package org.mongodb.morphia.query.validation; import org.mongodb.morphia.mapping.MappedField; import org.mongodb.morphia.query.FilterOperator; import java.util.List; /** * Extend this abstract class to provide a way of validating part of a query that contains a {@code FilterOperator}. Currently all * subclasses of this are final and singletons so this isn't the root of a massive class hierarchy. */ public abstract class OperationValidator implements Validator { /** * Apply validation for the given operator. If the operator does not match the operator required by the implementing class, then this * method will return false to show validation was not applied. If the operator is the one being validated, this method will return * true, and any failures in validation will be added to the list of {@code validationFailures}. * * @param mappedField the field being queried * @param operator any FilterOperator for a query * @param value the query value, to apply the operator to * @param validationFailures the list to add any failures to. If validation passes or {@code appliesTo} returned false, this list will * not change. * @return true if validation was applied, false if this validation doesn't apply to this operator. */ public boolean apply(final MappedField mappedField, final FilterOperator operator, final Object value, final List<ValidationFailure> validationFailures) { if (getOperator().equals(operator)) { validate(mappedField, value, validationFailures); return true; } return false; } /** * This method is called by the {@code apply} method to determine whether to validate the query. The validator will only work for a * single FilterOperator, and this will be returned by this method * * @return the FilterOperator this validator cares about. */ protected abstract FilterOperator getOperator(); /** * Performs the actual validation, and assumes {@code appliesTo} has returned true * * @param mappedField the field being queried * @param value the query value, to apply the operator to. This should not be null. * @param validationFailures the list to add any new {@code ValidationFailures} to. If validation passed this list will not change. */ protected abstract void validate(final MappedField mappedField, final Object value, final List<ValidationFailure> validationFailures); }