From d20ac83fdd7d23fa49572fa7d686c68489087d9d Mon Sep 17 00:00:00 2001 From: NF-coder Date: Tue, 16 Sep 2025 08:53:47 +0300 Subject: [PATCH 1/2] Multiple small imprivements. They won't ruin all project, trust me --- httpd/static/index.html | 5 ++--- server/src/main/java/org/web1/Main.java | 9 +++------ .../src/main/java/org/web1/checkers/Checker.java | 14 ++++++-------- .../{GraphQuarters.java => PlotQuarters.java} | 2 +- .../utils/{GraphUtils.java => PlotUtils.java} | 12 ++++++------ ...esponseFactory.java => ResponseController.java} | 12 +++++------- 6 files changed, 23 insertions(+), 31 deletions(-) rename server/src/main/java/org/web1/checkers/utils/{GraphQuarters.java => PlotQuarters.java} (80%) rename server/src/main/java/org/web1/checkers/utils/{GraphUtils.java => PlotUtils.java} (53%) rename server/src/main/java/org/web1/utils/responce/{ResponseFactory.java => ResponseController.java} (77%) diff --git a/httpd/static/index.html b/httpd/static/index.html index b872632..efd1e9c 100644 --- a/httpd/static/index.html +++ b/httpd/static/index.html @@ -672,7 +672,7 @@

История введенных данных

- - + /* Анимации */ + @keyframes containerFadeIn { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } + } + + @keyframes errorSlideIn { + from { + transform: translateX(100%); + opacity: 0; + } + to { + transform: translateX(0); + opacity: 1; + } + } + + @keyframes errorFadeOut { + from { + opacity: 1; + } + to { + opacity: 0; + display: none; + } + } + -
- -
-

Решетников Сергей Евгеньевич

-

Группа: P3108

-

Вариант: 467233

-
- -
- - - - - - - - - - - - - - - - - - - - - - R - R/2 - -R/2 - -R - - X - - - R - R/2 - -R/2 - -R - - Y - - - - - - - - - - - - - - - - - - - -
- - -
-
-
- -
-
-

Выберите X:

-
-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
-
- - -
-
-

Выберете R:

-
-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
-
- - -
-
-

Выберете Y:

-
-
- -
-
-
- -
- -
-
-
- - -
-

История введенных данных

-
- - - - - - - - - - - - - - -
Дата и времяЗатраченное времяXYRРезультат
-
- История пуста. Заполните форму, чтобы добавить данные. -
-
- -
- -
-
-
- - +
+ +
+

Решетников Сергей Евгеньевич

+

Группа: P3108

+

Вариант: 467233

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + R + R/2 + -R/2 + -R + + X + + + R + R/2 + -R/2 + -R + + Y + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+

Выберите X:

+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+

Выберете R:

+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+

Выберете Y:

+
+
+ +
+
+
+ +
+ +
+
+
+ + +
+

История введенных данных

+
+ + + + + + + + + + + + + + +
Дата и времяЗатраченное времяXYRРезультат
+
+ История пуста. Заполните форму, чтобы добавить данные. +
+
+ +
+ +
+
+
+ + \ No newline at end of file diff --git a/server/src/main/java/org/web1/Main.java b/server/src/main/java/org/web1/Main.java index b3abff1..2397c72 100644 --- a/server/src/main/java/org/web1/Main.java +++ b/server/src/main/java/org/web1/Main.java @@ -1,15 +1,17 @@ package org.web1; -import com.fastcgi.*; +import com.fastcgi.FCGIInterface; import java.util.HashMap; import java.util.function.Function; +import java.util.logging.Logger; import org.validator.ValidatedRecordFactory; import org.validator.validation.exceptions.ValidationException; import org.web1.DTOs.RequestDTO; import org.web1.checkers.Checker; import org.web1.checkers.CheckerFunction; +import org.web1.utils.SimpleLogger; import org.web1.utils.mappers.JsonBuilder; import org.web1.utils.mappers.QueryStringToHashmap; import org.web1.utils.responce.ResponseController; @@ -23,6 +25,8 @@ public class Main { public static void main(String[] args) { FCGIInterface fastCGI = new FCGIInterface(); Timer timer = new Timer(); + Logger logger = SimpleLogger.create(); + ResponseController responseController = new ResponseController(logger); while (fastCGI.FCGIaccept() >= 0) { timer.start(); @@ -30,6 +34,7 @@ public static void main(String[] args) { final HashMap queryParams = parseQuery.apply( FCGIInterface.request.params.getProperty("QUERY_STRING") ); + logger.info("Received request with query: " + queryParams); try { RequestDTO requestData = ValidatedRecordFactory.create( @@ -45,18 +50,21 @@ public static void main(String[] args) { Float.parseFloat(requestData.R()) ); - ResponseController.send( + + responseController.send( new JsonBuilder() .add("result", checkResult) .add("elapsedTimeNs", timer.stop()), ResponseStatus.OK ); } catch (ValidationException e) { - ResponseController.send( + responseController.send( new JsonBuilder() .add("error", '"'+e.getMessage()+'"'), ResponseStatus.BAD_REQUEST ); + } catch (Exception e) { + logger.severe("Failed to process request: " + e.getMessage()); } } } diff --git a/server/src/main/java/org/web1/checkers/Checker.java b/server/src/main/java/org/web1/checkers/Checker.java index 4a34e2f..e6a1745 100644 --- a/server/src/main/java/org/web1/checkers/Checker.java +++ b/server/src/main/java/org/web1/checkers/Checker.java @@ -3,7 +3,7 @@ import org.web1.checkers.utils.PlotUtils; public class Checker implements CheckerFunction{ - public boolean test(int x, float y, float r) { + public boolean test(final int x, final float y, final float r) { final PlotQuarters quarter = PlotUtils.getQuarter(x, y); if (quarter == PlotQuarters.FIRST_QUADRANT) return firstQuarterTester(x, y, r); @@ -12,19 +12,19 @@ public boolean test(int x, float y, float r) { return forthQuarterTester(x, y, r); } - private boolean firstQuarterTester(int x, float y, float r) { - return x <= r/2 && y <= r; + private boolean firstQuarterTester(final int x, final float y, final float r) { + return x <= r / 2 && y <= r; } - private boolean secondQuarterTester(int x, float y, float r) { - return y <= (r/2 + 0.5f*x); + private boolean secondQuarterTester(final int x, final float y, final float r) { + return y <= (r / 2 + 0.5f * x); } - private boolean thirdQuarterTester(int x, float y, float r) { + private boolean thirdQuarterTester(final int x, final float y,final float r) { return false; } - private boolean forthQuarterTester(int x, float y, float r) { - return Math.sqrt(x*x + y*y) <= r/2; + private boolean forthQuarterTester(final int x, final float y, final float r) { + return Math.sqrt(x * x + y * y) <= r / 2; } } \ No newline at end of file diff --git a/server/src/main/java/org/web1/checkers/utils/PlotUtils.java b/server/src/main/java/org/web1/checkers/utils/PlotUtils.java index d6044c6..c0134be 100644 --- a/server/src/main/java/org/web1/checkers/utils/PlotUtils.java +++ b/server/src/main/java/org/web1/checkers/utils/PlotUtils.java @@ -1,7 +1,7 @@ package org.web1.checkers.utils; public class PlotUtils { - public static PlotQuarters getQuarter(int x, float y) { + public static PlotQuarters getQuarter(final int x, final float y) { boolean isXGraterOrEqualsZero = x >= 0; boolean isYGraterOrEqualsZero = y >= 0; diff --git a/server/src/main/java/org/web1/utils/SimpleLogger.java b/server/src/main/java/org/web1/utils/SimpleLogger.java new file mode 100644 index 0000000..a7dcd05 --- /dev/null +++ b/server/src/main/java/org/web1/utils/SimpleLogger.java @@ -0,0 +1,21 @@ +package org.web1.utils; + +import java.io.IOException; +import java.util.logging.*; + +public class SimpleLogger { + static Logger logger = Logger.getLogger(Logger.class.getName()); + + public static Logger create(){ + try { + Handler fileHandler = new FileHandler("log.log"); + fileHandler.setFormatter(fileHandler.getFormatter()); + logger.addHandler(fileHandler); + logger.setLevel(Level.INFO); + + return logger; + } catch (SecurityException | IOException e) { + throw new RuntimeException("Can't init logger"); + } + } +} \ No newline at end of file diff --git a/server/src/main/java/org/web1/utils/mappers/QueryStringToHashmap.java b/server/src/main/java/org/web1/utils/mappers/QueryStringToHashmap.java index 5c03c31..5bc2ada 100644 --- a/server/src/main/java/org/web1/utils/mappers/QueryStringToHashmap.java +++ b/server/src/main/java/org/web1/utils/mappers/QueryStringToHashmap.java @@ -4,7 +4,7 @@ import java.util.function.Function; public class QueryStringToHashmap implements Function> { - public HashMap apply(String jsonStr) { + public HashMap apply(final String jsonStr) { HashMap params = new HashMap<>(); String[] pairs = jsonStr.split("&"); // get key+value pairs string diff --git a/server/src/main/java/org/web1/utils/responce/ResponseController.java b/server/src/main/java/org/web1/utils/responce/ResponseController.java index 35f6b0b..005e7cb 100644 --- a/server/src/main/java/org/web1/utils/responce/ResponseController.java +++ b/server/src/main/java/org/web1/utils/responce/ResponseController.java @@ -2,8 +2,12 @@ import org.web1.utils.mappers.JsonBuilder; +import java.io.FileWriter; +import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.HashMap; +import java.util.logging.Level; +import java.util.logging.Logger; public class ResponseController { private static final String BASE_RESPONSE = """ @@ -16,20 +20,29 @@ public class ResponseController { %s"""; private static final HashMap responseStatus = new HashMap<>(); + private final Logger logger; static { responseStatus.put(ResponseStatus.BAD_REQUEST, "400"); responseStatus.put(ResponseStatus.OK, "200"); } - public static void send(JsonBuilder jsonBuilder, ResponseStatus status) { + public ResponseController(Logger logger) { + this.logger = logger; + } + + public void send(JsonBuilder jsonBuilder, ResponseStatus status) { String response = jsonBuilder.build(); - System.out.printf( - (BASE_RESPONSE), + String out = String.format( + BASE_RESPONSE, responseStatus.get(status), response.getBytes(StandardCharsets.UTF_8).length, response ); + + logger.info("Sending response: " + out); + + System.out.println(out); } } diff --git a/server/src/main/java/org/web1/utils/timer/Timer.java b/server/src/main/java/org/web1/utils/timer/Timer.java index 199e210..5e27275 100644 --- a/server/src/main/java/org/web1/utils/timer/Timer.java +++ b/server/src/main/java/org/web1/utils/timer/Timer.java @@ -1,7 +1,7 @@ package org.web1.utils.timer; public class Timer { - long startTime; + private long startTime; public void start() { this.startTime = System.nanoTime(); }