package de.skuzzle.polly.sdk.httpv2.html; import de.skuzzle.polly.sdk.Types.NumberType; import de.skuzzle.polly.sdk.Types; public class NumericAcceptor implements Acceptor { private static class FilterObject { int order; double number; boolean noFilter; private FilterObject(double number, int order, boolean noFilter) { this.order = order; this.number = number; this.noFilter = noFilter; } public boolean test(double number) { if (this.noFilter) { return true; } else if (this.order < 0) { return number < this.number; } else if (this.order > 0) { return number > this.number; } else { return Double.compare(this.number, number) == 0; } } } @Override public Object parseFilter(String filter) { if (filter == null || filter.equals("")) { //$NON-NLS-1$ return new FilterObject(0, 0, true); } int order = 0; String part = filter; if (filter.startsWith("<")) { //$NON-NLS-1$ order = -1; part = filter.substring(1); } else if (filter.startsWith(">")) { //$NON-NLS-1$ order = 1; part = filter.substring(1); } try { final double d = Double.parseDouble(part); return new FilterObject(d, order, false); } catch (NumberFormatException e) { // backup, better not happen return new FilterObject(0.0, 0, true); } } @Override public boolean accept(Object filter, Object cellValue) { if (cellValue == null || !(filter instanceof FilterObject)) { return false; } final double currentValue; if (cellValue instanceof Types.NumberType) { currentValue = ((NumberType) cellValue).getValue(); } else if (cellValue instanceof Number) { currentValue = ((Number) cellValue).doubleValue(); } else { return false; } final FilterObject fo = (FilterObject) filter; return fo.test(currentValue); } }