package au.com.vaadinutils.validator; import java.util.List; import javax.persistence.metamodel.SingularAttribute; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import au.com.vaadinutils.crud.BaseCrudView; import au.com.vaadinutils.crud.CrudEntity; import au.com.vaadinutils.dao.JpaBaseDao; import com.vaadin.data.Validator; public class UniqueFieldValidator<E extends CrudEntity, F> implements Validator { /** * */ private static final long serialVersionUID = -2263382200263331788L; private Class<E> table; private SingularAttribute<E, F> matchField; private BaseCrudView<E> crud; transient Logger logger = LogManager.getLogger(UniqueFieldValidator.class); private String warningMessage; public UniqueFieldValidator(SingularAttribute<E, F> matchField, BaseCrudView<E> crud) { this(matchField, crud, "'" + matchField.getName() + "' must be unique"); } public UniqueFieldValidator(SingularAttribute<E, F> matchField, BaseCrudView<E> crud, String warningMessage) { this.table = matchField.getDeclaringType().getJavaType(); this.matchField = matchField; this.crud = crud; this.warningMessage = warningMessage; } @Override public void validate(Object value) throws InvalidValueException { if (value != null && !("".equals(value.toString()))) { JpaBaseDao<E, Long> dao = new JpaBaseDao<E, Long>(table); @SuppressWarnings("unchecked") List<E> matches = dao.findAllByAttribute(matchField, (F) value, null); for (E message : matches) { if (crud != null && crud.getCurrent() != null && !message.getId().equals(crud.getCurrent().getId())) { logger.error(warningMessage); throw new InvalidValueException(warningMessage); } if (crud == null) { logger.error(warningMessage); throw new InvalidValueException(warningMessage); } } } } }