package com.revolsys.collection.range;
import com.revolsys.beans.Classes;
import com.revolsys.util.Property;
import com.revolsys.util.number.Numbers;
public class Ranges {
private static boolean isNumeric(final RangeSet rangeSet) {
if (rangeSet == null) {
return false;
} else {
for (final AbstractRange<?> range : rangeSet.getRanges()) {
if (range instanceof LongRange) {
} else if (range instanceof IntRange) {
} else if (range instanceof LongPaddedRange) {
} else if (range instanceof CrossProductRange) {
final CrossProductRange crossProduct = (CrossProductRange)range;
for (final AbstractRange<?> subRange : crossProduct.getRanges()) {
if (subRange instanceof LongRange) {
} else if (subRange instanceof IntRange) {
} else if (subRange instanceof LongPaddedRange) {
} else {
return false;
}
}
} else {
return false;
}
}
return true;
}
}
public static boolean isNumeric(final String rangeSpec) {
try {
final RangeSet rangeSet = RangeSet.newRangeSet(rangeSpec);
return isNumeric(rangeSet);
} catch (final Throwable e) {
return false;
}
}
public static AbstractRange<?> newRange(final char value) {
if (Numbers.isDigit(value)) {
return new IntRange(value - '0');
} else if (CharRange.isLowerOrUpper(value)) {
return new CharRange(value);
} else {
return new StringSingletonRange(value);
}
}
public static AbstractRange<?> newRange(final char from, final char to) {
if (Numbers.isDigit(from) && Numbers.isDigit(to)) {
return new IntRange(from - '0', to - '0');
} else {
return new CharRange(from, to);
}
}
public static AbstractRange<?> newRange(final int value) {
return new IntRange(value);
}
public static AbstractRange<?> newRange(final int from, final int to) {
return new IntRange(from, to);
}
public static AbstractRange<?> newRange(final long value) {
return new LongRange(value);
}
public static AbstractRange<?> newRange(final long from, final long to) {
return new LongRange(from, to);
}
public static AbstractRange<?> newRange(Object value) {
value = toValue(value);
if (value == null) {
return null;
} else if (value instanceof Long) {
return newRange(((Long)value).longValue());
} else if (Numbers.isPrimitiveIntegral(value)) {
return newRange(((Number)value).intValue());
} else if (value instanceof Character) {
final Character character = (Character)value;
return newRange(character.charValue());
} else {
return new StringSingletonRange(value.toString());
}
}
public static AbstractRange<?> newRange(final Object from, final Object to) {
final Object fromValue = toValue(from);
final Object toValue = toValue(to);
if (fromValue == null) {
return newRange(toValue);
}
if (fromValue instanceof Long) {
final long fromLong = (Long)fromValue;
if (toValue instanceof Long) {
final long toLong = (Long)toValue;
if (fromLong != 0 && from.toString().charAt(0) == '0'
|| toLong != 0 && to.toString().charAt(0) == '0') {
return new LongPaddedRange(fromLong, toLong);
} else {
return newRange(fromLong, toLong);
}
} else if (toValue instanceof Integer) {
final long toLong = (Integer)toValue;
if (fromLong != 0 && from.toString().charAt(0) == '0'
|| toLong != 0 && to.toString().charAt(0) == '0') {
return new LongPaddedRange(fromLong, toLong);
} else {
return newRange(fromLong, toLong);
}
} else {
throw new RangeInvalidException("Cannot create range from " + fromValue + " (Long) and "
+ toValue + " (" + Classes.className(toValue.getClass()) + ")");
}
} else if (fromValue instanceof Integer) {
final int fromInt = (Integer)fromValue;
if (toValue instanceof Long) {
final long toLong = (Long)toValue;
if (fromInt != 0 && from.toString().charAt(0) == '0'
|| toLong != 0 && to.toString().charAt(0) == '0') {
return new LongPaddedRange(fromInt, toLong);
} else {
return newRange(fromInt, toLong);
}
} else if (toValue instanceof Integer) {
final int toInt = (Integer)toValue;
if (fromInt != 0 && from.toString().charAt(0) == '0'
|| toInt != 0 && to.toString().charAt(0) == '0') {
return new LongPaddedRange(fromInt, toInt);
} else {
return newRange(fromInt, toInt);
}
} else {
throw new RangeInvalidException("Cannot create range from " + fromValue + " (Long) and "
+ toValue + " (" + Classes.className(toValue.getClass()) + ")");
}
} else if (fromValue instanceof Character) {
final char fromChar = (Character)fromValue;
if (toValue instanceof Character) {
final char toChar = (Character)toValue;
return newRange(fromChar, toChar);
} else {
throw new RangeInvalidException("Cannot create range from " + fromValue
+ " (Character) and " + toValue + " (" + Classes.className(toValue.getClass()) + ")");
}
} else {
throw new RangeInvalidException("Cannot create range from " + fromValue + " (String) and "
+ toValue + " (" + Classes.className(toValue.getClass()) + ")");
}
}
public static Object toValue(final Object value) {
if (value == null) {
return null;
} else if (Numbers.isPrimitiveIntegral(value)) {
final Number number = (Number)value;
final long longValue = number.longValue();
final int intValue = (int)longValue;
if (intValue == longValue) {
return intValue;
} else {
return longValue;
}
} else if (value instanceof Character) {
final Character character = (Character)value;
return character.charValue();
} else {
return toValue(value.toString());
}
}
public static Object toValue(final String value) {
if (Property.hasValue(value)) {
final Long longValue = Numbers.toLong(value);
if (longValue == null) {
if (value.length() == 1) {
final char character = value.charAt(0);
if (CharRange.isLowerOrUpper(character)) {
return character;
}
}
return value;
} else {
final int intValue = longValue.intValue();
if (intValue == longValue) {
return intValue;
} else {
return longValue;
}
}
} else {
return null;
}
}
}