package com.doumee.lib_coremodel.util;
|
|
import androidx.annotation.Nullable;
|
|
/**
|
* @see <a href="https://github.com/google/guava/blob/b86fe4fc7ec511d78507c3ba32c789d1f250f827/guava/src/com/google/common/base/Preconditions.java">guava</a>
|
* @author <a href="mailto:jenly1314@gmail.com">Jenly</a>
|
*/
|
public final class Preconditions {
|
private Preconditions() {}
|
|
/**
|
* Ensures the truth of an expression involving one or more parameters to the calling method.
|
*
|
* @param expression a boolean expression
|
* @throws IllegalArgumentException if {@code expression} is false
|
*/
|
public static void checkArgument(boolean expression) {
|
if (!expression) {
|
throw new IllegalArgumentException();
|
}
|
}
|
|
/**
|
* Ensures the truth of an expression involving one or more parameters to the calling method.
|
*
|
* @param expression a boolean expression
|
* @param errorMessage the exception message to use if the check fails; will be converted to a
|
* string using {@link String#valueOf(Object)}
|
* @throws IllegalArgumentException if {@code expression} is false
|
*/
|
public static void checkArgument(boolean expression, @Nullable Object errorMessage) {
|
if (!expression) {
|
throw new IllegalArgumentException(String.valueOf(errorMessage));
|
}
|
}
|
|
/**
|
* Ensures the truth of an expression involving one or more parameters to the calling method.
|
*
|
* @param expression a boolean expression
|
* @param errorMessageTemplate a template for the exception message should the check fail. The
|
* message is formed by replacing each {@code %s} placeholder in the template with an
|
* argument. These are matched by position - the first {@code %s} gets {@code
|
* errorMessageArgs[0]}, etc. Unmatched arguments will be appended to the formatted message in
|
* square braces. Unmatched placeholders will be left as-is.
|
* @param errorMessageArgs the arguments to be substituted into the message template. Arguments
|
* are converted to strings using {@link String#valueOf(Object)}.
|
* @throws IllegalArgumentException if {@code expression} is false
|
*/
|
public static void checkArgument(
|
boolean expression,
|
@Nullable String errorMessageTemplate,
|
@Nullable Object... errorMessageArgs) {
|
if (!expression) {
|
throw new IllegalArgumentException(lenientFormat(errorMessageTemplate, errorMessageArgs));
|
}
|
}
|
|
/**
|
* Ensures the truth of an expression involving the state of the calling instance, but not
|
* involving any parameters to the calling method.
|
*
|
* @param expression a boolean expression
|
* @throws IllegalStateException if {@code expression} is false
|
*/
|
public static void checkState(boolean expression) {
|
if (!expression) {
|
throw new IllegalStateException();
|
}
|
}
|
|
/**
|
* Ensures the truth of an expression involving the state of the calling instance, but not
|
* involving any parameters to the calling method.
|
*
|
* @param expression a boolean expression
|
* @param errorMessage the exception message to use if the check fails; will be converted to a
|
* string using {@link String#valueOf(Object)}
|
* @throws IllegalStateException if {@code expression} is false
|
*/
|
public static void checkState(boolean expression, @Nullable Object errorMessage) {
|
if (!expression) {
|
throw new IllegalStateException(String.valueOf(errorMessage));
|
}
|
}
|
|
/**
|
* Ensures the truth of an expression involving the state of the calling instance, but not
|
* involving any parameters to the calling method.
|
*
|
* @param expression a boolean expression
|
* @param errorMessageTemplate a template for the exception message should the check fail. The
|
* message is formed by replacing each {@code %s} placeholder in the template with an
|
* argument. These are matched by position - the first {@code %s} gets {@code
|
* errorMessageArgs[0]}, etc. Unmatched arguments will be appended to the formatted message in
|
* square braces. Unmatched placeholders will be left as-is.
|
* @param errorMessageArgs the arguments to be substituted into the message template. Arguments
|
* are converted to strings using {@link String#valueOf(Object)}.
|
* @throws IllegalStateException if {@code expression} is false
|
*/
|
public static void checkState(
|
boolean expression,
|
@Nullable String errorMessageTemplate,
|
@Nullable Object... errorMessageArgs) {
|
if (!expression) {
|
throw new IllegalStateException(lenientFormat(errorMessageTemplate, errorMessageArgs));
|
}
|
}
|
|
/**
|
* Ensures that an object reference passed as a parameter to the calling method is not null.
|
*
|
* @param reference an object reference
|
* @return the non-null reference that was validated
|
* @throws NullPointerException if {@code reference} is null
|
*/
|
|
public static <T> T checkNotNull(T reference) {
|
if (reference == null) {
|
throw new NullPointerException();
|
}
|
return reference;
|
}
|
|
/**
|
* Ensures that an object reference passed as a parameter to the calling method is not null.
|
*
|
* @param reference an object reference
|
* @param errorMessage the exception message to use if the check fails; will be converted to a
|
* string using {@link String#valueOf(Object)}
|
* @return the non-null reference that was validated
|
* @throws NullPointerException if {@code reference} is null
|
*/
|
|
public static <T> T checkNotNull(T reference, @Nullable Object errorMessage) {
|
if (reference == null) {
|
throw new NullPointerException(String.valueOf(errorMessage));
|
}
|
return reference;
|
}
|
|
/**
|
* Ensures that an object reference passed as a parameter to the calling method is not null.
|
*
|
* @param reference an object reference
|
* @param errorMessageTemplate a template for the exception message should the check fail. The
|
* message is formed by replacing each {@code %s} placeholder in the template with an
|
* argument. These are matched by position - the first {@code %s} gets {@code
|
* errorMessageArgs[0]}, etc. Unmatched arguments will be appended to the formatted message in
|
* square braces. Unmatched placeholders will be left as-is.
|
* @param errorMessageArgs the arguments to be substituted into the message template. Arguments
|
* are converted to strings using {@link String#valueOf(Object)}.
|
* @return the non-null reference that was validated
|
* @throws NullPointerException if {@code reference} is null
|
*/
|
|
public static <T> T checkNotNull(
|
T reference, @Nullable String errorMessageTemplate, @Nullable Object... errorMessageArgs) {
|
if (reference == null) {
|
throw new NullPointerException(lenientFormat(errorMessageTemplate, errorMessageArgs));
|
}
|
return reference;
|
}
|
|
public static String lenientFormat(
|
@Nullable String template, @Nullable Object... args) {
|
template = String.valueOf(template); // null -> "null"
|
|
if (args == null) {
|
args = new Object[] {"(Object[])null"};
|
}
|
|
// start substituting the arguments into the '%s' placeholders
|
StringBuilder builder = new StringBuilder(template.length() + 16 * args.length);
|
int templateStart = 0;
|
int i = 0;
|
while (i < args.length) {
|
int placeholderStart = template.indexOf("%s", templateStart);
|
if (placeholderStart == -1) {
|
break;
|
}
|
builder.append(template, templateStart, placeholderStart);
|
builder.append(args[i++]);
|
templateStart = placeholderStart + 2;
|
}
|
builder.append(template, templateStart, template.length());
|
|
// if we run out of placeholders, append the extra args in square braces
|
if (i < args.length) {
|
builder.append(" [");
|
builder.append(args[i++]);
|
while (i < args.length) {
|
builder.append(", ");
|
builder.append(args[i++]);
|
}
|
builder.append(']');
|
}
|
|
return builder.toString();
|
}
|
|
|
}
|