/* * 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 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 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 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 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 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 void checkBuilderRequirement(T requirement, Class clazz) { if (requirement == null) { throw new IllegalStateException(clazz.getCanonicalName() + " must be set"); } } private Preconditions() {} }