/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.content.index.queryexpression; /** * Validates integer fields and convert integers represented as strings into actual integers. */ public final class IntegerFieldEvaluator extends QueryEvaluatorAdapter { public Object evaluate( CompareExpr expr ) { Expression left = (Expression) expr.getLeft().evaluate( this ); Expression right = (Expression) expr.getRight().evaluate( this ); if ( isIntegerField( left ) && right instanceof ValueExpr ) { ValueExpr valueExpr = (ValueExpr) right; if ( valueExpr.isString() ) { String s = (String) valueExpr.getValue(); validateInteger( valueExpr.getValue(), expr ); return new CompareExpr( expr.getOperator(), left, new ValueExpr( new Double( s ) ) ); } else if ( !valueExpr.isNumber() ) { throw new QueryParserException( "Expected integer" + " on right side of expression: " + expr ); } else if ( valueExpr.isNumber() ) { validateInteger( valueExpr.getValue(), expr ); } } return expr; } private boolean isIntegerField( Expression expr ) { return ( expr instanceof FieldExpr ) && ( (FieldExpr) expr ).isIntegerField(); } private void validateInteger( Object value, Expression expr ) { if ( value instanceof Double ) { Double d = (Double) value; if ( d.intValue() != d ) { throw new QueryParserException( "Expected integer on right side of expression: " + expr ); } else { return; } } try { new Integer( String.valueOf( value ) ); } catch ( NumberFormatException e ) { throw new QueryParserException( "Expected integer on right side of expression: " + expr ); } } }