You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
4.8 KiB
129 lines
4.8 KiB
/*
|
|
* Copyright (C) 2016 The Dagger Authors.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package dagger.internal;
|
|
|
|
/**
|
|
* An adaptation of Guava's {@code com.google.common.base.Preconditions} that is specially tailored
|
|
* to support checks applied in Dagger's generated code.
|
|
*/
|
|
public final class Preconditions {
|
|
/**
|
|
* 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
|
|
* @return the non-null reference that was validated
|
|
* @throws NullPointerException if {@code reference} is null
|
|
*/
|
|
public static <T> T checkNotNull(T reference, String errorMessage) {
|
|
if (reference == null) {
|
|
throw new NullPointerException(errorMessage);
|
|
}
|
|
return reference;
|
|
}
|
|
|
|
/**
|
|
* Ensures that an object reference returned from a provides 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 checkNotNullFromProvides(T reference) {
|
|
if (reference == null) {
|
|
throw new NullPointerException("Cannot return null from a non-@Nullable @Provides method");
|
|
}
|
|
return reference;
|
|
}
|
|
|
|
/**
|
|
* Ensures that an object reference returned from a component 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 checkNotNullFromComponent(T reference) {
|
|
if (reference == null) {
|
|
throw new NullPointerException("Cannot return null from a non-@Nullable component method");
|
|
}
|
|
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 the single {@code %s} placeholder in the template with
|
|
* {@code errorMessageArg}.
|
|
* @param errorMessageArg the argument to be substituted into the message template. Converted to a
|
|
* string using {@link String#valueOf(Object)}, except for {@link Class} objects, which use
|
|
* {@link Class#getCanonicalName()}.
|
|
* @return the non-null reference that was validated
|
|
* @throws NullPointerException if {@code reference} is null
|
|
* @throws IllegalArgumentException if {@code errorMessageTemplate} doesn't contain exactly one
|
|
* "%s"
|
|
*/
|
|
public static <T> T checkNotNull(
|
|
T reference, String errorMessageTemplate, Object errorMessageArg) {
|
|
if (reference == null) {
|
|
// Simple implementation of String.format, which is not GWT-compatible
|
|
if (!errorMessageTemplate.contains("%s")) {
|
|
throw new IllegalArgumentException("errorMessageTemplate has no format specifiers");
|
|
}
|
|
if (errorMessageTemplate.indexOf("%s") != errorMessageTemplate.lastIndexOf("%s")) {
|
|
throw new IllegalArgumentException(
|
|
"errorMessageTemplate has more than one format specifier");
|
|
}
|
|
String argString =
|
|
errorMessageArg instanceof Class
|
|
? ((Class) errorMessageArg).getCanonicalName()
|
|
: String.valueOf(errorMessageArg);
|
|
throw new NullPointerException(errorMessageTemplate.replace("%s", argString));
|
|
}
|
|
return reference;
|
|
}
|
|
|
|
/**
|
|
* Checks that the component builder field {@code requirement} has been initialized.
|
|
*
|
|
* @throws IllegalStateException if {@code requirement is null}
|
|
*/
|
|
public static <T> void checkBuilderRequirement(T requirement, Class<T> clazz) {
|
|
if (requirement == null) {
|
|
throw new IllegalStateException(clazz.getCanonicalName() + " must be set");
|
|
}
|
|
}
|
|
|
|
private Preconditions() {}
|
|
}
|