DateTimePathExpressionProviderImpl.java

package org.bitbucket.gt_tech.spring.data.querydsl.value.operators;

import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.core.types.dsl.DateTimePath;
import org.apache.commons.lang3.Validate;

import java.util.Arrays;
import java.util.Date;

class DateTimePathExpressionProviderImpl extends BaseExpressionProvider<DateTimePath> {

    public DateTimePathExpressionProviderImpl() {
        super(Arrays.asList(Operator.EQUAL, Operator.NOT_EQUAL, Operator.GREATER_THAN, Operator.GREATER_THAN_OR_EQUAL,
            Operator.LESS_THAN, Operator.LESS_THAN_OR_EQUAL));
    }

    @Override
    protected String getStringValue(DateTimePath path, Object value) {
        return value.toString();
    }

    @Override
    protected BooleanExpression eq(DateTimePath path, String value, boolean ignoreCase) {
        Validate.isTrue(isDate(value), "Invalid date value");
        return path.eq(convertToDate(value));
    }

    @Override
    protected BooleanExpression ne(DateTimePath path, String value, boolean ignoreCase) {
        Validate.isTrue(isDate(value), "Invalid date value");
        return path.ne(convertToDate(value));
    }

    @Override
    protected BooleanExpression contains(DateTimePath path, String value, boolean ignoreCase) {
        throw new UnsupportedOperationException("Datetime can't be searched using contains operator");
    }

    @Override
    protected BooleanExpression startsWith(DateTimePath path, String value, boolean ignoreCase) {
        throw new UnsupportedOperationException("Datetime can't be searched using startsWith operator");
    }

    @Override
    protected BooleanExpression endsWith(DateTimePath path, String value, boolean ignoreCase) {
        throw new UnsupportedOperationException("Datetime can't be searched using endsWith operator");
    }

    @Override
    protected BooleanExpression matches(DateTimePath path, String value) {
        throw new UnsupportedOperationException("Datetime can't be searched using matches operator");
    }

    @Override
    protected BooleanExpression gt(DateTimePath path, String value) {
        Validate.isTrue(isDate(value), "Invalid date value");
        return path.gt(convertToDate(value));
    }

    @Override
    protected BooleanExpression gte(DateTimePath path, String value) {
        Validate.isTrue(isDate(value), "Invalid date value");
        return path.goe(convertToDate(value));
    }

    @Override
    protected BooleanExpression lt(DateTimePath path, String value) {
        Validate.isTrue(isDate(value), "Invalid date value");
        return path.lt(convertToDate(value));
    }

    @Override
    protected BooleanExpression lte(DateTimePath path, String value) {
        Validate.isTrue(isDate(value), "Invalid date value");
        return path.loe(convertToDate(value));
    }

    private boolean isDate(String dateString) {
        try {
            // use the same conversion as used by the Conversion service
            new Date(dateString);
            return true;
        } catch (IllegalArgumentException iae) {
            return false;
        }
    }

    private Date convertToDate(String dateString) {
        // use the same conversion as used by the Conversion service
        return new Date(dateString);
    }
}