diff --git a/.gitignore b/.gitignore index 76611b072..1e30cbf03 100644 --- a/.gitignore +++ b/.gitignore @@ -18,4 +18,4 @@ bin/ .idea *.iws *.iml -*.ipr \ No newline at end of file +*.ipr diff --git a/application/.gitignore b/application/.gitignore new file mode 100644 index 000000000..7a36faae6 --- /dev/null +++ b/application/.gitignore @@ -0,0 +1,22 @@ +.DS_Store +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar +/out/ +/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + diff --git a/application/build.gradle b/application/build.gradle new file mode 100644 index 000000000..7a812a448 --- /dev/null +++ b/application/build.gradle @@ -0,0 +1,11 @@ +jar { + enabled = true +} + +dependencies { + implementation project(':application:module-api') + implementation project(':framework:module-webserver') + + implementation 'org.springframework:spring-core:5.2.6.RELEASE' + implementation 'com.github.jknack:handlebars:4.2.0' +} diff --git a/application/module-api/.gitignore b/application/module-api/.gitignore new file mode 100644 index 000000000..7a36faae6 --- /dev/null +++ b/application/module-api/.gitignore @@ -0,0 +1,22 @@ +.DS_Store +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar +/out/ +/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + diff --git a/application/module-api/build.gradle b/application/module-api/build.gradle new file mode 100644 index 000000000..0262f781d --- /dev/null +++ b/application/module-api/build.gradle @@ -0,0 +1,13 @@ +jar { + enabled = true +} + +dependencies { + implementation project(':application:module-core') + implementation project(':application:module-common') + implementation project(':framework:module-webserver') + + implementation 'org.springframework:spring-core:5.2.6.RELEASE' + implementation 'com.github.jknack:handlebars:4.2.0' + implementation 'ch.qos.logback:logback-classic:1.2.3' +} diff --git a/src/main/java/controller/AbstractController.java b/application/module-api/src/main/java/controller/AbstractController.java similarity index 94% rename from src/main/java/controller/AbstractController.java rename to application/module-api/src/main/java/controller/AbstractController.java index d21e94347..3aee48a92 100644 --- a/src/main/java/controller/AbstractController.java +++ b/application/module-api/src/main/java/controller/AbstractController.java @@ -3,9 +3,9 @@ import java.io.IOException; import java.net.URISyntaxException; -import webserver.HttpRequest; -import webserver.HttpResponse; -import webserver.HttpStatus; +import domain.HttpRequest; +import domain.HttpResponse; +import domain.HttpStatus; public abstract class AbstractController implements Controller { @Override diff --git a/src/main/java/controller/Controller.java b/application/module-api/src/main/java/controller/Controller.java similarity index 78% rename from src/main/java/controller/Controller.java rename to application/module-api/src/main/java/controller/Controller.java index b4c8bbc68..26051d81a 100644 --- a/src/main/java/controller/Controller.java +++ b/application/module-api/src/main/java/controller/Controller.java @@ -3,8 +3,8 @@ import java.io.IOException; import java.net.URISyntaxException; -import webserver.HttpRequest; -import webserver.HttpResponse; +import domain.HttpRequest; +import domain.HttpResponse; public interface Controller { void service(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException, URISyntaxException; diff --git a/src/main/java/controller/FileController.java b/application/module-api/src/main/java/controller/FileController.java similarity index 63% rename from src/main/java/controller/FileController.java rename to application/module-api/src/main/java/controller/FileController.java index bc87d5338..5a6bb5418 100644 --- a/src/main/java/controller/FileController.java +++ b/application/module-api/src/main/java/controller/FileController.java @@ -2,27 +2,33 @@ import java.io.IOException; import java.net.URISyntaxException; +import java.util.Objects; +import annotations.Controller; +import annotations.RequestMapping; +import domain.HttpHeader; +import domain.HttpMethod; +import domain.HttpRequest; +import domain.HttpResponse; +import domain.HttpStatus; import utils.Extension; import utils.FileIoUtils; import utils.RequestUtils; -import webserver.HttpHeader; -import webserver.HttpRequest; -import webserver.HttpResponse; -import webserver.HttpStatus; +@Controller public class FileController extends AbstractController { + @RequestMapping(path = "file", method = HttpMethod.GET) @Override public void doGet(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException, URISyntaxException { String path = httpRequest.getPath(); byte[] body = FileIoUtils.findStaticFile(path); - if (body != null) { + if (Objects.nonNull(body)) { httpResponse.setHttpStatus(HttpStatus.OK); addContentType(httpResponse, path); httpResponse.addHeader(HttpHeader.CONTENT_LENGTH, String.valueOf(body.length)); httpResponse.forward(body); } - if (body == null) { + if (Objects.isNull(body)) { httpResponse.setHttpStatus(HttpStatus.NOT_FOUND); httpResponse.error(); } @@ -30,12 +36,9 @@ public void doGet(HttpRequest httpRequest, HttpResponse httpResponse) throws IOE private void addContentType(HttpResponse httpResponse, String path) { String extension = RequestUtils.extractExtension(path); - if (Extension.isJS(extension)) { - httpResponse.addHeader(HttpHeader.CONTENT_TYPE, "application/javascript;charset=utf-8"); - } - if (Extension.isCSS(extension) || Extension.isHTML(extension)) { - httpResponse.addHeader(HttpHeader.CONTENT_TYPE, - String.format("text/%s;charset=utf-8", RequestUtils.extractExtension(path))); + String contentType = Extension.getContentType(extension); + if (Objects.nonNull(contentType)) { + httpResponse.addHeader(HttpHeader.CONTENT_TYPE, contentType); } } } diff --git a/application/module-api/src/main/java/controller/user/LoginController.java b/application/module-api/src/main/java/controller/user/LoginController.java new file mode 100644 index 000000000..a5596727f --- /dev/null +++ b/application/module-api/src/main/java/controller/user/LoginController.java @@ -0,0 +1,58 @@ +package controller.user; + +import java.io.IOException; +import java.util.Objects; + +import annotations.Controller; +import annotations.RequestMapping; +import controller.AbstractController; +import cookie.HttpCookie; +import domain.HttpMethod; +import domain.HttpRequest; +import domain.HttpResponse; +import domain.HttpStatus; +import service.user.UserService; +import session.HttpSession; +import user.User; + +@Controller +public class LoginController extends AbstractController { + private final UserService userService; + + public LoginController() { + userService = UserService.getInstance(); + } + + public LoginController(UserService userService) { + this.userService = userService; + } + + @RequestMapping(path = "/user/login", method = HttpMethod.POST) + @Override + public void doPost(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException { + if (!httpRequest.containsAll(User.USER_ID, User.PASSWORD)) { + httpResponse.setHttpStatus(HttpStatus.BAD_REQUEST); + httpResponse.error(); + return; + } + setHttpResponse(httpRequest, httpResponse); + } + + private void setHttpResponse(HttpRequest httpRequest, HttpResponse httpResponse) throws + IOException { + User user = userService.findByUserId(httpRequest.getParameter(User.USER_ID)); + HttpCookie httpCookie = new HttpCookie(); + HttpSession httpSession = httpRequest.getHttpSession(); + httpResponse.setHttpStatus(HttpStatus.FOUND); + httpCookie.add(String.format("SESSIONID=%s; Path=/", httpSession.getId())); + httpCookie.apply(httpResponse); + if (Objects.isNull(user)) { + httpSession.setAttribute("logined", false); + httpResponse.sendRedirect("/user/login_failed.html"); + } + if (Objects.nonNull(user)) { + httpSession.setAttribute("logined", true); + httpResponse.sendRedirect("/index.html"); + } + } +} diff --git a/src/main/java/domain/user/web/UserCreateController.java b/application/module-api/src/main/java/controller/user/UserCreateController.java similarity index 68% rename from src/main/java/domain/user/web/UserCreateController.java rename to application/module-api/src/main/java/controller/user/UserCreateController.java index cfb91582d..4c18a8631 100644 --- a/src/main/java/domain/user/web/UserCreateController.java +++ b/application/module-api/src/main/java/controller/user/UserCreateController.java @@ -1,26 +1,32 @@ -package domain.user.web; +package controller.user; import java.io.IOException; +import annotations.Controller; +import annotations.RequestMapping; import controller.AbstractController; -import domain.user.model.User; -import domain.user.service.UserService; -import session.model.HttpSession; -import session.service.SessionService; -import webserver.HttpCookie; -import webserver.HttpRequest; -import webserver.HttpResponse; -import webserver.HttpStatus; +import cookie.HttpCookie; +import domain.HttpMethod; +import domain.HttpRequest; +import domain.HttpResponse; +import domain.HttpStatus; +import service.user.UserService; +import session.HttpSession; +import user.User; +@Controller public class UserCreateController extends AbstractController { private final UserService userService; - private final SessionService sessionService; - public UserCreateController(UserService userService, SessionService sessionService) { + public UserCreateController() { + userService = UserService.getInstance(); + } + + public UserCreateController(UserService userService) { this.userService = userService; - this.sessionService = sessionService; } + @RequestMapping(path = "/user/create", method = HttpMethod.POST) @Override public void doPost(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException { if (!httpRequest.containsAll(User.USER_ID, User.PASSWORD, User.NAME, User.EMAIL)) { @@ -33,7 +39,6 @@ public void doPost(HttpRequest httpRequest, HttpResponse httpResponse) throws IO userService.addUser(user); HttpSession httpSession = new HttpSession(); httpSession.setAttribute("logined", true); - sessionService.addSession(httpSession); HttpCookie httpCookie = new HttpCookie(); httpCookie.add(String.format("SESSIONID=%s; Path=/", httpSession.getId())); httpCookie.apply(httpResponse); diff --git a/src/main/java/domain/user/web/UserListController.java b/application/module-api/src/main/java/controller/user/UserListController.java similarity index 60% rename from src/main/java/domain/user/web/UserListController.java rename to application/module-api/src/main/java/controller/user/UserListController.java index 6a1839cc1..52bdf9fad 100644 --- a/src/main/java/domain/user/web/UserListController.java +++ b/application/module-api/src/main/java/controller/user/UserListController.java @@ -1,34 +1,40 @@ -package domain.user.web; +package controller.user; import java.io.IOException; import java.util.List; import com.fasterxml.jackson.databind.ObjectMapper; +import annotations.Controller; +import annotations.RequestMapping; import controller.AbstractController; -import domain.user.model.User; -import domain.user.service.UserService; -import session.service.SessionService; -import webserver.HttpHeader; -import webserver.HttpRequest; -import webserver.HttpResponse; -import webserver.HttpStatus; +import domain.HttpHeader; +import domain.HttpMethod; +import domain.HttpRequest; +import domain.HttpResponse; +import domain.HttpStatus; +import service.user.UserService; +import user.User; +@Controller public class UserListController extends AbstractController { private final UserService userService; - private final SessionService sessionService; private final ObjectMapper objectMapper; - public UserListController(UserService userService, SessionService sessionService, ObjectMapper objectMapper) { + public UserListController() { + userService = UserService.getInstance(); + objectMapper = new ObjectMapper(); + } + + public UserListController(UserService userService, ObjectMapper objectMapper) { this.userService = userService; - this.sessionService = sessionService; this.objectMapper = objectMapper; } + @RequestMapping(path = "/user/list", method = HttpMethod.GET) @Override public void doGet(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException { - if (httpRequest.getSessionId() == null || - !(boolean)sessionService.findById(httpRequest.getSessionId()).getAttribute("logined")) { + if (httpRequest.notAuthorized()) { httpResponse.setHttpStatus(HttpStatus.UNAUTHORIZED); httpResponse.sendRedirect("/user/login.html"); return; diff --git a/src/main/java/domain/user/web/UserReadController.java b/application/module-api/src/main/java/controller/user/UserReadController.java similarity index 72% rename from src/main/java/domain/user/web/UserReadController.java rename to application/module-api/src/main/java/controller/user/UserReadController.java index db8f7b328..807398df5 100644 --- a/src/main/java/domain/user/web/UserReadController.java +++ b/application/module-api/src/main/java/controller/user/UserReadController.java @@ -1,30 +1,41 @@ -package domain.user.web; +package controller.user; import java.io.IOException; +import java.util.Objects; import com.fasterxml.jackson.databind.ObjectMapper; +import annotations.Controller; +import annotations.RequestMapping; import controller.AbstractController; -import domain.user.model.User; -import domain.user.service.UserService; -import webserver.HttpHeader; -import webserver.HttpRequest; -import webserver.HttpResponse; -import webserver.HttpStatus; +import domain.HttpHeader; +import domain.HttpMethod; +import domain.HttpRequest; +import domain.HttpResponse; +import domain.HttpStatus; +import service.user.UserService; +import user.User; +@Controller public class UserReadController extends AbstractController { private final UserService userService; private final ObjectMapper objectMapper; + public UserReadController() { + userService = UserService.getInstance(); + objectMapper = new ObjectMapper(); + } + public UserReadController(UserService userService, ObjectMapper objectMapper) { this.userService = userService; this.objectMapper = objectMapper; } + @RequestMapping(path = "/user/profile", method = HttpMethod.GET) @Override public void doGet(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException { User user = userService.findByUserId(httpRequest.getParameter(User.USER_ID)); - if (user == null) { + if (Objects.isNull(user)) { validateParameter(httpRequest, httpResponse); httpResponse.error(); return; diff --git a/src/main/java/domain/user/service/UserService.java b/application/module-api/src/main/java/service/user/UserService.java similarity index 84% rename from src/main/java/domain/user/service/UserService.java rename to application/module-api/src/main/java/service/user/UserService.java index 1c17c30d1..e38d0d357 100644 --- a/src/main/java/domain/user/service/UserService.java +++ b/application/module-api/src/main/java/service/user/UserService.java @@ -1,10 +1,10 @@ -package domain.user.service; +package service.user; import java.util.ArrayList; import java.util.List; -import domain.user.db.UserRepository; -import domain.user.model.User; +import user.User; +import user.UserRepository; public class UserService { private static final UserService instance = new UserService(); diff --git a/src/test/java/domain/user/web/LoginControllerTest.java b/application/module-api/src/test/java/controller/user/LoginControllerTest.java similarity index 90% rename from src/test/java/domain/user/web/LoginControllerTest.java rename to application/module-api/src/test/java/controller/user/LoginControllerTest.java index dcb7bc4f1..dad6e921a 100644 --- a/src/test/java/domain/user/web/LoginControllerTest.java +++ b/application/module-api/src/test/java/controller/user/LoginControllerTest.java @@ -1,4 +1,4 @@ -package domain.user.web; +package controller.user; import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*; @@ -13,33 +13,25 @@ import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import domain.user.model.User; -import domain.user.service.UserService; -import session.service.SessionService; -import webserver.HttpRequest; -import webserver.HttpResponse; +import domain.HttpRequest; +import domain.HttpResponse; +import service.user.UserService; +import user.User; @ExtendWith(MockitoExtension.class) class LoginControllerTest { @Mock private UserService userService; - @Mock - private SessionService sessionService; - + @InjectMocks private LoginController loginController; - @BeforeEach - void setUp() { - loginController = new LoginController(userService, sessionService); - } - @Test void doPost() throws IOException { String request = "GET /admin/ HTTP/1.1\n" diff --git a/src/test/java/domain/user/web/UserCreateControllerTest.java b/application/module-api/src/test/java/controller/user/UserCreateControllerTest.java similarity index 86% rename from src/test/java/domain/user/web/UserCreateControllerTest.java rename to application/module-api/src/test/java/controller/user/UserCreateControllerTest.java index 19e02ea89..ae2784df2 100644 --- a/src/test/java/domain/user/web/UserCreateControllerTest.java +++ b/application/module-api/src/test/java/controller/user/UserCreateControllerTest.java @@ -1,4 +1,4 @@ -package domain.user.web; +package controller.user; import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*; @@ -11,32 +11,24 @@ import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import domain.user.service.UserService; -import session.service.SessionService; -import webserver.HttpRequest; -import webserver.HttpResponse; +import domain.HttpRequest; +import domain.HttpResponse; +import service.user.UserService; @ExtendWith(MockitoExtension.class) class UserCreateControllerTest { @Mock private UserService userService; - @Mock - private SessionService sessionService; - + @InjectMocks private UserCreateController userCreateController; - @BeforeEach - void setUp() { - userCreateController = new UserCreateController(userService, sessionService); - } - @Test void doPost() throws IOException { String request = "POST /admin/ HTTP/1.1\n" diff --git a/src/test/java/domain/user/web/UserListControllerTest.java b/application/module-api/src/test/java/controller/user/UserListControllerTest.java similarity index 85% rename from src/test/java/domain/user/web/UserListControllerTest.java rename to application/module-api/src/test/java/controller/user/UserListControllerTest.java index 34d784c75..b4d5ac9ff 100644 --- a/src/test/java/domain/user/web/UserListControllerTest.java +++ b/application/module-api/src/test/java/controller/user/UserListControllerTest.java @@ -1,4 +1,4 @@ -package domain.user.web; +package controller.user; import static org.assertj.core.api.Assertions.*; import static org.mockito.BDDMockito.*; @@ -20,26 +20,22 @@ import com.fasterxml.jackson.databind.ObjectMapper; -import domain.user.model.User; -import domain.user.service.UserService; -import session.model.HttpSession; -import session.service.SessionService; -import webserver.HttpRequest; -import webserver.HttpResponse; +import domain.HttpRequest; +import domain.HttpResponse; +import service.user.UserService; +import session.HttpSession; +import user.User; @ExtendWith(MockitoExtension.class) class UserListControllerTest { @Mock private UserService userService; - @Mock - private SessionService sessionService; - private UserListController userListController; @BeforeEach void setUp() { - userListController = new UserListController(userService, sessionService, new ObjectMapper()); + userListController = new UserListController(userService, new ObjectMapper()); } @Test @@ -53,10 +49,10 @@ void doGet() throws IOException { HttpRequest httpRequest = new HttpRequest(br); HttpSession httpSession = new HttpSession(); httpSession.setAttribute("logined", true); + httpRequest.setHttpSession(httpSession); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); HttpResponse httpResponse = new HttpResponse(byteArrayOutputStream); - given(sessionService.findById(anyString())).willReturn(httpSession); given(userService.list()).willReturn( Collections.singletonList(new User("userId", "password", "name", "email"))); @@ -78,11 +74,10 @@ void sessionNotExist() throws IOException { HttpRequest httpRequest = new HttpRequest(br); HttpSession httpSession = new HttpSession(); httpSession.setAttribute("logined", false); + httpRequest.setHttpSession(httpSession); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); HttpResponse httpResponse = new HttpResponse(byteArrayOutputStream); - given(sessionService.findById(anyString())).willReturn(httpSession); - userListController.doGet(httpRequest, httpResponse); String result = byteArrayOutputStream.toString("UTF-8"); diff --git a/src/test/java/domain/user/web/UserReadControllerTest.java b/application/module-api/src/test/java/controller/user/UserReadControllerTest.java similarity index 94% rename from src/test/java/domain/user/web/UserReadControllerTest.java rename to application/module-api/src/test/java/controller/user/UserReadControllerTest.java index b1b8e9d51..6be2b314e 100644 --- a/src/test/java/domain/user/web/UserReadControllerTest.java +++ b/application/module-api/src/test/java/controller/user/UserReadControllerTest.java @@ -1,4 +1,4 @@ -package domain.user.web; +package controller.user; import static org.assertj.core.api.Assertions.*; import static org.mockito.BDDMockito.*; @@ -19,10 +19,10 @@ import com.fasterxml.jackson.databind.ObjectMapper; -import domain.user.model.User; -import domain.user.service.UserService; -import webserver.HttpRequest; -import webserver.HttpResponse; +import domain.HttpRequest; +import domain.HttpResponse; +import service.user.UserService; +import user.User; @ExtendWith(MockitoExtension.class) class UserReadControllerTest { diff --git a/src/test/java/domain/user/service/UserServiceTest.java b/application/module-api/src/test/java/service/user/UserServiceTest.java similarity index 91% rename from src/test/java/domain/user/service/UserServiceTest.java rename to application/module-api/src/test/java/service/user/UserServiceTest.java index 6369abe56..c602f4a7e 100644 --- a/src/test/java/domain/user/service/UserServiceTest.java +++ b/application/module-api/src/test/java/service/user/UserServiceTest.java @@ -1,4 +1,4 @@ -package domain.user.service; +package service.user; import static org.assertj.core.api.Assertions.*; @@ -7,8 +7,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import domain.user.db.UserRepository; -import domain.user.model.User; +import user.User; +import user.UserRepository; class UserServiceTest { private final UserService userService = UserService.getInstance(); diff --git a/src/test/java/webserver/ExecutorsTest.java b/application/module-api/src/test/java/utils/ExecutorsTest.java similarity index 98% rename from src/test/java/webserver/ExecutorsTest.java rename to application/module-api/src/test/java/utils/ExecutorsTest.java index 449b5aa4b..1dc63c558 100644 --- a/src/test/java/webserver/ExecutorsTest.java +++ b/application/module-api/src/test/java/utils/ExecutorsTest.java @@ -1,4 +1,4 @@ -package webserver; +package utils; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; diff --git a/src/test/java/utils/HandlebarsTest.java b/application/module-api/src/test/java/utils/HandlebarsTest.java similarity index 96% rename from src/test/java/utils/HandlebarsTest.java rename to application/module-api/src/test/java/utils/HandlebarsTest.java index 835b8c61f..36dc0b985 100644 --- a/src/test/java/utils/HandlebarsTest.java +++ b/application/module-api/src/test/java/utils/HandlebarsTest.java @@ -9,7 +9,7 @@ import com.github.jknack.handlebars.io.ClassPathTemplateLoader; import com.github.jknack.handlebars.io.TemplateLoader; -import domain.user.model.User; +import user.User; public class HandlebarsTest { private static final Logger log = LoggerFactory.getLogger(HandlebarsTest.class); diff --git a/src/test/resources/http/not_allowed.http b/application/module-api/src/test/resources/http/not_allowed.http similarity index 100% rename from src/test/resources/http/not_allowed.http rename to application/module-api/src/test/resources/http/not_allowed.http diff --git a/src/test/resources/http/not_found.http b/application/module-api/src/test/resources/http/not_found.http similarity index 100% rename from src/test/resources/http/not_found.http rename to application/module-api/src/test/resources/http/not_found.http diff --git a/src/test/resources/http/ok.http b/application/module-api/src/test/resources/http/ok.http similarity index 100% rename from src/test/resources/http/ok.http rename to application/module-api/src/test/resources/http/ok.http diff --git a/src/test/resources/http/user.http b/application/module-api/src/test/resources/http/user.http similarity index 100% rename from src/test/resources/http/user.http rename to application/module-api/src/test/resources/http/user.http diff --git a/application/module-common/.gitignore b/application/module-common/.gitignore new file mode 100644 index 000000000..7a36faae6 --- /dev/null +++ b/application/module-common/.gitignore @@ -0,0 +1,22 @@ +.DS_Store +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar +/out/ +/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + diff --git a/application/module-common/build.gradle b/application/module-common/build.gradle new file mode 100644 index 000000000..b669fb54d --- /dev/null +++ b/application/module-common/build.gradle @@ -0,0 +1,7 @@ +jar { + enabled = true +} + +dependencies { + implementation project(':application:module-core') +} diff --git a/src/main/java/domain/user/model/User.java b/application/module-common/src/main/java/user/User.java similarity index 97% rename from src/main/java/domain/user/model/User.java rename to application/module-common/src/main/java/user/User.java index 3e6b83667..874d36b4e 100644 --- a/src/main/java/domain/user/model/User.java +++ b/application/module-common/src/main/java/user/User.java @@ -1,4 +1,4 @@ -package domain.user.model; +package user; public class User { public static final String USER_ID = "userId"; diff --git a/src/main/java/domain/user/db/UserRepository.java b/application/module-common/src/main/java/user/UserRepository.java similarity index 90% rename from src/main/java/domain/user/db/UserRepository.java rename to application/module-common/src/main/java/user/UserRepository.java index 4ac7ec2b0..a1bf1fdb5 100644 --- a/src/main/java/domain/user/db/UserRepository.java +++ b/application/module-common/src/main/java/user/UserRepository.java @@ -1,12 +1,10 @@ -package domain.user.db; +package user; import java.util.Collection; import java.util.Map; import com.google.common.collect.Maps; -import domain.user.model.User; - public class UserRepository { private static final Map users = Maps.newHashMap(); diff --git a/application/module-core/.gitignore b/application/module-core/.gitignore new file mode 100644 index 000000000..7a36faae6 --- /dev/null +++ b/application/module-core/.gitignore @@ -0,0 +1,22 @@ +.DS_Store +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar +/out/ +/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + diff --git a/application/module-core/build.gradle b/application/module-core/build.gradle new file mode 100644 index 000000000..2da860e59 --- /dev/null +++ b/application/module-core/build.gradle @@ -0,0 +1,3 @@ +jar { + enabled = true +} diff --git a/application/module-core/src/main/java/utils/FileIoUtils.java b/application/module-core/src/main/java/utils/FileIoUtils.java new file mode 100644 index 000000000..f3c125fab --- /dev/null +++ b/application/module-core/src/main/java/utils/FileIoUtils.java @@ -0,0 +1,27 @@ +package utils; + +import java.io.File; +import java.io.IOException; + +public class FileIoUtils { + public static final String TEMPLATE_PATH = "/Users/sangbo/Projects/woowa/jwp-was/application/module-core/src/main/resources/templates"; + public static final String STATIC_PATH = "/Users/sangbo/Projects/woowa/jwp-was/application/module-core/src/main/resources/static"; + public static final String TEMPLATE_CLASS_PATH = "/templates"; + public static final String STATIC_CLASS_PATH = "/static"; + + public static byte[] findStaticFile(String path) throws IOException { + File file = new File(TEMPLATE_PATH + path); + if (file.isFile()) { + return FileIoUtils.loadFileFromClasspath(TEMPLATE_CLASS_PATH + path); + } + file = new File(STATIC_PATH + path); + if (file.isFile()) { + return FileIoUtils.loadFileFromClasspath(STATIC_CLASS_PATH + path); + } + return null; + } + + public static byte[] loadFileFromClasspath(String filePath) throws IOException { + return FileIoUtils.class.getResourceAsStream(filePath).readAllBytes(); + } +} diff --git a/src/main/resources/static/css/bootstrap.min.css b/application/module-core/src/main/resources/static/css/bootstrap.min.css similarity index 100% rename from src/main/resources/static/css/bootstrap.min.css rename to application/module-core/src/main/resources/static/css/bootstrap.min.css diff --git a/src/main/resources/static/css/styles.css b/application/module-core/src/main/resources/static/css/styles.css similarity index 100% rename from src/main/resources/static/css/styles.css rename to application/module-core/src/main/resources/static/css/styles.css diff --git a/src/main/resources/static/fonts/glyphicons-halflings-regular.eot b/application/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.eot similarity index 100% rename from src/main/resources/static/fonts/glyphicons-halflings-regular.eot rename to application/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.eot diff --git a/src/main/resources/static/fonts/glyphicons-halflings-regular.svg b/application/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.svg similarity index 100% rename from src/main/resources/static/fonts/glyphicons-halflings-regular.svg rename to application/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.svg diff --git a/src/main/resources/static/fonts/glyphicons-halflings-regular.ttf b/application/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.ttf similarity index 100% rename from src/main/resources/static/fonts/glyphicons-halflings-regular.ttf rename to application/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.ttf diff --git a/src/main/resources/static/fonts/glyphicons-halflings-regular.woff b/application/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.woff similarity index 100% rename from src/main/resources/static/fonts/glyphicons-halflings-regular.woff rename to application/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.woff diff --git a/src/main/resources/static/fonts/glyphicons-halflings-regular.woff2 b/application/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.woff2 similarity index 100% rename from src/main/resources/static/fonts/glyphicons-halflings-regular.woff2 rename to application/module-core/src/main/resources/static/fonts/glyphicons-halflings-regular.woff2 diff --git a/src/main/resources/static/images/80-text.png b/application/module-core/src/main/resources/static/images/80-text.png similarity index 100% rename from src/main/resources/static/images/80-text.png rename to application/module-core/src/main/resources/static/images/80-text.png diff --git a/src/main/resources/static/js/api/user.js b/application/module-core/src/main/resources/static/js/api/user.js similarity index 100% rename from src/main/resources/static/js/api/user.js rename to application/module-core/src/main/resources/static/js/api/user.js diff --git a/src/main/resources/static/js/bootstrap.min.js b/application/module-core/src/main/resources/static/js/bootstrap.min.js similarity index 100% rename from src/main/resources/static/js/bootstrap.min.js rename to application/module-core/src/main/resources/static/js/bootstrap.min.js diff --git a/src/main/resources/static/js/jquery-2.2.0.min.js b/application/module-core/src/main/resources/static/js/jquery-2.2.0.min.js similarity index 100% rename from src/main/resources/static/js/jquery-2.2.0.min.js rename to application/module-core/src/main/resources/static/js/jquery-2.2.0.min.js diff --git a/src/main/resources/static/js/scripts.js b/application/module-core/src/main/resources/static/js/scripts.js similarity index 100% rename from src/main/resources/static/js/scripts.js rename to application/module-core/src/main/resources/static/js/scripts.js diff --git a/src/main/resources/static/js/templates.js b/application/module-core/src/main/resources/static/js/templates.js similarity index 100% rename from src/main/resources/static/js/templates.js rename to application/module-core/src/main/resources/static/js/templates.js diff --git a/src/main/resources/static/js/user_list.js b/application/module-core/src/main/resources/static/js/user_list.js similarity index 100% rename from src/main/resources/static/js/user_list.js rename to application/module-core/src/main/resources/static/js/user_list.js diff --git a/src/main/resources/templates/favicon.ico b/application/module-core/src/main/resources/templates/favicon.ico similarity index 100% rename from src/main/resources/templates/favicon.ico rename to application/module-core/src/main/resources/templates/favicon.ico diff --git a/src/main/resources/templates/index.html b/application/module-core/src/main/resources/templates/index.html similarity index 100% rename from src/main/resources/templates/index.html rename to application/module-core/src/main/resources/templates/index.html diff --git a/src/main/resources/templates/qna/form.html b/application/module-core/src/main/resources/templates/qna/form.html similarity index 100% rename from src/main/resources/templates/qna/form.html rename to application/module-core/src/main/resources/templates/qna/form.html diff --git a/src/main/resources/templates/qna/show.html b/application/module-core/src/main/resources/templates/qna/show.html similarity index 100% rename from src/main/resources/templates/qna/show.html rename to application/module-core/src/main/resources/templates/qna/show.html diff --git a/src/main/resources/templates/user/form.html b/application/module-core/src/main/resources/templates/user/form.html similarity index 100% rename from src/main/resources/templates/user/form.html rename to application/module-core/src/main/resources/templates/user/form.html diff --git a/src/main/resources/templates/user/list.html b/application/module-core/src/main/resources/templates/user/list.html similarity index 100% rename from src/main/resources/templates/user/list.html rename to application/module-core/src/main/resources/templates/user/list.html diff --git a/src/main/resources/templates/user/login.html b/application/module-core/src/main/resources/templates/user/login.html similarity index 100% rename from src/main/resources/templates/user/login.html rename to application/module-core/src/main/resources/templates/user/login.html diff --git a/src/main/resources/templates/user/login_failed.html b/application/module-core/src/main/resources/templates/user/login_failed.html similarity index 100% rename from src/main/resources/templates/user/login_failed.html rename to application/module-core/src/main/resources/templates/user/login_failed.html diff --git a/src/main/resources/templates/user/profile.html b/application/module-core/src/main/resources/templates/user/profile.html similarity index 100% rename from src/main/resources/templates/user/profile.html rename to application/module-core/src/main/resources/templates/user/profile.html diff --git a/src/test/java/utils/FileIoUtilsTest.java b/application/module-core/src/test/java/utils/FileIoUtilsTest.java similarity index 65% rename from src/test/java/utils/FileIoUtilsTest.java rename to application/module-core/src/test/java/utils/FileIoUtilsTest.java index be4dcbf4e..357cfe7ad 100644 --- a/src/test/java/utils/FileIoUtilsTest.java +++ b/application/module-core/src/test/java/utils/FileIoUtilsTest.java @@ -3,12 +3,8 @@ import static org.assertj.core.api.Assertions.*; import org.junit.jupiter.api.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class FileIoUtilsTest { - private static final Logger log = LoggerFactory.getLogger(FileIoUtilsTest.class); - @Test void findStaticFile() throws Exception { byte[] body = FileIoUtils.findStaticFile("/index.html"); @@ -23,7 +19,6 @@ void findNotExistFile() throws Exception { @Test void loadFileFromClasspath() throws Exception { - byte[] body = FileIoUtils.loadFileFromClasspath("./templates/index.html"); - log.debug("file : {}", new String(body)); + byte[] body = FileIoUtils.loadFileFromClasspath("/templates/index.html"); } } diff --git a/application/src/main/java/Application.java b/application/src/main/java/Application.java new file mode 100644 index 000000000..7ead81a4c --- /dev/null +++ b/application/src/main/java/Application.java @@ -0,0 +1,6 @@ +public class Application { + public static void main(String[] args) throws Exception { + WebServer webServer = new WebServer(); + webServer.run(args); + } +} diff --git a/build.gradle b/build.gradle index 2c9a6618c..59abdc060 100644 --- a/build.gradle +++ b/build.gradle @@ -1,28 +1,24 @@ -plugins { - id 'java' - id 'idea' - id 'eclipse' -} +subprojects { + version = '1.0.0' -version = '1.0.0' -sourceCompatibility = 1.8 + apply plugin: 'java' + apply plugin: 'idea' + apply plugin: 'eclipse' -repositories { - mavenCentral() -} + repositories { + mavenCentral() + } -dependencies { - implementation 'com.google.guava:guava:29.0-jre' - implementation 'ch.qos.logback:logback-classic:1.2.3' - implementation 'com.github.jknack:handlebars:4.2.0' - implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.0' - implementation 'org.springframework:spring-core:5.2.6.RELEASE' - implementation 'org.mockito:mockito-core:3.5.15' - implementation 'org.mockito:mockito-junit-jupiter:3.5.15' - testImplementation 'org.junit.jupiter:junit-jupiter:5.6.2' - testImplementation 'org.assertj:assertj-core:3.16.1' -} + dependencies { + implementation 'com.google.guava:guava:29.0-jre' + implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.0' + implementation 'org.mockito:mockito-core:3.5.15' + implementation 'org.mockito:mockito-junit-jupiter:3.5.15' + testImplementation 'org.junit.jupiter:junit-jupiter:5.6.2' + testImplementation 'org.assertj:assertj-core:3.16.1' + } -test { - useJUnitPlatform() + test { + useJUnitPlatform() + } } diff --git a/framework/module-webserver/.gitignore b/framework/module-webserver/.gitignore new file mode 100644 index 000000000..7a36faae6 --- /dev/null +++ b/framework/module-webserver/.gitignore @@ -0,0 +1,22 @@ +.DS_Store +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar +/out/ +/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + diff --git a/framework/module-webserver/build.gradle b/framework/module-webserver/build.gradle new file mode 100644 index 000000000..958a963b7 --- /dev/null +++ b/framework/module-webserver/build.gradle @@ -0,0 +1,4 @@ +dependencies { + implementation 'ch.qos.logback:logback-classic:1.2.3' + implementation 'org.reflections:reflections:0.9.10' +} diff --git a/framework/module-webserver/src/main/java/Context.java b/framework/module-webserver/src/main/java/Context.java new file mode 100644 index 000000000..b31a8b46a --- /dev/null +++ b/framework/module-webserver/src/main/java/Context.java @@ -0,0 +1,96 @@ +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.stream.Collectors; + +import org.reflections.Reflections; +import org.reflections.scanners.MethodAnnotationsScanner; + +import annotations.Controller; +import annotations.RequestMapping; +import domain.HttpRequest; +import domain.HttpResponse; + +public class Context { + private static final String DEFAULT_CONTROLLER_DIRECTORY = "controller"; + private static final Context instance = new Context(); + + private final Map requestMapper; + private final List beans; + + private Context() { + requestMapper = new HashMap<>(); + beans = instantiate(); + initialize(); + } + + public static Context getInstance() { + return instance; + } + + private List instantiate() { + Reflections reflections = new Reflections(DEFAULT_CONTROLLER_DIRECTORY); + Set> controllerAnnotatedClasses = reflections.getTypesAnnotatedWith(Controller.class); + + return controllerAnnotatedClasses.stream() + .map(this::instantiateBean) + .collect(Collectors.toList()); + } + + private Object instantiateBean(Class aClass) { + try { + return aClass.getConstructor().newInstance(); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { + e.printStackTrace(); + } + return null; + } + + private void initialize() { + beans.stream() + .map(getAnnotatedMethods()) + .forEach(it -> it.forEach(addMethodToRequestMapper())); + } + + private Function> getAnnotatedMethods() { + return it -> new Reflections(it.getClass(), new MethodAnnotationsScanner()).getMethodsAnnotatedWith( + RequestMapping.class); + } + + private Consumer addMethodToRequestMapper() { + return method -> { + RequestMapping annotation = method.getAnnotation(RequestMapping.class); + requestMapper.put(annotation.path(), method); + }; + } + + public void invoke(HttpRequest httpRequest, HttpResponse httpResponse) throws + InvocationTargetException, IllegalAccessException { + String path = httpRequest.getPath(); + Method method = getAllocatedMethod(path); + Object bean = getInstance(method); + method.invoke(bean, httpRequest, httpResponse); + } + + private Method getAllocatedMethod(String path) { + Method method = requestMapper.get(path); + if (Objects.isNull(method)) { + return requestMapper.get("file"); + } + return method; + } + + private Object getInstance(Method method) { + return beans.stream() + .filter(t -> Arrays.asList(t.getClass().getMethods()).contains(method)) + .findFirst() + .orElseThrow(IllegalArgumentException::new); + } +} diff --git a/src/main/java/webserver/RequestHandler.java b/framework/module-webserver/src/main/java/RequestHandler.java similarity index 62% rename from src/main/java/webserver/RequestHandler.java rename to framework/module-webserver/src/main/java/RequestHandler.java index 55d6ebcd9..87ac1a299 100644 --- a/src/main/java/webserver/RequestHandler.java +++ b/framework/module-webserver/src/main/java/RequestHandler.java @@ -1,31 +1,33 @@ -package webserver; +import static org.slf4j.LoggerFactory.*; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; +import java.lang.reflect.InvocationTargetException; import java.net.Socket; -import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; -import java.util.Map; +import java.util.Objects; import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import controller.Controller; +import domain.HttpRequest; +import domain.HttpResponse; +import session.HttpSession; +import session.SessionService; public class RequestHandler implements Runnable { - private static final Logger logger = LoggerFactory.getLogger(RequestHandler.class); + private static final Logger logger = getLogger(RequestHandler.class); private final Socket connection; private final Context context; - private final Map controllers; + private final SessionService sessionService; public RequestHandler(Socket connectionSocket) { this.connection = connectionSocket; this.context = Context.getInstance(); - controllers = context.createControllerBifurcation(); + sessionService = SessionService.getInstance(); } public void run() { @@ -35,11 +37,18 @@ public void run() { try (InputStream in = connection.getInputStream(); OutputStream out = connection.getOutputStream()) { BufferedReader br = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8)); HttpRequest httpRequest = new HttpRequest(br); + if (Objects.isNull(httpRequest.getSessionId())) { + sessionService.add(httpRequest.getHttpSession()); + } + if (Objects.nonNull(httpRequest.getSessionId())) { + HttpSession httpSession = sessionService.findById(httpRequest.getSessionId()); + httpRequest.setHttpSession(httpSession); + } printHeader(httpRequest); printParameter(httpRequest); - Controller controller = controllers.getOrDefault(httpRequest.getPath(), controllers.get("file")); - controller.service(httpRequest, new HttpResponse(out)); - } catch (IOException | URISyntaxException e) { + context.invoke(httpRequest, new HttpResponse(out)); + sessionService.update(httpRequest.getHttpSession()); + } catch (IOException | IllegalAccessException | InvocationTargetException e) { logger.error(e.getMessage()); } } diff --git a/src/main/java/webserver/WebServer.java b/framework/module-webserver/src/main/java/WebServer.java similarity index 79% rename from src/main/java/webserver/WebServer.java rename to framework/module-webserver/src/main/java/WebServer.java index 2e7b08048..64edf49ce 100644 --- a/src/main/java/webserver/WebServer.java +++ b/framework/module-webserver/src/main/java/WebServer.java @@ -1,21 +1,21 @@ -package webserver; +import static org.slf4j.LoggerFactory.*; import java.net.ServerSocket; import java.net.Socket; +import java.util.Objects; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class WebServer { - private static final Logger logger = LoggerFactory.getLogger(WebServer.class); + private static final Logger logger = getLogger(WebServer.class); private static final ExecutorService es = Executors.newFixedThreadPool(100); private static final int DEFAULT_PORT = 8080; - public static void main(String[] args) throws Exception { + public void run(String[] args) throws Exception { int port = 0; - if (args == null || args.length == 0) { + if (Objects.isNull(args) || args.length == 0) { port = DEFAULT_PORT; } else { port = Integer.parseInt(args[0]); diff --git a/framework/module-webserver/src/main/java/annotations/Controller.java b/framework/module-webserver/src/main/java/annotations/Controller.java new file mode 100644 index 000000000..29ce1a727 --- /dev/null +++ b/framework/module-webserver/src/main/java/annotations/Controller.java @@ -0,0 +1,11 @@ +package annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface Controller { +} diff --git a/framework/module-webserver/src/main/java/annotations/RequestMapping.java b/framework/module-webserver/src/main/java/annotations/RequestMapping.java new file mode 100644 index 000000000..f8a256b2a --- /dev/null +++ b/framework/module-webserver/src/main/java/annotations/RequestMapping.java @@ -0,0 +1,16 @@ +package annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import domain.HttpMethod; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface RequestMapping { + String path() default ""; + + HttpMethod method() default HttpMethod.GET; +} diff --git a/src/main/java/webserver/HttpCookie.java b/framework/module-webserver/src/main/java/cookie/HttpCookie.java similarity index 86% rename from src/main/java/webserver/HttpCookie.java rename to framework/module-webserver/src/main/java/cookie/HttpCookie.java index 82ccd62d0..5f33ac634 100644 --- a/src/main/java/webserver/HttpCookie.java +++ b/framework/module-webserver/src/main/java/cookie/HttpCookie.java @@ -1,8 +1,11 @@ -package webserver; +package cookie; import java.util.ArrayList; import java.util.List; +import domain.HttpHeader; +import domain.HttpResponse; + public class HttpCookie { private final List cookies; diff --git a/src/main/java/webserver/HttpHeader.java b/framework/module-webserver/src/main/java/domain/HttpHeader.java similarity index 93% rename from src/main/java/webserver/HttpHeader.java rename to framework/module-webserver/src/main/java/domain/HttpHeader.java index d5c4efed8..d9365ee81 100644 --- a/src/main/java/webserver/HttpHeader.java +++ b/framework/module-webserver/src/main/java/domain/HttpHeader.java @@ -1,4 +1,4 @@ -package webserver; +package domain; public class HttpHeader { public static final String CONTENT_LENGTH = "Content-Length"; diff --git a/src/main/java/webserver/HttpMethod.java b/framework/module-webserver/src/main/java/domain/HttpMethod.java similarity index 94% rename from src/main/java/webserver/HttpMethod.java rename to framework/module-webserver/src/main/java/domain/HttpMethod.java index 80585ef5a..a1f93cabb 100644 --- a/src/main/java/webserver/HttpMethod.java +++ b/framework/module-webserver/src/main/java/domain/HttpMethod.java @@ -1,4 +1,4 @@ -package webserver; +package domain; public enum HttpMethod { GET, diff --git a/src/main/java/webserver/HttpRequest.java b/framework/module-webserver/src/main/java/domain/HttpRequest.java similarity index 84% rename from src/main/java/webserver/HttpRequest.java rename to framework/module-webserver/src/main/java/domain/HttpRequest.java index fadf1a502..709654d31 100644 --- a/src/main/java/webserver/HttpRequest.java +++ b/framework/module-webserver/src/main/java/domain/HttpRequest.java @@ -1,11 +1,13 @@ -package webserver; +package domain; import java.io.BufferedReader; import java.io.IOException; import java.util.Arrays; import java.util.Map; +import java.util.Objects; import java.util.TreeMap; +import session.HttpSession; import utils.IOUtils; import utils.RequestUtils; @@ -23,6 +25,7 @@ public class HttpRequest { private final Map header; private final Map parameter; private String path; + private HttpSession httpSession; public HttpRequest(BufferedReader br) throws IOException { this.header = new TreeMap<>(); @@ -52,7 +55,7 @@ private String readRequest(BufferedReader br) throws IOException { private void createHeader(BufferedReader br) throws IOException { String line = br.readLine(); - while (!EMPTY.equals(line) && line != null) { + while (!EMPTY.equals(line) && Objects.nonNull(line)) { String key = line.split(COLON)[KEY_INDEX]; String value = line.substring(key.length() + 2); header.put(key, value); @@ -70,7 +73,7 @@ private Map createParameter(BufferedReader br) throws IOExceptio public String getSessionId() { String cookie = header.get(HttpHeader.COOKIE); - if (cookie == null) { + if (Objects.isNull(cookie)) { return null; } return RequestUtils.extractSessionId(cookie); @@ -101,6 +104,22 @@ public boolean containsParameter(String key) { return parameter.containsKey(key); } + public boolean notAuthorized() { + Object logined = httpSession.getAttribute("logined"); + return Objects.isNull(logined) || !(boolean)logined; + } + + public void setHttpSession(HttpSession httpSession) { + this.httpSession = httpSession; + } + + public HttpSession getHttpSession() { + if (Objects.isNull(this.httpSession)) { + this.httpSession = new HttpSession(); + } + return this.httpSession; + } + public String getHeader(String key) { return header.get(key); } diff --git a/src/main/java/webserver/HttpResponse.java b/framework/module-webserver/src/main/java/domain/HttpResponse.java similarity index 99% rename from src/main/java/webserver/HttpResponse.java rename to framework/module-webserver/src/main/java/domain/HttpResponse.java index 00e9a01e1..50b4c474b 100644 --- a/src/main/java/webserver/HttpResponse.java +++ b/framework/module-webserver/src/main/java/domain/HttpResponse.java @@ -1,4 +1,4 @@ -package webserver; +package domain; import java.io.DataOutputStream; import java.io.IOException; diff --git a/src/main/java/webserver/HttpStatus.java b/framework/module-webserver/src/main/java/domain/HttpStatus.java similarity index 97% rename from src/main/java/webserver/HttpStatus.java rename to framework/module-webserver/src/main/java/domain/HttpStatus.java index aec7c6a9f..dd4178956 100644 --- a/src/main/java/webserver/HttpStatus.java +++ b/framework/module-webserver/src/main/java/domain/HttpStatus.java @@ -1,4 +1,4 @@ -package webserver; +package domain; public enum HttpStatus { OK("OK", 200), diff --git a/src/main/java/session/model/HttpSession.java b/framework/module-webserver/src/main/java/session/HttpSession.java similarity index 97% rename from src/main/java/session/model/HttpSession.java rename to framework/module-webserver/src/main/java/session/HttpSession.java index e478aafde..54ea223ec 100644 --- a/src/main/java/session/model/HttpSession.java +++ b/framework/module-webserver/src/main/java/session/HttpSession.java @@ -1,4 +1,4 @@ -package session.model; +package session; import java.util.Map; import java.util.UUID; diff --git a/src/main/java/session/db/SessionRepository.java b/framework/module-webserver/src/main/java/session/SessionRepository.java similarity index 74% rename from src/main/java/session/db/SessionRepository.java rename to framework/module-webserver/src/main/java/session/SessionRepository.java index be58c889b..0366c46c2 100644 --- a/src/main/java/session/db/SessionRepository.java +++ b/framework/module-webserver/src/main/java/session/SessionRepository.java @@ -1,11 +1,9 @@ -package session.db; +package session; import java.util.Map; import com.google.common.collect.Maps; -import session.model.HttpSession; - public class SessionRepository { private static final Map sessions = Maps.newHashMap(); @@ -16,4 +14,8 @@ public static void addSession(String sessionId, HttpSession httpSession) { public static HttpSession findById(String id) { return sessions.get(id); } + + public static void update(HttpSession httpSession) { + sessions.replace(httpSession.getId(), httpSession); + } } diff --git a/src/main/java/session/service/SessionService.java b/framework/module-webserver/src/main/java/session/SessionService.java similarity index 70% rename from src/main/java/session/service/SessionService.java rename to framework/module-webserver/src/main/java/session/SessionService.java index 94b22df48..9786af522 100644 --- a/src/main/java/session/service/SessionService.java +++ b/framework/module-webserver/src/main/java/session/SessionService.java @@ -1,7 +1,4 @@ -package session.service; - -import session.db.SessionRepository; -import session.model.HttpSession; +package session; public class SessionService { private static SessionService instance = new SessionService(); @@ -13,11 +10,15 @@ public static SessionService getInstance() { return instance; } - public void addSession(HttpSession httpSession) { + public void add(HttpSession httpSession) { SessionRepository.addSession(httpSession.getId(), httpSession); } public HttpSession findById(String id) { return SessionRepository.findById(id); } + + public void update(HttpSession httpSession) { + SessionRepository.update(httpSession); + } } diff --git a/framework/module-webserver/src/main/java/utils/Extension.java b/framework/module-webserver/src/main/java/utils/Extension.java new file mode 100644 index 000000000..21fb11751 --- /dev/null +++ b/framework/module-webserver/src/main/java/utils/Extension.java @@ -0,0 +1,23 @@ +package utils; + +public enum Extension { + JS("js"), + CSS("css"), + HTML("html"); + + private final String title; + + Extension(String title) { + this.title = title; + } + + public static String getContentType(String extension) { + if (JS.title.equals(extension)) { + return "application/javascript;charset=utf-8"; + } + if (CSS.title.equals(extension) || HTML.title.equals(extension)) { + return String.format("text/%s;charset=utf-8", extension); + } + return null; + } +} diff --git a/src/main/java/utils/IOUtils.java b/framework/module-webserver/src/main/java/utils/IOUtils.java similarity index 100% rename from src/main/java/utils/IOUtils.java rename to framework/module-webserver/src/main/java/utils/IOUtils.java diff --git a/src/main/java/utils/RequestUtils.java b/framework/module-webserver/src/main/java/utils/RequestUtils.java similarity index 100% rename from src/main/java/utils/RequestUtils.java rename to framework/module-webserver/src/main/java/utils/RequestUtils.java diff --git a/framework/module-webserver/src/main/resources/logback.xml b/framework/module-webserver/src/main/resources/logback.xml new file mode 100644 index 000000000..d601ca22e --- /dev/null +++ b/framework/module-webserver/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + + %d{HH:mm:ss.SSS} [%-5level] [%thread] [%logger{36}] - %m%n + + + + + + + diff --git a/src/test/java/webserver/HttpRequestTest.java b/framework/module-webserver/src/test/java/domain/HttpRequestTest.java similarity index 99% rename from src/test/java/webserver/HttpRequestTest.java rename to framework/module-webserver/src/test/java/domain/HttpRequestTest.java index e5552f17c..f8416e54d 100644 --- a/src/test/java/webserver/HttpRequestTest.java +++ b/framework/module-webserver/src/test/java/domain/HttpRequestTest.java @@ -1,4 +1,4 @@ -package webserver; +package domain; import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/webserver/HttpResponseTest.java b/framework/module-webserver/src/test/java/domain/HttpResponseTest.java similarity index 75% rename from src/test/java/webserver/HttpResponseTest.java rename to framework/module-webserver/src/test/java/domain/HttpResponseTest.java index 54986eb7c..bff99a3c1 100644 --- a/src/test/java/webserver/HttpResponseTest.java +++ b/framework/module-webserver/src/test/java/domain/HttpResponseTest.java @@ -1,26 +1,28 @@ -package webserver; +package domain; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; -import java.io.IOException; import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import org.junit.jupiter.api.Test; -import utils.FileIoUtils; import utils.RequestUtils; class HttpResponseTest { @Test void responseForward() throws Exception { // Http_Forward.txt 결과는 응답 body에 index.html이 포함되어 있어야 한다. - String path = "/index.html"; + String filePath = "./index.html"; HttpResponse response = new HttpResponse(createOutputStream("Http_Forward.txt")); - byte[] body = FileIoUtils.findStaticFile(path); + Path path = Paths.get(HttpResponseTest.class.getClassLoader().getResource(filePath).toURI()); + byte[] body = Files.readAllBytes(path); response.setHttpStatus(HttpStatus.OK); response.addHeader(HttpHeader.CONTENT_TYPE, - String.format("text/%s;charset=utf-8", RequestUtils.extractExtension(path))); + String.format("text/%s;charset=utf-8", RequestUtils.extractExtension(filePath))); response.addHeader(HttpHeader.CONTENT_LENGTH, String.valueOf(body.length)); response.forward(body); } @@ -34,14 +36,14 @@ public void responseRedirect() throws Exception { } @Test - public void error() throws IOException { + public void error() throws Exception { HttpResponse response = new HttpResponse(createOutputStream("Http_Error.txt")); response.setHttpStatus(HttpStatus.BAD_REQUEST); response.error(); } private OutputStream createOutputStream(String filename) throws FileNotFoundException { - String testDirectory = "./src/test/resources/"; + String testDirectory = "/Users/sangbo/Projects/woowa/jwp-was/framework/module-webserver/src/test/resources/"; return new FileOutputStream(new File(testDirectory + filename)); } } diff --git a/src/test/java/session/model/HttpSessionTest.java b/framework/module-webserver/src/test/java/session/HttpSessionTest.java similarity index 97% rename from src/test/java/session/model/HttpSessionTest.java rename to framework/module-webserver/src/test/java/session/HttpSessionTest.java index 79cda7828..933f65b4b 100644 --- a/src/test/java/session/model/HttpSessionTest.java +++ b/framework/module-webserver/src/test/java/session/HttpSessionTest.java @@ -1,4 +1,4 @@ -package session.model; +package session; import static org.assertj.core.api.Assertions.*; diff --git a/framework/module-webserver/src/test/java/utils/ExtensionTest.java b/framework/module-webserver/src/test/java/utils/ExtensionTest.java new file mode 100644 index 000000000..32edc2904 --- /dev/null +++ b/framework/module-webserver/src/test/java/utils/ExtensionTest.java @@ -0,0 +1,26 @@ +package utils; + +import static org.assertj.core.api.Assertions.*; + +import java.util.stream.Stream; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class ExtensionTest { + @ParameterizedTest + @MethodSource("provideExtensionAndResult") + void getContentType(String extension, String result) { + assertThat(Extension.getContentType(extension)).isEqualTo(result); + } + + private static Stream provideExtensionAndResult() { + return Stream.of( + Arguments.of("js", "application/javascript;charset=utf-8"), + Arguments.of("css", "text/css;charset=utf-8"), + Arguments.of("html", "text/html;charset=utf-8"), + Arguments.of("woff", null) + ); + } +} diff --git a/src/test/java/utils/IOUtilsTest.java b/framework/module-webserver/src/test/java/utils/IOUtilsTest.java similarity index 100% rename from src/test/java/utils/IOUtilsTest.java rename to framework/module-webserver/src/test/java/utils/IOUtilsTest.java diff --git a/src/test/java/utils/RequestUtilsTest.java b/framework/module-webserver/src/test/java/utils/RequestUtilsTest.java similarity index 100% rename from src/test/java/utils/RequestUtilsTest.java rename to framework/module-webserver/src/test/java/utils/RequestUtilsTest.java diff --git a/src/test/resources/Http_Error.txt b/framework/module-webserver/src/test/resources/Http_Error.txt similarity index 100% rename from src/test/resources/Http_Error.txt rename to framework/module-webserver/src/test/resources/Http_Error.txt diff --git a/src/test/resources/Http_Forward.txt b/framework/module-webserver/src/test/resources/Http_Forward.txt similarity index 100% rename from src/test/resources/Http_Forward.txt rename to framework/module-webserver/src/test/resources/Http_Forward.txt diff --git a/src/test/resources/Http_Redirect.txt b/framework/module-webserver/src/test/resources/Http_Redirect.txt similarity index 100% rename from src/test/resources/Http_Redirect.txt rename to framework/module-webserver/src/test/resources/Http_Redirect.txt diff --git a/framework/module-webserver/src/test/resources/index.html b/framework/module-webserver/src/test/resources/index.html new file mode 100644 index 000000000..1675898ad --- /dev/null +++ b/framework/module-webserver/src/test/resources/index.html @@ -0,0 +1,148 @@ + + + + + + SLiPP Java Web Programming + + + + + + + + + + +
+
+
+ +
+
+
+ +
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 000000000..764d40fd8 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,3 @@ +rootProject.name = 'jwp-was' +include 'application', 'application:module-api', 'application:module-common', 'application:module-core' +include 'framework:module-webserver' diff --git a/src/main/java/domain/user/web/LoginController.java b/src/main/java/domain/user/web/LoginController.java deleted file mode 100644 index 575adb954..000000000 --- a/src/main/java/domain/user/web/LoginController.java +++ /dev/null @@ -1,55 +0,0 @@ -package domain.user.web; - -import java.io.IOException; - -import controller.AbstractController; -import domain.user.model.User; -import domain.user.service.UserService; -import session.model.HttpSession; -import session.service.SessionService; -import webserver.HttpCookie; -import webserver.HttpRequest; -import webserver.HttpResponse; -import webserver.HttpStatus; - -public class LoginController extends AbstractController { - private final UserService userService; - private final SessionService sessionService; - - public LoginController(UserService userService, SessionService sessionService) { - this.userService = userService; - this.sessionService = sessionService; - } - - @Override - public void doPost(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException { - if (!httpRequest.containsAll(User.USER_ID, User.PASSWORD)) { - httpResponse.setHttpStatus(HttpStatus.BAD_REQUEST); - httpResponse.error(); - return; - } - HttpSession httpSession = new HttpSession(); - setHttpResponse(httpRequest, httpResponse, httpSession); - sessionService.addSession(httpSession); - } - - private void setHttpResponse(HttpRequest httpRequest, HttpResponse httpResponse, HttpSession httpSession) throws - IOException { - User user = userService.findByUserId(httpRequest.getParameter(User.USER_ID)); - HttpCookie httpCookie = new HttpCookie(); - if (user == null) { - httpResponse.setHttpStatus(HttpStatus.FOUND); - httpSession.setAttribute("logined", false); - httpCookie.add(String.format("SESSIONID=%s; Path=/", httpSession.getId())); - httpCookie.apply(httpResponse); - httpResponse.sendRedirect("/user/login_failed.html"); - } - if (user != null) { - httpResponse.setHttpStatus(HttpStatus.FOUND); - httpSession.setAttribute("logined", true); - httpCookie.add(String.format("SESSIONID=%s; Path=/", httpSession.getId())); - httpCookie.apply(httpResponse); - httpResponse.sendRedirect("/index.html"); - } - } -} diff --git a/src/main/java/utils/Extension.java b/src/main/java/utils/Extension.java deleted file mode 100644 index ae9837460..000000000 --- a/src/main/java/utils/Extension.java +++ /dev/null @@ -1,25 +0,0 @@ -package utils; - -public enum Extension { - JS("js"), - CSS("css"), - HTML("html"); - - private final String title; - - Extension(String title) { - this.title = title; - } - - public static boolean isJS(String extension) { - return extension.equals(JS.title); - } - - public static boolean isCSS(String extension) { - return extension.equals(CSS.title); - } - - public static boolean isHTML(String extension) { - return extension.equals(HTML.title); - } -} diff --git a/src/main/java/utils/FileIoUtils.java b/src/main/java/utils/FileIoUtils.java deleted file mode 100644 index 7de203157..000000000 --- a/src/main/java/utils/FileIoUtils.java +++ /dev/null @@ -1,32 +0,0 @@ -package utils; - -import java.io.File; -import java.io.IOException; -import java.net.URISyntaxException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; - -public class FileIoUtils { - public static final String TEMPLATE_PATH = "./src/main/resources/templates"; - public static final String STATIC_PATH = "./src/main/resources/static"; - public static final String TEMPLATE_CLASS_PATH = "./templates"; - public static final String STATIC_CLASS_PATH = "./static"; - - public static byte[] findStaticFile(String path) throws IOException, URISyntaxException { - File file = new File(TEMPLATE_PATH + path); - if (file.isFile()) { - return FileIoUtils.loadFileFromClasspath(TEMPLATE_CLASS_PATH + path); - } - file = new File(STATIC_PATH + path); - if (file.isFile()) { - return FileIoUtils.loadFileFromClasspath(STATIC_CLASS_PATH + path); - } - return null; - } - - public static byte[] loadFileFromClasspath(String filePath) throws IOException, URISyntaxException { - Path path = Paths.get(FileIoUtils.class.getClassLoader().getResource(filePath).toURI()); - return Files.readAllBytes(path); - } -} diff --git a/src/main/java/webserver/Context.java b/src/main/java/webserver/Context.java deleted file mode 100644 index 0fa276912..000000000 --- a/src/main/java/webserver/Context.java +++ /dev/null @@ -1,40 +0,0 @@ -package webserver; - -import java.util.HashMap; -import java.util.Map; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import controller.Controller; -import controller.FileController; -import domain.user.service.UserService; -import domain.user.web.LoginController; -import domain.user.web.UserCreateController; -import domain.user.web.UserListController; -import domain.user.web.UserReadController; -import session.service.SessionService; - -public class Context { - private static final ObjectMapper objectMapper = new ObjectMapper(); - private static final Context instance = new Context(); - - private Context() { - } - - public static Context getInstance() { - return instance; - } - - public Map createControllerBifurcation() { - Map controllers = new HashMap<>(); - UserService userService = UserService.getInstance(); - SessionService sessionService = SessionService.getInstance(); - - controllers.put("file", new FileController()); - controllers.put("/user/create", new UserCreateController(userService, sessionService)); - controllers.put("/user/profile", new UserReadController(userService, objectMapper)); - controllers.put("/user/login", new LoginController(userService, sessionService)); - controllers.put("/user/list", new UserListController(userService, sessionService, objectMapper)); - return controllers; - } -} diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml deleted file mode 100644 index ed8ef09ef..000000000 --- a/src/main/resources/logback.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - %d{HH:mm:ss.SSS} [%-5level] [%thread] [%logger{36}] - %m%n - - - - - - - \ No newline at end of file diff --git a/src/test/java/coordinate/AbstractFigure.java b/src/test/java/coordinate/AbstractFigure.java deleted file mode 100644 index 80d6e69bc..000000000 --- a/src/test/java/coordinate/AbstractFigure.java +++ /dev/null @@ -1,24 +0,0 @@ -package coordinate; - -import java.util.List; - -public abstract class AbstractFigure implements Figure { - private final List points; - - public AbstractFigure(List points) { - if (points.size() != size()) { - throw new IllegalArgumentException(getName() + "의 길이는 " + size() + "이어야 합니다."); - } - - this.points = points; - } - - protected Point getPoint(int index) { - return points.get(index); - } - - @Override - public List getPoints() { - return points; - } -} diff --git a/src/test/java/coordinate/Figure.java b/src/test/java/coordinate/Figure.java deleted file mode 100644 index f8f005903..000000000 --- a/src/test/java/coordinate/Figure.java +++ /dev/null @@ -1,13 +0,0 @@ -package coordinate; - -import java.util.List; - -public interface Figure { - List getPoints(); - - int size(); - - String getName(); - - double area(); -} diff --git a/src/test/java/coordinate/FigureCreator.java b/src/test/java/coordinate/FigureCreator.java deleted file mode 100644 index 609104623..000000000 --- a/src/test/java/coordinate/FigureCreator.java +++ /dev/null @@ -1,7 +0,0 @@ -package coordinate; - -import java.util.List; - -public interface FigureCreator { - Figure create(List points); -} diff --git a/src/test/java/coordinate/FigureFactory.java b/src/test/java/coordinate/FigureFactory.java deleted file mode 100644 index d30c19e7c..000000000 --- a/src/test/java/coordinate/FigureFactory.java +++ /dev/null @@ -1,21 +0,0 @@ -package coordinate; - -import java.util.List; - -public class FigureFactory { - static Figure getInstance(List points) { - if (points.size() == 2) { - return new Line(points); - } - - if (points.size() == 3) { - return new Triangle(points); - } - - if (points.size() == 4) { - return new Rectangle(points); - } - - throw new IllegalArgumentException("유효하지 않은 도형입니다."); - } -} diff --git a/src/test/java/coordinate/FigureFactoryTest.java b/src/test/java/coordinate/FigureFactoryTest.java deleted file mode 100644 index 91d1a8ff4..000000000 --- a/src/test/java/coordinate/FigureFactoryTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package coordinate; - -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -public class FigureFactoryTest { - @Test - public void line() { - List points = Arrays.asList( - Point.of(1, 2), - Point.of(2, 3)); - - Figure figure = FigureFactory.getInstance(points); - assertThat(figure).isInstanceOfAny(Line.class); - assertThat(figure.getName()).isEqualTo("선"); - } - - @Test - public void triangle() { - List points = Arrays.asList( - Point.of(1, 1), - Point.of(4, 1), - Point.of(1, 4)); - - Figure figure = FigureFactory.getInstance(points); - assertThat(figure).isInstanceOfAny(Triangle.class); - assertThat(figure.getName()).isEqualTo("삼각형"); - } - - @Test - public void rectangle() { - List points = Arrays.asList( - Point.of(1, 1), - Point.of(4, 1), - Point.of(1, 4), - Point.of(4, 4)); - - Figure figure = FigureFactory.getInstance(points); - assertThat(figure).isInstanceOfAny(Rectangle.class); - assertThat(figure.getName()).isEqualTo("사각형"); - } -} diff --git a/src/test/java/coordinate/Line.java b/src/test/java/coordinate/Line.java deleted file mode 100644 index 1e0d4a5ec..000000000 --- a/src/test/java/coordinate/Line.java +++ /dev/null @@ -1,24 +0,0 @@ -package coordinate; - -import java.util.List; - -public class Line extends AbstractFigure { - public Line(List points) { - super(points); - } - - @Override - public int size() { - return 2; - } - - @Override - public String getName() { - return "선"; - } - - @Override - public double area() { - return 0; - } -} diff --git a/src/test/java/coordinate/Point.java b/src/test/java/coordinate/Point.java deleted file mode 100644 index 39b4888e3..000000000 --- a/src/test/java/coordinate/Point.java +++ /dev/null @@ -1,62 +0,0 @@ -package coordinate; - -import java.util.Objects; - -public class Point { - private final int x; - private final int y; - - private Point(int x, int y) { - this.x = x; - if (x < 0 || x > 24) { - throw new IllegalArgumentException(); - } - - this.y = y; - if (y < 0 || y > 24) { - throw new IllegalArgumentException(); - } - } - - public double getDistance(Point other) { - int xDifference = other.minusX(x); - int yDifference = other.minusY(y); - return Math.sqrt(square(xDifference) + square(yDifference)); - } - - private int minusX(int number) { - return this.x - number; - } - - private int minusY(int number) { - return this.y - number; - } - - private static int square(int number) { - return number * number; - } - - public static Point of(int x, int y) { - return new Point(x, y); - } - - public static Point ofCommaSeparator(String text) { - String[] values = text.split(","); - return new Point(Integer.parseInt(values[0]), Integer.parseInt(values[1])); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Point point = (Point) o; - return x == point.x && - y == point.y; - } - - @Override - public int hashCode() { - - return Objects.hash(x, y); - } -} diff --git a/src/test/java/coordinate/Rectangle.java b/src/test/java/coordinate/Rectangle.java deleted file mode 100644 index d87821c5f..000000000 --- a/src/test/java/coordinate/Rectangle.java +++ /dev/null @@ -1,24 +0,0 @@ -package coordinate; - -import java.util.List; - -public class Rectangle extends AbstractFigure { - public Rectangle(List points) { - super(points); - } - - @Override - public int size() { - return 4; - } - - @Override - public String getName() { - return "사각형"; - } - - @Override - public double area() { - return 0; - } -} diff --git a/src/test/java/coordinate/Triangle.java b/src/test/java/coordinate/Triangle.java deleted file mode 100644 index cb076dd56..000000000 --- a/src/test/java/coordinate/Triangle.java +++ /dev/null @@ -1,24 +0,0 @@ -package coordinate; - -import java.util.List; - -public class Triangle extends AbstractFigure { - public Triangle(List points) { - super(points); - } - - @Override - public int size() { - return 3; - } - - @Override - public String getName() { - return "삼각형"; - } - - @Override - public double area() { - return 0; - } -} diff --git a/src/test/java/utils/ExtensionTest.java b/src/test/java/utils/ExtensionTest.java deleted file mode 100644 index 996bdb57b..000000000 --- a/src/test/java/utils/ExtensionTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package utils; - -import static org.assertj.core.api.Assertions.*; - -import java.util.stream.Stream; - -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -class ExtensionTest { - @ParameterizedTest - @MethodSource("provideJSAndAnswer") - void isJS(String extension, boolean result) { - assertThat(Extension.isJS(extension)).isEqualTo(result); - } - - @ParameterizedTest - @MethodSource("provideCSSAndAnswer") - void isCSS(String extension, boolean result) { - assertThat(Extension.isCSS(extension)).isEqualTo(result); - } - - @ParameterizedTest - @MethodSource("provideHTMLAndAnswer") - void isHTML(String extension, boolean result) { - assertThat(Extension.isHTML(extension)).isEqualTo(result); - } - - private static Stream provideJSAndAnswer() { - return Stream.of( - Arguments.of("js", true), - Arguments.of("css", false) - ); - } - - private static Stream provideCSSAndAnswer() { - return Stream.of( - Arguments.of("css", true), - Arguments.of("js", false) - ); - } - - private static Stream provideHTMLAndAnswer() { - return Stream.of( - Arguments.of("html", true), - Arguments.of("js", false) - ); - } -}