diff --git a/server/.idea/encodings.xml b/server/.idea/encodings.xml index aa00ffa..46ae1eb 100644 --- a/server/.idea/encodings.xml +++ b/server/.idea/encodings.xml @@ -1,7 +1,17 @@ + + + + + + + + + + \ No newline at end of file diff --git a/server/.idea/misc.xml b/server/.idea/misc.xml index 82dbec8..604268e 100644 --- a/server/.idea/misc.xml +++ b/server/.idea/misc.xml @@ -5,6 +5,7 @@ diff --git a/server/.idea/runConfigurations/build_lab2.xml b/server/.idea/runConfigurations/lab2_clean_install.xml similarity index 76% rename from server/.idea/runConfigurations/build_lab2.xml rename to server/.idea/runConfigurations/lab2_clean_install.xml index 23fde66..0a3beba 100644 --- a/server/.idea/runConfigurations/build_lab2.xml +++ b/server/.idea/runConfigurations/lab2_clean_install.xml @@ -1,5 +1,5 @@ - + diff --git a/server/docker/jsp-Dockerfile b/server/docker/jsp-Dockerfile index fdea693..4768d36 100644 --- a/server/docker/jsp-Dockerfile +++ b/server/docker/jsp-Dockerfile @@ -5,9 +5,10 @@ COPY pom.xml mvnw ./ COPY .mvn .mvn # copy source code -COPY src src +COPY validator-api validator-api +COPY server server RUN ./mvnw clean package FROM quay.io/wildfly/wildfly:latest-jdk17 WORKDIR server -COPY --from=build ./target/server-1.0.war /opt/jboss/wildfly/standalone/deployments/ROOT.war \ No newline at end of file +COPY --from=build ./server/target/server-1.0.war /opt/jboss/wildfly/standalone/deployments/ROOT.war \ No newline at end of file diff --git a/server/pom.xml b/server/pom.xml index ba86f35..0192371 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -5,9 +5,9 @@ 4.0.0 org.web2 - server + web2 1.0 - war + pom 17 @@ -15,31 +15,8 @@ UTF-8 - - - - jakarta.servlet - jakarta.servlet-api - 6.1.0 - provided - - - - - org.projectlombok - lombok - 1.18.42 - - - - - - - - org.apache.maven.plugins - maven-war-plugin - 3.4.0 - - - + + validator-api + server + \ No newline at end of file diff --git a/server/server/pom.xml b/server/server/pom.xml new file mode 100644 index 0000000..a427ec5 --- /dev/null +++ b/server/server/pom.xml @@ -0,0 +1,61 @@ + + + 4.0.0 + + org.web2 + server + 1.0 + war + + + 17 + 17 + UTF-8 + + + + + + jakarta.servlet + jakarta.servlet-api + 6.1.0 + provided + + + + + org.projectlombok + lombok + 1.18.42 + + + + org.web2 + validator-api + 1.0 + + + + + src + + + resources + + + + + + + org.apache.maven.plugins + maven-war-plugin + 3.4.0 + + webapp + + + + + \ No newline at end of file diff --git a/server/src/main/java/org/web2/controllers/ControllerServlet.java b/server/server/src/org/web2/controllers/ControllerServlet.java similarity index 100% rename from server/src/main/java/org/web2/controllers/ControllerServlet.java rename to server/server/src/org/web2/controllers/ControllerServlet.java diff --git a/server/src/main/java/org/web2/controllers/services/AreaCheckServlet.java b/server/server/src/org/web2/controllers/services/AreaCheckServlet.java similarity index 89% rename from server/src/main/java/org/web2/controllers/services/AreaCheckServlet.java rename to server/server/src/org/web2/controllers/services/AreaCheckServlet.java index ca4f7d3..d4d3985 100644 --- a/server/src/main/java/org/web2/controllers/services/AreaCheckServlet.java +++ b/server/server/src/org/web2/controllers/services/AreaCheckServlet.java @@ -1,6 +1,5 @@ package org.web2.controllers.services; - import jakarta.servlet.*; import jakarta.servlet.http.*; import jakarta.servlet.annotation.*; @@ -13,8 +12,8 @@ import org.web2.model.ResultBean; import java.io.IOException; +import java.util.ArrayDeque; import java.util.Date; -import java.util.ArrayList; @WebServlet("/check") public class AreaCheckServlet extends HttpServlet { @@ -33,7 +32,7 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se req.getParameter("R") ); - boolean hit = checker.test( + boolean hit = checker.check( Float.parseFloat(requestData.X()), Float.parseFloat(requestData.Y()), Integer.parseInt(requestData.R()) @@ -50,12 +49,12 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se HttpSession session = req.getSession(); @SuppressWarnings("unchecked") - ArrayList results = (ArrayList) session.getAttribute("results"); + ArrayDeque results = (ArrayDeque) session.getAttribute("results"); if (results == null) { - results = new ArrayList<>(); + results = new ArrayDeque<>(); } - results.add(newResult); + results.addFirst(newResult); session.setAttribute("results", results); session.setAttribute("lastResult", newResult); diff --git a/server/src/main/java/org/web2/controllers/services/DTOs/AreaCheckRequestDTO.java b/server/server/src/org/web2/controllers/services/DTOs/AreaCheckRequestDTO.java similarity index 100% rename from server/src/main/java/org/web2/controllers/services/DTOs/AreaCheckRequestDTO.java rename to server/server/src/org/web2/controllers/services/DTOs/AreaCheckRequestDTO.java diff --git a/server/src/main/java/org/web2/controllers/services/checkers/Checker.java b/server/server/src/org/web2/controllers/services/checkers/Checker.java similarity index 90% rename from server/src/main/java/org/web2/controllers/services/checkers/Checker.java rename to server/server/src/org/web2/controllers/services/checkers/Checker.java index 6a56146..1753503 100644 --- a/server/src/main/java/org/web2/controllers/services/checkers/Checker.java +++ b/server/server/src/org/web2/controllers/services/checkers/Checker.java @@ -4,7 +4,11 @@ import org.web2.controllers.services.checkers.utils.PlotUtils; public class Checker implements CheckerFunction{ - public boolean test(final float x, final float y, final int r) { + public boolean check( + final float x, + final float y, + final int r + ) { final PlotQuarters quarter = PlotUtils.getQuarter(x, y); if (quarter == PlotQuarters.FIRST_QUADRANT) return firstQuarterTester(x, y, r); diff --git a/server/src/main/java/org/web2/controllers/services/checkers/CheckerFunction.java b/server/server/src/org/web2/controllers/services/checkers/CheckerFunction.java similarity index 70% rename from server/src/main/java/org/web2/controllers/services/checkers/CheckerFunction.java rename to server/server/src/org/web2/controllers/services/checkers/CheckerFunction.java index cbacda7..f4df218 100644 --- a/server/src/main/java/org/web2/controllers/services/checkers/CheckerFunction.java +++ b/server/server/src/org/web2/controllers/services/checkers/CheckerFunction.java @@ -2,5 +2,5 @@ @FunctionalInterface public interface CheckerFunction { - boolean test(float x, float y, int r); + boolean check(float x, float y, int r); } diff --git a/server/src/main/java/org/web2/controllers/services/checkers/utils/PlotQuarters.java b/server/server/src/org/web2/controllers/services/checkers/utils/PlotQuarters.java similarity index 100% rename from server/src/main/java/org/web2/controllers/services/checkers/utils/PlotQuarters.java rename to server/server/src/org/web2/controllers/services/checkers/utils/PlotQuarters.java diff --git a/server/server/src/org/web2/controllers/services/checkers/utils/PlotUtils.java b/server/server/src/org/web2/controllers/services/checkers/utils/PlotUtils.java new file mode 100644 index 0000000..85d48c4 --- /dev/null +++ b/server/server/src/org/web2/controllers/services/checkers/utils/PlotUtils.java @@ -0,0 +1,13 @@ +package org.web2.controllers.services.checkers.utils; + +public class PlotUtils { + public static PlotQuarters getQuarter(final float x, final float y) { + boolean xSign = x >= 0; + boolean ySign = y >= 0; + + if (xSign && ySign) return PlotQuarters.FIRST_QUADRANT; + else if (xSign && !ySign) return PlotQuarters.SECOND_QUADRANT; // читабельность важнее + else if (!xSign && !ySign) return PlotQuarters.THIRD_QUADRANT; // читабельность важнее + return PlotQuarters.FOURTH_QUADRANT; + } +} diff --git a/server/src/main/java/org/web2/controllers/services/utils/logging/SimpleLogger.java b/server/server/src/org/web2/controllers/services/utils/logging/SimpleLogger.java similarity index 100% rename from server/src/main/java/org/web2/controllers/services/utils/logging/SimpleLogger.java rename to server/server/src/org/web2/controllers/services/utils/logging/SimpleLogger.java diff --git a/server/src/main/java/org/web2/controllers/services/utils/logging/SimpleLoggerFormatter.java b/server/server/src/org/web2/controllers/services/utils/logging/SimpleLoggerFormatter.java similarity index 100% rename from server/src/main/java/org/web2/controllers/services/utils/logging/SimpleLoggerFormatter.java rename to server/server/src/org/web2/controllers/services/utils/logging/SimpleLoggerFormatter.java diff --git a/server/src/main/java/org/web2/controllers/services/utils/time/Stopwatch.java b/server/server/src/org/web2/controllers/services/utils/time/Stopwatch.java similarity index 100% rename from server/src/main/java/org/web2/controllers/services/utils/time/Stopwatch.java rename to server/server/src/org/web2/controllers/services/utils/time/Stopwatch.java diff --git a/server/src/main/java/org/web2/model/ResultBean.java b/server/server/src/org/web2/model/ResultBean.java similarity index 100% rename from server/src/main/java/org/web2/model/ResultBean.java rename to server/server/src/org/web2/model/ResultBean.java diff --git a/server/src/main/webapp/WEB-INF/web.xml b/server/server/webapp/WEB-INF/web.xml similarity index 100% rename from server/src/main/webapp/WEB-INF/web.xml rename to server/server/webapp/WEB-INF/web.xml diff --git a/server/src/main/webapp/assets/css/error.css b/server/server/webapp/assets/css/error.css similarity index 100% rename from server/src/main/webapp/assets/css/error.css rename to server/server/webapp/assets/css/error.css diff --git a/server/src/main/webapp/assets/css/history.css b/server/server/webapp/assets/css/history.css similarity index 100% rename from server/src/main/webapp/assets/css/history.css rename to server/server/webapp/assets/css/history.css diff --git a/server/src/main/webapp/assets/css/main.css b/server/server/webapp/assets/css/main.css similarity index 100% rename from server/src/main/webapp/assets/css/main.css rename to server/server/webapp/assets/css/main.css diff --git a/server/src/main/webapp/assets/css/plot.css b/server/server/webapp/assets/css/plot.css similarity index 100% rename from server/src/main/webapp/assets/css/plot.css rename to server/server/webapp/assets/css/plot.css diff --git a/server/src/main/webapp/assets/css/themes/default.css b/server/server/webapp/assets/css/themes/default.css similarity index 100% rename from server/src/main/webapp/assets/css/themes/default.css rename to server/server/webapp/assets/css/themes/default.css diff --git a/server/src/main/webapp/assets/img/logo.ico b/server/server/webapp/assets/img/logo.ico similarity index 100% rename from server/src/main/webapp/assets/img/logo.ico rename to server/server/webapp/assets/img/logo.ico diff --git a/server/src/main/webapp/index.jsp b/server/server/webapp/index.jsp similarity index 91% rename from server/src/main/webapp/index.jsp rename to server/server/webapp/index.jsp index 08cb4ea..78372c7 100644 --- a/server/src/main/webapp/index.jsp +++ b/server/server/webapp/index.jsp @@ -1,7 +1,6 @@ <%@ page contentType="text/html;charset=UTF-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<%@ taglib prefix="u" uri="utils" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> @@ -18,9 +17,8 @@ - - - + +
@@ -171,7 +169,7 @@ - + ${ res.elapsedTimeNs } ns @@ -200,10 +198,10 @@ diff --git a/server/src/main/java/org/web2/controllers/services/checkers/utils/PlotUtils.java b/server/src/main/java/org/web2/controllers/services/checkers/utils/PlotUtils.java deleted file mode 100644 index 6d8fb2d..0000000 --- a/server/src/main/java/org/web2/controllers/services/checkers/utils/PlotUtils.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.web2.controllers.services.checkers.utils; - -public class PlotUtils { - public static PlotQuarters getQuarter(final float x, final float y) { - boolean isXGraterOrEqualsZero = x >= 0; - boolean isYGraterOrEqualsZero = y >= 0; - - if (isXGraterOrEqualsZero && isYGraterOrEqualsZero) return PlotQuarters.FIRST_QUADRANT; - else if (isXGraterOrEqualsZero && !isYGraterOrEqualsZero) return PlotQuarters.SECOND_QUADRANT; // читабельность важнее - else if (!isXGraterOrEqualsZero && !isYGraterOrEqualsZero) return PlotQuarters.THIRD_QUADRANT; // читабельность важнее - return PlotQuarters.FOURTH_QUADRANT; - } -} diff --git a/server/src/main/java/org/web2/jstlUtils/JstlFunctions.java b/server/src/main/java/org/web2/jstlUtils/JstlFunctions.java deleted file mode 100644 index 3b81070..0000000 --- a/server/src/main/java/org/web2/jstlUtils/JstlFunctions.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.web2.jstlUtils; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class JstlFunctions { - public static List reverse(List list) { - if (list == null) { - return null; - } - List reversed = new ArrayList<>(list); - Collections.reverse(reversed); - return reversed; - } -} \ No newline at end of file diff --git a/server/src/main/webapp/WEB-INF/tld/utils.tld b/server/src/main/webapp/WEB-INF/tld/utils.tld deleted file mode 100644 index 7b83590..0000000 --- a/server/src/main/webapp/WEB-INF/tld/utils.tld +++ /dev/null @@ -1,17 +0,0 @@ - - - - 1.0 - utils - utils - - - reverse - org.web2.jstlUtils.JstlFunctions - - java.util.List reverse(java.util.List) - - - \ No newline at end of file diff --git a/server/src/main/webapp/js/form.js b/server/src/main/webapp/js/form.js deleted file mode 100644 index c4bb19e..0000000 --- a/server/src/main/webapp/js/form.js +++ /dev/null @@ -1,19 +0,0 @@ -class Form { - #formId - - constructor(formId){ - this.#formId = formId; - } - - send(X,Y,R){ - const form = document.getElementById(this.#formId); - - // X - form["X"].value = X.toFixed(2); - - // Y - document.querySelectorAll(`input[name="Y"][value="${Y}"]`)[0].checked = true; - - form.submit(); - } -} \ No newline at end of file diff --git a/server/validator-api/pom.xml b/server/validator-api/pom.xml new file mode 100644 index 0000000..8e22f21 --- /dev/null +++ b/server/validator-api/pom.xml @@ -0,0 +1,26 @@ + + + 4.0.0 + + org.web2 + validator-api + 1.0 + jar + + + 17 + 17 + UTF-8 + + + + src + + + resources + + + + \ No newline at end of file diff --git a/server/src/main/java/org/validator/ValidatedRecordFactory.java b/server/validator-api/src/org/validator/ValidatedRecordFactory.java similarity index 100% rename from server/src/main/java/org/validator/ValidatedRecordFactory.java rename to server/validator-api/src/org/validator/ValidatedRecordFactory.java diff --git a/server/src/main/java/org/validator/annotations/NotNull.java b/server/validator-api/src/org/validator/annotations/NotNull.java similarity index 73% rename from server/src/main/java/org/validator/annotations/NotNull.java rename to server/validator-api/src/org/validator/annotations/NotNull.java index 731af81..b3d1f59 100644 --- a/server/src/main/java/org/validator/annotations/NotNull.java +++ b/server/validator-api/src/org/validator/annotations/NotNull.java @@ -6,7 +6,11 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.FIELD, ElementType.RECORD_COMPONENT, ElementType.ANNOTATION_TYPE}) +@Target({ + ElementType.FIELD, + ElementType.RECORD_COMPONENT, + ElementType.ANNOTATION_TYPE +}) public @interface NotNull { String errorMsg() default "Field required"; } diff --git a/server/src/main/java/org/validator/annotations/Number.java b/server/validator-api/src/org/validator/annotations/Number.java similarity index 86% rename from server/src/main/java/org/validator/annotations/Number.java rename to server/validator-api/src/org/validator/annotations/Number.java index e92023f..de14530 100644 --- a/server/src/main/java/org/validator/annotations/Number.java +++ b/server/validator-api/src/org/validator/annotations/Number.java @@ -6,7 +6,11 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE}) +@Target({ + ElementType.FIELD, + ElementType.RECORD_COMPONENT, + ElementType.ANNOTATION_TYPE +}) @NotNull(errorMsg = "Number field is required") @Size(min = 1, errorMsg = "Number must not be empty") @Pattern(pattern = "^-?\\d+(\\.\\d+)?$", errorMsg = "Must be a valid number") diff --git a/server/src/main/java/org/validator/annotations/Pattern.java b/server/validator-api/src/org/validator/annotations/Pattern.java similarity index 75% rename from server/src/main/java/org/validator/annotations/Pattern.java rename to server/validator-api/src/org/validator/annotations/Pattern.java index ca18e9c..f245214 100644 --- a/server/src/main/java/org/validator/annotations/Pattern.java +++ b/server/validator-api/src/org/validator/annotations/Pattern.java @@ -6,7 +6,11 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.FIELD, ElementType.RECORD_COMPONENT, ElementType.ANNOTATION_TYPE}) +@Target({ + ElementType.FIELD, + ElementType.RECORD_COMPONENT, + ElementType.ANNOTATION_TYPE +}) @NotNull public @interface Pattern { String errorMsg() default "Pattern mismatch"; diff --git a/server/src/main/java/org/validator/annotations/Size.java b/server/validator-api/src/org/validator/annotations/Size.java similarity index 78% rename from server/src/main/java/org/validator/annotations/Size.java rename to server/validator-api/src/org/validator/annotations/Size.java index e923d5b..2658b96 100644 --- a/server/src/main/java/org/validator/annotations/Size.java +++ b/server/validator-api/src/org/validator/annotations/Size.java @@ -6,7 +6,11 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) -@Target({ElementType.FIELD, ElementType.RECORD_COMPONENT, ElementType.ANNOTATION_TYPE}) +@Target({ + ElementType.FIELD, + ElementType.RECORD_COMPONENT, + ElementType.ANNOTATION_TYPE +}) @NotNull public @interface Size { String errorMsg() default "String size must be between %d and %d"; diff --git a/server/src/main/java/org/validator/validation/ValidationController.java b/server/validator-api/src/org/validator/validation/ValidationController.java similarity index 86% rename from server/src/main/java/org/validator/validation/ValidationController.java rename to server/validator-api/src/org/validator/validation/ValidationController.java index ab89146..9c685f7 100644 --- a/server/src/main/java/org/validator/validation/ValidationController.java +++ b/server/validator-api/src/org/validator/validation/ValidationController.java @@ -7,6 +7,7 @@ import org.validator.validation.validators.*; import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Field; import java.util.HashMap; @@ -25,17 +26,15 @@ public static void validateObject(T object) { for (Field field : object.getClass().getDeclaredFields()) { try { field.setAccessible(true); - - Object value = field.get(object); - validateField(value, field.getAnnotations()); + validate(field, field.get(object)); } catch (IllegalAccessException e) { throw new RuntimeException("Failed to validate field: " + field.getName(), e); } } } - private static void validateField(Object value, T[] annotations) { - for (Annotation annotation : annotations) { + public static void validate(AnnotatedElement annotatedElement, Object value) { + for (Annotation annotation : annotatedElement.getAnnotations()) { validateAnnotation(annotation, value); } } diff --git a/server/src/main/java/org/validator/validation/exceptions/ValidationException.java b/server/validator-api/src/org/validator/validation/exceptions/ValidationException.java similarity index 100% rename from server/src/main/java/org/validator/validation/exceptions/ValidationException.java rename to server/validator-api/src/org/validator/validation/exceptions/ValidationException.java diff --git a/server/src/main/java/org/validator/validation/validators/NotNullValidator.java b/server/validator-api/src/org/validator/validation/validators/NotNullValidator.java similarity index 100% rename from server/src/main/java/org/validator/validation/validators/NotNullValidator.java rename to server/validator-api/src/org/validator/validation/validators/NotNullValidator.java diff --git a/server/src/main/java/org/validator/validation/validators/NumberValidator.java b/server/validator-api/src/org/validator/validation/validators/NumberValidator.java similarity index 100% rename from server/src/main/java/org/validator/validation/validators/NumberValidator.java rename to server/validator-api/src/org/validator/validation/validators/NumberValidator.java diff --git a/server/src/main/java/org/validator/validation/validators/PatternValidator.java b/server/validator-api/src/org/validator/validation/validators/PatternValidator.java similarity index 100% rename from server/src/main/java/org/validator/validation/validators/PatternValidator.java rename to server/validator-api/src/org/validator/validation/validators/PatternValidator.java diff --git a/server/src/main/java/org/validator/validation/validators/SizeValidator.java b/server/validator-api/src/org/validator/validation/validators/SizeValidator.java similarity index 100% rename from server/src/main/java/org/validator/validation/validators/SizeValidator.java rename to server/validator-api/src/org/validator/validation/validators/SizeValidator.java diff --git a/server/src/main/java/org/validator/validation/validators/Validator.java b/server/validator-api/src/org/validator/validation/validators/Validator.java similarity index 100% rename from server/src/main/java/org/validator/validation/validators/Validator.java rename to server/validator-api/src/org/validator/validation/validators/Validator.java diff --git a/server/validator-processor/pom.xml b/server/validator-processor/pom.xml new file mode 100644 index 0000000..3d3dd20 --- /dev/null +++ b/server/validator-processor/pom.xml @@ -0,0 +1,26 @@ + + + 4.0.0 + + org.web2 + validator-processor + 1.0 + jar + + + 17 + 17 + UTF-8 + + + + src + + + resources + + + + \ No newline at end of file diff --git a/server/validator-processor/resources/META-INF/services/javax.annotation.processing.Processor b/server/validator-processor/resources/META-INF/services/javax.annotation.processing.Processor new file mode 100644 index 0000000..3a3fbf5 --- /dev/null +++ b/server/validator-processor/resources/META-INF/services/javax.annotation.processing.Processor @@ -0,0 +1 @@ +org.processor.ValidatedProcessor \ No newline at end of file diff --git a/server/validator-processor/src/org/processor/Validated.java b/server/validator-processor/src/org/processor/Validated.java new file mode 100644 index 0000000..ac9b877 --- /dev/null +++ b/server/validator-processor/src/org/processor/Validated.java @@ -0,0 +1,7 @@ +package org.processor; + +import java.lang.annotation.*; + +@Retention(RetentionPolicy.SOURCE) +@Target(ElementType.TYPE) +public @interface Validated {} \ No newline at end of file diff --git a/server/validator-processor/src/org/processor/ValidatedProcessor.java b/server/validator-processor/src/org/processor/ValidatedProcessor.java new file mode 100644 index 0000000..9d37874 --- /dev/null +++ b/server/validator-processor/src/org/processor/ValidatedProcessor.java @@ -0,0 +1,67 @@ +package org.processor; + +import javax.annotation.processing.*; +import javax.lang.model.SourceVersion; +import javax.lang.model.element.*; +import javax.lang.model.util.ElementFilter; +import javax.tools.Diagnostic; +import javax.tools.JavaFileObject; +import java.io.Writer; +import java.util.List; +import java.util.Set; + +@SuppressWarnings("unused") +@SupportedAnnotationTypes("org.validator.annotations.Validated") +@SupportedSourceVersion(SourceVersion.RELEASE_17) +public class ValidatedProcessor extends AbstractProcessor { + + @Override + public boolean process(Set annotations, RoundEnvironment roundEnv) { + for (TypeElement annotation : annotations) { + for (Element element : roundEnv.getElementsAnnotatedWith(annotation)) { + if (element.getKind() != ElementKind.RECORD) continue; + + String pkg = processingEnv.getElementUtils().getPackageOf(element).getQualifiedName().toString(); + String recordName = element.getSimpleName().toString(); + String factoryName = recordName + "Factory"; + + List params = ElementFilter.recordComponentsIn(element.getEnclosedElements()); + + try { + JavaFileObject file = processingEnv.getFiler().createSourceFile(pkg + "." + factoryName); + try (Writer writer = file.openWriter()) { + + writer.write("package " + pkg + ";\n\n"); + writer.write("public class " + factoryName + " {\n"); + writer.write(" public static " + recordName + " create("); + + // Аргументы + for (int i = 0; i < params.size(); i++) { + RecordComponentElement param = params.get(i); + writer.write(param.asType() + " " + param.getSimpleName()); + if (i < params.size() - 1) writer.write(", "); + } + writer.write(") {\n"); + + writer.write(" " + recordName + " obj = new " + recordName + "("); + + for (int i = 0; i < params.size(); i++) { + writer.write(params.get(i).getSimpleName().toString()); + if (i < params.size() - 1) writer.write(", "); + } + + writer.write(");\n"); + writer.write(" org.validator.validation.ValidationController.validateObject(obj);\n"); + writer.write(" return obj;\n"); + writer.write(" }\n"); + writer.write("}\n"); + } + } catch (Exception e) { + processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, e.getMessage()); + } + } + } + + return true; + } +} \ No newline at end of file