Compare commits
	
		
			4 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 74a159f0f3 | |||
| ddd959904e | |||
| f3baf87616 | |||
| d559289db3 | 
							
								
								
									
										2
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								pom.xml
									
									
									
									
									
								
							@@ -3,7 +3,7 @@
 | 
			
		||||
	<modelVersion>4.0.0</modelVersion>
 | 
			
		||||
	<groupId>kangaroo-and-rabbit</groupId>
 | 
			
		||||
	<artifactId>archidata</artifactId>
 | 
			
		||||
	<version>0.24.0</version>
 | 
			
		||||
	<version>0.21.0</version>
 | 
			
		||||
	<properties>
 | 
			
		||||
		<java.version>21</java.version>
 | 
			
		||||
		<maven.compiler.version>3.1</maven.compiler.version>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
package org.kar.archidata.annotation.method;
 | 
			
		||||
package org.kar.archidata.annotation;
 | 
			
		||||
 | 
			
		||||
import java.lang.annotation.ElementType;
 | 
			
		||||
import java.lang.annotation.Retention;
 | 
			
		||||
@@ -5,10 +5,6 @@ import java.lang.reflect.Field;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import org.kar.archidata.annotation.checker.Checker;
 | 
			
		||||
import org.kar.archidata.annotation.checker.CollectionItemNotNull;
 | 
			
		||||
import org.kar.archidata.annotation.checker.CollectionItemUnique;
 | 
			
		||||
import org.kar.archidata.annotation.checker.CollectionNotEmpty;
 | 
			
		||||
import org.kar.archidata.dataAccess.QueryOptions;
 | 
			
		||||
import org.kar.archidata.dataAccess.options.OptionRenameColumn;
 | 
			
		||||
import org.kar.archidata.dataAccess.options.OverrideTableName;
 | 
			
		||||
@@ -28,8 +24,6 @@ import jakarta.persistence.ManyToMany;
 | 
			
		||||
import jakarta.persistence.ManyToOne;
 | 
			
		||||
import jakarta.persistence.OneToMany;
 | 
			
		||||
import jakarta.persistence.Table;
 | 
			
		||||
import jakarta.validation.constraints.DecimalMax;
 | 
			
		||||
import jakarta.validation.constraints.DecimalMin;
 | 
			
		||||
import jakarta.validation.constraints.Email;
 | 
			
		||||
import jakarta.validation.constraints.Max;
 | 
			
		||||
import jakarta.validation.constraints.Min;
 | 
			
		||||
@@ -41,24 +35,6 @@ import jakarta.ws.rs.DefaultValue;
 | 
			
		||||
public class AnnotationTools {
 | 
			
		||||
	static final Logger LOGGER = LoggerFactory.getLogger(AnnotationTools.class);
 | 
			
		||||
 | 
			
		||||
	public static <TYPE extends Annotation> TYPE get(final Field element, final Class<TYPE> clazz) {
 | 
			
		||||
		final TYPE[] annotations = element.getDeclaredAnnotationsByType(clazz);
 | 
			
		||||
 | 
			
		||||
		if (annotations.length == 0) {
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
		return annotations[0];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static <TYPE extends Annotation> TYPE[] gets(final Field element, final Class<TYPE> clazz) {
 | 
			
		||||
		final TYPE[] annotations = element.getDeclaredAnnotationsByType(clazz);
 | 
			
		||||
 | 
			
		||||
		if (annotations.length == 0) {
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
		return annotations;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// For SQL declaration table Name
 | 
			
		||||
	public static String getTableName(final Class<?> clazz, final QueryOptions options) throws DataAccessException {
 | 
			
		||||
		if (options != null) {
 | 
			
		||||
@@ -109,18 +85,6 @@ public class AnnotationTools {
 | 
			
		||||
		return tmp;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static CollectionItemNotNull getCollectionItemNotNull(final Field element) {
 | 
			
		||||
		return get(element, CollectionItemNotNull.class);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static CollectionItemUnique getCollectionItemUnique(final Field element) {
 | 
			
		||||
		return get(element, CollectionItemUnique.class);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static CollectionNotEmpty getCollectionNotEmpty(final Field element) {
 | 
			
		||||
		return get(element, CollectionNotEmpty.class);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static boolean getSchemaReadOnly(final Field element) {
 | 
			
		||||
		final Annotation[] annotation = element.getDeclaredAnnotationsByType(Schema.class);
 | 
			
		||||
		if (annotation.length == 0) {
 | 
			
		||||
@@ -170,39 +134,51 @@ public class AnnotationTools {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static ManyToOne getManyToOne(final Field element) {
 | 
			
		||||
		return get(element, ManyToOne.class);
 | 
			
		||||
		final Annotation[] annotation = element.getDeclaredAnnotationsByType(ManyToOne.class);
 | 
			
		||||
		if (annotation.length == 0) {
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
		return (ManyToOne) annotation[0];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static ManyToMany getManyToMany(final Field element) {
 | 
			
		||||
		return get(element, ManyToMany.class);
 | 
			
		||||
		final Annotation[] annotation = element.getDeclaredAnnotationsByType(ManyToMany.class);
 | 
			
		||||
		if (annotation.length == 0) {
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
		return (ManyToMany) annotation[0];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static OneToMany getOneToMany(final Field element) {
 | 
			
		||||
		return get(element, OneToMany.class);
 | 
			
		||||
		final Annotation[] annotation = element.getDeclaredAnnotationsByType(OneToMany.class);
 | 
			
		||||
		if (annotation.length == 0) {
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
		return (OneToMany) annotation[0];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static DataJson getDataJson(final Field element) {
 | 
			
		||||
		return get(element, DataJson.class);
 | 
			
		||||
		final Annotation[] annotation = element.getDeclaredAnnotationsByType(DataJson.class);
 | 
			
		||||
		if (annotation.length == 0) {
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
		return (DataJson) annotation[0];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static Checker[] getConstraintsCheckers(final Field element) {
 | 
			
		||||
		return gets(element, Checker.class);
 | 
			
		||||
	public static Long getConstraintsMax(final Field element) {
 | 
			
		||||
		final Annotation[] annotation = element.getDeclaredAnnotationsByType(Max.class);
 | 
			
		||||
		if (annotation.length == 0) {
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
		return ((Max) annotation[0]).value();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static DecimalMin getConstraintsDecimalMin(final Field element) {
 | 
			
		||||
		return get(element, DecimalMin.class);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static DecimalMax getConstraintsDecimalMax(final Field element) {
 | 
			
		||||
		return get(element, DecimalMax.class);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static Max getConstraintsMax(final Field element) {
 | 
			
		||||
		return get(element, Max.class);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static Min getConstraintsMin(final Field element) {
 | 
			
		||||
		return get(element, Min.class);
 | 
			
		||||
	public static Long getConstraintsMin(final Field element) {
 | 
			
		||||
		final Annotation[] annotation = element.getDeclaredAnnotationsByType(Min.class);
 | 
			
		||||
		if (annotation.length == 0) {
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
		return ((Min) annotation[0]).value();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static int getLimitSize(final Field element) {
 | 
			
		||||
@@ -215,15 +191,27 @@ public class AnnotationTools {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static Size getConstraintsSize(final Field element) {
 | 
			
		||||
		return get(element, Size.class);
 | 
			
		||||
		final Annotation[] annotation = element.getDeclaredAnnotationsByType(Size.class);
 | 
			
		||||
		if (annotation.length == 0) {
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
		return (Size) annotation[0];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static Pattern getConstraintsPattern(final Field element) {
 | 
			
		||||
		return get(element, Pattern.class);
 | 
			
		||||
	public static String getConstraintsPattern(final Field element) {
 | 
			
		||||
		final Annotation[] annotation = element.getDeclaredAnnotationsByType(Pattern.class);
 | 
			
		||||
		if (annotation.length == 0) {
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
		return ((Pattern) annotation[0]).regexp();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static Email getConstraintsEmail(final Field element) {
 | 
			
		||||
		return get(element, Email.class);
 | 
			
		||||
	public static boolean getConstraintsEmail(final Field element) {
 | 
			
		||||
		final Annotation[] annotation = element.getDeclaredAnnotationsByType(Email.class);
 | 
			
		||||
		if (annotation.length == 0) {
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static boolean isAnnotationGroup(final Field field, final Class<?> annotationType) {
 | 
			
		||||
 
 | 
			
		||||
@@ -5,8 +5,13 @@ 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<? extends CheckFunctionInterface> checker() default CheckFunctionVoid.class;
 | 
			
		||||
 | 
			
		||||
	Class<?> targetEntity() default Void.class;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
package org.kar.archidata.annotation.method;
 | 
			
		||||
package org.kar.archidata.annotation;
 | 
			
		||||
 | 
			
		||||
import java.lang.annotation.ElementType;
 | 
			
		||||
import java.lang.annotation.Retention;
 | 
			
		||||
@@ -1,12 +0,0 @@
 | 
			
		||||
package org.kar.archidata.annotation.checker;
 | 
			
		||||
 | 
			
		||||
import java.lang.annotation.ElementType;
 | 
			
		||||
import java.lang.annotation.Retention;
 | 
			
		||||
import java.lang.annotation.RetentionPolicy;
 | 
			
		||||
import java.lang.annotation.Target;
 | 
			
		||||
 | 
			
		||||
@Target({ ElementType.TYPE, ElementType.FIELD })
 | 
			
		||||
@Retention(RetentionPolicy.RUNTIME)
 | 
			
		||||
public @interface CheckForeignKey {
 | 
			
		||||
	Class<?> target();
 | 
			
		||||
}
 | 
			
		||||
@@ -1,14 +0,0 @@
 | 
			
		||||
package org.kar.archidata.annotation.checker;
 | 
			
		||||
 | 
			
		||||
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<? extends CheckFunctionInterface> value();
 | 
			
		||||
}
 | 
			
		||||
@@ -1,12 +0,0 @@
 | 
			
		||||
package org.kar.archidata.annotation.checker;
 | 
			
		||||
 | 
			
		||||
import java.lang.annotation.ElementType;
 | 
			
		||||
import java.lang.annotation.Retention;
 | 
			
		||||
import java.lang.annotation.RetentionPolicy;
 | 
			
		||||
import java.lang.annotation.Target;
 | 
			
		||||
 | 
			
		||||
@Target(ElementType.FIELD)
 | 
			
		||||
@Retention(RetentionPolicy.RUNTIME)
 | 
			
		||||
public @interface CollectionItemNotNull {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,12 +0,0 @@
 | 
			
		||||
package org.kar.archidata.annotation.checker;
 | 
			
		||||
 | 
			
		||||
import java.lang.annotation.ElementType;
 | 
			
		||||
import java.lang.annotation.Retention;
 | 
			
		||||
import java.lang.annotation.RetentionPolicy;
 | 
			
		||||
import java.lang.annotation.Target;
 | 
			
		||||
 | 
			
		||||
@Target(ElementType.FIELD)
 | 
			
		||||
@Retention(RetentionPolicy.RUNTIME)
 | 
			
		||||
public @interface CollectionItemUnique {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,12 +0,0 @@
 | 
			
		||||
package org.kar.archidata.annotation.checker;
 | 
			
		||||
 | 
			
		||||
import java.lang.annotation.ElementType;
 | 
			
		||||
import java.lang.annotation.Retention;
 | 
			
		||||
import java.lang.annotation.RetentionPolicy;
 | 
			
		||||
import java.lang.annotation.Target;
 | 
			
		||||
 | 
			
		||||
@Target(ElementType.FIELD)
 | 
			
		||||
@Retention(RetentionPolicy.RUNTIME)
 | 
			
		||||
public @interface CollectionNotEmpty {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,898 +0,0 @@
 | 
			
		||||
package org.kar.archidata.checker;
 | 
			
		||||
 | 
			
		||||
import java.lang.reflect.Field;
 | 
			
		||||
import java.sql.Timestamp;
 | 
			
		||||
import java.time.LocalDate;
 | 
			
		||||
import java.time.LocalTime;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.regex.Pattern;
 | 
			
		||||
 | 
			
		||||
import org.kar.archidata.annotation.AnnotationTools;
 | 
			
		||||
import org.kar.archidata.annotation.checker.CheckForeignKey;
 | 
			
		||||
import org.kar.archidata.annotation.checker.Checker;
 | 
			
		||||
import org.kar.archidata.annotation.checker.CollectionItemNotNull;
 | 
			
		||||
import org.kar.archidata.annotation.checker.CollectionItemUnique;
 | 
			
		||||
import org.kar.archidata.annotation.checker.CollectionNotEmpty;
 | 
			
		||||
import org.kar.archidata.dataAccess.DBAccess;
 | 
			
		||||
import org.kar.archidata.dataAccess.QueryCondition;
 | 
			
		||||
import org.kar.archidata.dataAccess.QueryOptions;
 | 
			
		||||
import org.kar.archidata.dataAccess.options.CheckFunctionInterface;
 | 
			
		||||
import org.kar.archidata.dataAccess.options.CheckFunctionVoid;
 | 
			
		||||
import org.kar.archidata.dataAccess.options.Condition;
 | 
			
		||||
import org.kar.archidata.dataAccess.options.ConditionChecker;
 | 
			
		||||
import org.kar.archidata.exception.DataAccessException;
 | 
			
		||||
import org.kar.archidata.exception.InputException;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
 | 
			
		||||
import jakarta.persistence.ManyToOne;
 | 
			
		||||
import jakarta.validation.constraints.DecimalMax;
 | 
			
		||||
import jakarta.validation.constraints.DecimalMin;
 | 
			
		||||
import jakarta.validation.constraints.Max;
 | 
			
		||||
import jakarta.validation.constraints.Min;
 | 
			
		||||
import jakarta.validation.constraints.Size;
 | 
			
		||||
 | 
			
		||||
public class CheckJPA<T> implements CheckFunctionInterface {
 | 
			
		||||
 | 
			
		||||
	private static final Logger LOGGER = LoggerFactory.getLogger(CheckJPA.class);
 | 
			
		||||
	private final Class<?> clazz;
 | 
			
		||||
 | 
			
		||||
	/** By default some element are not read like createAt and UpdatedAt. This option permit to read it. */
 | 
			
		||||
	public interface CheckInterface<K> {
 | 
			
		||||
		/** This function implementation is design to check if the updated class is valid of not for insertion
 | 
			
		||||
		 * @param ioDb Access on the Data-Base
 | 
			
		||||
		 * @param baseName Base of the name input that is displayed in exception generated.
 | 
			
		||||
		 * @param data The object that might be injected.
 | 
			
		||||
		 * @param modifiedValue List of fields that modification is requested.
 | 
			
		||||
		 * @param options Some query option that the checker can need to generate basic check.
 | 
			
		||||
		 * @throws Exception Exception is generate if the data are incorrect. */
 | 
			
		||||
		void check(
 | 
			
		||||
				final DBAccess ioDb,
 | 
			
		||||
				final String baseName,
 | 
			
		||||
				final K data,
 | 
			
		||||
				List<String> modifiedValue,
 | 
			
		||||
				final QueryOptions options) throws Exception;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	protected Map<String, List<CheckInterface<T>>> checking = null;
 | 
			
		||||
 | 
			
		||||
	protected void add(final String field, final CheckInterface<T> checkFunction) throws DataAccessException {
 | 
			
		||||
		if (!AnnotationTools.hasFieldsName(this.clazz, field)) {
 | 
			
		||||
			LOGGER.error("Try to add a JPA Filter on an inexistant Field: '{}' not in {}", field,
 | 
			
		||||
					AnnotationTools.getAllFieldsNames(this.clazz));
 | 
			
		||||
			throw new DataAccessException("Try to add a JPA Filter on an inexistant Field: '" + field + "' not in "
 | 
			
		||||
					+ AnnotationTools.getAllFieldsNames(this.clazz));
 | 
			
		||||
		}
 | 
			
		||||
		List<CheckInterface<T>> actions = this.checking.get(field);
 | 
			
		||||
		if (actions == null) {
 | 
			
		||||
			actions = new ArrayList<>();
 | 
			
		||||
			this.checking.put(field, actions);
 | 
			
		||||
		}
 | 
			
		||||
		actions.add(checkFunction);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public CheckJPA(final Class<T> clazz) {
 | 
			
		||||
		this.clazz = clazz;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void initialize() throws Exception {
 | 
			
		||||
		if (this.checking != null) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		try {
 | 
			
		||||
			this.checking = new HashMap<>();
 | 
			
		||||
			// create Table:
 | 
			
		||||
			final List<String> primaryKeys = new ArrayList<>();
 | 
			
		||||
			for (final Field field : this.clazz.getFields()) {
 | 
			
		||||
				final String fieldName = field.getName(); // AnnotationTools.getFieldName(field);
 | 
			
		||||
				if (AnnotationTools.isPrimaryKey(field)) {
 | 
			
		||||
					add(fieldName,
 | 
			
		||||
							(
 | 
			
		||||
									final DBAccess ioDb,
 | 
			
		||||
									final String baseName,
 | 
			
		||||
									final T data,
 | 
			
		||||
									final List<String> modifiedValue,
 | 
			
		||||
									final QueryOptions options) -> {
 | 
			
		||||
								throw new InputException(baseName + fieldName,
 | 
			
		||||
										"This is a '@Id' (primaryKey) ==> can not be change");
 | 
			
		||||
							});
 | 
			
		||||
				}
 | 
			
		||||
				if (AnnotationTools.getConstraintsNotNull(field)) {
 | 
			
		||||
					add(fieldName,
 | 
			
		||||
							(
 | 
			
		||||
									final DBAccess ioDb,
 | 
			
		||||
									final String baseName,
 | 
			
		||||
									final T data,
 | 
			
		||||
									final List<String> modifiedValue,
 | 
			
		||||
									final QueryOptions options) -> {
 | 
			
		||||
								if (field.get(data) == null) {
 | 
			
		||||
									throw new InputException(baseName + fieldName, "Can not be null");
 | 
			
		||||
								}
 | 
			
		||||
							});
 | 
			
		||||
				}
 | 
			
		||||
				if (AnnotationTools.isCreatedAtField(field) || AnnotationTools.isUpdateAtField(field)) {
 | 
			
		||||
					add(fieldName,
 | 
			
		||||
							(
 | 
			
		||||
									final DBAccess ioDb,
 | 
			
		||||
									final String baseName,
 | 
			
		||||
									final T data,
 | 
			
		||||
									final List<String> modifiedValue,
 | 
			
		||||
									final QueryOptions options) -> {
 | 
			
		||||
								throw new InputException(baseName + fieldName, "It is forbidden to change this field");
 | 
			
		||||
							});
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				final Class<?> type = field.getType();
 | 
			
		||||
				if (type == Long.class || type == long.class) {
 | 
			
		||||
					final DecimalMax maxValueDecimal = AnnotationTools.getConstraintsDecimalMax(field);
 | 
			
		||||
					if (maxValueDecimal != null) {
 | 
			
		||||
						final long maxValue = Long.parseLong(maxValueDecimal.value());
 | 
			
		||||
						final boolean inclusive = maxValueDecimal.inclusive();
 | 
			
		||||
						final String exceptionComment = "Value too height max=" + maxValue
 | 
			
		||||
								+ (inclusive ? " (inclusive)" : " (exclusive)");
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final Long elemTyped = (Long) elem;
 | 
			
		||||
									if (inclusive) {
 | 
			
		||||
										if (elemTyped > maxValue) {
 | 
			
		||||
											throw new InputException(baseName + fieldName, exceptionComment);
 | 
			
		||||
										}
 | 
			
		||||
									} else if (elemTyped >= maxValue) {
 | 
			
		||||
										throw new InputException(baseName + fieldName, exceptionComment);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
					final DecimalMin minValueDecimal = AnnotationTools.getConstraintsDecimalMin(field);
 | 
			
		||||
					if (minValueDecimal != null) {
 | 
			
		||||
						final long minValue = Long.parseLong(minValueDecimal.value());
 | 
			
		||||
						final boolean inclusive = minValueDecimal.inclusive();
 | 
			
		||||
						final String exceptionComment = "Value too low min=" + minValue
 | 
			
		||||
								+ (inclusive ? " (inclusive)" : " (exclusive)");
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final Long elemTyped = (Long) elem;
 | 
			
		||||
									if (inclusive) {
 | 
			
		||||
										if (elemTyped < minValue) {
 | 
			
		||||
											throw new InputException(baseName + fieldName, exceptionComment);
 | 
			
		||||
										}
 | 
			
		||||
									} else if (elemTyped <= minValue) {
 | 
			
		||||
										throw new InputException(baseName + fieldName, exceptionComment);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
					final Max maxValue = AnnotationTools.getConstraintsMax(field);
 | 
			
		||||
					if (maxValue != null) {
 | 
			
		||||
						final Long maxValueTmp = maxValue.value();
 | 
			
		||||
						final String exceptionComment = "Value too height max=" + maxValueTmp + " (inclusive)";
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final Long elemTyped = (Long) elem;
 | 
			
		||||
									if (elemTyped > maxValueTmp) {
 | 
			
		||||
										throw new InputException(baseName + fieldName, exceptionComment);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
					final Min minValue = AnnotationTools.getConstraintsMin(field);
 | 
			
		||||
					if (minValue != null) {
 | 
			
		||||
						final Long minValueTmp = minValue.value();
 | 
			
		||||
						final String exceptionComment = "Value too low min=" + minValueTmp + " (inclusive)";
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final Long elemTyped = (Long) elem;
 | 
			
		||||
									if (elemTyped < minValueTmp) {
 | 
			
		||||
										throw new InputException(baseName + fieldName, exceptionComment);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
				} else if (type == Integer.class || type == int.class) {
 | 
			
		||||
					final DecimalMax maxValueDecimal = AnnotationTools.getConstraintsDecimalMax(field);
 | 
			
		||||
					if (maxValueDecimal != null) {
 | 
			
		||||
						final int maxValue = Integer.parseInt(maxValueDecimal.value());
 | 
			
		||||
						final boolean inclusive = maxValueDecimal.inclusive();
 | 
			
		||||
						final String exceptionComment = "Value too height max=" + maxValue
 | 
			
		||||
								+ (inclusive ? " (inclusive)" : " (exclusive)");
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final Integer elemTyped = (Integer) elem;
 | 
			
		||||
									if (inclusive) {
 | 
			
		||||
										if (elemTyped > maxValue) {
 | 
			
		||||
											throw new InputException(baseName + fieldName, exceptionComment);
 | 
			
		||||
										}
 | 
			
		||||
									} else if (elemTyped >= maxValue) {
 | 
			
		||||
 | 
			
		||||
										throw new InputException(baseName + fieldName, exceptionComment);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
					final DecimalMin minValueDecimal = AnnotationTools.getConstraintsDecimalMin(field);
 | 
			
		||||
					if (minValueDecimal != null) {
 | 
			
		||||
						final int minValue = Integer.parseInt(minValueDecimal.value());
 | 
			
		||||
						final boolean inclusive = minValueDecimal.inclusive();
 | 
			
		||||
						final String exceptionComment = "Value too low min=" + minValue
 | 
			
		||||
								+ (inclusive ? " (inclusive)" : " (exclusive)");
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final Integer elemTyped = (Integer) elem;
 | 
			
		||||
									if (inclusive) {
 | 
			
		||||
										if (elemTyped < minValue) {
 | 
			
		||||
											throw new InputException(baseName + fieldName, exceptionComment);
 | 
			
		||||
										}
 | 
			
		||||
									} else if (elemTyped <= minValue) {
 | 
			
		||||
										throw new InputException(baseName + fieldName, exceptionComment);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
					final Max maxValueRoot = AnnotationTools.getConstraintsMax(field);
 | 
			
		||||
					if (maxValueRoot != null) {
 | 
			
		||||
						final int maxValue = (int) maxValueRoot.value();
 | 
			
		||||
						final String exceptionComment = "Value too height max=" + maxValue + " (inclusive)";
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final Integer elemTyped = (Integer) elem;
 | 
			
		||||
									if (elemTyped > maxValue) {
 | 
			
		||||
										throw new InputException(baseName + fieldName, exceptionComment);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
					final Min minValueRoot = AnnotationTools.getConstraintsMin(field);
 | 
			
		||||
					if (minValueRoot != null) {
 | 
			
		||||
						final int minValue = (int) minValueRoot.value();
 | 
			
		||||
						final String exceptionComment = "Value too low min=" + minValue + " (inclusive)";
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final Integer elemTyped = (Integer) elem;
 | 
			
		||||
									if (elemTyped < minValue) {
 | 
			
		||||
										throw new InputException(baseName + fieldName, exceptionComment);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
				} else if (type == Boolean.class || type == boolean.class) {
 | 
			
		||||
 | 
			
		||||
				} else if (type == Float.class || type == float.class) {
 | 
			
		||||
					final DecimalMax maxValueDecimal = AnnotationTools.getConstraintsDecimalMax(field);
 | 
			
		||||
					if (maxValueDecimal != null) {
 | 
			
		||||
						final float maxValue = Float.parseFloat(maxValueDecimal.value());
 | 
			
		||||
						final boolean inclusive = maxValueDecimal.inclusive();
 | 
			
		||||
						final String exceptionComment = "Value too height max=" + maxValue
 | 
			
		||||
								+ (inclusive ? " (inclusive)" : " (exclusive)");
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final Float elemTyped = (Float) elem;
 | 
			
		||||
									if (inclusive) {
 | 
			
		||||
										if (elemTyped > maxValue) {
 | 
			
		||||
											throw new InputException(baseName + fieldName, exceptionComment);
 | 
			
		||||
										}
 | 
			
		||||
									} else if (elemTyped >= maxValue) {
 | 
			
		||||
										throw new InputException(baseName + fieldName, exceptionComment);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
					final DecimalMin minValueDecimal = AnnotationTools.getConstraintsDecimalMin(field);
 | 
			
		||||
					if (minValueDecimal != null) {
 | 
			
		||||
						final float minValue = Float.parseFloat(minValueDecimal.value());
 | 
			
		||||
						final boolean inclusive = minValueDecimal.inclusive();
 | 
			
		||||
						final String exceptionComment = "Value too low min=" + minValue
 | 
			
		||||
								+ (inclusive ? " (inclusive)" : " (exclusive)");
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final Float elemTyped = (Float) elem;
 | 
			
		||||
									if (inclusive) {
 | 
			
		||||
										if (elemTyped < minValue) {
 | 
			
		||||
											throw new InputException(baseName + fieldName, exceptionComment);
 | 
			
		||||
										}
 | 
			
		||||
									} else if (elemTyped <= minValue) {
 | 
			
		||||
										throw new InputException(baseName + fieldName, exceptionComment);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
					final Max maxValueRoot = AnnotationTools.getConstraintsMax(field);
 | 
			
		||||
					if (maxValueRoot != null) {
 | 
			
		||||
						final float maxValue = maxValueRoot.value();
 | 
			
		||||
						final String exceptionComment = "Value too height max=" + maxValue + " (inclusive)";
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final Float elemTyped = (Float) elem;
 | 
			
		||||
 | 
			
		||||
									if (elemTyped > maxValue) {
 | 
			
		||||
										throw new InputException(baseName + fieldName, exceptionComment);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
					final Min minValueRoot = AnnotationTools.getConstraintsMin(field);
 | 
			
		||||
					if (minValueRoot != null) {
 | 
			
		||||
						final float minValue = minValueRoot.value();
 | 
			
		||||
						final String exceptionComment = "Value too low min=" + minValue + " (inclusive)";
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final Float elemTyped = (Float) elem;
 | 
			
		||||
									if (elemTyped < minValue) {
 | 
			
		||||
										throw new InputException(baseName + fieldName, exceptionComment);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
				} else if (type == Double.class || type == double.class) {
 | 
			
		||||
					final DecimalMax maxValueDecimal = AnnotationTools.getConstraintsDecimalMax(field);
 | 
			
		||||
					if (maxValueDecimal != null) {
 | 
			
		||||
						final double maxValue = Float.parseFloat(maxValueDecimal.value());
 | 
			
		||||
						final boolean inclusive = maxValueDecimal.inclusive();
 | 
			
		||||
						final String exceptionComment = "Value too height max=" + maxValue
 | 
			
		||||
								+ (inclusive ? " (inclusive)" : " (exclusive)");
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final Double elemTyped = (Double) elem;
 | 
			
		||||
									if (inclusive) {
 | 
			
		||||
										if (elemTyped > maxValue) {
 | 
			
		||||
											throw new InputException(baseName + fieldName, exceptionComment);
 | 
			
		||||
										}
 | 
			
		||||
									} else if (elemTyped >= maxValue) {
 | 
			
		||||
										throw new InputException(baseName + fieldName, exceptionComment);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
					final DecimalMin minValueDecimal = AnnotationTools.getConstraintsDecimalMin(field);
 | 
			
		||||
					if (minValueDecimal != null) {
 | 
			
		||||
						final double minValue = Float.parseFloat(minValueDecimal.value());
 | 
			
		||||
						final boolean inclusive = minValueDecimal.inclusive();
 | 
			
		||||
						final String exceptionComment = "Value too low min=" + minValue
 | 
			
		||||
								+ (inclusive ? " (inclusive)" : " (exclusive)");
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final Double elemTyped = (Double) elem;
 | 
			
		||||
									if (inclusive) {
 | 
			
		||||
										if (elemTyped < minValue) {
 | 
			
		||||
											throw new InputException(baseName + fieldName,
 | 
			
		||||
													"Value too Low min: " + minValue);
 | 
			
		||||
										}
 | 
			
		||||
									} else if (elemTyped <= minValue) {
 | 
			
		||||
										throw new InputException(baseName + fieldName, exceptionComment);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
					final Max maxValueRoot = AnnotationTools.getConstraintsMax(field);
 | 
			
		||||
					if (maxValueRoot != null) {
 | 
			
		||||
						final double maxValue = maxValueRoot.value();
 | 
			
		||||
						final String exceptionComment = "Value too height max=" + maxValue + " (inclusive)";
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final Double elemTyped = (Double) elem;
 | 
			
		||||
									if (elemTyped > maxValue) {
 | 
			
		||||
										throw new InputException(baseName + fieldName, exceptionComment);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
					final Min minValueRoot = AnnotationTools.getConstraintsMin(field);
 | 
			
		||||
					if (minValueRoot != null) {
 | 
			
		||||
						final double minValue = minValueRoot.value();
 | 
			
		||||
						final String exceptionComment = "Value too low min=" + minValue + " (inclusive)";
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final Double elemTyped = (Double) elem;
 | 
			
		||||
									if (elemTyped < minValue) {
 | 
			
		||||
										throw new InputException(baseName + fieldName, exceptionComment);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
				} else if (type == Date.class || type == Timestamp.class) {
 | 
			
		||||
 | 
			
		||||
				} else if (type == LocalDate.class) {
 | 
			
		||||
 | 
			
		||||
				} else if (type == LocalTime.class) {
 | 
			
		||||
 | 
			
		||||
				} else if (type == String.class) {
 | 
			
		||||
					final Size limitSize = AnnotationTools.getConstraintsSize(field);
 | 
			
		||||
					if (limitSize != null) {
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final String elemTyped = (String) elem;
 | 
			
		||||
									if (elemTyped.length() > limitSize.max()) {
 | 
			
		||||
										throw new InputException(baseName + fieldName,
 | 
			
		||||
												"Too long size (constraints) must be <= " + limitSize.max());
 | 
			
		||||
									}
 | 
			
		||||
									if (elemTyped.length() < limitSize.min()) {
 | 
			
		||||
										throw new InputException(baseName + fieldName,
 | 
			
		||||
												"Too small size (constraints) must be >= " + limitSize.min());
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
					final jakarta.validation.constraints.Pattern patternString = AnnotationTools
 | 
			
		||||
							.getConstraintsPattern(field);
 | 
			
		||||
					if (patternString != null && patternString.regexp() != null) {
 | 
			
		||||
						final Pattern pattern = Pattern.compile(patternString.regexp());
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final String elemTyped = (String) elem;
 | 
			
		||||
									if (!pattern.matcher(elemTyped).find()) {
 | 
			
		||||
										throw new InputException(baseName + fieldName,
 | 
			
		||||
												"does not match the required pattern (constraints) must be '" + pattern
 | 
			
		||||
														+ "'");
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
					if (AnnotationTools.getConstraintsEmail(field) != null) {
 | 
			
		||||
						final String emailPattern = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$";
 | 
			
		||||
						final Pattern pattern = Pattern.compile(emailPattern);
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final String elemTyped = (String) elem;
 | 
			
		||||
									if (!pattern.matcher(elemTyped).find()) {
 | 
			
		||||
										throw new InputException(baseName + fieldName,
 | 
			
		||||
												"does not match the required pattern[email] (constraints) must be '"
 | 
			
		||||
														+ emailPattern + "'");
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
				} else if (type.isEnum()) {
 | 
			
		||||
					// nothing to do.
 | 
			
		||||
				}
 | 
			
		||||
				final Checker[] checkers = AnnotationTools.getConstraintsCheckers(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<String> 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);
 | 
			
		||||
											}
 | 
			
		||||
										}
 | 
			
		||||
									});
 | 
			
		||||
						} else {
 | 
			
		||||
							add(fieldName,
 | 
			
		||||
									(
 | 
			
		||||
											final DBAccess ioDb,
 | 
			
		||||
											final String baseName,
 | 
			
		||||
											final T data,
 | 
			
		||||
											final List<String> 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 CheckForeignKey foreighKey = AnnotationTools.get(field, CheckForeignKey.class);
 | 
			
		||||
				if (foreighKey != null) {
 | 
			
		||||
					if (Collection.class.isAssignableFrom(field.getType())) {
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> 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 List<ConditionChecker> condCheckers = options.get(ConditionChecker.class);
 | 
			
		||||
									final Condition conditionCheck = condCheckers.isEmpty() ? null
 | 
			
		||||
											: condCheckers.get(0).toCondition();
 | 
			
		||||
									final Collection<?> tmpCollection = (Collection<?>) tmpData;
 | 
			
		||||
									final Object[] elements = tmpCollection.toArray();
 | 
			
		||||
									for (int iii = 0; iii < elements.length; iii++) {
 | 
			
		||||
										if (elements[iii] == null) {
 | 
			
		||||
											continue;
 | 
			
		||||
										}
 | 
			
		||||
										final Long count = ioDb.count(foreighKey.target(), elements[iii],
 | 
			
		||||
												conditionCheck);
 | 
			
		||||
										if (count != 1) {
 | 
			
		||||
											throw new InputException(baseName + fieldName + '[' + iii + ']',
 | 
			
		||||
													"Foreign-key does not exist in the DB:" + elements[iii]);
 | 
			
		||||
 | 
			
		||||
										}
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					} else {
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object tmpData = field.get(data);
 | 
			
		||||
									if (tmpData == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final List<ConditionChecker> condCheckers = options.get(ConditionChecker.class);
 | 
			
		||||
									final Condition conditionCheck = condCheckers.isEmpty() ? null
 | 
			
		||||
											: condCheckers.get(0).toCondition();
 | 
			
		||||
									final Long count = ioDb.count(foreighKey.target(), tmpData, conditionCheck);
 | 
			
		||||
									if (count != 1) {
 | 
			
		||||
										throw new InputException(baseName + fieldName,
 | 
			
		||||
												"Foreign-key does not exist in the DB:" + tmpData);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				// check if we really want to keep it ...
 | 
			
		||||
				final ManyToOne annotationManyToOne = AnnotationTools.getManyToOne(field);
 | 
			
		||||
				if (annotationManyToOne != null && annotationManyToOne.targetEntity() != null) {
 | 
			
		||||
					add(fieldName,
 | 
			
		||||
							(
 | 
			
		||||
									final DBAccess ioDb,
 | 
			
		||||
									final String baseName,
 | 
			
		||||
									final T data,
 | 
			
		||||
									final List<String> modifiedValue,
 | 
			
		||||
									final QueryOptions options) -> {
 | 
			
		||||
								final Object elem = field.get(data);
 | 
			
		||||
								if (elem == null) {
 | 
			
		||||
									return;
 | 
			
		||||
								}
 | 
			
		||||
								final List<ConditionChecker> condCheckers = options.get(ConditionChecker.class);
 | 
			
		||||
								final Condition conditionCheck = condCheckers.isEmpty() ? null
 | 
			
		||||
										: condCheckers.get(0).toCondition();
 | 
			
		||||
								final long count = ioDb.count(annotationManyToOne.targetEntity(), elem, conditionCheck);
 | 
			
		||||
								if (count == 0) {
 | 
			
		||||
									throw new InputException(baseName + fieldName,
 | 
			
		||||
											"Foreign element does not exist in the DB:" + elem);
 | 
			
		||||
								}
 | 
			
		||||
							});
 | 
			
		||||
				}
 | 
			
		||||
				final CollectionItemUnique collectionUnique = AnnotationTools.getCollectionItemUnique(field);
 | 
			
		||||
				if (collectionUnique != null) {
 | 
			
		||||
					if (!Collection.class.isAssignableFrom(field.getType())) {
 | 
			
		||||
						throw new DataAccessException(
 | 
			
		||||
								"Request @CollectionItemUnique on a non collection field: '" + fieldName + "'");
 | 
			
		||||
					}
 | 
			
		||||
					add(fieldName,
 | 
			
		||||
							(
 | 
			
		||||
									final DBAccess ioDb,
 | 
			
		||||
									final String baseName,
 | 
			
		||||
									final T data,
 | 
			
		||||
									final List<String> modifiedValue,
 | 
			
		||||
									final QueryOptions options) -> {
 | 
			
		||||
								final Object tmpData = field.get(data);
 | 
			
		||||
								if (tmpData == null) {
 | 
			
		||||
									return;
 | 
			
		||||
								}
 | 
			
		||||
								final Collection<?> tmpCollection = (Collection<?>) tmpData;
 | 
			
		||||
								final Set<Object> uniqueValues = new HashSet<>(tmpCollection);
 | 
			
		||||
								if (uniqueValues.size() != tmpCollection.size()) {
 | 
			
		||||
									throw new InputException(baseName + fieldName,
 | 
			
		||||
											"Cannot insert multiple times the same elements");
 | 
			
		||||
								}
 | 
			
		||||
							});
 | 
			
		||||
				}
 | 
			
		||||
				final CollectionItemNotNull collectionNotNull = AnnotationTools.getCollectionItemNotNull(field);
 | 
			
		||||
				if (collectionNotNull != null) {
 | 
			
		||||
					if (!Collection.class.isAssignableFrom(field.getType())) {
 | 
			
		||||
						throw new DataAccessException(
 | 
			
		||||
								"Request @CollectionItemNotNull on a non collection field: '" + fieldName + "'");
 | 
			
		||||
					}
 | 
			
		||||
					add(fieldName,
 | 
			
		||||
							(
 | 
			
		||||
									final DBAccess ioDb,
 | 
			
		||||
									final String baseName,
 | 
			
		||||
									final T data,
 | 
			
		||||
									final List<String> modifiedValue,
 | 
			
		||||
									final QueryOptions options) -> {
 | 
			
		||||
								final Object tmpData = field.get(data);
 | 
			
		||||
								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) {
 | 
			
		||||
										throw new InputException(baseName + fieldName + '[' + iii + ']',
 | 
			
		||||
												"Collection can not contain NULL item");
 | 
			
		||||
									}
 | 
			
		||||
								}
 | 
			
		||||
							});
 | 
			
		||||
				}
 | 
			
		||||
				final CollectionNotEmpty collectionNotEmpty = AnnotationTools.getCollectionNotEmpty(field);
 | 
			
		||||
				if (collectionNotEmpty != null) {
 | 
			
		||||
					if (!Collection.class.isAssignableFrom(field.getType())) {
 | 
			
		||||
						throw new DataAccessException(
 | 
			
		||||
								"Request @collectionNotEmpty on a non collection field: '" + fieldName + "'");
 | 
			
		||||
					}
 | 
			
		||||
					add(fieldName,
 | 
			
		||||
							(
 | 
			
		||||
									final DBAccess ioDb,
 | 
			
		||||
									final String baseName,
 | 
			
		||||
									final T data,
 | 
			
		||||
									final List<String> modifiedValue,
 | 
			
		||||
									final QueryOptions options) -> {
 | 
			
		||||
								final Object tmpData = field.get(data);
 | 
			
		||||
								if (tmpData == null) {
 | 
			
		||||
									return;
 | 
			
		||||
								}
 | 
			
		||||
								final Collection<?> tmpCollection = (Collection<?>) tmpData;
 | 
			
		||||
								if (tmpCollection.isEmpty()) {
 | 
			
		||||
									throw new InputException(baseName + fieldName, "Collection can not be empty");
 | 
			
		||||
								}
 | 
			
		||||
							});
 | 
			
		||||
				}
 | 
			
		||||
				// keep this is last ==> take more time...
 | 
			
		||||
				if (AnnotationTools.isUnique(field)) {
 | 
			
		||||
					// Create the request ...
 | 
			
		||||
					add(fieldName,
 | 
			
		||||
							(
 | 
			
		||||
									final DBAccess ioDb,
 | 
			
		||||
									final String baseName,
 | 
			
		||||
									final T data,
 | 
			
		||||
									final List<String> modifiedValue,
 | 
			
		||||
									final QueryOptions options) -> {
 | 
			
		||||
								final List<ConditionChecker> condCheckers = options.get(ConditionChecker.class);
 | 
			
		||||
								Object other = null;
 | 
			
		||||
								if (condCheckers.isEmpty()) {
 | 
			
		||||
									other = ioDb.getWhere(this.clazz,
 | 
			
		||||
											new Condition(new QueryCondition(fieldName, "==", field.get(data))));
 | 
			
		||||
								} else {
 | 
			
		||||
									other = ioDb.getWhere(this.clazz,
 | 
			
		||||
											new Condition(new QueryCondition(fieldName, "==", field.get(data))),
 | 
			
		||||
											condCheckers.get(0).toCondition());
 | 
			
		||||
								}
 | 
			
		||||
								if (other != null) {
 | 
			
		||||
									throw new InputException(baseName + fieldName,
 | 
			
		||||
											"The field is already exist in the DB");
 | 
			
		||||
								}
 | 
			
		||||
							});
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
		} catch (final Exception ex) {
 | 
			
		||||
			this.checking = null;
 | 
			
		||||
			throw ex;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void check(final Object data) throws Exception {
 | 
			
		||||
		check(null, "", data, null, null);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void check(final String baseName, final Object data) throws Exception {
 | 
			
		||||
		check(null, baseName, data, null, null);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void check(final DBAccess ioDb, final String baseName, final Object data) throws Exception {
 | 
			
		||||
		check(ioDb, baseName, data, null, null);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void check(final DBAccess ioDb, final String baseName, final Object data, final List<String> modifiedValue)
 | 
			
		||||
			throws Exception {
 | 
			
		||||
		check(ioDb, baseName, data, modifiedValue, null);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void check(
 | 
			
		||||
			final DBAccess ioDb,
 | 
			
		||||
			final String baseName,
 | 
			
		||||
			final Object data,
 | 
			
		||||
			List<String> modifiedValue,
 | 
			
		||||
			final QueryOptions options) throws Exception {
 | 
			
		||||
		if (this.checking == null) {
 | 
			
		||||
			initialize();
 | 
			
		||||
		}
 | 
			
		||||
		if (modifiedValue == null) {
 | 
			
		||||
			modifiedValue = AnnotationTools.getAllFieldsNames(this.clazz);
 | 
			
		||||
		}
 | 
			
		||||
		if (!(this.clazz.isAssignableFrom(data.getClass()))) {
 | 
			
		||||
			throw new DataAccessException("Incompatatyble type of Object" + data.getClass().getCanonicalName());
 | 
			
		||||
		}
 | 
			
		||||
		@SuppressWarnings("unchecked")
 | 
			
		||||
		final T dataCasted = (T) data;
 | 
			
		||||
		for (final String filter : modifiedValue) {
 | 
			
		||||
			final List<CheckInterface<T>> actions = this.checking.get(filter);
 | 
			
		||||
			if (actions == null) {
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			for (final CheckInterface<T> action : actions) {
 | 
			
		||||
				action.check(ioDb, baseName, dataCasted, modifiedValue, options);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		checkTyped(dataCasted, modifiedValue, options);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void checkTyped(final T data, final List<String> modifiedValue, final QueryOptions options)
 | 
			
		||||
			throws Exception {
 | 
			
		||||
		// nothing to do ...
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -158,7 +158,7 @@ public class DBAccessSQL extends DBAccess {
 | 
			
		||||
			} else {
 | 
			
		||||
				// TODO : Maybe connect with a temporary not specified connection interface to a db ...
 | 
			
		||||
				final PreparedStatement ps = this.db.getConnection()
 | 
			
		||||
						.prepareStatement("SHOW TABLES IN `" + this.db.getConfig().getDbName() + "`");
 | 
			
		||||
						.prepareStatement("SHOW TABLES IN `" + this.db.getCongig().getDbName() + "`");
 | 
			
		||||
				final ResultSet rs = ps.executeQuery();
 | 
			
		||||
				// LOGGER.info("List all tables: equals? '{}'", name);
 | 
			
		||||
				while (rs.next()) {
 | 
			
		||||
@@ -815,9 +815,6 @@ public class DBAccessSQL extends DBAccess {
 | 
			
		||||
	@Override
 | 
			
		||||
	@SuppressFBWarnings("SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING")
 | 
			
		||||
	public <T> T insert(final T data, final QueryOption... option) throws Exception {
 | 
			
		||||
		if (data == null) {
 | 
			
		||||
			throw new DataAccessException("Try to check a null data ==> wrong API");
 | 
			
		||||
		}
 | 
			
		||||
		final Class<?> clazz = data.getClass();
 | 
			
		||||
		final QueryOptions options = new QueryOptions(option);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,6 @@ import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
import org.bson.types.ObjectId;
 | 
			
		||||
import org.kar.archidata.annotation.AnnotationTools;
 | 
			
		||||
import org.kar.archidata.annotation.AnnotationTools.FieldName;
 | 
			
		||||
import org.kar.archidata.dataAccess.CountInOut;
 | 
			
		||||
@@ -73,7 +72,7 @@ public class AddOnManyToMany implements DataAccessAddOn {
 | 
			
		||||
		}
 | 
			
		||||
		final Class<?> objectClass = (Class<?>) ((ParameterizedType) field.getGenericType())
 | 
			
		||||
				.getActualTypeArguments()[0];
 | 
			
		||||
		if (objectClass == Long.class || objectClass == UUID.class || objectClass == ObjectId.class) {
 | 
			
		||||
		if (objectClass == Long.class || objectClass == UUID.class) {
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
		final ManyToMany decorators = field.getDeclaredAnnotation(ManyToMany.class);
 | 
			
		||||
@@ -136,11 +135,7 @@ public class AddOnManyToMany implements DataAccessAddOn {
 | 
			
		||||
		querySelect.append("'");
 | 
			
		||||
		if (objectClass == Long.class) {
 | 
			
		||||
			querySelect.append(SEPARATOR_LONG);
 | 
			
		||||
		} else if (objectClass == UUID.class) {
 | 
			
		||||
			// ???
 | 
			
		||||
		} else if (objectClass == ObjectId.class) {
 | 
			
		||||
			// ???
 | 
			
		||||
		} else {
 | 
			
		||||
		} else if (objectClass == UUID.class) {} else {
 | 
			
		||||
			final Class<?> foreignKeyType = AnnotationTools.getPrimaryKeyField(objectClass).getType();
 | 
			
		||||
			if (foreignKeyType == Long.class) {
 | 
			
		||||
				querySelect.append(SEPARATOR_LONG);
 | 
			
		||||
@@ -198,7 +193,7 @@ public class AddOnManyToMany implements DataAccessAddOn {
 | 
			
		||||
		final Class<?> objectClass = (Class<?>) ((ParameterizedType) field.getGenericType())
 | 
			
		||||
				.getActualTypeArguments()[0];
 | 
			
		||||
		// TODO: manage better the eager and lazy !!
 | 
			
		||||
		if (objectClass == Long.class || objectClass == UUID.class || objectClass == ObjectId.class) {
 | 
			
		||||
		if (objectClass == Long.class || objectClass == UUID.class) {
 | 
			
		||||
			generateConcatQuery(tableName, primaryKey, field, querySelect, query, name, count, options);
 | 
			
		||||
		}
 | 
			
		||||
		final ManyToMany decorators = field.getDeclaredAnnotation(ManyToMany.class);
 | 
			
		||||
@@ -239,11 +234,6 @@ public class AddOnManyToMany implements DataAccessAddOn {
 | 
			
		||||
			field.set(data, idList);
 | 
			
		||||
			count.inc();
 | 
			
		||||
			return;
 | 
			
		||||
		} else if (objectClass == ObjectId.class) {
 | 
			
		||||
			final List<ObjectId> idList = ioDb.getListOfRawOIDs(rs, count.value);
 | 
			
		||||
			field.set(data, idList);
 | 
			
		||||
			count.inc();
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		final ManyToMany decorators = field.getDeclaredAnnotation(ManyToMany.class);
 | 
			
		||||
		if (decorators == null) {
 | 
			
		||||
@@ -295,27 +285,6 @@ public class AddOnManyToMany implements DataAccessAddOn {
 | 
			
		||||
					};
 | 
			
		||||
					lazyCall.add(lambda);
 | 
			
		||||
				}
 | 
			
		||||
			} else if (foreignKeyType == ObjectId.class) {
 | 
			
		||||
				final List<ObjectId> idList = ioDb.getListOfRawOIDs(rs, count.value);
 | 
			
		||||
				// field.set(data, idList);
 | 
			
		||||
				count.inc();
 | 
			
		||||
				if (idList != null && idList.size() > 0) {
 | 
			
		||||
					final FieldName idField = AnnotationTools.getFieldName(AnnotationTools.getIdField(objectClass),
 | 
			
		||||
							options);
 | 
			
		||||
					// In the lazy mode, the request is done in asynchronous mode, they will be done after...
 | 
			
		||||
					final LazyGetter lambda = () -> {
 | 
			
		||||
						final List<ObjectId> childs = new ArrayList<>(idList);
 | 
			
		||||
						// TODO: update to have get with abstract types ....
 | 
			
		||||
						@SuppressWarnings("unchecked")
 | 
			
		||||
						final Object foreignData = ioDb.getsWhere(decorators.targetEntity(),
 | 
			
		||||
								new Condition(new QueryInList<>(idField.inTable(), childs)));
 | 
			
		||||
						if (foreignData == null) {
 | 
			
		||||
							return;
 | 
			
		||||
						}
 | 
			
		||||
						field.set(data, foreignData);
 | 
			
		||||
					};
 | 
			
		||||
					lazyCall.add(lambda);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -340,10 +309,9 @@ public class AddOnManyToMany implements DataAccessAddOn {
 | 
			
		||||
		}
 | 
			
		||||
		final Class<?> objectClass = (Class<?>) ((ParameterizedType) field.getGenericType())
 | 
			
		||||
				.getActualTypeArguments()[0];
 | 
			
		||||
		if (objectClass != Long.class && objectClass != UUID.class && objectClass != ObjectId.class) {
 | 
			
		||||
			throw new DataAccessException(
 | 
			
		||||
					"Can not ManyToMany with other than List<Long> or List<UUID> or List<ObjectId> Model: List<"
 | 
			
		||||
							+ objectClass.getCanonicalName() + ">");
 | 
			
		||||
		if (objectClass != Long.class && objectClass != UUID.class) {
 | 
			
		||||
			throw new DataAccessException("Can not ManyToMany with other than List<Long> or List<UUID> Model: List<"
 | 
			
		||||
					+ objectClass.getCanonicalName() + ">");
 | 
			
		||||
		}
 | 
			
		||||
		final FieldName columnName = AnnotationTools.getFieldName(field, options);
 | 
			
		||||
		final String linkTableName = generateLinkTableName(tableName, columnName.inTable());
 | 
			
		||||
@@ -380,20 +348,19 @@ public class AddOnManyToMany implements DataAccessAddOn {
 | 
			
		||||
		}
 | 
			
		||||
		final Class<?> objectClass = (Class<?>) ((ParameterizedType) field.getGenericType())
 | 
			
		||||
				.getActualTypeArguments()[0];
 | 
			
		||||
		if (objectClass != Long.class && objectClass != UUID.class && objectClass != ObjectId.class) {
 | 
			
		||||
			throw new DataAccessException(
 | 
			
		||||
					"Can not ManyToMany with other than List<Long> or List<UUID> or List<ObjectId> Model: List<"
 | 
			
		||||
							+ objectClass.getCanonicalName() + ">");
 | 
			
		||||
		if (objectClass != Long.class && objectClass != UUID.class) {
 | 
			
		||||
			throw new DataAccessException("Can not ManyToMany with other than List<Long> or List<UUID> Model: List<"
 | 
			
		||||
					+ objectClass.getCanonicalName() + ">");
 | 
			
		||||
		}
 | 
			
		||||
		final FieldName columnName = AnnotationTools.getFieldName(field, options);
 | 
			
		||||
		final String linkTableName = generateLinkTableName(tableName, columnName.inTable());
 | 
			
		||||
		@SuppressWarnings("unchecked")
 | 
			
		||||
		final List<Object> dataCasted = (List<Object>) data;
 | 
			
		||||
		final List<Long> dataCasted = (List<Long>) data;
 | 
			
		||||
		if (dataCasted.size() == 0) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		final List<LinkTableGeneric> insertElements = new ArrayList<>();
 | 
			
		||||
		for (final Object remoteKey : dataCasted) {
 | 
			
		||||
		for (final Long remoteKey : dataCasted) {
 | 
			
		||||
			if (remoteKey == null) {
 | 
			
		||||
				throw new DataAccessException("Try to insert remote key with null value");
 | 
			
		||||
			}
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,6 @@ import java.sql.Types;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
import org.bson.types.ObjectId;
 | 
			
		||||
import org.kar.archidata.annotation.AnnotationTools;
 | 
			
		||||
import org.kar.archidata.annotation.AnnotationTools.FieldName;
 | 
			
		||||
import org.kar.archidata.dataAccess.CountInOut;
 | 
			
		||||
@@ -67,8 +66,6 @@ public class AddOnManyToOne implements DataAccessAddOn {
 | 
			
		||||
				ps.setNull(iii.value, Types.VARCHAR);
 | 
			
		||||
			} else if (field.getType() == UUID.class) {
 | 
			
		||||
				ps.setNull(iii.value, Types.BINARY);
 | 
			
		||||
			} else if (field.getType() == ObjectId.class) {
 | 
			
		||||
				ps.setNull(iii.value, Types.BINARY);
 | 
			
		||||
			}
 | 
			
		||||
		} else if (field.getType() == Long.class) {
 | 
			
		||||
			final Long dataTyped = (Long) data;
 | 
			
		||||
@@ -87,11 +84,6 @@ public class AddOnManyToOne implements DataAccessAddOn {
 | 
			
		||||
			LOGGER.info("Generate UUTD for DB: {}", dataTyped);
 | 
			
		||||
			final byte[] dataByte = UuidUtils.asBytes(dataTyped);
 | 
			
		||||
			ps.setBytes(iii.value, dataByte);
 | 
			
		||||
		} else if (field.getType() == ObjectId.class) {
 | 
			
		||||
			final ObjectId dataTyped = (ObjectId) data;
 | 
			
		||||
			LOGGER.info("Generate ObjectId for DB: {}", dataTyped);
 | 
			
		||||
			final byte[] dataByte = dataTyped.toByteArray();
 | 
			
		||||
			ps.setBytes(iii.value, dataByte);
 | 
			
		||||
		} else {
 | 
			
		||||
			final Field idField = AnnotationTools.getFieldOfId(field.getType());
 | 
			
		||||
			final Object uid = idField.get(data);
 | 
			
		||||
@@ -109,8 +101,7 @@ public class AddOnManyToOne implements DataAccessAddOn {
 | 
			
		||||
	@Override
 | 
			
		||||
	public boolean canInsert(final Field field) {
 | 
			
		||||
		if (field.getType() == Long.class || field.getType() == Integer.class || field.getType() == Short.class
 | 
			
		||||
				|| field.getType() == String.class || field.getType() == UUID.class
 | 
			
		||||
				|| field.getType() == ObjectId.class) {
 | 
			
		||||
				|| field.getType() == String.class || field.getType() == UUID.class) {
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
		final ManyToOne decorators = field.getDeclaredAnnotation(ManyToOne.class);
 | 
			
		||||
@@ -129,7 +120,7 @@ public class AddOnManyToOne implements DataAccessAddOn {
 | 
			
		||||
	public boolean canRetrieve(final Field field) {
 | 
			
		||||
		final Class<?> classType = field.getType();
 | 
			
		||||
		if (classType == Long.class || classType == Integer.class || classType == Short.class
 | 
			
		||||
				|| classType == String.class || classType == UUID.class || classType == ObjectId.class) {
 | 
			
		||||
				|| classType == String.class || classType == UUID.class) {
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
		final ManyToOne decorators = field.getDeclaredAnnotation(ManyToOne.class);
 | 
			
		||||
@@ -150,8 +141,7 @@ public class AddOnManyToOne implements DataAccessAddOn {
 | 
			
		||||
			@NotNull final CountInOut count,
 | 
			
		||||
			final QueryOptions options) throws Exception {
 | 
			
		||||
		if (field.getType() == Long.class || field.getType() == Integer.class || field.getType() == Short.class
 | 
			
		||||
				|| field.getType() == String.class || field.getType() == UUID.class
 | 
			
		||||
				|| field.getType() == ObjectId.class) {
 | 
			
		||||
				|| field.getType() == String.class || field.getType() == UUID.class) {
 | 
			
		||||
			querySelect.append(" ");
 | 
			
		||||
			querySelect.append(tableName);
 | 
			
		||||
			querySelect.append(".");
 | 
			
		||||
@@ -240,15 +230,6 @@ public class AddOnManyToOne implements DataAccessAddOn {
 | 
			
		||||
			}
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		if (field.getType() == ObjectId.class) {
 | 
			
		||||
			final byte[] tmp = rs.getBytes(count.value);
 | 
			
		||||
			count.inc();
 | 
			
		||||
			if (!rs.wasNull()) {
 | 
			
		||||
				final ObjectId foreignKey = new ObjectId(tmp);
 | 
			
		||||
				field.set(data, foreignKey);
 | 
			
		||||
			}
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		final Class<?> objectClass = field.getType();
 | 
			
		||||
		final ManyToOne decorators = field.getDeclaredAnnotation(ManyToOne.class);
 | 
			
		||||
		if (decorators == null) {
 | 
			
		||||
@@ -298,22 +279,6 @@ public class AddOnManyToOne implements DataAccessAddOn {
 | 
			
		||||
					};
 | 
			
		||||
					lazyCall.add(lambda);
 | 
			
		||||
				}
 | 
			
		||||
			} else if (remotePrimaryKeyType == ObjectId.class) {
 | 
			
		||||
				// here we have the field, the data and the the remote value ==> can create callback that generate the update of the value ...
 | 
			
		||||
				final ObjectId foreignKey = ioDb.getListOfRawOID(rs, count.value);
 | 
			
		||||
				count.inc();
 | 
			
		||||
				if (foreignKey != null) {
 | 
			
		||||
					// In the lazy mode, the request is done in asynchronous mode, they will be done after...
 | 
			
		||||
					final LazyGetter lambda = () -> {
 | 
			
		||||
						// TODO: update to have get with abstract types ....
 | 
			
		||||
						final Object foreignData = ioDb.get(decorators.targetEntity(), foreignKey);
 | 
			
		||||
						if (foreignData == null) {
 | 
			
		||||
							return;
 | 
			
		||||
						}
 | 
			
		||||
						field.set(data, foreignData);
 | 
			
		||||
					};
 | 
			
		||||
					lazyCall.add(lambda);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -333,7 +298,7 @@ public class AddOnManyToOne implements DataAccessAddOn {
 | 
			
		||||
			final QueryOptions options) throws Exception {
 | 
			
		||||
		final Class<?> classType = field.getType();
 | 
			
		||||
		if (classType == Long.class || classType == Integer.class || classType == Short.class
 | 
			
		||||
				|| classType == String.class || classType == UUID.class || classType == ObjectId.class) {
 | 
			
		||||
				|| classType == String.class || classType == UUID.class) {
 | 
			
		||||
			DataFactory.createTablesSpecificType(tableName, primaryField, field, mainTableBuilder, preActionList,
 | 
			
		||||
					postActionList, createIfNotExist, createDrop, fieldId, classType, options);
 | 
			
		||||
		} else {
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,6 @@ import java.util.List;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
import org.bson.types.ObjectId;
 | 
			
		||||
import org.kar.archidata.annotation.AnnotationTools;
 | 
			
		||||
import org.kar.archidata.annotation.AnnotationTools.FieldName;
 | 
			
		||||
import org.kar.archidata.dataAccess.CountInOut;
 | 
			
		||||
@@ -111,7 +110,7 @@ public class AddOnOneToMany implements DataAccessAddOn {
 | 
			
		||||
		}
 | 
			
		||||
		final Class<?> objectClass = (Class<?>) ((ParameterizedType) field.getGenericType())
 | 
			
		||||
				.getActualTypeArguments()[0];
 | 
			
		||||
		if (objectClass == Long.class || objectClass == UUID.class || objectClass == ObjectId.class) {
 | 
			
		||||
		if (objectClass == Long.class || objectClass == UUID.class) {
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
		final OneToMany decorators = field.getDeclaredAnnotation(OneToMany.class);
 | 
			
		||||
@@ -202,7 +201,7 @@ public class AddOnOneToMany implements DataAccessAddOn {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		// TODO: manage better the eager and lazy !!
 | 
			
		||||
		if (objectClass == Long.class || objectClass == UUID.class || objectClass == ObjectId.class) {
 | 
			
		||||
		if (objectClass == Long.class || objectClass == UUID.class) {
 | 
			
		||||
			generateConcatQuery(tableName, primaryKey, field, querySelect, query, name, count, options,
 | 
			
		||||
					decorators.targetEntity(), decorators.mappedBy());
 | 
			
		||||
			return;
 | 
			
		||||
@@ -251,35 +250,22 @@ public class AddOnOneToMany implements DataAccessAddOn {
 | 
			
		||||
			field.set(data, idList);
 | 
			
		||||
			count.inc();
 | 
			
		||||
			return;
 | 
			
		||||
		} else if (objectClass == ObjectId.class) {
 | 
			
		||||
			final List<ObjectId> idList = ioDb.getListOfRawOIDs(rs, count.value);
 | 
			
		||||
			field.set(data, idList);
 | 
			
		||||
			count.inc();
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		if (objectClass == decorators.targetEntity()) {
 | 
			
		||||
 | 
			
		||||
			Long parentIdTmp = null;
 | 
			
		||||
			UUID parendUuidTmp = null;
 | 
			
		||||
			ObjectId parendOidTmp = null;
 | 
			
		||||
			try {
 | 
			
		||||
				final String modelData = rs.getString(count.value);
 | 
			
		||||
				parentIdTmp = Long.valueOf(modelData);
 | 
			
		||||
				count.inc();
 | 
			
		||||
			} catch (final NumberFormatException ex) {
 | 
			
		||||
				try {
 | 
			
		||||
					final List<UUID> idList = ioDb.getListOfRawUUIDs(rs, count.value);
 | 
			
		||||
					parendUuidTmp = idList.get(0);
 | 
			
		||||
					count.inc();
 | 
			
		||||
				} catch (final NumberFormatException ex2) {
 | 
			
		||||
					// TODO : How to manage ObjectId ==> I am not sure it works well...
 | 
			
		||||
					final List<ObjectId> idList = ioDb.getListOfRawOIDs(rs, count.value);
 | 
			
		||||
					parendOidTmp = idList.get(0);
 | 
			
		||||
					count.inc();
 | 
			
		||||
				}
 | 
			
		||||
				final List<UUID> idList = ioDb.getListOfRawUUIDs(rs, count.value);
 | 
			
		||||
				parendUuidTmp = idList.get(0);
 | 
			
		||||
				count.inc();
 | 
			
		||||
			}
 | 
			
		||||
			final Long parentId = parentIdTmp;
 | 
			
		||||
			final UUID parendUuid = parendUuidTmp;
 | 
			
		||||
			final ObjectId parendOid = parendOidTmp;
 | 
			
		||||
			final String mappingKey = decorators.mappedBy();
 | 
			
		||||
			// We get the parent ID ... ==> need to request the list of elements
 | 
			
		||||
			if (objectClass == Long.class) {
 | 
			
		||||
@@ -290,10 +276,6 @@ public class AddOnOneToMany implements DataAccessAddOn {
 | 
			
		||||
				LOGGER.error("Need to retreive all primary key of all elements");
 | 
			
		||||
				//field.set(data, idList);
 | 
			
		||||
				return;
 | 
			
		||||
			} else if (objectClass == ObjectId.class) {
 | 
			
		||||
				LOGGER.error("Need to retreive all primary key of all elements");
 | 
			
		||||
				//field.set(data, idList);
 | 
			
		||||
				return;
 | 
			
		||||
			}
 | 
			
		||||
			if (objectClass == decorators.targetEntity()) {
 | 
			
		||||
				if (decorators.fetch() == FetchType.EAGER) {
 | 
			
		||||
@@ -321,17 +303,6 @@ public class AddOnOneToMany implements DataAccessAddOn {
 | 
			
		||||
						field.set(data, foreignData);
 | 
			
		||||
					};
 | 
			
		||||
					lazyCall.add(lambda);
 | 
			
		||||
				} else if (parendOid != null) {
 | 
			
		||||
					final LazyGetter lambda = () -> {
 | 
			
		||||
						@SuppressWarnings("unchecked")
 | 
			
		||||
						final Object foreignData = ioDb.getsWhere(decorators.targetEntity(),
 | 
			
		||||
								new Condition(new QueryCondition(mappingKey, "=", parendOid)));
 | 
			
		||||
						if (foreignData == null) {
 | 
			
		||||
							return;
 | 
			
		||||
						}
 | 
			
		||||
						field.set(data, foreignData);
 | 
			
		||||
					};
 | 
			
		||||
					lazyCall.add(lambda);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
@@ -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. */
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										575
									
								
								src/org/kar/archidata/dataAccess/options/CheckJPA.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										575
									
								
								src/org/kar/archidata/dataAccess/options/CheckJPA.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,575 @@
 | 
			
		||||
package org.kar.archidata.dataAccess.options;
 | 
			
		||||
 | 
			
		||||
import java.lang.reflect.Field;
 | 
			
		||||
import java.sql.Timestamp;
 | 
			
		||||
import java.time.LocalDate;
 | 
			
		||||
import java.time.LocalTime;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
import java.util.regex.Pattern;
 | 
			
		||||
 | 
			
		||||
import org.kar.archidata.annotation.AnnotationTools;
 | 
			
		||||
import org.kar.archidata.annotation.DataJson;
 | 
			
		||||
import org.kar.archidata.dataAccess.DBAccess;
 | 
			
		||||
import org.kar.archidata.dataAccess.DataAccess;
 | 
			
		||||
import org.kar.archidata.dataAccess.QueryCondition;
 | 
			
		||||
import org.kar.archidata.dataAccess.QueryOptions;
 | 
			
		||||
import org.kar.archidata.exception.DataAccessException;
 | 
			
		||||
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;
 | 
			
		||||
 | 
			
		||||
public class CheckJPA<T> implements CheckFunctionInterface {
 | 
			
		||||
 | 
			
		||||
	private static final Logger LOGGER = LoggerFactory.getLogger(CheckJPA.class);
 | 
			
		||||
	private final Class<?> clazz;
 | 
			
		||||
 | 
			
		||||
	/** By default some element are not read like createAt and UpdatedAt. This option permit to read it. */
 | 
			
		||||
	public interface CheckInterface<K> {
 | 
			
		||||
		/** This function implementation is design to check if the updated class is valid of not for insertion
 | 
			
		||||
		 * @param ioDb Access on the Data-Base
 | 
			
		||||
		 * @param baseName Base of the name input that is displayed in exception generated.
 | 
			
		||||
		 * @param data The object that might be injected.
 | 
			
		||||
		 * @param modifiedValue List of fields that modification is requested.
 | 
			
		||||
		 * @param options Some query option that the checker can need to generate basic check.
 | 
			
		||||
		 * @throws Exception Exception is generate if the data are incorrect. */
 | 
			
		||||
		void check(
 | 
			
		||||
				final DBAccess ioDb,
 | 
			
		||||
				final String baseName,
 | 
			
		||||
				final K data,
 | 
			
		||||
				List<String> modifiedValue,
 | 
			
		||||
				final QueryOptions options) throws Exception;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	protected Map<String, List<CheckInterface<T>>> checking = null;
 | 
			
		||||
 | 
			
		||||
	protected void add(final String field, final CheckInterface<T> checkFunction) throws DataAccessException {
 | 
			
		||||
		if (!AnnotationTools.hasFieldsName(this.clazz, field)) {
 | 
			
		||||
			LOGGER.error("Try to add a JPA Filter on an inexistant Field: '{}' not in {}", field,
 | 
			
		||||
					AnnotationTools.getAllFieldsNames(this.clazz));
 | 
			
		||||
			throw new DataAccessException("Try to add a JPA Filter on an inexistant Field: '" + field + "' not in "
 | 
			
		||||
					+ AnnotationTools.getAllFieldsNames(this.clazz));
 | 
			
		||||
		}
 | 
			
		||||
		List<CheckInterface<T>> actions = this.checking.get(field);
 | 
			
		||||
		if (actions == null) {
 | 
			
		||||
			actions = new ArrayList<>();
 | 
			
		||||
			this.checking.put(field, actions);
 | 
			
		||||
		}
 | 
			
		||||
		actions.add(checkFunction);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public CheckJPA(final Class<T> clazz) {
 | 
			
		||||
		this.clazz = clazz;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void initialize() throws Exception {
 | 
			
		||||
		if (this.checking != null) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		try {
 | 
			
		||||
			this.checking = new HashMap<>();
 | 
			
		||||
			// create Table:
 | 
			
		||||
			final List<String> primaryKeys = new ArrayList<>();
 | 
			
		||||
			for (final Field field : this.clazz.getFields()) {
 | 
			
		||||
				final String fieldName = field.getName(); // AnnotationTools.getFieldName(field);
 | 
			
		||||
				if (AnnotationTools.isPrimaryKey(field)) {
 | 
			
		||||
					add(fieldName,
 | 
			
		||||
							(
 | 
			
		||||
									final DBAccess ioDb,
 | 
			
		||||
									final String baseName,
 | 
			
		||||
									final T data,
 | 
			
		||||
									final List<String> modifiedValue,
 | 
			
		||||
									final QueryOptions options) -> {
 | 
			
		||||
								throw new InputException(baseName + fieldName,
 | 
			
		||||
										"This is a '@Id' (primaryKey) ==> can not be change");
 | 
			
		||||
							});
 | 
			
		||||
				}
 | 
			
		||||
				if (AnnotationTools.getConstraintsNotNull(field)) {
 | 
			
		||||
					add(fieldName,
 | 
			
		||||
							(
 | 
			
		||||
									final DBAccess ioDb,
 | 
			
		||||
									final String baseName,
 | 
			
		||||
									final T data,
 | 
			
		||||
									final List<String> modifiedValue,
 | 
			
		||||
									final QueryOptions options) -> {
 | 
			
		||||
								if (field.get(data) == null) {
 | 
			
		||||
									throw new InputException(baseName + fieldName, "Can not be null");
 | 
			
		||||
								}
 | 
			
		||||
							});
 | 
			
		||||
				}
 | 
			
		||||
				if (AnnotationTools.isCreatedAtField(field) || AnnotationTools.isUpdateAtField(field)) {
 | 
			
		||||
					add(fieldName,
 | 
			
		||||
							(
 | 
			
		||||
									final DBAccess ioDb,
 | 
			
		||||
									final String baseName,
 | 
			
		||||
									final T data,
 | 
			
		||||
									final List<String> modifiedValue,
 | 
			
		||||
									final QueryOptions options) -> {
 | 
			
		||||
								throw new InputException(baseName + fieldName, "It is forbidden to change this field");
 | 
			
		||||
							});
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				final Class<?> type = field.getType();
 | 
			
		||||
				if (type == Long.class || type == long.class) {
 | 
			
		||||
					final Long maxValue = AnnotationTools.getConstraintsMax(field);
 | 
			
		||||
					if (maxValue != null) {
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final Long elemTyped = (Long) elem;
 | 
			
		||||
									if (elemTyped > maxValue) {
 | 
			
		||||
										throw new InputException(baseName + fieldName,
 | 
			
		||||
												"Value too height max: " + maxValue);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
					final Long minValue = AnnotationTools.getConstraintsMin(field);
 | 
			
		||||
					if (minValue != null) {
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final Long elemTyped = (Long) elem;
 | 
			
		||||
									if (elemTyped < minValue) {
 | 
			
		||||
										throw new InputException(baseName + fieldName,
 | 
			
		||||
												"Value too Low min: " + minValue);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
					final ManyToOne annotationManyToOne = AnnotationTools.getManyToOne(field);
 | 
			
		||||
					if (annotationManyToOne != null && annotationManyToOne.targetEntity() != null) {
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final List<ConditionChecker> condCheckers = options.get(ConditionChecker.class);
 | 
			
		||||
									final Condition conditionCheck = condCheckers.isEmpty() ? null
 | 
			
		||||
											: condCheckers.get(0).toCondition();
 | 
			
		||||
									final long count = DataAccess.count(annotationManyToOne.targetEntity(), elem,
 | 
			
		||||
											conditionCheck);
 | 
			
		||||
									if (count == 0) {
 | 
			
		||||
										throw new InputException(baseName + fieldName,
 | 
			
		||||
												"Foreign element does not exist in the DB:" + elem);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
				} else if (type == Integer.class || type == int.class) {
 | 
			
		||||
					final Long maxValueRoot = AnnotationTools.getConstraintsMax(field);
 | 
			
		||||
					if (maxValueRoot != null) {
 | 
			
		||||
						final int maxValue = maxValueRoot.intValue();
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final Integer elemTyped = (Integer) elem;
 | 
			
		||||
									if (elemTyped > maxValue) {
 | 
			
		||||
										throw new InputException(baseName + fieldName,
 | 
			
		||||
												"Value too height max: " + maxValue);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
					final Long minValueRoot = AnnotationTools.getConstraintsMin(field);
 | 
			
		||||
					if (minValueRoot != null) {
 | 
			
		||||
						final int minValue = minValueRoot.intValue();
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final Integer elemTyped = (Integer) elem;
 | 
			
		||||
									if (elemTyped < minValue) {
 | 
			
		||||
										throw new InputException(baseName + fieldName,
 | 
			
		||||
												"Value too Low min: " + minValue);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
					final ManyToOne annotationManyToOne = AnnotationTools.getManyToOne(field);
 | 
			
		||||
					if (annotationManyToOne != null && annotationManyToOne.targetEntity() != null) {
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final long count = DataAccess.count(annotationManyToOne.targetEntity(), elem);
 | 
			
		||||
									if (count == 0) {
 | 
			
		||||
										throw new InputException(baseName + fieldName,
 | 
			
		||||
												"Foreign element does not exist in the DB:" + elem);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
				} else if (type == UUID.class) {
 | 
			
		||||
					final ManyToOne annotationManyToOne = AnnotationTools.getManyToOne(field);
 | 
			
		||||
					if (annotationManyToOne != null && annotationManyToOne.targetEntity() != null) {
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final long count = DataAccess.count(annotationManyToOne.targetEntity(), elem);
 | 
			
		||||
									if (count == 0) {
 | 
			
		||||
										throw new InputException(baseName + fieldName,
 | 
			
		||||
												"Foreign element does not exist in the DB:" + elem);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
				} else if (type == Boolean.class || type == boolean.class) {
 | 
			
		||||
 | 
			
		||||
				} else if (type == Float.class || type == float.class) {
 | 
			
		||||
					final Long maxValueRoot = AnnotationTools.getConstraintsMax(field);
 | 
			
		||||
					if (maxValueRoot != null) {
 | 
			
		||||
						final float maxValue = maxValueRoot.floatValue();
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final Float elemTyped = (Float) elem;
 | 
			
		||||
									if (elemTyped > maxValue) {
 | 
			
		||||
										throw new InputException(baseName + fieldName,
 | 
			
		||||
												"Value too height max: " + maxValue);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
					final Long minValueRoot = AnnotationTools.getConstraintsMin(field);
 | 
			
		||||
					if (minValueRoot != null) {
 | 
			
		||||
						final float minValue = minValueRoot.floatValue();
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final Float elemTyped = (Float) elem;
 | 
			
		||||
									if (elemTyped < minValue) {
 | 
			
		||||
										throw new InputException(baseName + fieldName,
 | 
			
		||||
												"Value too Low min: " + minValue);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
				} else if (type == Double.class || type == double.class) {
 | 
			
		||||
					final Long maxValueRoot = AnnotationTools.getConstraintsMax(field);
 | 
			
		||||
					if (maxValueRoot != null) {
 | 
			
		||||
						final double maxValue = maxValueRoot.doubleValue();
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final Double elemTyped = (Double) elem;
 | 
			
		||||
									if (elemTyped > maxValue) {
 | 
			
		||||
										throw new InputException(baseName + fieldName,
 | 
			
		||||
												"Value too height max: " + maxValue);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
					final Long minValueRoot = AnnotationTools.getConstraintsMin(field);
 | 
			
		||||
					if (minValueRoot != null) {
 | 
			
		||||
						final double minValue = minValueRoot.doubleValue();
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final Double elemTyped = (Double) elem;
 | 
			
		||||
									if (elemTyped < minValue) {
 | 
			
		||||
										throw new InputException(baseName + fieldName,
 | 
			
		||||
												"Value too Low min: " + minValue);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
				} else if (type == Date.class || type == Timestamp.class) {
 | 
			
		||||
 | 
			
		||||
				} else if (type == LocalDate.class) {
 | 
			
		||||
 | 
			
		||||
				} else if (type == LocalTime.class) {
 | 
			
		||||
 | 
			
		||||
				} else if (type == String.class) {
 | 
			
		||||
					final int maxSizeString = AnnotationTools.getLimitSize(field);
 | 
			
		||||
					if (maxSizeString > 0) {
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final String elemTyped = (String) elem;
 | 
			
		||||
									if (elemTyped.length() > maxSizeString) {
 | 
			
		||||
										throw new InputException(baseName + fieldName,
 | 
			
		||||
												"Too long size must be <= " + maxSizeString);
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
					final Size limitSize = AnnotationTools.getConstraintsSize(field);
 | 
			
		||||
					if (limitSize != null) {
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final String elemTyped = (String) elem;
 | 
			
		||||
									if (elemTyped.length() > limitSize.max()) {
 | 
			
		||||
										throw new InputException(baseName + fieldName,
 | 
			
		||||
												"Too long size (constraints) must be <= " + limitSize.max());
 | 
			
		||||
									}
 | 
			
		||||
									if (elemTyped.length() < limitSize.min()) {
 | 
			
		||||
										throw new InputException(baseName + fieldName,
 | 
			
		||||
												"Too small size (constraints) must be >= " + limitSize.min());
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
					final String patternString = AnnotationTools.getConstraintsPattern(field);
 | 
			
		||||
					if (patternString != null) {
 | 
			
		||||
						final Pattern pattern = Pattern.compile(patternString);
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final String elemTyped = (String) elem;
 | 
			
		||||
									if (!pattern.matcher(elemTyped).find()) {
 | 
			
		||||
										throw new InputException(baseName + fieldName,
 | 
			
		||||
												"does not match the required pattern (constraints) must be '"
 | 
			
		||||
														+ patternString + "'");
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
					if (AnnotationTools.getConstraintsEmail(field)) {
 | 
			
		||||
						final String emailPattern = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$";
 | 
			
		||||
						final Pattern pattern = Pattern.compile(emailPattern);
 | 
			
		||||
						add(fieldName,
 | 
			
		||||
								(
 | 
			
		||||
										final DBAccess ioDb,
 | 
			
		||||
										final String baseName,
 | 
			
		||||
										final T data,
 | 
			
		||||
										final List<String> modifiedValue,
 | 
			
		||||
										final QueryOptions options) -> {
 | 
			
		||||
									final Object elem = field.get(data);
 | 
			
		||||
									if (elem == null) {
 | 
			
		||||
										return;
 | 
			
		||||
									}
 | 
			
		||||
									final String elemTyped = (String) elem;
 | 
			
		||||
									if (!pattern.matcher(elemTyped).find()) {
 | 
			
		||||
										throw new InputException(baseName + fieldName,
 | 
			
		||||
												"does not match the required pattern[email] (constraints) must be '"
 | 
			
		||||
														+ emailPattern + "'");
 | 
			
		||||
									}
 | 
			
		||||
								});
 | 
			
		||||
					}
 | 
			
		||||
				} 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<String> 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();
 | 
			
		||||
					add(fieldName,
 | 
			
		||||
							(
 | 
			
		||||
									final DBAccess ioDb,
 | 
			
		||||
									final String baseName,
 | 
			
		||||
									final T data,
 | 
			
		||||
									final List<String> modifiedValue,
 | 
			
		||||
									final QueryOptions options) -> {
 | 
			
		||||
								// get the field of the specific element
 | 
			
		||||
								final Object tmpData = field.get(data);
 | 
			
		||||
								checkerInstance.check(ioDb, baseName, tmpData, null, options);
 | 
			
		||||
							});
 | 
			
		||||
				}
 | 
			
		||||
				// keep this is last ==> take more time...
 | 
			
		||||
				if (AnnotationTools.isUnique(field)) {
 | 
			
		||||
					// Create the request ...
 | 
			
		||||
					add(fieldName,
 | 
			
		||||
							(
 | 
			
		||||
									final DBAccess ioDb,
 | 
			
		||||
									final String baseName,
 | 
			
		||||
									final T data,
 | 
			
		||||
									final List<String> modifiedValue,
 | 
			
		||||
									final QueryOptions options) -> {
 | 
			
		||||
								final List<ConditionChecker> condCheckers = options.get(ConditionChecker.class);
 | 
			
		||||
								Object other = null;
 | 
			
		||||
								if (condCheckers.isEmpty()) {
 | 
			
		||||
									other = DataAccess.getWhere(this.clazz,
 | 
			
		||||
											new Condition(new QueryCondition(fieldName, "==", field.get(data))));
 | 
			
		||||
								} else {
 | 
			
		||||
									other = DataAccess.getWhere(this.clazz,
 | 
			
		||||
											new Condition(new QueryCondition(fieldName, "==", field.get(data))),
 | 
			
		||||
											condCheckers.get(0).toCondition());
 | 
			
		||||
								}
 | 
			
		||||
								if (other != null) {
 | 
			
		||||
									throw new InputException(baseName + fieldName, "Name already exist in the DB");
 | 
			
		||||
								}
 | 
			
		||||
							});
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
		} catch (final Exception ex) {
 | 
			
		||||
			this.checking = null;
 | 
			
		||||
			throw ex;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void check(final Object data) throws Exception {
 | 
			
		||||
		check(null, "", data, null, null);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void check(final String baseName, final Object data) throws Exception {
 | 
			
		||||
		check(null, baseName, data, null, null);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void check(final DBAccess ioDb, final String baseName, final Object data) throws Exception {
 | 
			
		||||
		check(ioDb, baseName, data, null, null);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void check(final DBAccess ioDb, final String baseName, final Object data, final List<String> modifiedValue)
 | 
			
		||||
			throws Exception {
 | 
			
		||||
		check(ioDb, baseName, data, modifiedValue, null);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void check(
 | 
			
		||||
			final DBAccess ioDb,
 | 
			
		||||
			final String baseName,
 | 
			
		||||
			final Object data,
 | 
			
		||||
			List<String> modifiedValue,
 | 
			
		||||
			final QueryOptions options) throws Exception {
 | 
			
		||||
		if (this.checking == null) {
 | 
			
		||||
			initialize();
 | 
			
		||||
		}
 | 
			
		||||
		if (modifiedValue == null) {
 | 
			
		||||
			modifiedValue = AnnotationTools.getAllFieldsNames(this.clazz);
 | 
			
		||||
		}
 | 
			
		||||
		if (!(this.clazz.isAssignableFrom(data.getClass()))) {
 | 
			
		||||
			throw new DataAccessException("Incompatatyble type of Object" + data.getClass().getCanonicalName());
 | 
			
		||||
		}
 | 
			
		||||
		@SuppressWarnings("unchecked")
 | 
			
		||||
		final T dataCasted = (T) data;
 | 
			
		||||
		for (final String filter : modifiedValue) {
 | 
			
		||||
			final List<CheckInterface<T>> actions = this.checking.get(filter);
 | 
			
		||||
			if (actions == null) {
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
			for (final CheckInterface<T> action : actions) {
 | 
			
		||||
				action.check(ioDb, baseName, dataCasted, modifiedValue, options);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		checkTyped(dataCasted, modifiedValue, options);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void checkTyped(final T data, final List<String> modifiedValue, final QueryOptions options)
 | 
			
		||||
			throws Exception {
 | 
			
		||||
		// nothing to do ...
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -76,7 +76,7 @@ public abstract class DbIo implements Closeable {
 | 
			
		||||
		return this.config.equals(config);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public DbConfig getConfig() {
 | 
			
		||||
	public DbConfig getCongig() {
 | 
			
		||||
		return this.config;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -151,6 +151,38 @@ public class DotClassElement {
 | 
			
		||||
		return ".optional()";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public String maxSizeZod(final FieldProperty field) {
 | 
			
		||||
		final StringBuilder builder = new StringBuilder();
 | 
			
		||||
		final Class<?> clazz = field.model().getOriginClasses();
 | 
			
		||||
		if (clazz == String.class) {
 | 
			
		||||
			if (field.sizeMin() > 0) {
 | 
			
		||||
				builder.append(".min(");
 | 
			
		||||
				builder.append(field.sizeMin());
 | 
			
		||||
				builder.append(")");
 | 
			
		||||
			}
 | 
			
		||||
			if (field.sizeMax() > 0) {
 | 
			
		||||
				builder.append(".max(");
 | 
			
		||||
				builder.append(field.sizeMax());
 | 
			
		||||
				builder.append(")");
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if (clazz == short.class || clazz == Short.class || clazz == int.class || clazz == Integer.class
 | 
			
		||||
				|| clazz == long.class || clazz == Long.class || clazz == float.class || clazz == Float.class
 | 
			
		||||
				|| clazz == double.class || clazz == Double.class) {
 | 
			
		||||
			if (field.min() != null && field.min() > 0) {
 | 
			
		||||
				builder.append(".min(");
 | 
			
		||||
				builder.append(field.min());
 | 
			
		||||
				builder.append(")");
 | 
			
		||||
			}
 | 
			
		||||
			if (field.max() != null && field.max() > 0) {
 | 
			
		||||
				builder.append(".max(");
 | 
			
		||||
				builder.append(field.max());
 | 
			
		||||
				builder.append(")");
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return builder.toString();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public String readOnlyZod(final FieldProperty field) {
 | 
			
		||||
		if (field.readOnly()) {
 | 
			
		||||
			return ".readonly()";
 | 
			
		||||
 
 | 
			
		||||
@@ -7,11 +7,11 @@ import java.util.Arrays;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import org.glassfish.jersey.media.multipart.FormDataParam;
 | 
			
		||||
import org.kar.archidata.annotation.ARCHIVE;
 | 
			
		||||
import org.kar.archidata.annotation.AsyncType;
 | 
			
		||||
import org.kar.archidata.annotation.FormDataOptional;
 | 
			
		||||
import org.kar.archidata.annotation.RESTORE;
 | 
			
		||||
import org.kar.archidata.annotation.TypeScriptProgress;
 | 
			
		||||
import org.kar.archidata.annotation.method.ARCHIVE;
 | 
			
		||||
import org.kar.archidata.annotation.method.RESTORE;
 | 
			
		||||
 | 
			
		||||
import io.swagger.v3.oas.annotations.Operation;
 | 
			
		||||
import jakarta.ws.rs.Consumes;
 | 
			
		||||
 
 | 
			
		||||
@@ -18,12 +18,6 @@ import org.slf4j.LoggerFactory;
 | 
			
		||||
import jakarta.persistence.ManyToMany;
 | 
			
		||||
import jakarta.persistence.ManyToOne;
 | 
			
		||||
import jakarta.persistence.OneToMany;
 | 
			
		||||
import jakarta.validation.constraints.DecimalMax;
 | 
			
		||||
import jakarta.validation.constraints.DecimalMin;
 | 
			
		||||
import jakarta.validation.constraints.Email;
 | 
			
		||||
import jakarta.validation.constraints.Max;
 | 
			
		||||
import jakarta.validation.constraints.Min;
 | 
			
		||||
import jakarta.validation.constraints.Pattern;
 | 
			
		||||
import jakarta.validation.constraints.Size;
 | 
			
		||||
 | 
			
		||||
public class ClassObjectModel extends ClassModel {
 | 
			
		||||
@@ -67,31 +61,24 @@ public class ClassObjectModel extends ClassModel {
 | 
			
		||||
			ClassModel model,
 | 
			
		||||
			ClassModel linkClass, // link class when use remote ID (ex: list<UUID>)
 | 
			
		||||
			String comment,
 | 
			
		||||
			Size stringSize, // String Size
 | 
			
		||||
			Min min, // number min value
 | 
			
		||||
			Max max, // number max value
 | 
			
		||||
			DecimalMin decimalMin,
 | 
			
		||||
			DecimalMax decimalMax,
 | 
			
		||||
			Pattern pattern,
 | 
			
		||||
			Email email,
 | 
			
		||||
			int sizeMin, // String SizeMin
 | 
			
		||||
			int sizeMax, // String SizeMax
 | 
			
		||||
			Long min, // number min value
 | 
			
		||||
			Long max, // number max value
 | 
			
		||||
			Boolean readOnly,
 | 
			
		||||
			Boolean notNull,
 | 
			
		||||
			Boolean columnNotNull,
 | 
			
		||||
			Boolean nullable) {
 | 
			
		||||
 | 
			
		||||
		public FieldProperty(final String name, final ClassModel model, final ClassModel linkClass,
 | 
			
		||||
				final String comment, final Size stringSize, final Min min, final Max max, final DecimalMin decimalMin,
 | 
			
		||||
				final DecimalMax decimalMax, final Pattern pattern, final Email email, final Boolean readOnly,
 | 
			
		||||
				final Boolean notNull, final Boolean columnNotNull, final Boolean nullable) {
 | 
			
		||||
				final String comment, final int sizeMin, final int sizeMax, final Long min, final Long max,
 | 
			
		||||
				final Boolean readOnly, final Boolean notNull, final Boolean columnNotNull, final Boolean nullable) {
 | 
			
		||||
			this.name = name;
 | 
			
		||||
			this.model = model;
 | 
			
		||||
			this.linkClass = linkClass;
 | 
			
		||||
			this.comment = comment;
 | 
			
		||||
			this.stringSize = stringSize;
 | 
			
		||||
			this.decimalMin = decimalMin;
 | 
			
		||||
			this.decimalMax = decimalMax;
 | 
			
		||||
			this.pattern = pattern;
 | 
			
		||||
			this.email = email;
 | 
			
		||||
			this.sizeMin = sizeMin;
 | 
			
		||||
			this.sizeMax = sizeMax;
 | 
			
		||||
			this.min = min;
 | 
			
		||||
			this.max = max;
 | 
			
		||||
			this.readOnly = readOnly;
 | 
			
		||||
@@ -101,6 +88,17 @@ public class ClassObjectModel extends ClassModel {
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		private static int getStringMinSize(final Field field) throws DataAccessException {
 | 
			
		||||
			final Size size = AnnotationTools.getConstraintsSize(field);
 | 
			
		||||
			return size != null ? size.min() : 0;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		private static int getStringMaxSize(final Field field) throws DataAccessException {
 | 
			
		||||
			final Size size = AnnotationTools.getConstraintsSize(field);
 | 
			
		||||
			final int colomnLimitSize = AnnotationTools.getLimitSize(field);
 | 
			
		||||
			return size == null ? colomnLimitSize : colomnLimitSize < size.max() ? colomnLimitSize : size.max();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		private static Class<?> getSubModelIfExist2(final Field field) {
 | 
			
		||||
			final ManyToOne manyToOne = AnnotationTools.getManyToOne(field);
 | 
			
		||||
			if (manyToOne != null) {
 | 
			
		||||
@@ -139,13 +137,10 @@ public class ClassObjectModel extends ClassModel {
 | 
			
		||||
					ClassModel.getModel(field.getGenericType(), previous), //
 | 
			
		||||
					getSubModelIfExist(field, previous), //
 | 
			
		||||
					AnnotationTools.getSchemaDescription(field), //
 | 
			
		||||
					AnnotationTools.getConstraintsSize(field), //
 | 
			
		||||
					getStringMinSize(field), //
 | 
			
		||||
					getStringMaxSize(field), //
 | 
			
		||||
					AnnotationTools.getConstraintsMin(field), //
 | 
			
		||||
					AnnotationTools.getConstraintsMax(field), //
 | 
			
		||||
					AnnotationTools.getConstraintsDecimalMin(field), //
 | 
			
		||||
					AnnotationTools.getConstraintsDecimalMax(field), //
 | 
			
		||||
					AnnotationTools.getConstraintsPattern(field), //
 | 
			
		||||
					AnnotationTools.getConstraintsEmail(field), //
 | 
			
		||||
					AnnotationTools.getSchemaReadOnly(field), //
 | 
			
		||||
					AnnotationTools.getConstraintsNotNull(field), //
 | 
			
		||||
					AnnotationTools.getColumnNotNull(field), //
 | 
			
		||||
 
 | 
			
		||||
@@ -259,61 +259,28 @@ public class TsClassElement {
 | 
			
		||||
		final StringBuilder builder = new StringBuilder();
 | 
			
		||||
		final Class<?> clazz = field.model().getOriginClasses();
 | 
			
		||||
		if (clazz == String.class) {
 | 
			
		||||
			if (field.stringSize() != null) {
 | 
			
		||||
				if (field.stringSize().min() > 0) {
 | 
			
		||||
					// A string size can not be lower at 0
 | 
			
		||||
					builder.append(".min(");
 | 
			
		||||
					builder.append(field.stringSize().min());
 | 
			
		||||
					builder.append(")");
 | 
			
		||||
				}
 | 
			
		||||
				if (field.stringSize().max() != Integer.MAX_VALUE) {
 | 
			
		||||
					builder.append(".max(");
 | 
			
		||||
					builder.append(field.stringSize().max());
 | 
			
		||||
					builder.append(")");
 | 
			
		||||
				}
 | 
			
		||||
			if (field.sizeMin() > 0) {
 | 
			
		||||
				builder.append(".min(");
 | 
			
		||||
				builder.append(field.sizeMin());
 | 
			
		||||
				builder.append(")");
 | 
			
		||||
			}
 | 
			
		||||
			/*Must be tested before
 | 
			
		||||
			if (field.pattern() != null) {
 | 
			
		||||
				builder.append(".regex((");
 | 
			
		||||
				builder.append(field.pattern().regexp());
 | 
			
		||||
			if (field.sizeMax() > 0) {
 | 
			
		||||
				builder.append(".max(");
 | 
			
		||||
				builder.append(field.sizeMax());
 | 
			
		||||
				builder.append(")");
 | 
			
		||||
			}*/
 | 
			
		||||
			/*Must be tested before
 | 
			
		||||
			if (field.email() != null) {
 | 
			
		||||
				builder.append(".regex((");
 | 
			
		||||
				builder.append(field.email().regexp());
 | 
			
		||||
				builder.append(")");
 | 
			
		||||
			}*/
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if (clazz == short.class || clazz == Short.class || clazz == int.class || clazz == Integer.class
 | 
			
		||||
				|| clazz == long.class || clazz == Long.class || clazz == float.class || clazz == Float.class
 | 
			
		||||
				|| clazz == double.class || clazz == Double.class) {
 | 
			
		||||
			if (field.min() != null) {
 | 
			
		||||
				builder.append(".gte(");
 | 
			
		||||
				builder.append(field.min().value());
 | 
			
		||||
			if (field.min() != null && field.min() > 0) {
 | 
			
		||||
				builder.append(".min(");
 | 
			
		||||
				builder.append(field.min());
 | 
			
		||||
				builder.append(")");
 | 
			
		||||
			}
 | 
			
		||||
			if (field.max() != null) {
 | 
			
		||||
				builder.append(".lte(");
 | 
			
		||||
				builder.append(field.max().value());
 | 
			
		||||
				builder.append(")");
 | 
			
		||||
			}
 | 
			
		||||
			if (field.decimalMax() != null) {
 | 
			
		||||
				if (field.decimalMax().inclusive()) {
 | 
			
		||||
					builder.append(".lte(");
 | 
			
		||||
				} else {
 | 
			
		||||
					builder.append(".lt(");
 | 
			
		||||
				}
 | 
			
		||||
				builder.append(field.decimalMax().value());
 | 
			
		||||
				builder.append(")");
 | 
			
		||||
			}
 | 
			
		||||
			if (field.decimalMin() != null) {
 | 
			
		||||
				if (field.decimalMin().inclusive()) {
 | 
			
		||||
					builder.append(".gte(");
 | 
			
		||||
				} else {
 | 
			
		||||
					builder.append(".gt(");
 | 
			
		||||
				}
 | 
			
		||||
				builder.append(field.decimalMin().value());
 | 
			
		||||
			if (field.max() != null && field.max() > 0) {
 | 
			
		||||
				builder.append(".max(");
 | 
			
		||||
				builder.append(field.max());
 | 
			
		||||
				builder.append(")");
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
@@ -353,19 +320,16 @@ public class TsClassElement {
 | 
			
		||||
		out.append("export const ");
 | 
			
		||||
		out.append(this.zodName);
 | 
			
		||||
		out.append(" = ");
 | 
			
		||||
		// Check if the object is empty:
 | 
			
		||||
		boolean isEmpty = model.getFields().size() == 0;
 | 
			
		||||
 | 
			
		||||
		if (model.getExtendsClass() != null) {
 | 
			
		||||
			final ClassModel parentClass = model.getExtendsClass();
 | 
			
		||||
			final TsClassElement tsParentModel = tsGroup.find(parentClass);
 | 
			
		||||
			out.append(tsParentModel.zodName);
 | 
			
		||||
			if (!isEmpty) {
 | 
			
		||||
				out.append(".extend({\n");
 | 
			
		||||
			}
 | 
			
		||||
			out.append(".extend({");
 | 
			
		||||
		} else {
 | 
			
		||||
			out.append("zod.object({\n");
 | 
			
		||||
			out.append("zod.object({");
 | 
			
		||||
		}
 | 
			
		||||
		out.append("\n");
 | 
			
		||||
		for (final FieldProperty field : model.getFields()) {
 | 
			
		||||
			final ClassModel fieldModel = field.model();
 | 
			
		||||
			if (field.comment() != null) {
 | 
			
		||||
@@ -393,11 +357,7 @@ public class TsClassElement {
 | 
			
		||||
			out.append(",\n");
 | 
			
		||||
		}
 | 
			
		||||
		final List<String> omitField = model.getReadOnlyField();
 | 
			
		||||
		if (model.getExtendsClass() != null && isEmpty) {
 | 
			
		||||
			out.append(";\n");
 | 
			
		||||
		} else {
 | 
			
		||||
			out.append("\n});\n");
 | 
			
		||||
		}
 | 
			
		||||
		out.append("\n});\n");
 | 
			
		||||
		out.append(generateZodInfer(this.tsTypeName, this.zodName));
 | 
			
		||||
		out.append(generateExportCheckFunctionWrite(""));
 | 
			
		||||
		// check if we need to generate write mode :
 | 
			
		||||
@@ -409,18 +369,17 @@ public class TsClassElement {
 | 
			
		||||
			out.append("export const ");
 | 
			
		||||
			out.append(this.zodName);
 | 
			
		||||
			out.append("Write = ");
 | 
			
		||||
			isEmpty = model.getFields().stream().filter(field -> !field.readOnly()).count() == 0;
 | 
			
		||||
 | 
			
		||||
			if (model.getExtendsClass() != null) {
 | 
			
		||||
				final ClassModel parentClass = model.getExtendsClass();
 | 
			
		||||
				final TsClassElement tsParentModel = tsGroup.find(parentClass);
 | 
			
		||||
				out.append(tsParentModel.zodName);
 | 
			
		||||
				out.append("Write");
 | 
			
		||||
				if (!isEmpty) {
 | 
			
		||||
					out.append(".extend({\n");
 | 
			
		||||
				}
 | 
			
		||||
				out.append(".extend({");
 | 
			
		||||
			} else {
 | 
			
		||||
				out.append("zod.object({\n");
 | 
			
		||||
				out.append("zod.object({");
 | 
			
		||||
			}
 | 
			
		||||
			out.append("\n");
 | 
			
		||||
			for (final FieldProperty field : model.getFields()) {
 | 
			
		||||
				// remove all readOnly field
 | 
			
		||||
				if (field.readOnly()) {
 | 
			
		||||
@@ -458,11 +417,7 @@ public class TsClassElement {
 | 
			
		||||
				}
 | 
			
		||||
				out.append(",\n");
 | 
			
		||||
			}
 | 
			
		||||
			if (model.getExtendsClass() != null && isEmpty) {
 | 
			
		||||
				out.append(";\n");
 | 
			
		||||
			} else {
 | 
			
		||||
				out.append("\n});\n");
 | 
			
		||||
			}
 | 
			
		||||
			out.append("\n});\n");
 | 
			
		||||
			out.append(generateZodInfer(this.tsTypeName + "Write", this.zodName + "Write"));
 | 
			
		||||
			// Check only the input value ==> no need of the output
 | 
			
		||||
			out.append(generateExportCheckFunctionWrite("Write"));
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@ import java.io.IOException;
 | 
			
		||||
import java.lang.reflect.Method;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Map.Entry;
 | 
			
		||||
// https://stackoverflow.com/questions/26777083/best-practice-for-rest-token-based-authentication-with-jax-rs-and-jersey
 | 
			
		||||
// https://stackoverflow.com/questions/26777083/best-practice-for-rest-token-based-authentication-with-jax-rs-and-jersey/45814178#45814178
 | 
			
		||||
@@ -245,7 +246,7 @@ public class AuthenticationFilter implements ContainerRequestFilter {
 | 
			
		||||
		final Object rowRight = ret.getClaim("right");
 | 
			
		||||
		if (rowRight != null) {
 | 
			
		||||
			LOGGER.info("Detect right in Authentication Filter: {}", rowRight);
 | 
			
		||||
			user.right = RightSafeCaster.safeCastAndTransform(ret.getClaim("right"));
 | 
			
		||||
			user.right = (Map<String, Map<String, Object>>) ret.getClaim("right");
 | 
			
		||||
			/*
 | 
			
		||||
			if (rights.containsKey(this.applicationName)) {
 | 
			
		||||
				user.right = rights.get(this.applicationName);
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,7 @@ public class MySecurityContext implements SecurityContext {
 | 
			
		||||
		return this.contextPrincipale;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public PartRight getRightOfRoleInGroup(final String group, final String role) {
 | 
			
		||||
	public Object getRightOfRoleInGroup(final String group, final String role) {
 | 
			
		||||
		if (this.contextPrincipale.userByToken != null) {
 | 
			
		||||
			return this.contextPrincipale.userByToken.getRight(group, role);
 | 
			
		||||
		}
 | 
			
		||||
@@ -67,14 +67,21 @@ public class MySecurityContext implements SecurityContext {
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
		// get associated Roles:
 | 
			
		||||
		final PartRight rightPart = getRightOfRoleInGroup(group, role);
 | 
			
		||||
		if (PartRight.READ_WRITE.equals(rightPart)) {
 | 
			
		||||
		final Object rightPart = getRightOfRoleInGroup(group, role);
 | 
			
		||||
		LOGGER.info("detect : {}", rightPart);
 | 
			
		||||
		long dataRight = 0;
 | 
			
		||||
		if (rightPart instanceof final Long rightPartCasted) {
 | 
			
		||||
			dataRight = rightPartCasted;
 | 
			
		||||
		} else if (rightPart instanceof final Integer rightPartCasted) {
 | 
			
		||||
			dataRight = rightPartCasted;
 | 
			
		||||
		}
 | 
			
		||||
		if (dataRight == PartRight.READ_WRITE.getValue()) {
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
		if (!needRead && needWrite && PartRight.WRITE.equals(rightPart)) {
 | 
			
		||||
		if (!needRead && needWrite && dataRight == PartRight.WRITE.getValue()) {
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
		if (needRead && !needWrite && PartRight.READ.equals(rightPart)) {
 | 
			
		||||
		if (needRead && !needWrite && dataRight == PartRight.READ.getValue()) {
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
		return false;
 | 
			
		||||
 
 | 
			
		||||
@@ -27,27 +27,4 @@ public enum PartRight {
 | 
			
		||||
		}
 | 
			
		||||
		throw new IllegalArgumentException("PartRight: Unknown value: " + value);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static PartRight fromValue(final long value) {
 | 
			
		||||
		for (final PartRight element : values()) {
 | 
			
		||||
			if (element.getValue() == value) {
 | 
			
		||||
				return element;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		throw new IllegalArgumentException("PartRight: Unknown value: " + value);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static PartRight fromString(final String value) {
 | 
			
		||||
		if (value == null) {
 | 
			
		||||
			throw new IllegalArgumentException("La chaîne ne peut pas être nulle");
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return switch (value.toUpperCase()) {
 | 
			
		||||
			case "NONE" -> NONE;
 | 
			
		||||
			case "READ" -> READ;
 | 
			
		||||
			case "WRITE" -> WRITE;
 | 
			
		||||
			case "READ_WRITE" -> READ_WRITE;
 | 
			
		||||
			default -> throw new IllegalArgumentException("Valeur inconnue pour PartRight : " + value);
 | 
			
		||||
		};
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,61 +0,0 @@
 | 
			
		||||
package org.kar.archidata.filter;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
public class RightSafeCaster {
 | 
			
		||||
 | 
			
		||||
	@SuppressWarnings("unchecked")
 | 
			
		||||
	public static Map<String, Map<String, PartRight>> safeCastAndTransform(final Object obj) {
 | 
			
		||||
		if (!(obj instanceof Map)) {
 | 
			
		||||
			throw new IllegalArgumentException("L'objet n'est pas un Map");
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		final Map<?, ?> outerMap = (Map<?, ?>) obj;
 | 
			
		||||
 | 
			
		||||
		// Résultat final après vérification et transformation
 | 
			
		||||
		final Map<String, Map<String, PartRight>> resultMap = new java.util.HashMap<>();
 | 
			
		||||
 | 
			
		||||
		for (final Map.Entry<?, ?> outerEntry : outerMap.entrySet()) {
 | 
			
		||||
			if (!(outerEntry.getKey() instanceof String)) {
 | 
			
		||||
				throw new IllegalArgumentException("Une clé du Map externe n'est pas de type String");
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (!(outerEntry.getValue() instanceof Map)) {
 | 
			
		||||
				throw new IllegalArgumentException("Une valeur du Map externe n'est pas un Map");
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			final String outerKey = (String) outerEntry.getKey();
 | 
			
		||||
			final Map<?, ?> innerMap = (Map<?, ?>) outerEntry.getValue();
 | 
			
		||||
 | 
			
		||||
			final Map<String, PartRight> transformedInnerMap = new java.util.HashMap<>();
 | 
			
		||||
 | 
			
		||||
			for (final Map.Entry<?, ?> innerEntry : innerMap.entrySet()) {
 | 
			
		||||
				if (!(innerEntry.getKey() instanceof String)) {
 | 
			
		||||
					throw new IllegalArgumentException("Une clé du Map interne n'est pas de type String");
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				final String innerKey = (String) innerEntry.getKey();
 | 
			
		||||
				final Object value = innerEntry.getValue();
 | 
			
		||||
 | 
			
		||||
				PartRight partRight;
 | 
			
		||||
				if (value instanceof PartRight) {
 | 
			
		||||
					partRight = (PartRight) value;
 | 
			
		||||
				} else if (value instanceof final Integer valueCasted) {
 | 
			
		||||
					partRight = PartRight.fromValue(valueCasted);
 | 
			
		||||
				} else if (value instanceof final Long valueCasted) {
 | 
			
		||||
					partRight = PartRight.fromValue(valueCasted);
 | 
			
		||||
				} else if (value instanceof final String valueCasted) {
 | 
			
		||||
					partRight = PartRight.fromString(valueCasted);
 | 
			
		||||
				} else {
 | 
			
		||||
					throw new IllegalArgumentException("The Map Value is neither PartRight nor String nor Integer");
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				transformedInnerMap.put(innerKey, partRight);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			resultMap.put(outerKey, transformedInnerMap);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return resultMap;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -11,7 +11,6 @@ import org.kar.archidata.dataAccess.DataFactory;
 | 
			
		||||
import org.kar.archidata.dataAccess.QueryOptions;
 | 
			
		||||
import org.kar.archidata.db.DbConfig;
 | 
			
		||||
import org.kar.archidata.migration.model.Migration;
 | 
			
		||||
import org.kar.archidata.tools.ConfigBaseVariable;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
 | 
			
		||||
@@ -131,40 +130,35 @@ public class MigrationEngine {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private void createTableIfAbleOrWaitAdmin(final DbConfig configInput) throws MigrationException {
 | 
			
		||||
		if (ConfigBaseVariable.getDBAbleToCreate()) {
 | 
			
		||||
			final DbConfig config = configInput.clone();
 | 
			
		||||
			config.setDbName(null);
 | 
			
		||||
			final String dbName = configInput.getDbName();
 | 
			
		||||
			LOGGER.info("Verify existance of '{}'", dbName);
 | 
			
		||||
			try (final DBAccess da = DBAccess.createInterface(config)) {
 | 
			
		||||
				boolean exist = da.isDBExist(dbName);
 | 
			
		||||
				if (!exist) {
 | 
			
		||||
					LOGGER.warn("DB: '{}' DOES NOT EXIST ==> create one", dbName);
 | 
			
		||||
					// create the local DB:
 | 
			
		||||
					da.createDB(dbName);
 | 
			
		||||
		final DbConfig config = configInput.clone();
 | 
			
		||||
		config.setDbName(null);
 | 
			
		||||
		final String dbName = configInput.getDbName();
 | 
			
		||||
		LOGGER.info("Verify existance of '{}'", dbName);
 | 
			
		||||
		try (final DBAccess da = DBAccess.createInterface(config)) {
 | 
			
		||||
			boolean exist = da.isDBExist(dbName);
 | 
			
		||||
			if (!exist) {
 | 
			
		||||
				LOGGER.warn("DB: '{}' DOES NOT EXIST ==> create one", dbName);
 | 
			
		||||
				// create the local DB:
 | 
			
		||||
				da.createDB(dbName);
 | 
			
		||||
			}
 | 
			
		||||
			exist = da.isDBExist(dbName);
 | 
			
		||||
			while (!exist) {
 | 
			
		||||
				LOGGER.error("DB: '{}' DOES NOT EXIST after trying to create one ", dbName);
 | 
			
		||||
				LOGGER.error("Waiting administrator create a new one, we check after 30 seconds...");
 | 
			
		||||
				try {
 | 
			
		||||
					Thread.sleep(30000);
 | 
			
		||||
				} catch (final InterruptedException e) {
 | 
			
		||||
					// TODO Auto-generated catch block
 | 
			
		||||
					e.printStackTrace();
 | 
			
		||||
				}
 | 
			
		||||
				exist = da.isDBExist(dbName);
 | 
			
		||||
				while (!exist) {
 | 
			
		||||
					LOGGER.error("DB: '{}' DOES NOT EXIST after trying to create one ", dbName);
 | 
			
		||||
					LOGGER.error("Waiting administrator create a new one, we check after 30 seconds...");
 | 
			
		||||
					try {
 | 
			
		||||
						Thread.sleep(30000);
 | 
			
		||||
					} catch (final InterruptedException e) {
 | 
			
		||||
						// TODO Auto-generated catch block
 | 
			
		||||
						e.printStackTrace();
 | 
			
		||||
					}
 | 
			
		||||
					exist = da.isDBExist(dbName);
 | 
			
		||||
				}
 | 
			
		||||
			} catch (final InternalServerErrorException e) {
 | 
			
		||||
				e.printStackTrace();
 | 
			
		||||
				throw new MigrationException("TODO ...");
 | 
			
		||||
			} catch (final IOException e) {
 | 
			
		||||
				e.printStackTrace();
 | 
			
		||||
				throw new MigrationException("TODO ...");
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			final String dbName = configInput.getDbName();
 | 
			
		||||
			LOGGER.warn("DB: '{}' is not check if it EXIST", dbName);
 | 
			
		||||
		} catch (final InternalServerErrorException e) {
 | 
			
		||||
			e.printStackTrace();
 | 
			
		||||
			throw new MigrationException("TODO ...");
 | 
			
		||||
		} catch (final IOException e) {
 | 
			
		||||
			e.printStackTrace();
 | 
			
		||||
			throw new MigrationException("TODO ...");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,6 @@ import com.fasterxml.jackson.annotation.JsonInclude;
 | 
			
		||||
import io.swagger.v3.oas.annotations.media.Schema;
 | 
			
		||||
import jakarta.persistence.Column;
 | 
			
		||||
import jakarta.persistence.Table;
 | 
			
		||||
import jakarta.validation.constraints.Size;
 | 
			
		||||
 | 
			
		||||
@Table(name = "data")
 | 
			
		||||
@DataIfNotExists
 | 
			
		||||
@@ -15,11 +14,9 @@ import jakarta.validation.constraints.Size;
 | 
			
		||||
public class Data extends OIDGenericDataSoftDelete {
 | 
			
		||||
	@Column(length = 128, nullable = false)
 | 
			
		||||
	@Schema(description = "Sha512 of the data")
 | 
			
		||||
	@Size(max = 512)
 | 
			
		||||
	public String sha512;
 | 
			
		||||
	@Column(length = 128, nullable = false)
 | 
			
		||||
	@Schema(description = "Mime -type of the media")
 | 
			
		||||
	@Size(max = 512)
 | 
			
		||||
	public String mimeType;
 | 
			
		||||
	@Column(nullable = false)
 | 
			
		||||
	@Schema(description = "Size in Byte of the data")
 | 
			
		||||
 
 | 
			
		||||
@@ -51,7 +51,6 @@ public class User extends GenericDataSoftDelete {
 | 
			
		||||
	@Nullable
 | 
			
		||||
	public Boolean blocked = false;
 | 
			
		||||
	@Column(length = 512)
 | 
			
		||||
	@Size(max = 512)
 | 
			
		||||
	public String blockedReason;
 | 
			
		||||
 | 
			
		||||
	@Schema(description = "List of Id of the specific covers")
 | 
			
		||||
 
 | 
			
		||||
@@ -4,8 +4,6 @@ import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
import org.kar.archidata.filter.PartRight;
 | 
			
		||||
 | 
			
		||||
public class UserByToken {
 | 
			
		||||
	public static final int TYPE_USER = -1;
 | 
			
		||||
	public static final int TYPE_APPLICATION = -2;
 | 
			
		||||
@@ -13,11 +11,10 @@ public class UserByToken {
 | 
			
		||||
	public Integer type = null;
 | 
			
		||||
 | 
			
		||||
	public Long id = null;
 | 
			
		||||
	// For application, this is the id of the application, and of user token, this is the USERID
 | 
			
		||||
	public Long parentId = null;
 | 
			
		||||
	public Long parentId = null; // FOr application, this is the id of the application, and of user token, this is the USERID
 | 
			
		||||
	public String name = null;
 | 
			
		||||
	// Right map
 | 
			
		||||
	public Map<String, Map<String, PartRight>> right = new HashMap<>();
 | 
			
		||||
	public Map<String, Map<String, Object>> right = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
	public Set<String> getGroups() {
 | 
			
		||||
		return this.right.keySet();
 | 
			
		||||
@@ -30,11 +27,11 @@ public class UserByToken {
 | 
			
		||||
		return this.right.containsKey(group);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public PartRight getRight(final String group, final String key) {
 | 
			
		||||
	public Object getRight(final String group, final String key) {
 | 
			
		||||
		if (!this.right.containsKey(group)) {
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
		final Map<String, PartRight> rightGroup = this.right.get(group);
 | 
			
		||||
		final Map<String, Object> rightGroup = this.right.get(group);
 | 
			
		||||
		if (!rightGroup.containsKey(key)) {
 | 
			
		||||
			return null;
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,13 +0,0 @@
 | 
			
		||||
package org.kar.archidata.model.token;
 | 
			
		||||
 | 
			
		||||
import jakarta.validation.constraints.NotNull;
 | 
			
		||||
import jakarta.validation.constraints.Size;
 | 
			
		||||
 | 
			
		||||
public class JwtHeader {
 | 
			
		||||
	@Size(max = 128)
 | 
			
		||||
	@NotNull
 | 
			
		||||
	public String typ;
 | 
			
		||||
	@Size(max = 128)
 | 
			
		||||
	@NotNull
 | 
			
		||||
	public String alg;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,29 +0,0 @@
 | 
			
		||||
package org.kar.archidata.model.token;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import jakarta.validation.constraints.NotNull;
 | 
			
		||||
 | 
			
		||||
public class JwtPayload {
 | 
			
		||||
	// User identification
 | 
			
		||||
	@NotNull
 | 
			
		||||
	public String sub;
 | 
			
		||||
	// Application destination
 | 
			
		||||
	@NotNull
 | 
			
		||||
	public String application;
 | 
			
		||||
	// Emitter of the token
 | 
			
		||||
	@NotNull
 | 
			
		||||
	public String iss;
 | 
			
		||||
	// Access Right Map<application, Map< section, right>>
 | 
			
		||||
	@NotNull
 | 
			
		||||
	public Map<String, Map<String, Long>> right;
 | 
			
		||||
	// user name
 | 
			
		||||
	@NotNull
 | 
			
		||||
	public String login;
 | 
			
		||||
	// Expiration (timestamp)
 | 
			
		||||
	@NotNull
 | 
			
		||||
	public Long exp;
 | 
			
		||||
	// Create time (timestamp)
 | 
			
		||||
	@NotNull
 | 
			
		||||
	public Long iat;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,12 +0,0 @@
 | 
			
		||||
package org.kar.archidata.model.token;
 | 
			
		||||
 | 
			
		||||
import jakarta.validation.constraints.NotNull;
 | 
			
		||||
 | 
			
		||||
public class JwtToken {
 | 
			
		||||
	@NotNull
 | 
			
		||||
	public JwtHeader header;
 | 
			
		||||
	@NotNull
 | 
			
		||||
	public JwtPayload payload;
 | 
			
		||||
	@NotNull
 | 
			
		||||
	public String signature;
 | 
			
		||||
}
 | 
			
		||||
@@ -3,7 +3,6 @@ package org.kar.archidata.tools;
 | 
			
		||||
public class ConfigBaseVariable {
 | 
			
		||||
	static public String tmpDataFolder;
 | 
			
		||||
	static public String dataFolder;
 | 
			
		||||
	static public String dbAbleToCreate;
 | 
			
		||||
	static public String dbType;
 | 
			
		||||
	static public String dbHost;
 | 
			
		||||
	static public String dbPort;
 | 
			
		||||
@@ -24,7 +23,6 @@ public class ConfigBaseVariable {
 | 
			
		||||
	public static void clearAllValue() {
 | 
			
		||||
		tmpDataFolder = System.getenv("DATA_TMP_FOLDER");
 | 
			
		||||
		dataFolder = System.getenv("DATA_FOLDER");
 | 
			
		||||
		dbAbleToCreate = System.getenv("DB_ABLE_TO_CREATE");
 | 
			
		||||
		dbType = System.getenv("DB_TYPE");
 | 
			
		||||
		dbHost = System.getenv("DB_HOST");
 | 
			
		||||
		dbPort = System.getenv("DB_PORT");
 | 
			
		||||
@@ -60,13 +58,6 @@ public class ConfigBaseVariable {
 | 
			
		||||
		return dataFolder;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static boolean getDBAbleToCreate() {
 | 
			
		||||
		if (dbAbleToCreate == null) {
 | 
			
		||||
			return true;
 | 
			
		||||
		}
 | 
			
		||||
		return Boolean.getBoolean(dbAbleToCreate);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static String getDBType() {
 | 
			
		||||
		if (dbType == null) {
 | 
			
		||||
			return "mysql";
 | 
			
		||||
@@ -109,6 +100,9 @@ public class ConfigBaseVariable {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static String getDBName() {
 | 
			
		||||
		if (bdDatabase == null) {
 | 
			
		||||
			return "unknown";
 | 
			
		||||
		}
 | 
			
		||||
		return bdDatabase;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -56,6 +56,7 @@ public class RESTApi {
 | 
			
		||||
						"Fail to get the data [" + httpResponse.statusCode() + "] " + httpResponse.body());
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		//return this.mapper.readValue(httpResponse.body(), new TypeReference<List<T>>() {});
 | 
			
		||||
		return this.mapper.readValue(httpResponse.body(),
 | 
			
		||||
				this.mapper.getTypeFactory().constructCollectionType(List.class, clazz));
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -4,9 +4,9 @@ import java.util.ArrayList;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import org.kar.archidata.annotation.ARCHIVE;
 | 
			
		||||
import org.kar.archidata.annotation.AsyncType;
 | 
			
		||||
import org.kar.archidata.annotation.method.ARCHIVE;
 | 
			
		||||
import org.kar.archidata.annotation.method.RESTORE;
 | 
			
		||||
import org.kar.archidata.annotation.RESTORE;
 | 
			
		||||
import org.kar.archidata.exception.NotFoundException;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
 
 | 
			
		||||
@@ -2,9 +2,9 @@ package test.kar.archidata.apiExtern.resource;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import org.kar.archidata.annotation.ARCHIVE;
 | 
			
		||||
import org.kar.archidata.annotation.AsyncType;
 | 
			
		||||
import org.kar.archidata.annotation.method.ARCHIVE;
 | 
			
		||||
import org.kar.archidata.annotation.method.RESTORE;
 | 
			
		||||
import org.kar.archidata.annotation.RESTORE;
 | 
			
		||||
import org.kar.archidata.dataAccess.DataAccess;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,240 +0,0 @@
 | 
			
		||||
package test.kar.archidata.checker;
 | 
			
		||||
 | 
			
		||||
import org.junit.jupiter.api.Assertions;
 | 
			
		||||
import org.junit.jupiter.api.Test;
 | 
			
		||||
import org.kar.archidata.exception.InputException;
 | 
			
		||||
 | 
			
		||||
import test.kar.archidata.checker.model.JpaBaseModel;
 | 
			
		||||
import test.kar.archidata.checker.model.JpaBaseModel.JpaBaseModelChecker;
 | 
			
		||||
 | 
			
		||||
public class TestJPACheckerDecimalMax {
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMaxIncludeInteger() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMaxIncludeInteger = 75;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxIncludeInteger = 74;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxIncludeInteger = 76;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxIncludeInteger = 100;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMaxIncludeIntegerObject() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMaxIncludeIntegerObject = 75;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxIncludeIntegerObject = 74;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxIncludeIntegerObject = 76;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxIncludeIntegerObject = 100;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMaxIncludeLong() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMaxIncludeLong = 75;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxIncludeLong = 74;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxIncludeLong = 76;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxIncludeLong = 100;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMaxIncludeLongObject() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMaxIncludeLongObject = 75L;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxIncludeLongObject = 74L;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxIncludeLongObject = 76L;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxIncludeLongObject = 100L;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMaxIncludeFloat() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		// can not be tested
 | 
			
		||||
		//data.testDecimalMaxIncludeFloat = 75.56f;
 | 
			
		||||
		//Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxIncludeFloat = 75.5599f;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxIncludeFloat = 75.5601f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxIncludeFloat = 100f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMaxIncludeFloatObject() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMaxIncludeFloatObject = 75.56f;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxIncludeFloatObject = 75.5599f;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxIncludeFloatObject = 75.5601f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxIncludeFloatObject = 100f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMaxIncludeDouble() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		// can not be tested
 | 
			
		||||
		//data.testDecimalMaxIncludeDouble = 75.56d;
 | 
			
		||||
		//Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxIncludeDouble = 75.5599d;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxIncludeDouble = 75.5601d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxIncludeDouble = 100d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMaxIncludeDoubleObject() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		//data.testDecimalMaxIncludeDoubleObject = 75.56d;
 | 
			
		||||
		//Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxIncludeDoubleObject = 75.5599d;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxIncludeDoubleObject = 75.5601d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxIncludeDoubleObject = 100d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// exclude
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMaxExcludeInteger() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMaxExcludeInteger = 75;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxExcludeInteger = 74;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxExcludeInteger = 76;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxExcludeInteger = 100;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMaxExcludeIntegerObject() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMaxExcludeIntegerObject = 75;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxExcludeIntegerObject = 74;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxExcludeIntegerObject = 76;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxExcludeIntegerObject = 100;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMaxExcludeLong() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMaxExcludeLong = 75;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxExcludeLong = 74;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxExcludeLong = 76;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxExcludeLong = 100;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMaxExcludeLongObject() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMaxExcludeLongObject = 75L;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxExcludeLongObject = 74L;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxExcludeLongObject = 76L;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxExcludeLongObject = 100L;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMaxExcludeFloat() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMaxExcludeFloat = 75.56f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxExcludeFloat = 75.5599f;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxExcludeFloat = 75.5601f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxExcludeFloat = 100f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMaxExcludeFloatObject() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMaxExcludeFloatObject = 75.56f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxExcludeFloatObject = 75.5599f;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxExcludeFloatObject = 75.5601f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxExcludeFloatObject = 100f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMaxExcludeDouble() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMaxExcludeDouble = 75.56d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxExcludeDouble = 75.5599d;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxExcludeDouble = 75.5601d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxExcludeDouble = 100d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMaxExcludeDoubleObject() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMaxExcludeDoubleObject = 75.56d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxExcludeDoubleObject = 75.5599d;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxExcludeDoubleObject = 75.5601d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMaxExcludeDoubleObject = 100d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,240 +0,0 @@
 | 
			
		||||
package test.kar.archidata.checker;
 | 
			
		||||
 | 
			
		||||
import org.junit.jupiter.api.Assertions;
 | 
			
		||||
import org.junit.jupiter.api.Test;
 | 
			
		||||
import org.kar.archidata.exception.InputException;
 | 
			
		||||
 | 
			
		||||
import test.kar.archidata.checker.model.JpaBaseModel;
 | 
			
		||||
import test.kar.archidata.checker.model.JpaBaseModel.JpaBaseModelChecker;
 | 
			
		||||
 | 
			
		||||
public class TestJPACheckerDecimalMin {
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMinIncludeInteger() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMinIncludeInteger = -75;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinIncludeInteger = -74;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinIncludeInteger = -76;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinIncludeInteger = -100;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMinIncludeIntegerObject() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMinIncludeIntegerObject = -75;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinIncludeIntegerObject = -74;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinIncludeIntegerObject = -76;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinIncludeIntegerObject = -100;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMinIncludeLong() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMinIncludeLong = -75;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinIncludeLong = -74;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinIncludeLong = -76;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinIncludeLong = -100;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMinIncludeLongObject() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMinIncludeLongObject = -75L;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinIncludeLongObject = -74L;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinIncludeLongObject = -76L;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinIncludeLongObject = -100L;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMinIncludeFloat() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMinIncludeFloat = -75.56f;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinIncludeFloat = -75.5599f;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinIncludeFloat = -75.5601f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinIncludeFloat = -100f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMinIncludeFloatObject() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMinIncludeFloatObject = -75.56f;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinIncludeFloatObject = -75.5599f;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinIncludeFloatObject = -75.5601f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinIncludeFloatObject = -100f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMinIncludeDouble() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		// can not be tested
 | 
			
		||||
		//data.testDecimalMinIncludeDouble = -75.56d;
 | 
			
		||||
		//Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinIncludeDouble = -75.5599d;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinIncludeDouble = -75.5601d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinIncludeDouble = -100d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMinIncludeDoubleObject() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		// can not be tested
 | 
			
		||||
		//data.testDecimalMinIncludeDoubleObject = -75.56d;
 | 
			
		||||
		//Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinIncludeDoubleObject = -75.5599d;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinIncludeDoubleObject = -75.5601d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinIncludeDoubleObject = -100d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// exclude
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMinExcludeInteger() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMinExcludeInteger = -75;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinExcludeInteger = -74;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinExcludeInteger = -76;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinExcludeInteger = -100;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMinExcludeIntegerObject() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMinExcludeIntegerObject = -75;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinExcludeIntegerObject = -74;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinExcludeIntegerObject = -76;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinExcludeIntegerObject = -100;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMinExcludeLong() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMinExcludeLong = -75;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinExcludeLong = -74;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinExcludeLong = -76;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinExcludeLong = -100;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMinExcludeLongObject() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMinExcludeLongObject = -75L;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinExcludeLongObject = -74L;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinExcludeLongObject = -76L;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinExcludeLongObject = -100L;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMinExcludeFloat() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMinExcludeFloat = -75.56f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinExcludeFloat = -75.5599f;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinExcludeFloat = -75.5601f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinExcludeFloat = -100f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMinExcludeFloatObject() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMinExcludeFloatObject = -75.56f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinExcludeFloatObject = -75.5599f;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinExcludeFloatObject = -75.5601f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinExcludeFloatObject = -100f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMinExcludeDouble() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMinExcludeDouble = -75.56d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinExcludeDouble = -75.5599d;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinExcludeDouble = -75.5601d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinExcludeDouble = -100d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testDecimalMinExcludeDoubleObject() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testDecimalMinExcludeDoubleObject = -75.56d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinExcludeDoubleObject = -75.5599d;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinExcludeDoubleObject = -75.5601d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testDecimalMinExcludeDoubleObject = -100d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,30 +0,0 @@
 | 
			
		||||
package test.kar.archidata.checker;
 | 
			
		||||
 | 
			
		||||
import org.junit.jupiter.api.Assertions;
 | 
			
		||||
import org.junit.jupiter.api.Test;
 | 
			
		||||
import org.kar.archidata.exception.InputException;
 | 
			
		||||
 | 
			
		||||
import test.kar.archidata.checker.model.JpaBaseModel;
 | 
			
		||||
import test.kar.archidata.checker.model.JpaBaseModel.JpaBaseModelChecker;
 | 
			
		||||
 | 
			
		||||
public class TestJPACheckerEMail {
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testEMail() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testEMail = "s@s.ds";
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testEMail = "yuio.sdf@sqdf.com";
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testEMail = "s@s.s";
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testEMail = "sq@qsd";
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testEMail = "sqsdfsdf";
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testEMail = "56465456";
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,123 +0,0 @@
 | 
			
		||||
package test.kar.archidata.checker;
 | 
			
		||||
 | 
			
		||||
import org.junit.jupiter.api.Assertions;
 | 
			
		||||
import org.junit.jupiter.api.Test;
 | 
			
		||||
import org.kar.archidata.exception.InputException;
 | 
			
		||||
 | 
			
		||||
import test.kar.archidata.checker.model.JpaBaseModel;
 | 
			
		||||
import test.kar.archidata.checker.model.JpaBaseModel.JpaBaseModelChecker;
 | 
			
		||||
 | 
			
		||||
public class TestJPACheckerMax {
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testMaxInteger() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testMaxInteger = 75;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMaxInteger = 74;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMaxInteger = 76;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testMaxInteger = 100;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testMaxIntegerObject() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testMaxIntegerObject = 75;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMaxIntegerObject = 74;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMaxIntegerObject = 76;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testMaxIntegerObject = 100;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testMaxLong() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testMaxLong = 75;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMaxLong = 74;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMaxLong = 76;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testMaxLong = 100;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testMaxLongObject() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testMaxLongObject = 75L;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMaxLongObject = 74L;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMaxLongObject = 76L;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testMaxLongObject = 100L;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testMaxFloat() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testMaxFloat = 75f;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMaxFloat = 74.99f;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMaxFloat = 75.01f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testMaxFloat = 100f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testMaxFloatObject() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testMaxFloatObject = 75f;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMaxFloatObject = 74.99f;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMaxFloatObject = 75.01f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testMaxFloatObject = 100f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testMaxDouble() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testMaxDouble = 75d;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMaxDouble = 74.99d;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMaxDouble = 75.01d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testMaxDouble = 100d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testMaxDoubleObject() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testMaxDoubleObject = 75d;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMaxDoubleObject = 74.99d;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMaxDoubleObject = 75.01d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testMaxDoubleObject = 100d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -1,123 +0,0 @@
 | 
			
		||||
package test.kar.archidata.checker;
 | 
			
		||||
 | 
			
		||||
import org.junit.jupiter.api.Assertions;
 | 
			
		||||
import org.junit.jupiter.api.Test;
 | 
			
		||||
import org.kar.archidata.exception.InputException;
 | 
			
		||||
 | 
			
		||||
import test.kar.archidata.checker.model.JpaBaseModel;
 | 
			
		||||
import test.kar.archidata.checker.model.JpaBaseModel.JpaBaseModelChecker;
 | 
			
		||||
 | 
			
		||||
public class TestJPACheckerMin {
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testMinInteger() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testMinInteger = -75;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMinInteger = -74;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMinInteger = -76;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testMinInteger = -100;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testMinIntegerObject() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testMinIntegerObject = -75;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMinIntegerObject = -74;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMinIntegerObject = -76;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testMinIntegerObject = -100;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testMinLong() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testMinLong = -75;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMinLong = -74;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMinLong = -76;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testMinLong = -100;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testMinLongObject() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testMinLongObject = -75L;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMinLongObject = -74L;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMinLongObject = -76L;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testMinLongObject = -100L;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testMinFloat() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testMinFloat = -75f;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMinFloat = -74.99f;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMinFloat = -75.01f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testMinFloat = -100f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testMinFloatObject() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testMinFloatObject = -75f;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMinFloatObject = -74.99f;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMinFloatObject = -75.01f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testMinFloatObject = -100f;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testMinDouble() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testMinDouble = -75d;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMinDouble = -74.99d;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMinDouble = -75.01d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testMinDouble = -100d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testMinDoubleObject() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testMinDoubleObject = -75d;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMinDoubleObject = -74.99d;
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testMinDoubleObject = -75.01d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testMinDoubleObject = -100d;
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -1,26 +0,0 @@
 | 
			
		||||
package test.kar.archidata.checker;
 | 
			
		||||
 | 
			
		||||
import org.junit.jupiter.api.Assertions;
 | 
			
		||||
import org.junit.jupiter.api.Test;
 | 
			
		||||
import org.kar.archidata.exception.InputException;
 | 
			
		||||
 | 
			
		||||
import test.kar.archidata.checker.model.JpaBaseModel;
 | 
			
		||||
import test.kar.archidata.checker.model.JpaBaseModel.JpaBaseModelChecker;
 | 
			
		||||
 | 
			
		||||
public class TestJPACheckerPattern {
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testPattern() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testPattern = "0";
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testPattern = "1234567890";
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testPattern = "q";
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testPattern = "qsdf4653";
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,26 +0,0 @@
 | 
			
		||||
package test.kar.archidata.checker;
 | 
			
		||||
 | 
			
		||||
import org.junit.jupiter.api.Assertions;
 | 
			
		||||
import org.junit.jupiter.api.Test;
 | 
			
		||||
import org.kar.archidata.exception.InputException;
 | 
			
		||||
 | 
			
		||||
import test.kar.archidata.checker.model.JpaBaseModel;
 | 
			
		||||
import test.kar.archidata.checker.model.JpaBaseModel.JpaBaseModelChecker;
 | 
			
		||||
 | 
			
		||||
public class TestJPACheckerSize {
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testSize() throws Exception {
 | 
			
		||||
		final JpaBaseModelChecker checker = new JpaBaseModelChecker();
 | 
			
		||||
		final JpaBaseModel data = new JpaBaseModel();
 | 
			
		||||
		data.testSize = "000";
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testSize = "00000000";
 | 
			
		||||
		Assertions.assertDoesNotThrow(() -> checker.check(data));
 | 
			
		||||
		data.testSize = "00";
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
		data.testSize = "000000000";
 | 
			
		||||
		Assertions.assertThrows(InputException.class, () -> checker.check(data));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,132 +0,0 @@
 | 
			
		||||
package test.kar.archidata.checker.model;
 | 
			
		||||
 | 
			
		||||
import org.kar.archidata.checker.CheckJPA;
 | 
			
		||||
 | 
			
		||||
import jakarta.validation.constraints.DecimalMax;
 | 
			
		||||
import jakarta.validation.constraints.DecimalMin;
 | 
			
		||||
import jakarta.validation.constraints.Email;
 | 
			
		||||
import jakarta.validation.constraints.Max;
 | 
			
		||||
import jakarta.validation.constraints.Min;
 | 
			
		||||
import jakarta.validation.constraints.Pattern;
 | 
			
		||||
import jakarta.validation.constraints.Size;
 | 
			
		||||
 | 
			
		||||
public class JpaBaseModel {
 | 
			
		||||
	// Simple checker declaration
 | 
			
		||||
	public static class JpaBaseModelChecker extends CheckJPA<JpaBaseModel> {
 | 
			
		||||
		public JpaBaseModelChecker() {
 | 
			
		||||
			super(JpaBaseModel.class);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Simple data to verify if the checker is active
 | 
			
		||||
	@Size(min = 3, max = 8)
 | 
			
		||||
	public String testSize;
 | 
			
		||||
 | 
			
		||||
	@Pattern(regexp = "^[0-9]+$")
 | 
			
		||||
	public String testPattern;
 | 
			
		||||
 | 
			
		||||
	@Email
 | 
			
		||||
	public String testEMail;
 | 
			
		||||
 | 
			
		||||
	@Min(-75)
 | 
			
		||||
	public int testMinInteger;
 | 
			
		||||
	@Min(-75)
 | 
			
		||||
	public Integer testMinIntegerObject;
 | 
			
		||||
	@Min(-75)
 | 
			
		||||
	public long testMinLong;
 | 
			
		||||
	@Min(-75)
 | 
			
		||||
	public Long testMinLongObject;
 | 
			
		||||
	@Min(-75)
 | 
			
		||||
	public float testMinFloat;
 | 
			
		||||
	@Min(-75)
 | 
			
		||||
	public Float testMinFloatObject;
 | 
			
		||||
	@Min(-75)
 | 
			
		||||
	public double testMinDouble;
 | 
			
		||||
	@Min(-75)
 | 
			
		||||
	public Double testMinDoubleObject;
 | 
			
		||||
 | 
			
		||||
	@Max(75)
 | 
			
		||||
	public int testMaxInteger;
 | 
			
		||||
	@Max(75)
 | 
			
		||||
	public Integer testMaxIntegerObject;
 | 
			
		||||
	@Max(75)
 | 
			
		||||
	public long testMaxLong;
 | 
			
		||||
	@Max(75)
 | 
			
		||||
	public Long testMaxLongObject;
 | 
			
		||||
	@Max(75)
 | 
			
		||||
	public float testMaxFloat;
 | 
			
		||||
	@Max(75)
 | 
			
		||||
	public Float testMaxFloatObject;
 | 
			
		||||
	@Max(75)
 | 
			
		||||
	public double testMaxDouble;
 | 
			
		||||
	@Max(75)
 | 
			
		||||
	public Double testMaxDoubleObject;
 | 
			
		||||
 | 
			
		||||
	@DecimalMin("-75")
 | 
			
		||||
	public int testDecimalMinIncludeInteger;
 | 
			
		||||
	@DecimalMin("-75")
 | 
			
		||||
	public Integer testDecimalMinIncludeIntegerObject;
 | 
			
		||||
	@DecimalMin("-75")
 | 
			
		||||
	public long testDecimalMinIncludeLong;
 | 
			
		||||
	@DecimalMin("-75")
 | 
			
		||||
	public Long testDecimalMinIncludeLongObject;
 | 
			
		||||
	@DecimalMin("-75.56")
 | 
			
		||||
	public float testDecimalMinIncludeFloat;
 | 
			
		||||
	@DecimalMin("-75.56")
 | 
			
		||||
	public Float testDecimalMinIncludeFloatObject;
 | 
			
		||||
	@DecimalMin("-75.56")
 | 
			
		||||
	public double testDecimalMinIncludeDouble;
 | 
			
		||||
	@DecimalMin("-75.56")
 | 
			
		||||
	public Double testDecimalMinIncludeDoubleObject;
 | 
			
		||||
 | 
			
		||||
	@DecimalMax("75")
 | 
			
		||||
	public int testDecimalMaxIncludeInteger;
 | 
			
		||||
	@DecimalMax("75")
 | 
			
		||||
	public Integer testDecimalMaxIncludeIntegerObject;
 | 
			
		||||
	@DecimalMax("75")
 | 
			
		||||
	public long testDecimalMaxIncludeLong;
 | 
			
		||||
	@DecimalMax("75")
 | 
			
		||||
	public Long testDecimalMaxIncludeLongObject;
 | 
			
		||||
	@DecimalMax("75.56")
 | 
			
		||||
	public float testDecimalMaxIncludeFloat;
 | 
			
		||||
	@DecimalMax("75.56")
 | 
			
		||||
	public Float testDecimalMaxIncludeFloatObject;
 | 
			
		||||
	@DecimalMax("75.56")
 | 
			
		||||
	public double testDecimalMaxIncludeDouble;
 | 
			
		||||
	@DecimalMax("75.56")
 | 
			
		||||
	public Double testDecimalMaxIncludeDoubleObject;
 | 
			
		||||
 | 
			
		||||
	@DecimalMin(value = "-75", inclusive = false)
 | 
			
		||||
	public int testDecimalMinExcludeInteger;
 | 
			
		||||
	@DecimalMin(value = "-75", inclusive = false)
 | 
			
		||||
	public Integer testDecimalMinExcludeIntegerObject;
 | 
			
		||||
	@DecimalMin(value = "-75", inclusive = false)
 | 
			
		||||
	public long testDecimalMinExcludeLong;
 | 
			
		||||
	@DecimalMin(value = "-75", inclusive = false)
 | 
			
		||||
	public Long testDecimalMinExcludeLongObject;
 | 
			
		||||
	@DecimalMin(value = "-75.56", inclusive = false)
 | 
			
		||||
	public float testDecimalMinExcludeFloat;
 | 
			
		||||
	@DecimalMin(value = "-75.56", inclusive = false)
 | 
			
		||||
	public Float testDecimalMinExcludeFloatObject;
 | 
			
		||||
	@DecimalMin(value = "-75.56", inclusive = false)
 | 
			
		||||
	public double testDecimalMinExcludeDouble;
 | 
			
		||||
	@DecimalMin(value = "-75.56", inclusive = false)
 | 
			
		||||
	public Double testDecimalMinExcludeDoubleObject;
 | 
			
		||||
 | 
			
		||||
	@DecimalMax(value = "75", inclusive = false)
 | 
			
		||||
	public int testDecimalMaxExcludeInteger;
 | 
			
		||||
	@DecimalMax(value = "75", inclusive = false)
 | 
			
		||||
	public Integer testDecimalMaxExcludeIntegerObject;
 | 
			
		||||
	@DecimalMax(value = "75", inclusive = false)
 | 
			
		||||
	public long testDecimalMaxExcludeLong;
 | 
			
		||||
	@DecimalMax(value = "75", inclusive = false)
 | 
			
		||||
	public Long testDecimalMaxExcludeLongObject;
 | 
			
		||||
	@DecimalMax(value = "75.56", inclusive = false)
 | 
			
		||||
	public float testDecimalMaxExcludeFloat;
 | 
			
		||||
	@DecimalMax(value = "75.56", inclusive = false)
 | 
			
		||||
	public Float testDecimalMaxExcludeFloatObject;
 | 
			
		||||
	@DecimalMax(value = "75.56", inclusive = false)
 | 
			
		||||
	public double testDecimalMaxExcludeDouble;
 | 
			
		||||
	@DecimalMax(value = "75.56", inclusive = false)
 | 
			
		||||
	public Double testDecimalMaxExcludeDoubleObject;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
package test.kar.archidata.dataAccess.model;
 | 
			
		||||
 | 
			
		||||
import org.kar.archidata.checker.CheckJPA;
 | 
			
		||||
import org.kar.archidata.dataAccess.options.CheckJPA;
 | 
			
		||||
 | 
			
		||||
import jakarta.validation.constraints.Pattern;
 | 
			
		||||
import jakarta.validation.constraints.Size;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,7 @@
 | 
			
		||||
package test.kar.archidata.dataAccess.model;
 | 
			
		||||
 | 
			
		||||
import org.kar.archidata.annotation.DataJson;
 | 
			
		||||
import org.kar.archidata.annotation.checker.Checker;
 | 
			
		||||
import org.kar.archidata.checker.CheckJPA;
 | 
			
		||||
import org.kar.archidata.dataAccess.options.CheckJPA;
 | 
			
		||||
 | 
			
		||||
public class DataWithSubJson {
 | 
			
		||||
	// Simple checker declaration
 | 
			
		||||
@@ -12,7 +11,6 @@ public class DataWithSubJson {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@DataJson()
 | 
			
		||||
	@Checker(DataInJson.DataInJsonChecker.class)
 | 
			
		||||
	@DataJson(checker = DataInJson.DataInJsonChecker.class)
 | 
			
		||||
	public DataInJson dataSerialized;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1 +1 @@
 | 
			
		||||
0.24.0
 | 
			
		||||
0.21.0
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user