// Path: src/main/java/org/cejug/hurraa/validation/impl/UniqueValidator.java
// public class UniqueValidator implements ConstraintValidator< Unique  ,  Object > {
//     
// //  @PersistenceContext
// //  private EntityManager entityManager;
// 
//     @PersistenceUnit
//     private EntityManagerFactory entityManagerFactory;
//     
//     private String fieldName;
//     private String identityFieldName;
//     @SuppressWarnings("rawtypes")
//     private Class entityClass;
//     
//     @Override
//     public void initialize(Unique constraintAnnotation) {
//         fieldName = constraintAnnotation.propertyName();
//         identityFieldName = constraintAnnotation.identityPropertyName();
//         entityClass = constraintAnnotation.entityClass();
//     }
//     
//     @Override
//     public boolean isValid(Object value,
//             ConstraintValidatorContext context) {
//         return validateUniqueness(value, context);
//     }
//     
//     public boolean validateUniqueness(Object value,
//             ConstraintValidatorContext context){
//         try {
//             Field field = value.getClass().getDeclaredField(fieldName);
//             field.setAccessible(true);
//             Object fieldValue = field.get(value);
//             
//             field = value.getClass().getDeclaredField( identityFieldName );
//             field.setAccessible(true);
//             Object identityFieldValue = field.get(value);
//             
//             
//             StringBuilder sb = new StringBuilder( String.format( "FROM %s a WHERE  a.%s = :fieldValue" , entityClass.getSimpleName() , fieldName ) );
//             if(identityFieldValue != null)
//                sb.append( String.format( " AND a.%s != :identifyFieldValue"  , identityFieldName ) );   
//             
//             EntityManager entityManager = entityManagerFactory.createEntityManager();
//             
//             Query query = entityManager.createQuery( sb.toString() );
//             query.setMaxResults(1);
//             query.setParameter( "fieldValue", fieldValue );
//             if(identityFieldValue != null)
//                 query.setParameter( "identifyFieldValue", identityFieldValue );
//             
//             return query.getResultList().isEmpty();
//         } catch (IllegalArgumentException | IllegalAccessException e) {
//             e.printStackTrace();
//         } catch (NoSuchFieldException e) {
//             e.printStackTrace();
//         } catch (SecurityException e) {
//             e.printStackTrace();
//         }
//         
//         return false;
//     }
// 
// }


import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.ReportAsSingleViolation;
import org.cejug.hurraa.validation.impl.UniqueValidator;
package org.cejug.hurraa.validation;




@Target({ ElementType.TYPE , ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
// Path: src/main/java/org/cejug/hurraa/validation/impl/UniqueValidator.java
// public class UniqueValidator implements ConstraintValidator< Unique  ,  Object > {
//     
// //  @PersistenceContext
// //  private EntityManager entityManager;
// 
//     @PersistenceUnit
//     private EntityManagerFactory entityManagerFactory;
//     
//     private String fieldName;
//     private String identityFieldName;
//     @SuppressWarnings("rawtypes")
//     private Class entityClass;
//     
//     @Override
//     public void initialize(Unique constraintAnnotation) {
//         fieldName = constraintAnnotation.propertyName();
//         identityFieldName = constraintAnnotation.identityPropertyName();
//         entityClass = constraintAnnotation.entityClass();
//     }
//     
//     @Override
//     public boolean isValid(Object value,
//             ConstraintValidatorContext context) {
//         return validateUniqueness(value, context);
//     }
//     
//     public boolean validateUniqueness(Object value,
//             ConstraintValidatorContext context){
//         try {
//             Field field = value.getClass().getDeclaredField(fieldName);
//             field.setAccessible(true);
//             Object fieldValue = field.get(value);
//             
//             field = value.getClass().getDeclaredField( identityFieldName );
//             field.setAccessible(true);
//             Object identityFieldValue = field.get(value);
//             
//             
//             StringBuilder sb = new StringBuilder( String.format( "FROM %s a WHERE  a.%s = :fieldValue" , entityClass.getSimpleName() , fieldName ) );
//             if(identityFieldValue != null)
//                sb.append( String.format( " AND a.%s != :identifyFieldValue"  , identityFieldName ) );   
//             
//             EntityManager entityManager = entityManagerFactory.createEntityManager();
//             
//             Query query = entityManager.createQuery( sb.toString() );
//             query.setMaxResults(1);
//             query.setParameter( "fieldValue", fieldValue );
//             if(identityFieldValue != null)
//                 query.setParameter( "identifyFieldValue", identityFieldValue );
//             
//             return query.getResultList().isEmpty();
//         } catch (IllegalArgumentException | IllegalAccessException e) {
//             e.printStackTrace();
//         } catch (NoSuchFieldException e) {
//             e.printStackTrace();
//         } catch (SecurityException e) {
//             e.printStackTrace();
//         }
//         
//         return false;
//     }
// 
// }


// Path: src/main/java/org/cejug/hurraa/validation/Unique.java
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.ReportAsSingleViolation;
import org.cejug.hurraa.validation.impl.UniqueValidator;

package org.cejug.hurraa.validation;




@Target({ ElementType.TYPE , ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = { UniqueValidator.class })