package de.flower.common.validation.unique; import de.flower.common.model.db.entity.IEntity; import de.flower.common.util.Check; import de.flower.common.validation.unique.impl.IColumnResolver; import de.flower.common.validation.unique.impl.IRowCountChecker; import de.flower.common.validation.unique.impl.UniqueDef; import de.flower.common.validation.unique.impl.UniqueDefFactory; import org.apache.commons.beanutils.PropertyUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; /** * Validator for testing unique constraints. */ public final class UniqueValidator implements ConstraintValidator<Unique, IEntity> { private static final Logger LOG = LoggerFactory.getLogger(UniqueValidator.class); private final IColumnResolver columnResolver; private final IRowCountChecker rowCountChecker; private UniqueDef constraintDef; @Autowired public UniqueValidator(final IColumnResolver columnResolver, final IRowCountChecker rowCountChecker) { this.columnResolver = Check.notNull(columnResolver); this.rowCountChecker = Check.notNull(rowCountChecker); } @Override public void initialize(final Unique constraint) { constraintDef = UniqueDefFactory.parseConstraint(constraint, columnResolver); } @Override public boolean isValid(final IEntity entity, final ConstraintValidatorContext context) { LOG.debug("Validating [{}] against constraint [{}].", entity, constraintDef); // Unique-Validator does not handle null values correctly for (final String attributeName : constraintDef.getAttributeNames()) { try { final Object value = PropertyUtils.getProperty(entity, attributeName); if (value == null) { return true; } // CHECKSTYLE IGNORE 1 LINES } catch (final Exception e) { throw new RuntimeException(e); } } boolean valid = rowCountChecker.rowCount(entity, constraintDef.getAttributeNames()).intValue() == 0; return valid; } }