/******************************************************************************* * Copyright (c) 2014 BestSolution.at and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * tom <FIRSTNAME.LASTNAME@bestsolution.at> - initial API and implementation *******************************************************************************/ package at.bestsolution.persistence.expr; import java.util.ArrayList; import java.util.List; public class RangeExpression<O> extends PropertyExpression<O> { private RangeExpression(ExpressionType type, String property, Object[] data) { super(type, property, data); } public static <O> RangeExpression<O> range(String property, Range[] ranges) { return new RangeExpression<O>(ExpressionType.RANGE, property, ranges); } public static <O> RangeExpression<O> range(String property, String rangeString) { return new RangeExpression<O>(ExpressionType.RANGE, property, parseRanges(rangeString)); } private static Range[] parseRanges(String rangeString) { List<Range> r = new ArrayList<RangeExpression.Range>(); for( String rangeSegment : rangeString.split(",") ) { if( rangeSegment.contains("-") ) { String[] parts = rangeSegment.split("-"); if( parts.length != 2 ) { throw new IllegalArgumentException("Invalid range definition: '"+rangeSegment+"' in '"+rangeString+"'"); } else if( parts[0].trim().length() == 0 || parts[1].trim().length() == 0 ) { throw new IllegalArgumentException("Invalid range definition: '"+rangeSegment+"' in '"+rangeString+"'"); } r.add(new Range(parts[0], parts[1])); } else { r.add(new Range(rangeSegment, rangeSegment)); } } return r.toArray(new Range[0]); } public static class Range { public final String min; public final String max; public Range(String min, String max) { this.min = min; this.max = max; } } }