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>
 | 
						<modelVersion>4.0.0</modelVersion>
 | 
				
			||||||
	<groupId>kangaroo-and-rabbit</groupId>
 | 
						<groupId>kangaroo-and-rabbit</groupId>
 | 
				
			||||||
	<artifactId>archidata</artifactId>
 | 
						<artifactId>archidata</artifactId>
 | 
				
			||||||
	<version>0.24.0</version>
 | 
						<version>0.21.0</version>
 | 
				
			||||||
	<properties>
 | 
						<properties>
 | 
				
			||||||
		<java.version>21</java.version>
 | 
							<java.version>21</java.version>
 | 
				
			||||||
		<maven.compiler.version>3.1</maven.compiler.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.ElementType;
 | 
				
			||||||
import java.lang.annotation.Retention;
 | 
					import java.lang.annotation.Retention;
 | 
				
			||||||
@@ -5,10 +5,6 @@ import java.lang.reflect.Field;
 | 
				
			|||||||
import java.util.ArrayList;
 | 
					import java.util.ArrayList;
 | 
				
			||||||
import java.util.List;
 | 
					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.QueryOptions;
 | 
				
			||||||
import org.kar.archidata.dataAccess.options.OptionRenameColumn;
 | 
					import org.kar.archidata.dataAccess.options.OptionRenameColumn;
 | 
				
			||||||
import org.kar.archidata.dataAccess.options.OverrideTableName;
 | 
					import org.kar.archidata.dataAccess.options.OverrideTableName;
 | 
				
			||||||
@@ -28,8 +24,6 @@ import jakarta.persistence.ManyToMany;
 | 
				
			|||||||
import jakarta.persistence.ManyToOne;
 | 
					import jakarta.persistence.ManyToOne;
 | 
				
			||||||
import jakarta.persistence.OneToMany;
 | 
					import jakarta.persistence.OneToMany;
 | 
				
			||||||
import jakarta.persistence.Table;
 | 
					import jakarta.persistence.Table;
 | 
				
			||||||
import jakarta.validation.constraints.DecimalMax;
 | 
					 | 
				
			||||||
import jakarta.validation.constraints.DecimalMin;
 | 
					 | 
				
			||||||
import jakarta.validation.constraints.Email;
 | 
					import jakarta.validation.constraints.Email;
 | 
				
			||||||
import jakarta.validation.constraints.Max;
 | 
					import jakarta.validation.constraints.Max;
 | 
				
			||||||
import jakarta.validation.constraints.Min;
 | 
					import jakarta.validation.constraints.Min;
 | 
				
			||||||
@@ -41,24 +35,6 @@ import jakarta.ws.rs.DefaultValue;
 | 
				
			|||||||
public class AnnotationTools {
 | 
					public class AnnotationTools {
 | 
				
			||||||
	static final Logger LOGGER = LoggerFactory.getLogger(AnnotationTools.class);
 | 
						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
 | 
						// For SQL declaration table Name
 | 
				
			||||||
	public static String getTableName(final Class<?> clazz, final QueryOptions options) throws DataAccessException {
 | 
						public static String getTableName(final Class<?> clazz, final QueryOptions options) throws DataAccessException {
 | 
				
			||||||
		if (options != null) {
 | 
							if (options != null) {
 | 
				
			||||||
@@ -109,18 +85,6 @@ public class AnnotationTools {
 | 
				
			|||||||
		return tmp;
 | 
							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) {
 | 
						public static boolean getSchemaReadOnly(final Field element) {
 | 
				
			||||||
		final Annotation[] annotation = element.getDeclaredAnnotationsByType(Schema.class);
 | 
							final Annotation[] annotation = element.getDeclaredAnnotationsByType(Schema.class);
 | 
				
			||||||
		if (annotation.length == 0) {
 | 
							if (annotation.length == 0) {
 | 
				
			||||||
@@ -170,39 +134,51 @@ public class AnnotationTools {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public static ManyToOne getManyToOne(final Field element) {
 | 
						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) {
 | 
						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) {
 | 
						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) {
 | 
						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) {
 | 
						public static Long getConstraintsMax(final Field element) {
 | 
				
			||||||
		return gets(element, Checker.class);
 | 
							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) {
 | 
						public static Long getConstraintsMin(final Field element) {
 | 
				
			||||||
		return get(element, DecimalMin.class);
 | 
							final Annotation[] annotation = element.getDeclaredAnnotationsByType(Min.class);
 | 
				
			||||||
	}
 | 
							if (annotation.length == 0) {
 | 
				
			||||||
 | 
								return null;
 | 
				
			||||||
	public static DecimalMax getConstraintsDecimalMax(final Field element) {
 | 
							}
 | 
				
			||||||
		return get(element, DecimalMax.class);
 | 
							return ((Min) annotation[0]).value();
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	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 int getLimitSize(final Field element) {
 | 
						public static int getLimitSize(final Field element) {
 | 
				
			||||||
@@ -215,15 +191,27 @@ public class AnnotationTools {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public static Size getConstraintsSize(final Field element) {
 | 
						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) {
 | 
						public static String getConstraintsPattern(final Field element) {
 | 
				
			||||||
		return get(element, Pattern.class);
 | 
							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) {
 | 
						public static boolean getConstraintsEmail(final Field element) {
 | 
				
			||||||
		return get(element, Email.class);
 | 
							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) {
 | 
						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.RetentionPolicy;
 | 
				
			||||||
import java.lang.annotation.Target;
 | 
					import java.lang.annotation.Target;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.kar.archidata.dataAccess.options.CheckFunctionInterface;
 | 
				
			||||||
 | 
					import org.kar.archidata.dataAccess.options.CheckFunctionVoid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Target({ ElementType.TYPE, ElementType.FIELD })
 | 
					@Target({ ElementType.TYPE, ElementType.FIELD })
 | 
				
			||||||
@Retention(RetentionPolicy.RUNTIME)
 | 
					@Retention(RetentionPolicy.RUNTIME)
 | 
				
			||||||
public @interface DataJson {
 | 
					public @interface DataJson {
 | 
				
			||||||
 | 
						Class<? extends CheckFunctionInterface> checker() default CheckFunctionVoid.class;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Class<?> targetEntity() default Void.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.ElementType;
 | 
				
			||||||
import java.lang.annotation.Retention;
 | 
					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 {
 | 
								} else {
 | 
				
			||||||
				// TODO : Maybe connect with a temporary not specified connection interface to a db ...
 | 
									// TODO : Maybe connect with a temporary not specified connection interface to a db ...
 | 
				
			||||||
				final PreparedStatement ps = this.db.getConnection()
 | 
									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();
 | 
									final ResultSet rs = ps.executeQuery();
 | 
				
			||||||
				// LOGGER.info("List all tables: equals? '{}'", name);
 | 
									// LOGGER.info("List all tables: equals? '{}'", name);
 | 
				
			||||||
				while (rs.next()) {
 | 
									while (rs.next()) {
 | 
				
			||||||
@@ -815,9 +815,6 @@ public class DBAccessSQL extends DBAccess {
 | 
				
			|||||||
	@Override
 | 
						@Override
 | 
				
			||||||
	@SuppressFBWarnings("SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING")
 | 
						@SuppressFBWarnings("SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING")
 | 
				
			||||||
	public <T> T insert(final T data, final QueryOption... option) throws Exception {
 | 
						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 Class<?> clazz = data.getClass();
 | 
				
			||||||
		final QueryOptions options = new QueryOptions(option);
 | 
							final QueryOptions options = new QueryOptions(option);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,6 @@ import java.util.ArrayList;
 | 
				
			|||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.UUID;
 | 
					import java.util.UUID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import org.bson.types.ObjectId;
 | 
					 | 
				
			||||||
import org.kar.archidata.annotation.AnnotationTools;
 | 
					import org.kar.archidata.annotation.AnnotationTools;
 | 
				
			||||||
import org.kar.archidata.annotation.AnnotationTools.FieldName;
 | 
					import org.kar.archidata.annotation.AnnotationTools.FieldName;
 | 
				
			||||||
import org.kar.archidata.dataAccess.CountInOut;
 | 
					import org.kar.archidata.dataAccess.CountInOut;
 | 
				
			||||||
@@ -73,7 +72,7 @@ public class AddOnManyToMany implements DataAccessAddOn {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		final Class<?> objectClass = (Class<?>) ((ParameterizedType) field.getGenericType())
 | 
							final Class<?> objectClass = (Class<?>) ((ParameterizedType) field.getGenericType())
 | 
				
			||||||
				.getActualTypeArguments()[0];
 | 
									.getActualTypeArguments()[0];
 | 
				
			||||||
		if (objectClass == Long.class || objectClass == UUID.class || objectClass == ObjectId.class) {
 | 
							if (objectClass == Long.class || objectClass == UUID.class) {
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		final ManyToMany decorators = field.getDeclaredAnnotation(ManyToMany.class);
 | 
							final ManyToMany decorators = field.getDeclaredAnnotation(ManyToMany.class);
 | 
				
			||||||
@@ -136,11 +135,7 @@ public class AddOnManyToMany implements DataAccessAddOn {
 | 
				
			|||||||
		querySelect.append("'");
 | 
							querySelect.append("'");
 | 
				
			||||||
		if (objectClass == Long.class) {
 | 
							if (objectClass == Long.class) {
 | 
				
			||||||
			querySelect.append(SEPARATOR_LONG);
 | 
								querySelect.append(SEPARATOR_LONG);
 | 
				
			||||||
		} else if (objectClass == UUID.class) {
 | 
							} else if (objectClass == UUID.class) {} else {
 | 
				
			||||||
			// ???
 | 
					 | 
				
			||||||
		} else if (objectClass == ObjectId.class) {
 | 
					 | 
				
			||||||
			// ???
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			final Class<?> foreignKeyType = AnnotationTools.getPrimaryKeyField(objectClass).getType();
 | 
								final Class<?> foreignKeyType = AnnotationTools.getPrimaryKeyField(objectClass).getType();
 | 
				
			||||||
			if (foreignKeyType == Long.class) {
 | 
								if (foreignKeyType == Long.class) {
 | 
				
			||||||
				querySelect.append(SEPARATOR_LONG);
 | 
									querySelect.append(SEPARATOR_LONG);
 | 
				
			||||||
@@ -198,7 +193,7 @@ public class AddOnManyToMany implements DataAccessAddOn {
 | 
				
			|||||||
		final Class<?> objectClass = (Class<?>) ((ParameterizedType) field.getGenericType())
 | 
							final Class<?> objectClass = (Class<?>) ((ParameterizedType) field.getGenericType())
 | 
				
			||||||
				.getActualTypeArguments()[0];
 | 
									.getActualTypeArguments()[0];
 | 
				
			||||||
		// TODO: manage better the eager and lazy !!
 | 
							// 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);
 | 
								generateConcatQuery(tableName, primaryKey, field, querySelect, query, name, count, options);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		final ManyToMany decorators = field.getDeclaredAnnotation(ManyToMany.class);
 | 
							final ManyToMany decorators = field.getDeclaredAnnotation(ManyToMany.class);
 | 
				
			||||||
@@ -239,11 +234,6 @@ public class AddOnManyToMany implements DataAccessAddOn {
 | 
				
			|||||||
			field.set(data, idList);
 | 
								field.set(data, idList);
 | 
				
			||||||
			count.inc();
 | 
								count.inc();
 | 
				
			||||||
			return;
 | 
								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);
 | 
							final ManyToMany decorators = field.getDeclaredAnnotation(ManyToMany.class);
 | 
				
			||||||
		if (decorators == null) {
 | 
							if (decorators == null) {
 | 
				
			||||||
@@ -295,27 +285,6 @@ public class AddOnManyToMany implements DataAccessAddOn {
 | 
				
			|||||||
					};
 | 
										};
 | 
				
			||||||
					lazyCall.add(lambda);
 | 
										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())
 | 
							final Class<?> objectClass = (Class<?>) ((ParameterizedType) field.getGenericType())
 | 
				
			||||||
				.getActualTypeArguments()[0];
 | 
									.getActualTypeArguments()[0];
 | 
				
			||||||
		if (objectClass != Long.class && objectClass != UUID.class && objectClass != ObjectId.class) {
 | 
							if (objectClass != Long.class && objectClass != UUID.class) {
 | 
				
			||||||
			throw new DataAccessException(
 | 
								throw new DataAccessException("Can not ManyToMany with other than List<Long> or List<UUID> Model: List<"
 | 
				
			||||||
					"Can not ManyToMany with other than List<Long> or List<UUID> or List<ObjectId> Model: List<"
 | 
										+ objectClass.getCanonicalName() + ">");
 | 
				
			||||||
							+ objectClass.getCanonicalName() + ">");
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		final FieldName columnName = AnnotationTools.getFieldName(field, options);
 | 
							final FieldName columnName = AnnotationTools.getFieldName(field, options);
 | 
				
			||||||
		final String linkTableName = generateLinkTableName(tableName, columnName.inTable());
 | 
							final String linkTableName = generateLinkTableName(tableName, columnName.inTable());
 | 
				
			||||||
@@ -380,20 +348,19 @@ public class AddOnManyToMany implements DataAccessAddOn {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		final Class<?> objectClass = (Class<?>) ((ParameterizedType) field.getGenericType())
 | 
							final Class<?> objectClass = (Class<?>) ((ParameterizedType) field.getGenericType())
 | 
				
			||||||
				.getActualTypeArguments()[0];
 | 
									.getActualTypeArguments()[0];
 | 
				
			||||||
		if (objectClass != Long.class && objectClass != UUID.class && objectClass != ObjectId.class) {
 | 
							if (objectClass != Long.class && objectClass != UUID.class) {
 | 
				
			||||||
			throw new DataAccessException(
 | 
								throw new DataAccessException("Can not ManyToMany with other than List<Long> or List<UUID> Model: List<"
 | 
				
			||||||
					"Can not ManyToMany with other than List<Long> or List<UUID> or List<ObjectId> Model: List<"
 | 
										+ objectClass.getCanonicalName() + ">");
 | 
				
			||||||
							+ objectClass.getCanonicalName() + ">");
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		final FieldName columnName = AnnotationTools.getFieldName(field, options);
 | 
							final FieldName columnName = AnnotationTools.getFieldName(field, options);
 | 
				
			||||||
		final String linkTableName = generateLinkTableName(tableName, columnName.inTable());
 | 
							final String linkTableName = generateLinkTableName(tableName, columnName.inTable());
 | 
				
			||||||
		@SuppressWarnings("unchecked")
 | 
							@SuppressWarnings("unchecked")
 | 
				
			||||||
		final List<Object> dataCasted = (List<Object>) data;
 | 
							final List<Long> dataCasted = (List<Long>) data;
 | 
				
			||||||
		if (dataCasted.size() == 0) {
 | 
							if (dataCasted.size() == 0) {
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		final List<LinkTableGeneric> insertElements = new ArrayList<>();
 | 
							final List<LinkTableGeneric> insertElements = new ArrayList<>();
 | 
				
			||||||
		for (final Object remoteKey : dataCasted) {
 | 
							for (final Long remoteKey : dataCasted) {
 | 
				
			||||||
			if (remoteKey == null) {
 | 
								if (remoteKey == null) {
 | 
				
			||||||
				throw new DataAccessException("Try to insert remote key with null value");
 | 
									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.List;
 | 
				
			||||||
import java.util.UUID;
 | 
					import java.util.UUID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import org.bson.types.ObjectId;
 | 
					 | 
				
			||||||
import org.kar.archidata.annotation.AnnotationTools;
 | 
					import org.kar.archidata.annotation.AnnotationTools;
 | 
				
			||||||
import org.kar.archidata.annotation.AnnotationTools.FieldName;
 | 
					import org.kar.archidata.annotation.AnnotationTools.FieldName;
 | 
				
			||||||
import org.kar.archidata.dataAccess.CountInOut;
 | 
					import org.kar.archidata.dataAccess.CountInOut;
 | 
				
			||||||
@@ -67,8 +66,6 @@ public class AddOnManyToOne implements DataAccessAddOn {
 | 
				
			|||||||
				ps.setNull(iii.value, Types.VARCHAR);
 | 
									ps.setNull(iii.value, Types.VARCHAR);
 | 
				
			||||||
			} else if (field.getType() == UUID.class) {
 | 
								} else if (field.getType() == UUID.class) {
 | 
				
			||||||
				ps.setNull(iii.value, Types.BINARY);
 | 
									ps.setNull(iii.value, Types.BINARY);
 | 
				
			||||||
			} else if (field.getType() == ObjectId.class) {
 | 
					 | 
				
			||||||
				ps.setNull(iii.value, Types.BINARY);
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		} else if (field.getType() == Long.class) {
 | 
							} else if (field.getType() == Long.class) {
 | 
				
			||||||
			final Long dataTyped = (Long) data;
 | 
								final Long dataTyped = (Long) data;
 | 
				
			||||||
@@ -87,11 +84,6 @@ public class AddOnManyToOne implements DataAccessAddOn {
 | 
				
			|||||||
			LOGGER.info("Generate UUTD for DB: {}", dataTyped);
 | 
								LOGGER.info("Generate UUTD for DB: {}", dataTyped);
 | 
				
			||||||
			final byte[] dataByte = UuidUtils.asBytes(dataTyped);
 | 
								final byte[] dataByte = UuidUtils.asBytes(dataTyped);
 | 
				
			||||||
			ps.setBytes(iii.value, dataByte);
 | 
								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 {
 | 
							} else {
 | 
				
			||||||
			final Field idField = AnnotationTools.getFieldOfId(field.getType());
 | 
								final Field idField = AnnotationTools.getFieldOfId(field.getType());
 | 
				
			||||||
			final Object uid = idField.get(data);
 | 
								final Object uid = idField.get(data);
 | 
				
			||||||
@@ -109,8 +101,7 @@ public class AddOnManyToOne implements DataAccessAddOn {
 | 
				
			|||||||
	@Override
 | 
						@Override
 | 
				
			||||||
	public boolean canInsert(final Field field) {
 | 
						public boolean canInsert(final Field field) {
 | 
				
			||||||
		if (field.getType() == Long.class || field.getType() == Integer.class || field.getType() == Short.class
 | 
							if (field.getType() == Long.class || field.getType() == Integer.class || field.getType() == Short.class
 | 
				
			||||||
				|| field.getType() == String.class || field.getType() == UUID.class
 | 
									|| field.getType() == String.class || field.getType() == UUID.class) {
 | 
				
			||||||
				|| field.getType() == ObjectId.class) {
 | 
					 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		final ManyToOne decorators = field.getDeclaredAnnotation(ManyToOne.class);
 | 
							final ManyToOne decorators = field.getDeclaredAnnotation(ManyToOne.class);
 | 
				
			||||||
@@ -129,7 +120,7 @@ public class AddOnManyToOne implements DataAccessAddOn {
 | 
				
			|||||||
	public boolean canRetrieve(final Field field) {
 | 
						public boolean canRetrieve(final Field field) {
 | 
				
			||||||
		final Class<?> classType = field.getType();
 | 
							final Class<?> classType = field.getType();
 | 
				
			||||||
		if (classType == Long.class || classType == Integer.class || classType == Short.class
 | 
							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;
 | 
								return true;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		final ManyToOne decorators = field.getDeclaredAnnotation(ManyToOne.class);
 | 
							final ManyToOne decorators = field.getDeclaredAnnotation(ManyToOne.class);
 | 
				
			||||||
@@ -150,8 +141,7 @@ public class AddOnManyToOne implements DataAccessAddOn {
 | 
				
			|||||||
			@NotNull final CountInOut count,
 | 
								@NotNull final CountInOut count,
 | 
				
			||||||
			final QueryOptions options) throws Exception {
 | 
								final QueryOptions options) throws Exception {
 | 
				
			||||||
		if (field.getType() == Long.class || field.getType() == Integer.class || field.getType() == Short.class
 | 
							if (field.getType() == Long.class || field.getType() == Integer.class || field.getType() == Short.class
 | 
				
			||||||
				|| field.getType() == String.class || field.getType() == UUID.class
 | 
									|| field.getType() == String.class || field.getType() == UUID.class) {
 | 
				
			||||||
				|| field.getType() == ObjectId.class) {
 | 
					 | 
				
			||||||
			querySelect.append(" ");
 | 
								querySelect.append(" ");
 | 
				
			||||||
			querySelect.append(tableName);
 | 
								querySelect.append(tableName);
 | 
				
			||||||
			querySelect.append(".");
 | 
								querySelect.append(".");
 | 
				
			||||||
@@ -240,15 +230,6 @@ public class AddOnManyToOne implements DataAccessAddOn {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
			return;
 | 
								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 Class<?> objectClass = field.getType();
 | 
				
			||||||
		final ManyToOne decorators = field.getDeclaredAnnotation(ManyToOne.class);
 | 
							final ManyToOne decorators = field.getDeclaredAnnotation(ManyToOne.class);
 | 
				
			||||||
		if (decorators == null) {
 | 
							if (decorators == null) {
 | 
				
			||||||
@@ -298,22 +279,6 @@ public class AddOnManyToOne implements DataAccessAddOn {
 | 
				
			|||||||
					};
 | 
										};
 | 
				
			||||||
					lazyCall.add(lambda);
 | 
										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 QueryOptions options) throws Exception {
 | 
				
			||||||
		final Class<?> classType = field.getType();
 | 
							final Class<?> classType = field.getType();
 | 
				
			||||||
		if (classType == Long.class || classType == Integer.class || classType == Short.class
 | 
							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,
 | 
								DataFactory.createTablesSpecificType(tableName, primaryField, field, mainTableBuilder, preActionList,
 | 
				
			||||||
					postActionList, createIfNotExist, createDrop, fieldId, classType, options);
 | 
										postActionList, createIfNotExist, createDrop, fieldId, classType, options);
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,7 +10,6 @@ import java.util.List;
 | 
				
			|||||||
import java.util.UUID;
 | 
					import java.util.UUID;
 | 
				
			||||||
import java.util.stream.Collectors;
 | 
					import java.util.stream.Collectors;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import org.bson.types.ObjectId;
 | 
					 | 
				
			||||||
import org.kar.archidata.annotation.AnnotationTools;
 | 
					import org.kar.archidata.annotation.AnnotationTools;
 | 
				
			||||||
import org.kar.archidata.annotation.AnnotationTools.FieldName;
 | 
					import org.kar.archidata.annotation.AnnotationTools.FieldName;
 | 
				
			||||||
import org.kar.archidata.dataAccess.CountInOut;
 | 
					import org.kar.archidata.dataAccess.CountInOut;
 | 
				
			||||||
@@ -111,7 +110,7 @@ public class AddOnOneToMany implements DataAccessAddOn {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		final Class<?> objectClass = (Class<?>) ((ParameterizedType) field.getGenericType())
 | 
							final Class<?> objectClass = (Class<?>) ((ParameterizedType) field.getGenericType())
 | 
				
			||||||
				.getActualTypeArguments()[0];
 | 
									.getActualTypeArguments()[0];
 | 
				
			||||||
		if (objectClass == Long.class || objectClass == UUID.class || objectClass == ObjectId.class) {
 | 
							if (objectClass == Long.class || objectClass == UUID.class) {
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		final OneToMany decorators = field.getDeclaredAnnotation(OneToMany.class);
 | 
							final OneToMany decorators = field.getDeclaredAnnotation(OneToMany.class);
 | 
				
			||||||
@@ -202,7 +201,7 @@ public class AddOnOneToMany implements DataAccessAddOn {
 | 
				
			|||||||
			return;
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		// TODO: manage better the eager and lazy !!
 | 
							// 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,
 | 
								generateConcatQuery(tableName, primaryKey, field, querySelect, query, name, count, options,
 | 
				
			||||||
					decorators.targetEntity(), decorators.mappedBy());
 | 
										decorators.targetEntity(), decorators.mappedBy());
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
@@ -251,35 +250,22 @@ public class AddOnOneToMany implements DataAccessAddOn {
 | 
				
			|||||||
			field.set(data, idList);
 | 
								field.set(data, idList);
 | 
				
			||||||
			count.inc();
 | 
								count.inc();
 | 
				
			||||||
			return;
 | 
								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()) {
 | 
							if (objectClass == decorators.targetEntity()) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			Long parentIdTmp = null;
 | 
								Long parentIdTmp = null;
 | 
				
			||||||
			UUID parendUuidTmp = null;
 | 
								UUID parendUuidTmp = null;
 | 
				
			||||||
			ObjectId parendOidTmp = null;
 | 
					 | 
				
			||||||
			try {
 | 
								try {
 | 
				
			||||||
				final String modelData = rs.getString(count.value);
 | 
									final String modelData = rs.getString(count.value);
 | 
				
			||||||
				parentIdTmp = Long.valueOf(modelData);
 | 
									parentIdTmp = Long.valueOf(modelData);
 | 
				
			||||||
				count.inc();
 | 
									count.inc();
 | 
				
			||||||
			} catch (final NumberFormatException ex) {
 | 
								} catch (final NumberFormatException ex) {
 | 
				
			||||||
				try {
 | 
									final List<UUID> idList = ioDb.getListOfRawUUIDs(rs, count.value);
 | 
				
			||||||
					final List<UUID> idList = ioDb.getListOfRawUUIDs(rs, count.value);
 | 
									parendUuidTmp = idList.get(0);
 | 
				
			||||||
					parendUuidTmp = idList.get(0);
 | 
									count.inc();
 | 
				
			||||||
					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 Long parentId = parentIdTmp;
 | 
								final Long parentId = parentIdTmp;
 | 
				
			||||||
			final UUID parendUuid = parendUuidTmp;
 | 
								final UUID parendUuid = parendUuidTmp;
 | 
				
			||||||
			final ObjectId parendOid = parendOidTmp;
 | 
					 | 
				
			||||||
			final String mappingKey = decorators.mappedBy();
 | 
								final String mappingKey = decorators.mappedBy();
 | 
				
			||||||
			// We get the parent ID ... ==> need to request the list of elements
 | 
								// We get the parent ID ... ==> need to request the list of elements
 | 
				
			||||||
			if (objectClass == Long.class) {
 | 
								if (objectClass == Long.class) {
 | 
				
			||||||
@@ -290,10 +276,6 @@ public class AddOnOneToMany implements DataAccessAddOn {
 | 
				
			|||||||
				LOGGER.error("Need to retreive all primary key of all elements");
 | 
									LOGGER.error("Need to retreive all primary key of all elements");
 | 
				
			||||||
				//field.set(data, idList);
 | 
									//field.set(data, idList);
 | 
				
			||||||
				return;
 | 
									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 (objectClass == decorators.targetEntity()) {
 | 
				
			||||||
				if (decorators.fetch() == FetchType.EAGER) {
 | 
									if (decorators.fetch() == FetchType.EAGER) {
 | 
				
			||||||
@@ -321,17 +303,6 @@ public class AddOnOneToMany implements DataAccessAddOn {
 | 
				
			|||||||
						field.set(data, foreignData);
 | 
											field.set(data, foreignData);
 | 
				
			||||||
					};
 | 
										};
 | 
				
			||||||
					lazyCall.add(lambda);
 | 
										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. */
 | 
					/** By default some element are not read like createAt and UpdatedAt. This option permit to read it. */
 | 
				
			||||||
public interface CheckFunctionInterface {
 | 
					public interface CheckFunctionInterface {
 | 
				
			||||||
	/** This function implementation is design to check if the updated class is valid of not for insertion
 | 
						/** 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 data The object that might be injected.
 | 
				
			||||||
	 * @param modifiedValue List of fields that might be check. If null, then all column must be checked.
 | 
						 * @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. */
 | 
						 * @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);
 | 
							return this.config.equals(config);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public DbConfig getConfig() {
 | 
						public DbConfig getCongig() {
 | 
				
			||||||
		return this.config;
 | 
							return this.config;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -151,6 +151,38 @@ public class DotClassElement {
 | 
				
			|||||||
		return ".optional()";
 | 
							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) {
 | 
						public String readOnlyZod(final FieldProperty field) {
 | 
				
			||||||
		if (field.readOnly()) {
 | 
							if (field.readOnly()) {
 | 
				
			||||||
			return ".readonly()";
 | 
								return ".readonly()";
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,11 +7,11 @@ import java.util.Arrays;
 | 
				
			|||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import org.glassfish.jersey.media.multipart.FormDataParam;
 | 
					import org.glassfish.jersey.media.multipart.FormDataParam;
 | 
				
			||||||
 | 
					import org.kar.archidata.annotation.ARCHIVE;
 | 
				
			||||||
import org.kar.archidata.annotation.AsyncType;
 | 
					import org.kar.archidata.annotation.AsyncType;
 | 
				
			||||||
import org.kar.archidata.annotation.FormDataOptional;
 | 
					import org.kar.archidata.annotation.FormDataOptional;
 | 
				
			||||||
 | 
					import org.kar.archidata.annotation.RESTORE;
 | 
				
			||||||
import org.kar.archidata.annotation.TypeScriptProgress;
 | 
					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 io.swagger.v3.oas.annotations.Operation;
 | 
				
			||||||
import jakarta.ws.rs.Consumes;
 | 
					import jakarta.ws.rs.Consumes;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,12 +18,6 @@ import org.slf4j.LoggerFactory;
 | 
				
			|||||||
import jakarta.persistence.ManyToMany;
 | 
					import jakarta.persistence.ManyToMany;
 | 
				
			||||||
import jakarta.persistence.ManyToOne;
 | 
					import jakarta.persistence.ManyToOne;
 | 
				
			||||||
import jakarta.persistence.OneToMany;
 | 
					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;
 | 
					import jakarta.validation.constraints.Size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class ClassObjectModel extends ClassModel {
 | 
					public class ClassObjectModel extends ClassModel {
 | 
				
			||||||
@@ -67,31 +61,24 @@ public class ClassObjectModel extends ClassModel {
 | 
				
			|||||||
			ClassModel model,
 | 
								ClassModel model,
 | 
				
			||||||
			ClassModel linkClass, // link class when use remote ID (ex: list<UUID>)
 | 
								ClassModel linkClass, // link class when use remote ID (ex: list<UUID>)
 | 
				
			||||||
			String comment,
 | 
								String comment,
 | 
				
			||||||
			Size stringSize, // String Size
 | 
								int sizeMin, // String SizeMin
 | 
				
			||||||
			Min min, // number min value
 | 
								int sizeMax, // String SizeMax
 | 
				
			||||||
			Max max, // number max value
 | 
								Long min, // number min value
 | 
				
			||||||
			DecimalMin decimalMin,
 | 
								Long max, // number max value
 | 
				
			||||||
			DecimalMax decimalMax,
 | 
					 | 
				
			||||||
			Pattern pattern,
 | 
					 | 
				
			||||||
			Email email,
 | 
					 | 
				
			||||||
			Boolean readOnly,
 | 
								Boolean readOnly,
 | 
				
			||||||
			Boolean notNull,
 | 
								Boolean notNull,
 | 
				
			||||||
			Boolean columnNotNull,
 | 
								Boolean columnNotNull,
 | 
				
			||||||
			Boolean nullable) {
 | 
								Boolean nullable) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		public FieldProperty(final String name, final ClassModel model, final ClassModel linkClass,
 | 
							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 String comment, final int sizeMin, final int sizeMax, final Long min, final Long max,
 | 
				
			||||||
				final DecimalMax decimalMax, final Pattern pattern, final Email email, final Boolean readOnly,
 | 
									final Boolean readOnly, final Boolean notNull, final Boolean columnNotNull, final Boolean nullable) {
 | 
				
			||||||
				final Boolean notNull, final Boolean columnNotNull, final Boolean nullable) {
 | 
					 | 
				
			||||||
			this.name = name;
 | 
								this.name = name;
 | 
				
			||||||
			this.model = model;
 | 
								this.model = model;
 | 
				
			||||||
			this.linkClass = linkClass;
 | 
								this.linkClass = linkClass;
 | 
				
			||||||
			this.comment = comment;
 | 
								this.comment = comment;
 | 
				
			||||||
			this.stringSize = stringSize;
 | 
								this.sizeMin = sizeMin;
 | 
				
			||||||
			this.decimalMin = decimalMin;
 | 
								this.sizeMax = sizeMax;
 | 
				
			||||||
			this.decimalMax = decimalMax;
 | 
					 | 
				
			||||||
			this.pattern = pattern;
 | 
					 | 
				
			||||||
			this.email = email;
 | 
					 | 
				
			||||||
			this.min = min;
 | 
								this.min = min;
 | 
				
			||||||
			this.max = max;
 | 
								this.max = max;
 | 
				
			||||||
			this.readOnly = readOnly;
 | 
								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) {
 | 
							private static Class<?> getSubModelIfExist2(final Field field) {
 | 
				
			||||||
			final ManyToOne manyToOne = AnnotationTools.getManyToOne(field);
 | 
								final ManyToOne manyToOne = AnnotationTools.getManyToOne(field);
 | 
				
			||||||
			if (manyToOne != null) {
 | 
								if (manyToOne != null) {
 | 
				
			||||||
@@ -139,13 +137,10 @@ public class ClassObjectModel extends ClassModel {
 | 
				
			|||||||
					ClassModel.getModel(field.getGenericType(), previous), //
 | 
										ClassModel.getModel(field.getGenericType(), previous), //
 | 
				
			||||||
					getSubModelIfExist(field, previous), //
 | 
										getSubModelIfExist(field, previous), //
 | 
				
			||||||
					AnnotationTools.getSchemaDescription(field), //
 | 
										AnnotationTools.getSchemaDescription(field), //
 | 
				
			||||||
					AnnotationTools.getConstraintsSize(field), //
 | 
										getStringMinSize(field), //
 | 
				
			||||||
 | 
										getStringMaxSize(field), //
 | 
				
			||||||
					AnnotationTools.getConstraintsMin(field), //
 | 
										AnnotationTools.getConstraintsMin(field), //
 | 
				
			||||||
					AnnotationTools.getConstraintsMax(field), //
 | 
										AnnotationTools.getConstraintsMax(field), //
 | 
				
			||||||
					AnnotationTools.getConstraintsDecimalMin(field), //
 | 
					 | 
				
			||||||
					AnnotationTools.getConstraintsDecimalMax(field), //
 | 
					 | 
				
			||||||
					AnnotationTools.getConstraintsPattern(field), //
 | 
					 | 
				
			||||||
					AnnotationTools.getConstraintsEmail(field), //
 | 
					 | 
				
			||||||
					AnnotationTools.getSchemaReadOnly(field), //
 | 
										AnnotationTools.getSchemaReadOnly(field), //
 | 
				
			||||||
					AnnotationTools.getConstraintsNotNull(field), //
 | 
										AnnotationTools.getConstraintsNotNull(field), //
 | 
				
			||||||
					AnnotationTools.getColumnNotNull(field), //
 | 
										AnnotationTools.getColumnNotNull(field), //
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -259,61 +259,28 @@ public class TsClassElement {
 | 
				
			|||||||
		final StringBuilder builder = new StringBuilder();
 | 
							final StringBuilder builder = new StringBuilder();
 | 
				
			||||||
		final Class<?> clazz = field.model().getOriginClasses();
 | 
							final Class<?> clazz = field.model().getOriginClasses();
 | 
				
			||||||
		if (clazz == String.class) {
 | 
							if (clazz == String.class) {
 | 
				
			||||||
			if (field.stringSize() != null) {
 | 
								if (field.sizeMin() > 0) {
 | 
				
			||||||
				if (field.stringSize().min() > 0) {
 | 
									builder.append(".min(");
 | 
				
			||||||
					// A string size can not be lower at 0
 | 
									builder.append(field.sizeMin());
 | 
				
			||||||
					builder.append(".min(");
 | 
									builder.append(")");
 | 
				
			||||||
					builder.append(field.stringSize().min());
 | 
					 | 
				
			||||||
					builder.append(")");
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if (field.stringSize().max() != Integer.MAX_VALUE) {
 | 
					 | 
				
			||||||
					builder.append(".max(");
 | 
					 | 
				
			||||||
					builder.append(field.stringSize().max());
 | 
					 | 
				
			||||||
					builder.append(")");
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			/*Must be tested before
 | 
								if (field.sizeMax() > 0) {
 | 
				
			||||||
			if (field.pattern() != null) {
 | 
									builder.append(".max(");
 | 
				
			||||||
				builder.append(".regex((");
 | 
									builder.append(field.sizeMax());
 | 
				
			||||||
				builder.append(field.pattern().regexp());
 | 
					 | 
				
			||||||
				builder.append(")");
 | 
									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
 | 
							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 == long.class || clazz == Long.class || clazz == float.class || clazz == Float.class
 | 
				
			||||||
				|| clazz == double.class || clazz == Double.class) {
 | 
									|| clazz == double.class || clazz == Double.class) {
 | 
				
			||||||
			if (field.min() != null) {
 | 
								if (field.min() != null && field.min() > 0) {
 | 
				
			||||||
				builder.append(".gte(");
 | 
									builder.append(".min(");
 | 
				
			||||||
				builder.append(field.min().value());
 | 
									builder.append(field.min());
 | 
				
			||||||
				builder.append(")");
 | 
									builder.append(")");
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if (field.max() != null) {
 | 
								if (field.max() != null && field.max() > 0) {
 | 
				
			||||||
				builder.append(".lte(");
 | 
									builder.append(".max(");
 | 
				
			||||||
				builder.append(field.max().value());
 | 
									builder.append(field.max());
 | 
				
			||||||
				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());
 | 
					 | 
				
			||||||
				builder.append(")");
 | 
									builder.append(")");
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -353,19 +320,16 @@ public class TsClassElement {
 | 
				
			|||||||
		out.append("export const ");
 | 
							out.append("export const ");
 | 
				
			||||||
		out.append(this.zodName);
 | 
							out.append(this.zodName);
 | 
				
			||||||
		out.append(" = ");
 | 
							out.append(" = ");
 | 
				
			||||||
		// Check if the object is empty:
 | 
					 | 
				
			||||||
		boolean isEmpty = model.getFields().size() == 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (model.getExtendsClass() != null) {
 | 
							if (model.getExtendsClass() != null) {
 | 
				
			||||||
			final ClassModel parentClass = model.getExtendsClass();
 | 
								final ClassModel parentClass = model.getExtendsClass();
 | 
				
			||||||
			final TsClassElement tsParentModel = tsGroup.find(parentClass);
 | 
								final TsClassElement tsParentModel = tsGroup.find(parentClass);
 | 
				
			||||||
			out.append(tsParentModel.zodName);
 | 
								out.append(tsParentModel.zodName);
 | 
				
			||||||
			if (!isEmpty) {
 | 
								out.append(".extend({");
 | 
				
			||||||
				out.append(".extend({\n");
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			out.append("zod.object({\n");
 | 
								out.append("zod.object({");
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							out.append("\n");
 | 
				
			||||||
		for (final FieldProperty field : model.getFields()) {
 | 
							for (final FieldProperty field : model.getFields()) {
 | 
				
			||||||
			final ClassModel fieldModel = field.model();
 | 
								final ClassModel fieldModel = field.model();
 | 
				
			||||||
			if (field.comment() != null) {
 | 
								if (field.comment() != null) {
 | 
				
			||||||
@@ -393,11 +357,7 @@ public class TsClassElement {
 | 
				
			|||||||
			out.append(",\n");
 | 
								out.append(",\n");
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		final List<String> omitField = model.getReadOnlyField();
 | 
							final List<String> omitField = model.getReadOnlyField();
 | 
				
			||||||
		if (model.getExtendsClass() != null && isEmpty) {
 | 
							out.append("\n});\n");
 | 
				
			||||||
			out.append(";\n");
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			out.append("\n});\n");
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		out.append(generateZodInfer(this.tsTypeName, this.zodName));
 | 
							out.append(generateZodInfer(this.tsTypeName, this.zodName));
 | 
				
			||||||
		out.append(generateExportCheckFunctionWrite(""));
 | 
							out.append(generateExportCheckFunctionWrite(""));
 | 
				
			||||||
		// check if we need to generate write mode :
 | 
							// check if we need to generate write mode :
 | 
				
			||||||
@@ -409,18 +369,17 @@ public class TsClassElement {
 | 
				
			|||||||
			out.append("export const ");
 | 
								out.append("export const ");
 | 
				
			||||||
			out.append(this.zodName);
 | 
								out.append(this.zodName);
 | 
				
			||||||
			out.append("Write = ");
 | 
								out.append("Write = ");
 | 
				
			||||||
			isEmpty = model.getFields().stream().filter(field -> !field.readOnly()).count() == 0;
 | 
					
 | 
				
			||||||
			if (model.getExtendsClass() != null) {
 | 
								if (model.getExtendsClass() != null) {
 | 
				
			||||||
				final ClassModel parentClass = model.getExtendsClass();
 | 
									final ClassModel parentClass = model.getExtendsClass();
 | 
				
			||||||
				final TsClassElement tsParentModel = tsGroup.find(parentClass);
 | 
									final TsClassElement tsParentModel = tsGroup.find(parentClass);
 | 
				
			||||||
				out.append(tsParentModel.zodName);
 | 
									out.append(tsParentModel.zodName);
 | 
				
			||||||
				out.append("Write");
 | 
									out.append("Write");
 | 
				
			||||||
				if (!isEmpty) {
 | 
									out.append(".extend({");
 | 
				
			||||||
					out.append(".extend({\n");
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				out.append("zod.object({\n");
 | 
									out.append("zod.object({");
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								out.append("\n");
 | 
				
			||||||
			for (final FieldProperty field : model.getFields()) {
 | 
								for (final FieldProperty field : model.getFields()) {
 | 
				
			||||||
				// remove all readOnly field
 | 
									// remove all readOnly field
 | 
				
			||||||
				if (field.readOnly()) {
 | 
									if (field.readOnly()) {
 | 
				
			||||||
@@ -458,11 +417,7 @@ public class TsClassElement {
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
				out.append(",\n");
 | 
									out.append(",\n");
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if (model.getExtendsClass() != null && isEmpty) {
 | 
								out.append("\n});\n");
 | 
				
			||||||
				out.append(";\n");
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				out.append("\n});\n");
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			out.append(generateZodInfer(this.tsTypeName + "Write", this.zodName + "Write"));
 | 
								out.append(generateZodInfer(this.tsTypeName + "Write", this.zodName + "Write"));
 | 
				
			||||||
			// Check only the input value ==> no need of the output
 | 
								// Check only the input value ==> no need of the output
 | 
				
			||||||
			out.append(generateExportCheckFunctionWrite("Write"));
 | 
								out.append(generateExportCheckFunctionWrite("Write"));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@ import java.io.IOException;
 | 
				
			|||||||
import java.lang.reflect.Method;
 | 
					import java.lang.reflect.Method;
 | 
				
			||||||
import java.util.Arrays;
 | 
					import java.util.Arrays;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import java.util.Map;
 | 
				
			||||||
import java.util.Map.Entry;
 | 
					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
 | 
				
			||||||
// https://stackoverflow.com/questions/26777083/best-practice-for-rest-token-based-authentication-with-jax-rs-and-jersey/45814178#45814178
 | 
					// 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");
 | 
							final Object rowRight = ret.getClaim("right");
 | 
				
			||||||
		if (rowRight != null) {
 | 
							if (rowRight != null) {
 | 
				
			||||||
			LOGGER.info("Detect right in Authentication Filter: {}", rowRight);
 | 
								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)) {
 | 
								if (rights.containsKey(this.applicationName)) {
 | 
				
			||||||
				user.right = rights.get(this.applicationName);
 | 
									user.right = rights.get(this.applicationName);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,7 +26,7 @@ public class MySecurityContext implements SecurityContext {
 | 
				
			|||||||
		return this.contextPrincipale;
 | 
							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) {
 | 
							if (this.contextPrincipale.userByToken != null) {
 | 
				
			||||||
			return this.contextPrincipale.userByToken.getRight(group, role);
 | 
								return this.contextPrincipale.userByToken.getRight(group, role);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -67,14 +67,21 @@ public class MySecurityContext implements SecurityContext {
 | 
				
			|||||||
			return false;
 | 
								return false;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		// get associated Roles:
 | 
							// get associated Roles:
 | 
				
			||||||
		final PartRight rightPart = getRightOfRoleInGroup(group, role);
 | 
							final Object rightPart = getRightOfRoleInGroup(group, role);
 | 
				
			||||||
		if (PartRight.READ_WRITE.equals(rightPart)) {
 | 
							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;
 | 
								return true;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if (!needRead && needWrite && PartRight.WRITE.equals(rightPart)) {
 | 
							if (!needRead && needWrite && dataRight == PartRight.WRITE.getValue()) {
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if (needRead && !needWrite && PartRight.READ.equals(rightPart)) {
 | 
							if (needRead && !needWrite && dataRight == PartRight.READ.getValue()) {
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,27 +27,4 @@ public enum PartRight {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		throw new IllegalArgumentException("PartRight: Unknown value: " + value);
 | 
							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.dataAccess.QueryOptions;
 | 
				
			||||||
import org.kar.archidata.db.DbConfig;
 | 
					import org.kar.archidata.db.DbConfig;
 | 
				
			||||||
import org.kar.archidata.migration.model.Migration;
 | 
					import org.kar.archidata.migration.model.Migration;
 | 
				
			||||||
import org.kar.archidata.tools.ConfigBaseVariable;
 | 
					 | 
				
			||||||
import org.slf4j.Logger;
 | 
					import org.slf4j.Logger;
 | 
				
			||||||
import org.slf4j.LoggerFactory;
 | 
					import org.slf4j.LoggerFactory;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -131,40 +130,35 @@ public class MigrationEngine {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private void createTableIfAbleOrWaitAdmin(final DbConfig configInput) throws MigrationException {
 | 
						private void createTableIfAbleOrWaitAdmin(final DbConfig configInput) throws MigrationException {
 | 
				
			||||||
		if (ConfigBaseVariable.getDBAbleToCreate()) {
 | 
							final DbConfig config = configInput.clone();
 | 
				
			||||||
			final DbConfig config = configInput.clone();
 | 
							config.setDbName(null);
 | 
				
			||||||
			config.setDbName(null);
 | 
							final String dbName = configInput.getDbName();
 | 
				
			||||||
			final String dbName = configInput.getDbName();
 | 
							LOGGER.info("Verify existance of '{}'", dbName);
 | 
				
			||||||
			LOGGER.info("Verify existance of '{}'", dbName);
 | 
							try (final DBAccess da = DBAccess.createInterface(config)) {
 | 
				
			||||||
			try (final DBAccess da = DBAccess.createInterface(config)) {
 | 
								boolean exist = da.isDBExist(dbName);
 | 
				
			||||||
				boolean exist = da.isDBExist(dbName);
 | 
								if (!exist) {
 | 
				
			||||||
				if (!exist) {
 | 
									LOGGER.warn("DB: '{}' DOES NOT EXIST ==> create one", dbName);
 | 
				
			||||||
					LOGGER.warn("DB: '{}' DOES NOT EXIST ==> create one", dbName);
 | 
									// create the local DB:
 | 
				
			||||||
					// create the local DB:
 | 
									da.createDB(dbName);
 | 
				
			||||||
					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);
 | 
									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 {
 | 
							} catch (final InternalServerErrorException e) {
 | 
				
			||||||
			final String dbName = configInput.getDbName();
 | 
								e.printStackTrace();
 | 
				
			||||||
			LOGGER.warn("DB: '{}' is not check if it EXIST", dbName);
 | 
								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 io.swagger.v3.oas.annotations.media.Schema;
 | 
				
			||||||
import jakarta.persistence.Column;
 | 
					import jakarta.persistence.Column;
 | 
				
			||||||
import jakarta.persistence.Table;
 | 
					import jakarta.persistence.Table;
 | 
				
			||||||
import jakarta.validation.constraints.Size;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Table(name = "data")
 | 
					@Table(name = "data")
 | 
				
			||||||
@DataIfNotExists
 | 
					@DataIfNotExists
 | 
				
			||||||
@@ -15,11 +14,9 @@ import jakarta.validation.constraints.Size;
 | 
				
			|||||||
public class Data extends OIDGenericDataSoftDelete {
 | 
					public class Data extends OIDGenericDataSoftDelete {
 | 
				
			||||||
	@Column(length = 128, nullable = false)
 | 
						@Column(length = 128, nullable = false)
 | 
				
			||||||
	@Schema(description = "Sha512 of the data")
 | 
						@Schema(description = "Sha512 of the data")
 | 
				
			||||||
	@Size(max = 512)
 | 
					 | 
				
			||||||
	public String sha512;
 | 
						public String sha512;
 | 
				
			||||||
	@Column(length = 128, nullable = false)
 | 
						@Column(length = 128, nullable = false)
 | 
				
			||||||
	@Schema(description = "Mime -type of the media")
 | 
						@Schema(description = "Mime -type of the media")
 | 
				
			||||||
	@Size(max = 512)
 | 
					 | 
				
			||||||
	public String mimeType;
 | 
						public String mimeType;
 | 
				
			||||||
	@Column(nullable = false)
 | 
						@Column(nullable = false)
 | 
				
			||||||
	@Schema(description = "Size in Byte of the data")
 | 
						@Schema(description = "Size in Byte of the data")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,7 +51,6 @@ public class User extends GenericDataSoftDelete {
 | 
				
			|||||||
	@Nullable
 | 
						@Nullable
 | 
				
			||||||
	public Boolean blocked = false;
 | 
						public Boolean blocked = false;
 | 
				
			||||||
	@Column(length = 512)
 | 
						@Column(length = 512)
 | 
				
			||||||
	@Size(max = 512)
 | 
					 | 
				
			||||||
	public String blockedReason;
 | 
						public String blockedReason;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@Schema(description = "List of Id of the specific covers")
 | 
						@Schema(description = "List of Id of the specific covers")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,8 +4,6 @@ import java.util.HashMap;
 | 
				
			|||||||
import java.util.Map;
 | 
					import java.util.Map;
 | 
				
			||||||
import java.util.Set;
 | 
					import java.util.Set;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import org.kar.archidata.filter.PartRight;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class UserByToken {
 | 
					public class UserByToken {
 | 
				
			||||||
	public static final int TYPE_USER = -1;
 | 
						public static final int TYPE_USER = -1;
 | 
				
			||||||
	public static final int TYPE_APPLICATION = -2;
 | 
						public static final int TYPE_APPLICATION = -2;
 | 
				
			||||||
@@ -13,11 +11,10 @@ public class UserByToken {
 | 
				
			|||||||
	public Integer type = null;
 | 
						public Integer type = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public Long id = 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; // FOr application, this is the id of the application, and of user token, this is the USERID
 | 
				
			||||||
	public Long parentId = null;
 | 
					 | 
				
			||||||
	public String name = null;
 | 
						public String name = null;
 | 
				
			||||||
	// Right map
 | 
						// Right map
 | 
				
			||||||
	public Map<String, Map<String, PartRight>> right = new HashMap<>();
 | 
						public Map<String, Map<String, Object>> right = new HashMap<>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public Set<String> getGroups() {
 | 
						public Set<String> getGroups() {
 | 
				
			||||||
		return this.right.keySet();
 | 
							return this.right.keySet();
 | 
				
			||||||
@@ -30,11 +27,11 @@ public class UserByToken {
 | 
				
			|||||||
		return this.right.containsKey(group);
 | 
							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)) {
 | 
							if (!this.right.containsKey(group)) {
 | 
				
			||||||
			return null;
 | 
								return null;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		final Map<String, PartRight> rightGroup = this.right.get(group);
 | 
							final Map<String, Object> rightGroup = this.right.get(group);
 | 
				
			||||||
		if (!rightGroup.containsKey(key)) {
 | 
							if (!rightGroup.containsKey(key)) {
 | 
				
			||||||
			return null;
 | 
								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 {
 | 
					public class ConfigBaseVariable {
 | 
				
			||||||
	static public String tmpDataFolder;
 | 
						static public String tmpDataFolder;
 | 
				
			||||||
	static public String dataFolder;
 | 
						static public String dataFolder;
 | 
				
			||||||
	static public String dbAbleToCreate;
 | 
					 | 
				
			||||||
	static public String dbType;
 | 
						static public String dbType;
 | 
				
			||||||
	static public String dbHost;
 | 
						static public String dbHost;
 | 
				
			||||||
	static public String dbPort;
 | 
						static public String dbPort;
 | 
				
			||||||
@@ -24,7 +23,6 @@ public class ConfigBaseVariable {
 | 
				
			|||||||
	public static void clearAllValue() {
 | 
						public static void clearAllValue() {
 | 
				
			||||||
		tmpDataFolder = System.getenv("DATA_TMP_FOLDER");
 | 
							tmpDataFolder = System.getenv("DATA_TMP_FOLDER");
 | 
				
			||||||
		dataFolder = System.getenv("DATA_FOLDER");
 | 
							dataFolder = System.getenv("DATA_FOLDER");
 | 
				
			||||||
		dbAbleToCreate = System.getenv("DB_ABLE_TO_CREATE");
 | 
					 | 
				
			||||||
		dbType = System.getenv("DB_TYPE");
 | 
							dbType = System.getenv("DB_TYPE");
 | 
				
			||||||
		dbHost = System.getenv("DB_HOST");
 | 
							dbHost = System.getenv("DB_HOST");
 | 
				
			||||||
		dbPort = System.getenv("DB_PORT");
 | 
							dbPort = System.getenv("DB_PORT");
 | 
				
			||||||
@@ -60,13 +58,6 @@ public class ConfigBaseVariable {
 | 
				
			|||||||
		return dataFolder;
 | 
							return dataFolder;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public static boolean getDBAbleToCreate() {
 | 
					 | 
				
			||||||
		if (dbAbleToCreate == null) {
 | 
					 | 
				
			||||||
			return true;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return Boolean.getBoolean(dbAbleToCreate);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	public static String getDBType() {
 | 
						public static String getDBType() {
 | 
				
			||||||
		if (dbType == null) {
 | 
							if (dbType == null) {
 | 
				
			||||||
			return "mysql";
 | 
								return "mysql";
 | 
				
			||||||
@@ -109,6 +100,9 @@ public class ConfigBaseVariable {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public static String getDBName() {
 | 
						public static String getDBName() {
 | 
				
			||||||
 | 
							if (bdDatabase == null) {
 | 
				
			||||||
 | 
								return "unknown";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		return bdDatabase;
 | 
							return bdDatabase;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -56,6 +56,7 @@ public class RESTApi {
 | 
				
			|||||||
						"Fail to get the data [" + httpResponse.statusCode() + "] " + httpResponse.body());
 | 
											"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(),
 | 
							return this.mapper.readValue(httpResponse.body(),
 | 
				
			||||||
				this.mapper.getTypeFactory().constructCollectionType(List.class, clazz));
 | 
									this.mapper.getTypeFactory().constructCollectionType(List.class, clazz));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,9 +4,9 @@ import java.util.ArrayList;
 | 
				
			|||||||
import java.util.Date;
 | 
					import java.util.Date;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.kar.archidata.annotation.ARCHIVE;
 | 
				
			||||||
import org.kar.archidata.annotation.AsyncType;
 | 
					import org.kar.archidata.annotation.AsyncType;
 | 
				
			||||||
import org.kar.archidata.annotation.method.ARCHIVE;
 | 
					import org.kar.archidata.annotation.RESTORE;
 | 
				
			||||||
import org.kar.archidata.annotation.method.RESTORE;
 | 
					 | 
				
			||||||
import org.kar.archidata.exception.NotFoundException;
 | 
					import org.kar.archidata.exception.NotFoundException;
 | 
				
			||||||
import org.slf4j.Logger;
 | 
					import org.slf4j.Logger;
 | 
				
			||||||
import org.slf4j.LoggerFactory;
 | 
					import org.slf4j.LoggerFactory;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,9 +2,9 @@ package test.kar.archidata.apiExtern.resource;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.kar.archidata.annotation.ARCHIVE;
 | 
				
			||||||
import org.kar.archidata.annotation.AsyncType;
 | 
					import org.kar.archidata.annotation.AsyncType;
 | 
				
			||||||
import org.kar.archidata.annotation.method.ARCHIVE;
 | 
					import org.kar.archidata.annotation.RESTORE;
 | 
				
			||||||
import org.kar.archidata.annotation.method.RESTORE;
 | 
					 | 
				
			||||||
import org.kar.archidata.dataAccess.DataAccess;
 | 
					import org.kar.archidata.dataAccess.DataAccess;
 | 
				
			||||||
import org.slf4j.Logger;
 | 
					import org.slf4j.Logger;
 | 
				
			||||||
import org.slf4j.LoggerFactory;
 | 
					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;
 | 
					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.Pattern;
 | 
				
			||||||
import jakarta.validation.constraints.Size;
 | 
					import jakarta.validation.constraints.Size;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,7 @@
 | 
				
			|||||||
package test.kar.archidata.dataAccess.model;
 | 
					package test.kar.archidata.dataAccess.model;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import org.kar.archidata.annotation.DataJson;
 | 
					import org.kar.archidata.annotation.DataJson;
 | 
				
			||||||
import org.kar.archidata.annotation.checker.Checker;
 | 
					import org.kar.archidata.dataAccess.options.CheckJPA;
 | 
				
			||||||
import org.kar.archidata.checker.CheckJPA;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class DataWithSubJson {
 | 
					public class DataWithSubJson {
 | 
				
			||||||
	// Simple checker declaration
 | 
						// Simple checker declaration
 | 
				
			||||||
@@ -12,7 +11,6 @@ public class DataWithSubJson {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@DataJson()
 | 
						@DataJson(checker = DataInJson.DataInJsonChecker.class)
 | 
				
			||||||
	@Checker(DataInJson.DataInJsonChecker.class)
 | 
					 | 
				
			||||||
	public DataInJson dataSerialized;
 | 
						public DataInJson dataSerialized;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1 +1 @@
 | 
				
			|||||||
0.24.0
 | 
					0.21.0
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user