|
${ 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 extends TypeElement> 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