package serializers.dslplatform; import java.util.*; import java.math.BigDecimal; public final class Guards { public static <T> void checkNulls(final Iterable<T> values) { if (values == null) return; int i = 0; for (final T value : values) { if (value == null) throw new IllegalArgumentException("Element at index " + i + " was a null value, which is not permitted."); i++; } } public static <T> void checkNulls(final T[] values) { if (values == null) return; for (int i = 0; i < values.length; i++) { if (values[i] == null) throw new IllegalArgumentException("Element at index " + i + " was a null value, which is not permitted."); } } public static <T> void checkNulls(final List<T> values) { if (values == null) return; for (int i = 0; i < values.size(); i++) { if (values.get(i) == null) throw new IllegalArgumentException("Element at index " + i + " was a null value, which is not permitted."); } } public static void checkScale(final BigDecimal value, final int scale) { if (value == null) return; try { value.setScale(scale); } catch (final ArithmeticException e) { throw new IllegalArgumentException("Decimal places allowed: " + scale + ". Value: " + value, e); } } public static void checkScale(final BigDecimal[] values, final int scale) { if (values == null) return; for (int i = 0; i < values.length; i++) { final BigDecimal value = values[i]; if (value == null) continue; try { value.setScale(scale); } catch (final ArithmeticException e) { throw new IllegalArgumentException("Invalid value for element at index " + i + ". Decimal places allowed: " + scale + ". Value: " + value, e); } } } public static void checkScale(final List<BigDecimal> values, final int scale) { if (values == null) return; for (int i = 0; i < values.size(); i++) { final BigDecimal value = values.get(i); if (value == null) continue; try { value.setScale(scale); } catch (final ArithmeticException e) { throw new IllegalArgumentException("Invalid value for element at index " + i + ". Decimal places allowed: " + scale + ". Value: " + value, e); } } } public static void checkScale(final Iterable<BigDecimal> values, final int scale) { if (values == null) return; int i = 0; for (final BigDecimal value : values) { try { if (value != null) value.setScale(scale); } catch (final ArithmeticException e) { throw new IllegalArgumentException( "Invalid value for element at index " + i + ". Decimal places allowed: " + scale + ". Value: " + value, e); } i++; } } public static BigDecimal setScale(final BigDecimal value, final int scale) { return value.setScale(scale, BigDecimal.ROUND_HALF_UP); } public static Set<BigDecimal> setScale(final Set<BigDecimal> values, final int scale) { if (values == null) return null; final Set<BigDecimal> result = new LinkedHashSet<BigDecimal>(values.size()); for (final BigDecimal value : values) result.add(value != null ? setScale(value, scale) : null); return result; } public static BigDecimal[] setScale(final BigDecimal[] values, final int scale) { if (values == null) return null; final BigDecimal[] result = new BigDecimal[values.length]; for (int i = 0; i < values.length; i++) { final BigDecimal value = values[i]; result[i] = value != null ? setScale(value, scale) : null; } return result; } public static List<BigDecimal> setScale(final List<BigDecimal> values, final int scale) { if (values == null) return null; final ArrayList<BigDecimal> result = new ArrayList<BigDecimal>(values.size()); for (int i = 0; i < values.size(); i++) { final BigDecimal value = values.get(i); result.add(value != null ? setScale(value, scale) : null); } return result; } public static Stack<BigDecimal> setScale(final Stack<BigDecimal> values, final int scale) { if (values == null) return null; final Stack<BigDecimal> result = new Stack<BigDecimal>(); for (int i = 0; i < values.size(); i++) { final BigDecimal value = values.get(i); result.add(value != null ? setScale(value, scale) : null); } return result; } public static Vector<BigDecimal> setScale(final Vector<BigDecimal> values, final int scale) { if (values == null) return null; final Vector<BigDecimal> result = new Vector<BigDecimal>(); for (int i = 0; i < values.size(); i++) { final BigDecimal value = values.get(i); result.add(value != null ? setScale(value, scale) : null); } return result; } public static LinkedList<BigDecimal> setScale(final LinkedList<BigDecimal> values, final int scale) { if (values == null) return null; final LinkedList<BigDecimal> result = new LinkedList<BigDecimal>(); for (int i = 0; i < values.size(); i++) { final BigDecimal value = values.get(i); result.add(value != null ? setScale(value, scale) : null); } return result; } public static void checkLength(final String value, final int length) { if (value != null && value.length() > length) throw new IllegalArgumentException( "Maximum length allowed: " + length + ". Value: " + value); } public static void checkLength(final Iterable<String> values, final int length) { if (values == null) return; int i = 0; for (final String value : values) { if (value != null && value.length() > length) throw new IllegalArgumentException( "Invalid value for element at index " + i + ". Maximum length allowed: " + length + ". Value: " + value); i++; } } public static void checkLength(final String[] values, final int length) { if (values == null) return; for (int i = 0; i < values.length; i++) { final String value = values[i]; if (value != null && value.length() > length) throw new IllegalArgumentException( "Invalid value for element at index " + i + ". Maximum length allowed: " + length + ". Value: " + value); } } public static void checkLength(final List<String> values, final int length) { if (values == null) return; for (int i = 0; i < values.size(); i++) { final String value = values.get(i); if (value != null && value.length() > length) throw new IllegalArgumentException( "Invalid value for element at index " + i + ". Maximum length allowed: " + length + ". Value: " + value); } } public static boolean compareBigDecimal(final Iterable<BigDecimal> left, final Iterable<BigDecimal> right) { if (left == null && right == null) return true; if (left == null || right == null) return false; final Iterator<BigDecimal> leftIterator = left.iterator(); final Iterator<BigDecimal> rightIterator = right.iterator(); while (leftIterator.hasNext() && rightIterator.hasNext()) { final BigDecimal l = leftIterator.next(); final BigDecimal r = rightIterator.next(); if (!(l == r || l != null && r != null && l.compareTo(r) == 0)) return false; } return leftIterator.hasNext() == rightIterator.hasNext(); } public static boolean compareBigDecimal(final BigDecimal[] left, final BigDecimal[] right) { if (left == null && right == null) return true; if (left == null || right == null) return false; if (left.length != right.length) return false; for (int i = 0; i < left.length; i++) { final BigDecimal l = left[i]; final BigDecimal r = right[i]; if (!(l == r || l != null && r != null && l.compareTo(r) == 0)) return false; } return true; } private static final Comparator<BigDecimal> bigDecimalComparator = new Comparator<BigDecimal>() { @Override public int compare(final BigDecimal left, final BigDecimal right) { return left == null && right == null ? 0 : left == null ? -1 : right == null? 1 : left.compareTo(right); } }; public static boolean compareBigDecimal(final Set<BigDecimal> left, final Set<BigDecimal> right) { if (left == null && right == null) return true; if (left == null || right == null) return false; if (left.size() != right.size()) return false; final BigDecimal[] leftSorted = left.toArray(new BigDecimal[left.size()]); Arrays.sort(leftSorted, bigDecimalComparator); final BigDecimal[] rightSorted = right.toArray(new BigDecimal[right.size()]); Arrays.sort(rightSorted, bigDecimalComparator); return compareBigDecimal(leftSorted, rightSorted); } public static boolean compareBinary(final Iterable<byte[]> left, final Iterable<byte[]> right) { if (left == null && right == null) return true; if (left == null || right == null) return false; final Iterator<byte[]> leftIterator = left.iterator(); final Iterator<byte[]> rightIterator = right.iterator(); while (leftIterator.hasNext() && rightIterator.hasNext()) { final byte[] l = leftIterator.next(); final byte[] r = rightIterator.next(); if (!Arrays.equals(l, r)) return false; } return leftIterator.hasNext() == rightIterator.hasNext(); } public static boolean compareBinary(final byte[][] left, final byte[][] right) { if (left == null && right == null) return true; if (left == null || right == null) return false; if (left.length != right.length) return false; for (int i = 0; i < left.length; i++) { if (!Arrays.equals(left[i], right[i])) return false; } return true; } public static boolean compareBinary(final Set<byte[]> left, final Set<byte[]> right) { if (left == null && right == null) return true; if (left == null || right == null) return false; if (left.size() != right.size()) return false; loop: for (final byte[] l : left) { for (final byte[] r : right) { if (Arrays.equals(l, r)) continue loop; } return false; } return true; } public static <T> boolean compareQueue(final Queue<T> left, final Queue<T> right) { if (left == null && right == null) return true; if (left == null || right == null) return false; final Iterator<T> leftIterator = left.iterator(); final Iterator<T> rightIterator = right.iterator(); while (leftIterator.hasNext() && rightIterator.hasNext()) { final T l = leftIterator.next(); final T r = rightIterator.next(); if (!(l == r || l != null && r != null && l.equals(r))) return false; } return leftIterator.hasNext() == rightIterator.hasNext(); } }