package com.brightgenerous.lang; import java.io.Serializable; import java.util.Collection; import java.util.Map; public class Args { private Args() { } public static <T> T notNull(T argument, String name) { return notNull(argument, "Argument '%s' may not be null.", name); } public static <T> T notNull(T argument, String message, Object... params) { if (argument == null) { throw new IllegalArgumentException(Args.format(message, params)); } return argument; } public static <T extends CharSequence> T notEmpty(T argument, String name) { return notEmpty(argument, "Argument '%s' may not be null or empty.", name); } public static <T extends CharSequence> T notEmpty(T argument, String message, Object... params) { if ((argument == null) || (argument.length() < 1)) { throw new IllegalArgumentException(Args.format(message, params)); } return argument; } public static <T extends Collection<?>> T notEmpty(T collection, String name) { return notEmpty(collection, "Collection '%s' may not be null or empty.", name); } public static <T extends Collection<?>> T notEmpty(T collection, String message, Object... params) { if ((collection == null) || collection.isEmpty()) { throw new IllegalArgumentException(Args.format(message, params)); } return collection; } public static <T extends Map<?, ?>> T notEmpty(T collection, String name) { return notEmpty(collection, "Map '%s' may not be null or empty.", name); } public static <T extends Map<?, ?>> T notEmpty(T collection, String message, Object... params) { if ((collection == null) || collection.isEmpty()) { throw new IllegalArgumentException(Args.format(message, params)); } return collection; } public static <T> T[] notEmpty(T[] array, String name) { return notEmpty(array, "Array '%s' may not be null or empty.", name); } public static <T> T[] notEmpty(T[] array, String message, Object... params) { if ((array == null) || (array.length < 1)) { throw new IllegalArgumentException(Args.format(message, params)); } return array; } public static byte lowerThan(byte max, byte value, String name) { return lowerThan(Byte.valueOf(max), Byte.valueOf(value), name).byteValue(); } public static short lowerThan(short max, short value, String name) { return lowerThan(Short.valueOf(max), Short.valueOf(value), name).shortValue(); } public static int lowerThan(int max, int value, String name) { return lowerThan(Integer.valueOf(max), Integer.valueOf(value), name).intValue(); } public static long lowerThan(long max, long value, String name) { return lowerThan(Long.valueOf(max), Long.valueOf(value), name).longValue(); } public static float lowerThan(float max, float value, String name) { return lowerThan(Float.valueOf(max), Float.valueOf(value), name).floatValue(); } public static double lowerThan(double max, double value, String name) { return lowerThan(Double.valueOf(max), Double.valueOf(value), name).doubleValue(); } public static <T extends Comparable<T>> T lowerThan(T max, T value, String name) { notNull(max, name); if ((value.compareTo(max) >= 0)) { throw new IllegalArgumentException( String.format("Argument '%s' must have a value lower than [%s], but was %s", name, max, value)); } return value; } public static byte lowerEqual(byte max, byte value, String name) { return lowerEqual(Byte.valueOf(max), Byte.valueOf(value), name).byteValue(); } public static short lowerEqual(short max, short value, String name) { return lowerEqual(Short.valueOf(max), Short.valueOf(value), name).shortValue(); } public static int lowerEqual(int max, int value, String name) { return lowerEqual(Integer.valueOf(max), Integer.valueOf(value), name).intValue(); } public static long lowerEqual(long max, long value, String name) { return lowerEqual(Long.valueOf(max), Long.valueOf(value), name).longValue(); } public static float lowerEqual(float max, float value, String name) { return lowerEqual(Float.valueOf(max), Float.valueOf(value), name).floatValue(); } public static double lowerEqual(double max, double value, String name) { return lowerEqual(Double.valueOf(max), Double.valueOf(value), name).doubleValue(); } public static <T extends Comparable<T>> T lowerEqual(T max, T value, String name) { notNull(max, name); if ((value.compareTo(max) > 0)) { throw new IllegalArgumentException(String.format( "Argument '%s' must have a value lower equal [%s], but was %s", name, max, value)); } return value; } public static byte greaterThan(byte max, byte value, String name) { return greaterThan(Byte.valueOf(max), Byte.valueOf(value), name).byteValue(); } public static short greaterThan(short max, short value, String name) { return greaterThan(Short.valueOf(max), Short.valueOf(value), name).shortValue(); } public static int greaterThan(int max, int value, String name) { return greaterThan(Integer.valueOf(max), Integer.valueOf(value), name).intValue(); } public static long greaterThan(long max, long value, String name) { return greaterThan(Long.valueOf(max), Long.valueOf(value), name).longValue(); } public static float greaterThan(float max, float value, String name) { return greaterThan(Float.valueOf(max), Float.valueOf(value), name).floatValue(); } public static double greaterThan(double max, double value, String name) { return greaterThan(Double.valueOf(max), Double.valueOf(value), name).doubleValue(); } public static <T extends Comparable<T>> T greaterThan(T min, T value, String name) { notNull(min, name); if ((value.compareTo(min) <= 0)) { throw new IllegalArgumentException(String.format( "Argument '%s' must have a value greater than [%s], but was %s", name, min, value)); } return value; } public static byte greaterEqual(byte max, byte value, String name) { return greaterEqual(Byte.valueOf(max), Byte.valueOf(value), name).byteValue(); } public static short greaterEqual(short max, short value, String name) { return greaterEqual(Short.valueOf(max), Short.valueOf(value), name).shortValue(); } public static int greaterEqual(int max, int value, String name) { return greaterEqual(Integer.valueOf(max), Integer.valueOf(value), name).intValue(); } public static long greaterEqual(long max, long value, String name) { return greaterEqual(Long.valueOf(max), Long.valueOf(value), name).longValue(); } public static float greaterEqual(float max, float value, String name) { return greaterEqual(Float.valueOf(max), Float.valueOf(value), name).floatValue(); } public static double greaterEqual(double max, double value, String name) { return greaterEqual(Double.valueOf(max), Double.valueOf(value), name).doubleValue(); } public static <T extends Comparable<T>> T greaterEqual(T min, T value, String name) { notNull(min, name); if ((value.compareTo(min) < 0)) { throw new IllegalArgumentException(String.format( "Argument '%s' must have a value greater equal [%s], but was %s", name, min, value)); } return value; } public static byte withinRange(byte min, byte max, byte value, String name) { return withinRange(Byte.valueOf(min), Byte.valueOf(max), Byte.valueOf(value), name) .byteValue(); } public static short withinRange(short min, short max, short value, String name) { return withinRange(Short.valueOf(min), Short.valueOf(max), Short.valueOf(value), name) .shortValue(); } public static int withinRange(int min, int max, int value, String name) { return withinRange(Integer.valueOf(min), Integer.valueOf(max), Integer.valueOf(value), name) .intValue(); } public static long withinRange(long min, long max, long value, String name) { return withinRange(Long.valueOf(min), Long.valueOf(max), Long.valueOf(value), name) .longValue(); } public static float withinRange(float min, float max, float value, String name) { return withinRange(Float.valueOf(min), Float.valueOf(max), Float.valueOf(value), name) .floatValue(); } public static double withinRange(double min, double max, double value, String name) { return withinRange(Double.valueOf(min), Double.valueOf(max), Double.valueOf(value), name) .doubleValue(); } public static <T extends Comparable<T>> T withinRange(T min, T max, T value, String name) { notNull(min, name); notNull(max, name); if ((value.compareTo(min) < 0) || (value.compareTo(max) > 0)) { throw new IllegalArgumentException(String.format( "Argument '%s' must have a value within [%s,%s], but was %s", name, min, max, value)); } return value; } public static boolean isTrue(boolean argument, String name) { return isTrue(argument, "Argument '%s' may not be false.", name); } public static boolean isTrue(boolean argument, String msg, Object... params) { if (!argument) { throw new IllegalArgumentException(format(msg, params)); } return argument; } public static boolean isFalse(boolean argument, String name) { return isFalse(argument, "Argument '%s' may not be true.", name); } public static boolean isFalse(boolean argument, String msg, Object... params) { if (argument) { throw new IllegalArgumentException(format(msg, params)); } return argument; } public static <T> T isSerializable(T argument, String name) { return instanceOf(argument, Serializable.class, name); } public static <T> T instanceOf(T argument, Class<?> clazz, String name) { notNull(argument, name); notNull(clazz, "clazz"); if (!clazz.isAssignableFrom(argument.getClass())) { throw new IllegalArgumentException(String.format( "Argument '%s' must instanceof %s, but argument was %s", name, clazz.getName(), argument.getClass().getName())); } return argument; } private static String format(String msg, Object... params) { msg = msg.replaceAll("\\{\\}", "%s"); return String.format(msg, params); } }