diff --git a/src/org/kar/archidata/annotation/AnnotationTools.java b/src/org/kar/archidata/annotation/AnnotationTools.java index 698ddd3..eb5ff5b 100644 --- a/src/org/kar/archidata/annotation/AnnotationTools.java +++ b/src/org/kar/archidata/annotation/AnnotationTools.java @@ -189,6 +189,14 @@ public class AnnotationTools { return (DataJson) annotation[0]; } + public static Checker[] getCheckers(final Field element) { + final Annotation[] annotation = element.getDeclaredAnnotationsByType(Checker.class); + if (annotation.length == 0) { + return null; + } + return (Checker[]) annotation; + } + public static Long getConstraintsMax(final Field element) { final Annotation[] annotation = element.getDeclaredAnnotationsByType(Max.class); if (annotation.length == 0) { diff --git a/src/org/kar/archidata/annotation/Checker.java b/src/org/kar/archidata/annotation/Checker.java new file mode 100644 index 0000000..750a1de --- /dev/null +++ b/src/org/kar/archidata/annotation/Checker.java @@ -0,0 +1,14 @@ +package org.kar.archidata.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.kar.archidata.dataAccess.options.CheckFunctionInterface; + +@Target({ ElementType.TYPE, ElementType.FIELD }) +@Retention(RetentionPolicy.RUNTIME) +public @interface Checker { + Class value(); +} diff --git a/src/org/kar/archidata/annotation/DataJson.java b/src/org/kar/archidata/annotation/DataJson.java index 61bd08c..b133dc9 100644 --- a/src/org/kar/archidata/annotation/DataJson.java +++ b/src/org/kar/archidata/annotation/DataJson.java @@ -5,13 +5,8 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import org.kar.archidata.dataAccess.options.CheckFunctionInterface; -import org.kar.archidata.dataAccess.options.CheckFunctionVoid; - @Target({ ElementType.TYPE, ElementType.FIELD }) @Retention(RetentionPolicy.RUNTIME) public @interface DataJson { - Class checker() default CheckFunctionVoid.class; - Class targetEntity() default Void.class; } diff --git a/src/org/kar/archidata/dataAccess/options/CheckFunctionInterface.java b/src/org/kar/archidata/dataAccess/options/CheckFunctionInterface.java index 06e3881..0ac9bc8 100644 --- a/src/org/kar/archidata/dataAccess/options/CheckFunctionInterface.java +++ b/src/org/kar/archidata/dataAccess/options/CheckFunctionInterface.java @@ -9,7 +9,7 @@ import org.kar.archidata.dataAccess.QueryOptions; /** By default some element are not read like createAt and UpdatedAt. This option permit to read it. */ public interface CheckFunctionInterface { /** This function implementation is design to check if the updated class is valid of not for insertion - * @param baseName NAme of the object to be precise with the use of what fail. + * @param baseName Name of the object to be precise with the use of what fail. * @param data The object that might be injected. * @param modifiedValue List of fields that might be check. If null, then all column must be checked. * @throws Exception Exception is generate if the data are incorrect. */ diff --git a/src/org/kar/archidata/dataAccess/options/CheckJPA.java b/src/org/kar/archidata/dataAccess/options/CheckJPA.java index 9ddf71a..f615f9d 100644 --- a/src/org/kar/archidata/dataAccess/options/CheckJPA.java +++ b/src/org/kar/archidata/dataAccess/options/CheckJPA.java @@ -16,10 +16,10 @@ import java.util.UUID; import java.util.regex.Pattern; import org.kar.archidata.annotation.AnnotationTools; +import org.kar.archidata.annotation.Checker; import org.kar.archidata.annotation.CollectionItemNotNull; import org.kar.archidata.annotation.CollectionItemUnique; import org.kar.archidata.annotation.CollectionNotEmpty; -import org.kar.archidata.annotation.DataJson; import org.kar.archidata.dataAccess.DBAccess; import org.kar.archidata.dataAccess.DataAccess; import org.kar.archidata.dataAccess.QueryCondition; @@ -29,8 +29,6 @@ import org.kar.archidata.exception.InputException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.fasterxml.jackson.annotation.JsonValue; - import jakarta.persistence.ManyToOne; import jakarta.validation.constraints.Size; @@ -458,68 +456,57 @@ public class CheckJPA implements CheckFunctionInterface { } }); } - } else if (type == JsonValue.class) { - final DataJson jsonAnnotation = AnnotationTools.getDataJson(field); - if (jsonAnnotation != null && jsonAnnotation.checker() != CheckFunctionVoid.class) { - // Here if we have an error it crash at start and no new instance after creation... - final CheckFunctionInterface instance = jsonAnnotation.checker().getDeclaredConstructor() - .newInstance(); - add(fieldName, - ( - final DBAccess ioDb, - final String baseName, - final T data, - final List modifiedValue, - final QueryOptions options) -> { - instance.checkAll(ioDb, baseName + fieldName + ".", field.get(data), options); - }); - } } else if (type.isEnum()) { // nothing to do. } - final DataJson dataJson = AnnotationTools.getDataJson(field); - if (dataJson != null && dataJson.checker() != null) { - final CheckFunctionInterface checkerInstance = dataJson.checker().getDeclaredConstructor() - .newInstance(); - if (Collection.class.isAssignableFrom(field.getType())) { - add(fieldName, - ( - final DBAccess ioDb, - final String baseName, - final T data, - final List modifiedValue, - final QueryOptions options) -> { - // get the field of the specific element - final Object tmpData = field.get(data); - // It is not the objective of this element to check if it is authorize to set NULL - if (tmpData == null) { - return; - } - final Collection tmpCollection = (Collection) tmpData; - final Object[] elements = tmpCollection.toArray(); - for (int iii = 0; iii < elements.length; iii++) { - if (elements[iii] != null) { - checkerInstance.check(ioDb, baseName + fieldName + '[' + iii + "].", - elements[iii], null, options); + final Checker[] checkers = AnnotationTools.getCheckers(field); + if (checkers != null) { + for (final Checker checker : checkers) { + if (checker == null || checker.value() == CheckFunctionVoid.class) { + continue; + } + final CheckFunctionInterface checkerInstance = checker.value().getDeclaredConstructor() + .newInstance(); + if (Collection.class.isAssignableFrom(field.getType())) { + add(fieldName, + ( + final DBAccess ioDb, + final String baseName, + final T data, + final List modifiedValue, + final QueryOptions options) -> { + // get the field of the specific element + final Object tmpData = field.get(data); + // It is not the objective of this element to check if it is authorize to set NULL + if (tmpData == null) { + return; } - } - }); - } else { - add(fieldName, - ( - final DBAccess ioDb, - final String baseName, - final T data, - final List modifiedValue, - final QueryOptions options) -> { - // get the field of the specific element - final Object tmpData = field.get(data); - // It is not the objective of this element to check if it is authorize to set NULL - if (tmpData == null) { - return; - } - checkerInstance.check(ioDb, baseName + fieldName + '.', tmpData, null, options); - }); + final Collection tmpCollection = (Collection) tmpData; + final Object[] elements = tmpCollection.toArray(); + for (int iii = 0; iii < elements.length; iii++) { + if (elements[iii] != null) { + checkerInstance.check(ioDb, baseName + fieldName + '[' + iii + "].", + elements[iii], null, options); + } + } + }); + } else { + add(fieldName, + ( + final DBAccess ioDb, + final String baseName, + final T data, + final List modifiedValue, + final QueryOptions options) -> { + // get the field of the specific element + final Object tmpData = field.get(data); + // It is not the objective of this element to check if it is authorize to set NULL + if (tmpData == null) { + return; + } + checkerInstance.check(ioDb, baseName + fieldName + '.', tmpData, null, options); + }); + } } } final CollectionItemUnique collectionUnique = AnnotationTools.getCollectionItemUnique(field); diff --git a/src/org/kar/archidata/tools/RESTApi.java b/src/org/kar/archidata/tools/RESTApi.java index 2eb4907..794feb9 100644 --- a/src/org/kar/archidata/tools/RESTApi.java +++ b/src/org/kar/archidata/tools/RESTApi.java @@ -56,7 +56,6 @@ public class RESTApi { "Fail to get the data [" + httpResponse.statusCode() + "] " + httpResponse.body()); } } - //return this.mapper.readValue(httpResponse.body(), new TypeReference>() {}); return this.mapper.readValue(httpResponse.body(), this.mapper.getTypeFactory().constructCollectionType(List.class, clazz)); } diff --git a/test/src/test/kar/archidata/dataAccess/model/DataWithSubJson.java b/test/src/test/kar/archidata/dataAccess/model/DataWithSubJson.java index 95b7070..f9956cb 100644 --- a/test/src/test/kar/archidata/dataAccess/model/DataWithSubJson.java +++ b/test/src/test/kar/archidata/dataAccess/model/DataWithSubJson.java @@ -1,5 +1,6 @@ package test.kar.archidata.dataAccess.model; +import org.kar.archidata.annotation.Checker; import org.kar.archidata.annotation.DataJson; import org.kar.archidata.dataAccess.options.CheckJPA; @@ -11,6 +12,7 @@ public class DataWithSubJson { } } - @DataJson(checker = DataInJson.DataInJsonChecker.class) + @DataJson() + @Checker(DataInJson.DataInJsonChecker.class) public DataInJson dataSerialized; }