package edu.ualberta.med.biobank.validator.constraint.model.impl;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import edu.ualberta.med.biobank.model.AbstractPosition;
import edu.ualberta.med.biobank.model.ContainerType;
import edu.ualberta.med.biobank.validator.EventSourceAwareConstraintValidator;
import edu.ualberta.med.biobank.validator.constraint.model.InBounds;
public class InBoundsValidator
extends EventSourceAwareConstraintValidator<Object>
implements ConstraintValidator<InBounds, Object> {
private static final String OUT_OF_BOUNDS =
"{edu.ualberta.med.biobank.model.AbstractPosition.InBounds.outOfBounds}";
@Override
public void initialize(InBounds annotation) {
}
@Override
public boolean isValidInEventSource(Object value,
ConstraintValidatorContext context) {
if (value == null) return true;
if (!(value instanceof AbstractPosition)) return false;
// TODO: note that this type of validation should probably be enforced
// through foreign key constraints. Then the capacity and labeling
// scheme can be changed?
context.disableDefaultConstraintViolation();
AbstractPosition position = (AbstractPosition) value;
boolean isValid = checkBounds(position, context);
return isValid;
}
private boolean checkBounds(AbstractPosition position,
ConstraintValidatorContext context) {
ContainerType ct = position.getHoldingContainer().getContainerType();
Integer maxRow = ct.getRowCapacity();
Integer maxCol = ct.getColCapacity();
Integer row = position.getRow();
Integer col = position.getCol();
if (maxRow != null && maxCol != null
&& (row < 0 || row >= maxRow || col < 0 || col >= maxCol)) {
context.buildConstraintViolationWithTemplate(OUT_OF_BOUNDS)
.addNode("row")
.addNode("col")
.addConstraintViolation();
return false;
}
return true;
}
}