|
@@ -0,0 +1,548 @@
|
|
|
+package com.xtframe.core.utils;
|
|
|
+
|
|
|
+import java.util.Collection;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+import com.xtframe.core.exception.BizException;
|
|
|
+import com.xtframe.util.CollectionUtils;
|
|
|
+import com.xtframe.util.ObjectUtils;
|
|
|
+import com.xtframe.util.StringUtils;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 断言共通类
|
|
|
+ *
|
|
|
+ * @author 袁晓冬
|
|
|
+ *
|
|
|
+ */
|
|
|
+public abstract class Assert {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert a boolean expression, throwing {@code BizException} if
|
|
|
+ * the test result is {@code false}.
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.isTrue(i > 0, "The value must be greater than zero");
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param expression
|
|
|
+ * a boolean expression
|
|
|
+ * @param message
|
|
|
+ * the exception message to use if the assertion fails
|
|
|
+ * @throws BizException
|
|
|
+ * if expression is {@code false}
|
|
|
+ */
|
|
|
+ public static void isTrue(boolean expression, String message) {
|
|
|
+ if (!expression) {
|
|
|
+ throw new BizException(message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert a boolean expression, throwing {@code BizException} if
|
|
|
+ * the test result is {@code false}.
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.isTrue(i > 0);
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param expression
|
|
|
+ * a boolean expression
|
|
|
+ * @throws BizException
|
|
|
+ * if expression is {@code false}
|
|
|
+ */
|
|
|
+ public static void isTrue(boolean expression) {
|
|
|
+ isTrue(expression, "[Assertion failed] - this expression must be true");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert that an object is {@code null} .
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.isNull(value, "The value must be null");
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param object
|
|
|
+ * the object to check
|
|
|
+ * @param message
|
|
|
+ * the exception message to use if the assertion fails
|
|
|
+ * @throws BizException
|
|
|
+ * if the object is not {@code null}
|
|
|
+ */
|
|
|
+ public static void isNull(Object object, String message) {
|
|
|
+ if (object != null) {
|
|
|
+ throw new BizException(message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert that an object is {@code null} .
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.isNull(value);
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param object
|
|
|
+ * the object to check
|
|
|
+ * @throws BizException
|
|
|
+ * if the object is not {@code null}
|
|
|
+ */
|
|
|
+ public static void isNull(Object object) {
|
|
|
+ isNull(object, "[Assertion failed] - the object argument must be null");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert that an object is not {@code null} .
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.notNull(clazz, "The class must not be null");
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param object
|
|
|
+ * the object to check
|
|
|
+ * @param message
|
|
|
+ * the exception message to use if the assertion fails
|
|
|
+ * @throws BizException
|
|
|
+ * if the object is {@code null}
|
|
|
+ */
|
|
|
+ public static void notNull(Object object, String message) {
|
|
|
+ if (object == null) {
|
|
|
+ throw new BizException(message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert that an object is not {@code null} .
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.notNull(clazz);
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param object
|
|
|
+ * the object to check
|
|
|
+ * @throws BizException
|
|
|
+ * if the object is {@code null}
|
|
|
+ */
|
|
|
+ public static void notNull(Object object) {
|
|
|
+ notNull(object, "[Assertion failed] - this argument is required; it must not be null");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert that the given String is not empty; that is, it must not be
|
|
|
+ * {@code null} and not the empty String.
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.hasLength(name, "Name must not be empty");
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param text
|
|
|
+ * the String to check
|
|
|
+ * @param message
|
|
|
+ * the exception message to use if the assertion fails
|
|
|
+ * @see StringUtils#hasLength
|
|
|
+ */
|
|
|
+ public static void hasLength(String text, String message) {
|
|
|
+ if (!StringUtils.hasLength(text)) {
|
|
|
+ throw new BizException(message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert that the given String is not empty; that is, it must not be
|
|
|
+ * {@code null} and not the empty String.
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.hasLength(name);
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param text
|
|
|
+ * the String to check
|
|
|
+ * @see StringUtils#hasLength
|
|
|
+ */
|
|
|
+ public static void hasLength(String text) {
|
|
|
+ hasLength(text, "[Assertion failed] - this String argument must have length; it must not be null or empty");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert that the given String has valid text content; that is, it must not
|
|
|
+ * be {@code null} and must contain at least one non-whitespace character.
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.hasText(name, "'name' must not be empty");
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param text
|
|
|
+ * the String to check
|
|
|
+ * @param message
|
|
|
+ * the exception message to use if the assertion fails
|
|
|
+ * @see StringUtils#hasText
|
|
|
+ */
|
|
|
+ public static void hasText(String text, String message) {
|
|
|
+ if (!StringUtils.hasText(text)) {
|
|
|
+ throw new BizException(message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert that the given String has valid text content; that is, it must not
|
|
|
+ * be {@code null} and must contain at least one non-whitespace character.
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.hasText(name, "'name' must not be empty");
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param text
|
|
|
+ * the String to check
|
|
|
+ * @see StringUtils#hasText
|
|
|
+ */
|
|
|
+ public static void hasText(String text) {
|
|
|
+ hasText(text,
|
|
|
+ "[Assertion failed] - this String argument must have text; it must not be null, empty,'null', or blank");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 非空字符串判断<br>
|
|
|
+ * “null”视为空字符串
|
|
|
+ *
|
|
|
+ * @param text
|
|
|
+ * @param message
|
|
|
+ */
|
|
|
+ public static void notBlank(String text, String message) {
|
|
|
+ if (!StringUtils.hasText(text) || "null".equalsIgnoreCase(message)) {
|
|
|
+ throw new BizException(message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void notBlank(String text) {
|
|
|
+ notBlank(text,
|
|
|
+ "[Assertion failed] - this String argument must have text; it must not be null, empty,'null', or blank");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert that the given text does not contain the given substring.
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.doesNotContain(name, "rod", "Name must not contain 'rod'");
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param textToSearch
|
|
|
+ * the text to search
|
|
|
+ * @param substring
|
|
|
+ * the substring to find within the text
|
|
|
+ * @param message
|
|
|
+ * the exception message to use if the assertion fails
|
|
|
+ */
|
|
|
+ public static void doesNotContain(String textToSearch, String substring, String message) {
|
|
|
+ if (StringUtils.hasLength(textToSearch) && StringUtils.hasLength(substring) && textToSearch.contains(substring)) {
|
|
|
+ throw new BizException(message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert that the given text does not contain the given substring.
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.doesNotContain(name, "rod");
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param textToSearch
|
|
|
+ * the text to search
|
|
|
+ * @param substring
|
|
|
+ * the substring to find within the text
|
|
|
+ */
|
|
|
+ public static void doesNotContain(String textToSearch, String substring) {
|
|
|
+ doesNotContain(textToSearch, substring,
|
|
|
+ "[Assertion failed] - this String argument must not contain the substring [" + substring + "]");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert that an array has elements; that is, it must not be {@code null}
|
|
|
+ * and must have at least one element.
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.notEmpty(array, "The array must have elements");
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param array
|
|
|
+ * the array to check
|
|
|
+ * @param message
|
|
|
+ * the exception message to use if the assertion fails
|
|
|
+ * @throws BizException
|
|
|
+ * if the object array is {@code null} or has no elements
|
|
|
+ */
|
|
|
+ public static void notEmpty(Object[] array, String message) {
|
|
|
+ if (ObjectUtils.isEmpty(array)) {
|
|
|
+ throw new BizException(message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert that an array has elements; that is, it must not be {@code null}
|
|
|
+ * and must have at least one element.
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.notEmpty(array);
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param array
|
|
|
+ * the array to check
|
|
|
+ * @throws BizException
|
|
|
+ * if the object array is {@code null} or has no elements
|
|
|
+ */
|
|
|
+ public static void notEmpty(Object[] array) {
|
|
|
+ notEmpty(array, "[Assertion failed] - this array must not be empty: it must contain at least 1 element");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert that an array has no null elements. Note: Does not complain if the
|
|
|
+ * array is empty!
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.noNullElements(array, "The array must have non-null elements");
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param array
|
|
|
+ * the array to check
|
|
|
+ * @param message
|
|
|
+ * the exception message to use if the assertion fails
|
|
|
+ * @throws BizException
|
|
|
+ * if the object array contains a {@code null} element
|
|
|
+ */
|
|
|
+ public static void noNullElements(Object[] array, String message) {
|
|
|
+ if (array != null) {
|
|
|
+ for (Object element : array) {
|
|
|
+ if (element == null) {
|
|
|
+ throw new BizException(message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert that an array has no null elements. Note: Does not complain if the
|
|
|
+ * array is empty!
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.noNullElements(array);
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param array
|
|
|
+ * the array to check
|
|
|
+ * @throws BizException
|
|
|
+ * if the object array contains a {@code null} element
|
|
|
+ */
|
|
|
+ public static void noNullElements(Object[] array) {
|
|
|
+ noNullElements(array, "[Assertion failed] - this array must not contain any null elements");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert that a collection has elements; that is, it must not be
|
|
|
+ * {@code null} and must have at least one element.
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.notEmpty(collection, "Collection must have elements");
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param collection
|
|
|
+ * the collection to check
|
|
|
+ * @param message
|
|
|
+ * the exception message to use if the assertion fails
|
|
|
+ * @throws BizException
|
|
|
+ * if the collection is {@code null} or has no elements
|
|
|
+ */
|
|
|
+ public static void notEmpty(Collection<?> collection, String message) {
|
|
|
+ if (CollectionUtils.isEmpty(collection)) {
|
|
|
+ throw new BizException(message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert that a collection has elements; that is, it must not be
|
|
|
+ * {@code null} and must have at least one element.
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.notEmpty(collection, "Collection must have elements");
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param collection
|
|
|
+ * the collection to check
|
|
|
+ * @throws BizException
|
|
|
+ * if the collection is {@code null} or has no elements
|
|
|
+ */
|
|
|
+ public static void notEmpty(Collection<?> collection) {
|
|
|
+ notEmpty(collection,
|
|
|
+ "[Assertion failed] - this collection must not be empty: it must contain at least 1 element");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert that a Map has entries; that is, it must not be {@code null} and
|
|
|
+ * must have at least one entry.
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.notEmpty(map, "Map must have entries");
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param map
|
|
|
+ * the map to check
|
|
|
+ * @param message
|
|
|
+ * the exception message to use if the assertion fails
|
|
|
+ * @throws BizException
|
|
|
+ * if the map is {@code null} or has no entries
|
|
|
+ */
|
|
|
+ public static void notEmpty(Map<?, ?> map, String message) {
|
|
|
+ if (CollectionUtils.isEmpty(map)) {
|
|
|
+ throw new BizException(message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert that a Map has entries; that is, it must not be {@code null} and
|
|
|
+ * must have at least one entry.
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.notEmpty(map);
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param map
|
|
|
+ * the map to check
|
|
|
+ * @throws BizException
|
|
|
+ * if the map is {@code null} or has no entries
|
|
|
+ */
|
|
|
+ public static void notEmpty(Map<?, ?> map) {
|
|
|
+ notEmpty(map, "[Assertion failed] - this map must not be empty; it must contain at least one entry");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert that the provided object is an instance of the provided class.
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.instanceOf(Foo.class, foo);
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param clazz
|
|
|
+ * the required class
|
|
|
+ * @param obj
|
|
|
+ * the object to check
|
|
|
+ * @throws BizException
|
|
|
+ * if the object is not an instance of clazz
|
|
|
+ * @see Class#isInstance
|
|
|
+ */
|
|
|
+ public static void isInstanceOf(Class<?> clazz, Object obj) {
|
|
|
+ isInstanceOf(clazz, obj, "");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert that the provided object is an instance of the provided class.
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.instanceOf(Foo.class, foo);
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param type
|
|
|
+ * the type to check against
|
|
|
+ * @param obj
|
|
|
+ * the object to check
|
|
|
+ * @param message
|
|
|
+ * a message which will be prepended to the message produced by
|
|
|
+ * the function itself, and which may be used to provide context.
|
|
|
+ * It should normally end in a ": " or ". " so that the function
|
|
|
+ * generate message looks ok when prepended to it.
|
|
|
+ * @throws BizException
|
|
|
+ * if the object is not an instance of clazz
|
|
|
+ * @see Class#isInstance
|
|
|
+ */
|
|
|
+ public static void isInstanceOf(Class<?> type, Object obj, String message) {
|
|
|
+ notNull(type, "Type to check against must not be null");
|
|
|
+ if (!type.isInstance(obj)) {
|
|
|
+ throw new BizException((StringUtils.hasLength(message) ? message + " " : "")
|
|
|
+ + "Object of class [" + (obj != null ? obj.getClass().getName() : "null")
|
|
|
+ + "] must be an instance of " + type);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert that {@code superType.isAssignableFrom(subType)} is {@code true}.
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.isAssignable(Number.class, myClass);
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param superType
|
|
|
+ * the super type to check
|
|
|
+ * @param subType
|
|
|
+ * the sub type to check
|
|
|
+ * @throws BizException
|
|
|
+ * if the classes are not assignable
|
|
|
+ */
|
|
|
+ public static void isAssignable(Class<?> superType, Class<?> subType) {
|
|
|
+ isAssignable(superType, subType, "");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert that {@code superType.isAssignableFrom(subType)} is {@code true}.
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.isAssignable(Number.class, myClass);
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param superType
|
|
|
+ * the super type to check against
|
|
|
+ * @param subType
|
|
|
+ * the sub type to check
|
|
|
+ * @param message
|
|
|
+ * a message which will be prepended to the message produced by
|
|
|
+ * the function itself, and which may be used to provide context.
|
|
|
+ * It should normally end in a ": " or ". " so that the function
|
|
|
+ * generate message looks ok when prepended to it.
|
|
|
+ * @throws BizException
|
|
|
+ * if the classes are not assignable
|
|
|
+ */
|
|
|
+ public static void isAssignable(Class<?> superType, Class<?> subType, String message) {
|
|
|
+ notNull(superType, "Type to check against must not be null");
|
|
|
+ if (subType == null || !superType.isAssignableFrom(subType)) {
|
|
|
+ throw new BizException(message + subType + " is not assignable to " + superType);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert a boolean expression, throwing {@code BizException} if
|
|
|
+ * the test result is {@code false}. Call isTrue if you wish to throw
|
|
|
+ * BizException on an assertion failure.
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.state(id == null, "The id property must not already be initialized");
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param expression
|
|
|
+ * a boolean expression
|
|
|
+ * @param message
|
|
|
+ * the exception message to use if the assertion fails
|
|
|
+ * @throws BizException
|
|
|
+ * if expression is {@code false}
|
|
|
+ */
|
|
|
+ public static void state(boolean expression, String message) {
|
|
|
+ if (!expression) {
|
|
|
+ throw new BizException(message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Assert a boolean expression, throwing {@link BizException} if
|
|
|
+ * the test result is {@code false}.
|
|
|
+ * <p>
|
|
|
+ * Call {@link #isTrue(boolean)} if you wish to throw
|
|
|
+ * {@link BizException} on an assertion failure.
|
|
|
+ *
|
|
|
+ * <pre class="code">
|
|
|
+ * Assert.state(id == null);
|
|
|
+ * </pre>
|
|
|
+ *
|
|
|
+ * @param expression
|
|
|
+ * a boolean expression
|
|
|
+ * @throws BizException
|
|
|
+ * if the supplied expression is {@code false}
|
|
|
+ */
|
|
|
+ public static void state(boolean expression) {
|
|
|
+ state(expression, "[Assertion failed] - this state invariant must be true");
|
|
|
+ }
|
|
|
+
|
|
|
+}
|