From 955c44c1cbb14b8ee1fc58e2009605fb8c6e1716 Mon Sep 17 00:00:00 2001 From: Roman Yehorov Date: Sat, 22 Jun 2024 15:00:04 +0200 Subject: [PATCH 01/17] add class LogicServlet, modified main.css and index.jsp (added table with clickable cells) --- src/main/java/com/tictactoe/LogicServlet.java | 23 +++++++++++++++++++ src/main/webapp/index.jsp | 19 ++++++++++++++- src/main/webapp/static/main.css | 22 ++++++++++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/tictactoe/LogicServlet.java diff --git a/src/main/java/com/tictactoe/LogicServlet.java b/src/main/java/com/tictactoe/LogicServlet.java new file mode 100644 index 00000000..2aebb0cd --- /dev/null +++ b/src/main/java/com/tictactoe/LogicServlet.java @@ -0,0 +1,23 @@ +package com.tictactoe; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet(name = "LogicServlet", value = "/logic") +public class LogicServlet extends HttpServlet { + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + int index = getSelectedIndex(req); + resp.sendRedirect("/index.jsp"); + } + + private int getSelectedIndex(HttpServletRequest request) { + String click = request.getParameter("click"); + boolean isNumeric = click.chars().allMatch(Character::isDigit); + return isNumeric ? Integer.parseInt(click) : 0; + } +} diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp index 964cc071..3c878f33 100644 --- a/src/main/webapp/index.jsp +++ b/src/main/webapp/index.jsp @@ -3,11 +3,28 @@ + Tic-Tac-Toe

Tic-Tac-Toe

- + + + + + + + + + + + + + + + + +
012
345
678
From b4f7c886bac5006c6e18547bfc72f5d4ca64154e Mon Sep 17 00:00:00 2001 From: Roman Yehorov Date: Sat, 22 Jun 2024 15:31:54 +0200 Subject: [PATCH 05/17] add RestartServlet logic and restart button --- src/main/java/com/tictactoe/RestartServlet.java | 16 ++++++++++++++++ src/main/webapp/index.jsp | 15 ++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/tictactoe/RestartServlet.java diff --git a/src/main/java/com/tictactoe/RestartServlet.java b/src/main/java/com/tictactoe/RestartServlet.java new file mode 100644 index 00000000..3ebfb6fe --- /dev/null +++ b/src/main/java/com/tictactoe/RestartServlet.java @@ -0,0 +1,16 @@ +package com.tictactoe; + +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet(name = "RestartServlet", value = "/restart") +public class RestartServlet extends HttpServlet { + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { + req.getSession().invalidate(); + resp.sendRedirect("/start"); + } +} \ No newline at end of file diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp index 50cdf9e3..6c1faa4c 100644 --- a/src/main/webapp/index.jsp +++ b/src/main/webapp/index.jsp @@ -5,6 +5,7 @@ <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + Tic-Tac-Toe @@ -32,12 +33,24 @@

CROSSES WIN!

+

NOUGHTS WIN!

+
From 4dcc3b21c1a497b0ea5262b2758ba1d2b6938019 Mon Sep 17 00:00:00 2001 From: Roman Yehorov Date: Sat, 22 Jun 2024 15:35:19 +0200 Subject: [PATCH 06/17] add draw logic --- src/main/java/com/tictactoe/LogicServlet.java | 8 +++ src/main/webapp/index.jsp | 52 ++++++++++--------- 2 files changed, 36 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/tictactoe/LogicServlet.java b/src/main/java/com/tictactoe/LogicServlet.java index 67b482f1..1f83fb29 100644 --- a/src/main/java/com/tictactoe/LogicServlet.java +++ b/src/main/java/com/tictactoe/LogicServlet.java @@ -37,6 +37,14 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se if (checkWin(resp, currentSession, field)) { return; } + } else { + currentSession.setAttribute("draw", true); + + List data = field.getFieldData(); + + currentSession.setAttribute("data", data); + resp.sendRedirect("/index.jsp"); + return; } List data = field.getFieldData(); diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp index 6c1faa4c..98e3a1aa 100644 --- a/src/main/webapp/index.jsp +++ b/src/main/webapp/index.jsp @@ -10,7 +10,7 @@ Tic-Tac-Toe -

Tic-Tac-Toe

+

Tic-Tac-Toe

@@ -28,30 +28,34 @@
${data.get(0).getSign()}${data.get(8).getSign()}
- - + + - -

CROSSES WIN!

- -
- -

NOUGHTS WIN!

- -
- + +

CROSSES WIN!

+ +
+ +

NOUGHTS WIN!

+ +
+ +

IT'S A DRAW

+ +
+ \ No newline at end of file From 19cde4bbfe263b2e92bcac9c92759edbf0279213 Mon Sep 17 00:00:00 2001 From: Roman Yehorov Date: Sun, 23 Jun 2024 19:40:57 +0200 Subject: [PATCH 07/17] add Field tests & add dependency --- pom.xml | 13 +++ src/test/java/com/tictactoe/FieldTest.java | 96 ++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 src/test/java/com/tictactoe/FieldTest.java diff --git a/pom.xml b/pom.xml index cb226e88..aa46ff9f 100644 --- a/pom.xml +++ b/pom.xml @@ -28,6 +28,19 @@ jstl 1.2 + + org.junit.jupiter + junit-jupiter-api + 5.10.2 + test + + + org.junit.jupiter + junit-jupiter-params + 5.10.2 + test + + diff --git a/src/test/java/com/tictactoe/FieldTest.java b/src/test/java/com/tictactoe/FieldTest.java new file mode 100644 index 00000000..fe8e6898 --- /dev/null +++ b/src/test/java/com/tictactoe/FieldTest.java @@ -0,0 +1,96 @@ +package com.tictactoe; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.ValueSource; + +import java.util.Map; +import java.util.TreeMap; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertSame; + +class FieldTest { + + @Test + void allFieldCellsShouldBeEmptyWhenFieldCreated() { + Map field = new Field().getField(); + field.forEach((integer, sign) -> assertSame(sign, Sign.EMPTY)); + } + + @ParameterizedTest + @ValueSource(ints = {0, 1, 2, 3, 4, 5, 6, 7, 8}) + void shouldReturnRightEmptyFieldIndex(int fieldIndex) { + Field field = new Field(); + field.getField().forEach((integer, sign) -> { + if (integer != fieldIndex) { + field.getField().put(integer, Sign.CROSS); + } + }); + + assertEquals(fieldIndex, field.getEmptyFieldIndex()); + } + + @ParameterizedTest + @ValueSource(ints = {0, 1, 2, 3, 4, 5, 6, 7, 8}) + void getFieldData(int fieldIndex) { + Field field = new Field(); + field.getField().forEach((integer, sign) -> { + if (integer != fieldIndex) { + field.getField().put(integer, integer % 2 == 0 ? Sign.NOUGHT : Sign.CROSS); + } + }); + + Map expectedField = new TreeMap<>(); + for (int integer = 0; integer < 9; integer++) { + if (integer != fieldIndex) { + expectedField.put(integer, integer % 2 == 0 ? Sign.NOUGHT : Sign.CROSS); + } else { + expectedField.put(integer, Sign.EMPTY); + } + } + + assertEquals(expectedField, field.getField()); + } + + @ParameterizedTest + @CsvSource({ + "0, 1, 2", + "3, 4, 5", + "6, 7, 8", + "0, 3, 6", + "1, 4, 7", + "2, 5, 8", + "0, 4, 8", + "2, 4, 6" + }) + void shouldReturnCROSSSignWhenCalledCheckWin(int firstFieldIndex, int secondFieldIndex, int thirdFieldIndex) { + Field field = new Field(); + field.getField().put(firstFieldIndex, Sign.CROSS); + field.getField().put(secondFieldIndex, Sign.CROSS); + field.getField().put(thirdFieldIndex, Sign.CROSS); + + assertSame(Sign.CROSS, field.checkWin()); + } + + @ParameterizedTest + @CsvSource({ + "0, 1, 2", + "3, 4, 5", + "6, 7, 8", + "0, 3, 6", + "1, 4, 7", + "2, 5, 8", + "0, 4, 8", + "2, 4, 6" + }) + void shouldReturnNOUGHTSignWhenCalledCheckWin(int firstFieldIndex, int secondFieldIndex, int thirdFieldIndex) { + Field field = new Field(); + field.getField().put(firstFieldIndex, Sign.NOUGHT); + field.getField().put(secondFieldIndex, Sign.NOUGHT); + field.getField().put(thirdFieldIndex, Sign.NOUGHT); + + assertSame(Sign.NOUGHT, field.checkWin()); + } +} \ No newline at end of file From 602692a316f6c3af41831bddc6965eed1933454a Mon Sep 17 00:00:00 2001 From: Roman Yehorov Date: Sun, 23 Jun 2024 19:53:14 +0200 Subject: [PATCH 08/17] modify tests --- src/test/java/com/tictactoe/FieldTest.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/test/java/com/tictactoe/FieldTest.java b/src/test/java/com/tictactoe/FieldTest.java index fe8e6898..e5bfe39a 100644 --- a/src/test/java/com/tictactoe/FieldTest.java +++ b/src/test/java/com/tictactoe/FieldTest.java @@ -1,5 +1,6 @@ package com.tictactoe; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; @@ -13,16 +14,21 @@ class FieldTest { + public Field field; + @BeforeEach + void init() { + field = new Field(); + } + @Test void allFieldCellsShouldBeEmptyWhenFieldCreated() { - Map field = new Field().getField(); - field.forEach((integer, sign) -> assertSame(sign, Sign.EMPTY)); + Map fieldMap = field.getField(); + fieldMap.forEach((integer, sign) -> assertSame(sign, Sign.EMPTY)); } @ParameterizedTest @ValueSource(ints = {0, 1, 2, 3, 4, 5, 6, 7, 8}) void shouldReturnRightEmptyFieldIndex(int fieldIndex) { - Field field = new Field(); field.getField().forEach((integer, sign) -> { if (integer != fieldIndex) { field.getField().put(integer, Sign.CROSS); @@ -35,7 +41,6 @@ void shouldReturnRightEmptyFieldIndex(int fieldIndex) { @ParameterizedTest @ValueSource(ints = {0, 1, 2, 3, 4, 5, 6, 7, 8}) void getFieldData(int fieldIndex) { - Field field = new Field(); field.getField().forEach((integer, sign) -> { if (integer != fieldIndex) { field.getField().put(integer, integer % 2 == 0 ? Sign.NOUGHT : Sign.CROSS); @@ -66,7 +71,6 @@ void getFieldData(int fieldIndex) { "2, 4, 6" }) void shouldReturnCROSSSignWhenCalledCheckWin(int firstFieldIndex, int secondFieldIndex, int thirdFieldIndex) { - Field field = new Field(); field.getField().put(firstFieldIndex, Sign.CROSS); field.getField().put(secondFieldIndex, Sign.CROSS); field.getField().put(thirdFieldIndex, Sign.CROSS); @@ -86,7 +90,6 @@ void shouldReturnCROSSSignWhenCalledCheckWin(int firstFieldIndex, int secondFiel "2, 4, 6" }) void shouldReturnNOUGHTSignWhenCalledCheckWin(int firstFieldIndex, int secondFieldIndex, int thirdFieldIndex) { - Field field = new Field(); field.getField().put(firstFieldIndex, Sign.NOUGHT); field.getField().put(secondFieldIndex, Sign.NOUGHT); field.getField().put(thirdFieldIndex, Sign.NOUGHT); From 82def6a56e94c89b5417a6d1b9108ee336760af0 Mon Sep 17 00:00:00 2001 From: Roman Yehorov Date: Sun, 23 Jun 2024 23:59:54 +0200 Subject: [PATCH 09/17] add tests for LogicServlet --- pom.xml | 7 ++ .../java/com/tictactoe/LogicServletTest.java | 111 ++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 src/test/java/com/tictactoe/LogicServletTest.java diff --git a/pom.xml b/pom.xml index aa46ff9f..96a146e7 100644 --- a/pom.xml +++ b/pom.xml @@ -40,6 +40,13 @@ 5.10.2 test + + org.mockito + mockito-junit-jupiter + 5.12.0 + test + + diff --git a/src/test/java/com/tictactoe/LogicServletTest.java b/src/test/java/com/tictactoe/LogicServletTest.java new file mode 100644 index 00000000..5bf95154 --- /dev/null +++ b/src/test/java/com/tictactoe/LogicServletTest.java @@ -0,0 +1,111 @@ +package com.tictactoe; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.ValueSource; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import javax.servlet.RequestDispatcher; +import javax.servlet.ServletConfig; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class LogicServletTest { + + @Mock + public HttpServletRequest request; + @Mock + public HttpServletResponse response; + @Mock + public HttpSession session; + @Mock + public RequestDispatcher requestDispatcher; + @Mock + public ServletContext servletContext; + @Mock + public ServletConfig servletConfig; + + public LogicServlet logicServlet; + public Field field; + + @BeforeEach + void setUp() throws ServletException { + logicServlet = new LogicServlet(); + field = new Field(); + logicServlet.init(servletConfig); + when(request.getSession(true)).thenReturn(session); + when(session.getAttribute("field")).thenReturn(field); + } + + @ParameterizedTest + @ValueSource(ints = {0, 1, 2, 3, 4, 5, 6, 7, 8}) + void shouldNotChangeFieldWhenClickedNotOnEmptyCell_TestWithParams_doGet(int click) throws ServletException, IOException { + when(logicServlet.getServletContext()).thenReturn(servletContext); + when(logicServlet.getServletContext().getRequestDispatcher("/index.jsp")).thenReturn(requestDispatcher); + when(request.getParameter("click")).thenReturn(String.valueOf(click)); + + field.getField().put(click, Sign.CROSS); + + Field expectedField = field; + logicServlet.doGet(request, response); + + assertEquals(expectedField.getField(), field.getField()); + } + + @ParameterizedTest + @CsvSource({ + "0, 1, 2", + "3, 4, 5", + "6, 7, 8", + "0, 3, 6", + "1, 4, 7", + "2, 5, 8", + "0, 4, 8", + "2, 4, 6" + }) + void shouldStopGameWhenCrossWinnerExist_TestWithParams_doGet(int firstCell, int secondCell, int thirdCell) throws ServletException, IOException { + field.getField().put(firstCell, Sign.CROSS); + field.getField().put(secondCell, Sign.CROSS); + + when(request.getParameter("click")).thenReturn(String.valueOf(thirdCell)); + + logicServlet.doGet(request, response); + + verify(session).setAttribute("winner", Sign.CROSS); + } + + @ParameterizedTest + @CsvSource({ + "0, 1, 2", + "3, 4, 5", + "6, 7, 8", + "0, 3, 6", + "1, 4, 7", + "2, 5, 8", + "0, 4, 8", + "2, 4, 6" + }) + void shouldStopGameWhenNoughtWinnerExist_TestWithParams_doGet(int firstCell, int secondCell, int thirdCell) throws ServletException, IOException { + field.getField().put(firstCell, Sign.NOUGHT); + field.getField().put(secondCell, Sign.NOUGHT); + field.getField().put(thirdCell, Sign.NOUGHT); + + when(request.getParameter("click")).thenReturn(String.valueOf(field.getEmptyFieldIndex())); + + logicServlet.doGet(request, response); + + verify(session).setAttribute("winner", Sign.NOUGHT); + } +} \ No newline at end of file From aa2a426f9f5645ddd82c0b73bf156c911ef6df37 Mon Sep 17 00:00:00 2001 From: Roman Yehorov Date: Mon, 24 Jun 2024 00:01:59 +0200 Subject: [PATCH 10/17] delete unused variable --- src/main/java/com/tictactoe/InitServlet.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/tictactoe/InitServlet.java b/src/main/java/com/tictactoe/InitServlet.java index f4bf2c6a..8666dcbe 100644 --- a/src/main/java/com/tictactoe/InitServlet.java +++ b/src/main/java/com/tictactoe/InitServlet.java @@ -8,7 +8,6 @@ import javax.servlet.http.HttpSession; import java.io.IOException; import java.util.List; -import java.util.Map; @WebServlet(name = "InitServlet", value = "/start") public class InitServlet extends HttpServlet { @@ -17,7 +16,6 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se HttpSession currentSession = req.getSession(true); Field field = new Field(); - Map fieldData = field.getField(); List data = field.getFieldData(); From c79164f841ddd9e57311bc8e24a4ef14ab8ac42a Mon Sep 17 00:00:00 2001 From: Roman Yehorov Date: Tue, 25 Jun 2024 21:56:55 +0200 Subject: [PATCH 11/17] add conf file and dependencies for logs --- pom.xml | 12 ++++++++++-- src/main/resources/log4j2.xml | 23 +++++++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/log4j2.xml diff --git a/pom.xml b/pom.xml index 96a146e7..34647798 100644 --- a/pom.xml +++ b/pom.xml @@ -46,8 +46,16 @@ 5.12.0 test - - + + org.apache.logging.log4j + log4j-core + 2.20.0 + + + org.apache.logging.log4j + log4j-api + 2.20.0 + diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml new file mode 100644 index 00000000..0d7a893d --- /dev/null +++ b/src/main/resources/log4j2.xml @@ -0,0 +1,23 @@ + + + %date %level %logger{10} [%file:%line] %msg%n + C:/Main/project-servlet + + + + + + + + + + + + + + + + + + \ No newline at end of file From d88c1cc68dbe54d372f57a1fe970e148ae1ba09a Mon Sep 17 00:00:00 2001 From: Roman Yehorov Date: Tue, 25 Jun 2024 21:57:59 +0200 Subject: [PATCH 12/17] fix win checking --- src/main/java/com/tictactoe/Field.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/tictactoe/Field.java b/src/main/java/com/tictactoe/Field.java index c52d2a0d..f0076344 100644 --- a/src/main/java/com/tictactoe/Field.java +++ b/src/main/java/com/tictactoe/Field.java @@ -52,7 +52,8 @@ public Sign checkWin() { ); for (List winPossibility : winPossibilities) { - if (field.get(winPossibility.get(0)) == field.get(winPossibility.get(1)) + if (field.get(winPossibility.get(0)) != Sign.EMPTY + && field.get(winPossibility.get(0)) == field.get(winPossibility.get(1)) && field.get(winPossibility.get(0)) == field.get(winPossibility.get(2))) { return field.get(winPossibility.get(0)); } From 0b21f95c8d5588bd910b73aa69bf52c7a2fecdef Mon Sep 17 00:00:00 2001 From: Roman Yehorov Date: Tue, 25 Jun 2024 21:58:30 +0200 Subject: [PATCH 13/17] add logs for InitServlet --- src/main/java/com/tictactoe/InitServlet.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/tictactoe/InitServlet.java b/src/main/java/com/tictactoe/InitServlet.java index 8666dcbe..8ecfee10 100644 --- a/src/main/java/com/tictactoe/InitServlet.java +++ b/src/main/java/com/tictactoe/InitServlet.java @@ -1,5 +1,8 @@ package com.tictactoe; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; @@ -11,6 +14,8 @@ @WebServlet(name = "InitServlet", value = "/start") public class InitServlet extends HttpServlet { + private static final Logger LOGGER = LogManager.getLogger(InitServlet.class); + @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession currentSession = req.getSession(true); @@ -22,6 +27,7 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se currentSession.setAttribute("field", field); currentSession.setAttribute("data", data); + LOGGER.info("Game started, field initialized"); getServletContext().getRequestDispatcher("/index.jsp").forward(req, resp); } } From b7b156832b0f9b9d92ca36871f9a06c64215b693 Mon Sep 17 00:00:00 2001 From: Roman Yehorov Date: Tue, 25 Jun 2024 21:58:54 +0200 Subject: [PATCH 14/17] add logs for LogicServlet --- src/main/java/com/tictactoe/LogicServlet.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/com/tictactoe/LogicServlet.java b/src/main/java/com/tictactoe/LogicServlet.java index 1f83fb29..938fd0ae 100644 --- a/src/main/java/com/tictactoe/LogicServlet.java +++ b/src/main/java/com/tictactoe/LogicServlet.java @@ -1,5 +1,8 @@ package com.tictactoe; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; @@ -12,6 +15,8 @@ @WebServlet(name = "LogicServlet", value = "/logic") public class LogicServlet extends HttpServlet { + private static final Logger LOGGER = LogManager.getLogger(LogicServlet.class); + @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession currentSession = req.getSession(true); @@ -21,6 +26,7 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se Sign currentSign = field.getField().get(index); if (Sign.EMPTY != currentSign) { + LOGGER.debug("Clicked on not EMPTY sign"); RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/index.jsp"); dispatcher.forward(req, resp); return; @@ -28,6 +34,8 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se field.getField().put(index, Sign.CROSS); if (checkWin(resp, currentSession, field)) { + LOGGER.info("Game ended"); + LOGGER.debug("Player won"); return; } @@ -35,6 +43,8 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se if (emptyFieldIndex >= 0) { field.getField().put(emptyFieldIndex, Sign.NOUGHT); if (checkWin(resp, currentSession, field)) { + LOGGER.info("Game ended"); + LOGGER.debug("Computer won"); return; } } else { @@ -59,6 +69,7 @@ private Field extractField(HttpSession currentSession) { Object fieldAttribute = currentSession.getAttribute("field"); if (fieldAttribute.getClass() != Field.class) { currentSession.invalidate(); + LOGGER.error("Session is broken"); throw new RuntimeException("Session is broken, try one more time"); } return (Field) fieldAttribute; From c76e4574b8b6c4ed9be8296bad7ae7b0d88b8644 Mon Sep 17 00:00:00 2001 From: Roman Yehorov Date: Tue, 25 Jun 2024 21:59:18 +0200 Subject: [PATCH 15/17] add logs for RestartServlet --- src/main/java/com/tictactoe/RestartServlet.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/tictactoe/RestartServlet.java b/src/main/java/com/tictactoe/RestartServlet.java index 3ebfb6fe..154ba3f9 100644 --- a/src/main/java/com/tictactoe/RestartServlet.java +++ b/src/main/java/com/tictactoe/RestartServlet.java @@ -1,5 +1,8 @@ package com.tictactoe; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -8,9 +11,12 @@ @WebServlet(name = "RestartServlet", value = "/restart") public class RestartServlet extends HttpServlet { + private static final Logger LOGGER = LogManager.getLogger(RestartServlet.class); + @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { req.getSession().invalidate(); resp.sendRedirect("/start"); + LOGGER.info("Game restarted"); } } \ No newline at end of file From 8b085168e199138c79e348ce3044e990aeb39304 Mon Sep 17 00:00:00 2001 From: Roman Yehorov <62105686+5arav031k@users.noreply.github.com> Date: Fri, 5 Jul 2024 12:25:50 +0200 Subject: [PATCH 16/17] Create README.md --- README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..05034e1d --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +Game "Tic-Tac-Toe" with simple HTML and CSS, using Servlets and JSP. From b9cd8ebca91630efb4d950d4e3f995cf2bbf5672 Mon Sep 17 00:00:00 2001 From: Roman Yehorov <62105686+5arav031k@users.noreply.github.com> Date: Fri, 5 Jul 2024 12:29:38 +0200 Subject: [PATCH 17/17] Delete README.md --- README.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index 05034e1d..00000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -Game "Tic-Tac-Toe" with simple HTML and CSS, using Servlets and JSP.