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

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -57,15 +57,19 @@
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<artifactId>junit-jupiter-params</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<scope>test</scope>
</dependency>

</dependencies>

<build>
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/com/javarush/buslovskii/command/Command.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.javarush.buslovskii.command;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

public interface Command {
String execute(HttpServletRequest request, HttpServletResponse response) throws Exception;
}
39 changes: 39 additions & 0 deletions src/main/java/com/javarush/buslovskii/command/CommandFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.javarush.buslovskii.command;

import java.util.HashMap;
import java.util.Map;

public class CommandFactory {

private static CommandFactory instance;
private Map<String, Command> commands;

private CommandFactory() {
commands = new HashMap<>();
commands.put("start", new StartCommand());
commands.put("game", new GameCommand());
commands.put("restart", new RestartCommand());
commands.put("selectquest", new SelectQuestCommand());
commands.put("selectQuest", new SelectQuestCommand());
}

public static synchronized CommandFactory getInstance() {
if (instance == null) {
instance = new CommandFactory();
}
return instance;
}

public Command getCommand(String commandName) {
if (commandName == null || commandName.isEmpty()) {
return new StartCommand();
}

Command command = commands.get(commandName.toLowerCase());
if (command == null) {
command = new UnknownCommand();
}

return command;
}
}
103 changes: 103 additions & 0 deletions src/main/java/com/javarush/buslovskii/command/GameCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
package com.javarush.buslovskii.command;

import com.javarush.buslovskii.model.GameState;
import com.javarush.buslovskii.model.Quest;
import com.javarush.buslovskii.model.Question;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

public class GameCommand implements Command {

@Override
public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpSession session = request.getSession();
GameState gameState = (GameState) session.getAttribute("gameState");
Quest currentQuest = (Quest) session.getAttribute("currentQuest");

if (gameState == null) {
return "redirect:/start";
}

if (currentQuest == null) {
return "redirect:/selectQuest";
}

String method = request.getMethod();

if ("POST".equalsIgnoreCase(method)) {
String choiceParam = request.getParameter("choice");
if (choiceParam != null) {
try {
int choice = Integer.parseInt(choiceParam);
int currentQuestionId = gameState.getCurrentQuestionId();

Question currentQuestion = currentQuest.getQuestions().get(currentQuestionId);
if (currentQuestion == null) {
return "redirect:/selectQuest";
}

int nextQuestionId;
if (choice == 1) {
nextQuestionId = currentQuestion.getNextIdOption1();
} else {
nextQuestionId = currentQuestion.getNextIdOption2();
}

Question nextQuestion = currentQuest.getQuestions().get(nextQuestionId);
if (nextQuestion == null) {
return "redirect:/selectQuest";
}

gameState.setCurrentQuestionId(nextQuestionId);

if (nextQuestion.isFinal()) {
gameState.setGameOver(true);

boolean victory = currentQuest.isVictory(nextQuestionId);
gameState.setVictory(victory);

if (victory) {
gameState.addWin();
session.setAttribute("finalMessage", currentQuest.getVictoryMessage(nextQuestionId));
} else {
gameState.addLoss();
session.setAttribute("finalMessage", currentQuest.getDefeatMessage(nextQuestionId));
}

gameState.incrementGamesPlayed();
return "redirect:/game?result=final";
}
} catch (NumberFormatException e) {
return "redirect:/game";
}
}
return "redirect:/game";
}

if (gameState.isGameOver()) {
Question currentQuestion = currentQuest.getQuestions().get(gameState.getCurrentQuestionId());
if (currentQuestion == null) {
return "redirect:/selectQuest";
}
request.setAttribute("question", currentQuestion);

String finalMessage = (String) session.getAttribute("finalMessage");
if (finalMessage != null) {
request.setAttribute("finalMessage", finalMessage);
session.removeAttribute("finalMessage");
}

return "/result.jsp";
}

Question currentQuestion = currentQuest.getQuestions().get(gameState.getCurrentQuestionId());
if (currentQuestion == null) {
return "redirect:/selectQuest";
}

request.setAttribute("question", currentQuestion);
request.setAttribute("quest", currentQuest);
return "/game.jsp";
}
}
28 changes: 28 additions & 0 deletions src/main/java/com/javarush/buslovskii/command/RestartCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.javarush.buslovskii.command;

import com.javarush.buslovskii.model.GameState;
import com.javarush.buslovskii.model.Quest;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

public class RestartCommand implements Command {

@Override
public String execute(HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession();
GameState gameState = (GameState) session.getAttribute("gameState");
Quest currentQuest = (Quest) session.getAttribute("currentQuest");

if (gameState != null && currentQuest != null) {
gameState.setCurrentQuestionId(1);
gameState.setGameOver(false);
gameState.setVictory(false);
session.removeAttribute("finalMessage");
} else {
return "redirect:/start";
}

return "redirect:/game";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.javarush.buslovskii.command;

import com.javarush.buslovskii.model.GameState;
import com.javarush.buslovskii.model.Quest;
import com.javarush.buslovskii.model.QuestManager;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

public class SelectQuestCommand implements Command {

@Override
public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpSession session = request.getSession();
GameState gameState = (GameState) session.getAttribute("gameState");
QuestManager questManager = QuestManager.getInstance();

if (gameState == null) {
return "redirect:/start";
}

String method = request.getMethod();

if ("POST".equalsIgnoreCase(method)) {
String questId = request.getParameter("questId");
if (questId == null || questId.trim().isEmpty()) {
// Если ID не выбран, показываем список снова
request.setAttribute("quests", questManager.getAllQuests());
request.setAttribute("questStats", questManager.getAllQuestStats());
return "/quest-selection.jsp";
}

Quest selectedQuest = questManager.getQuest(questId);

if (selectedQuest != null) {
session.setAttribute("currentQuest", selectedQuest);
gameState.setCurrentQuestId(questId);
gameState.setCurrentQuestionId(1);
gameState.setGameOver(false);
gameState.setVictory(false);

questManager.incrementQuestPlays(questId);

return "redirect:/game";
}
}

request.setAttribute("quests", questManager.getAllQuests());
request.setAttribute("questStats", questManager.getAllQuestStats());
return "/quest-selection.jsp";
}
}
33 changes: 33 additions & 0 deletions src/main/java/com/javarush/buslovskii/command/StartCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.javarush.buslovskii.command;

import com.javarush.buslovskii.model.GameState;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

public class StartCommand implements Command {

@Override
public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
String method = request.getMethod();

if ("POST".equalsIgnoreCase(method)) {
String playerName = request.getParameter("playerName");

if (playerName == null || playerName.trim().isEmpty()) {
playerName = "Игрок";
}

HttpSession session = request.getSession();

GameState gameState = new GameState();
gameState.setPlayerName(playerName.trim());

session.setAttribute("gameState", gameState);

return "redirect:/selectQuest";
}

return "/index.jsp";
}
}
12 changes: 12 additions & 0 deletions src/main/java/com/javarush/buslovskii/command/UnknownCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.javarush.buslovskii.command;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

public class UnknownCommand implements Command {

@Override
public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
return "redirect:/start";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package com.javarush.buslovskii.controller;

import com.javarush.buslovskii.command.Command;
import com.javarush.buslovskii.command.CommandFactory;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/")
public class FrontControllerServlet extends HttpServlet {

private CommandFactory commandFactory;

@Override
public void init() throws ServletException {
commandFactory = CommandFactory.getInstance();
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

private void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

String path = getCommandPath(request);
Command command = commandFactory.getCommand(path);

try {
String view = command.execute(request, response);

if (view.startsWith("redirect:")) {
String redirectPath = view.substring("redirect:".length());
response.sendRedirect(request.getContextPath() + redirectPath);
} else {
request.getRequestDispatcher(view).forward(request, response);
}
} catch (Exception e) {
throw new ServletException("Error executing command", e);
}
}

private String getCommandPath(HttpServletRequest request) {
String uri = request.getRequestURI();
String contextPath = request.getContextPath();

String path = uri.substring(contextPath.length());

if (path.startsWith("/")) {
path = path.substring(1);
}

if (path.isEmpty() || path.equals("favicon.ico")) {
return "start";
}

if (path.contains("?")) {
path = path.substring(0, path.indexOf("?"));
}
if (path.contains("#")) {
path = path.substring(0, path.indexOf("#"));
}

if (path.contains(".")) {
path = path.substring(0, path.indexOf("."));
}

return path;
}
}
Loading