// Copyright 2014 The Bazel Authors. All rights reserved. // // 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 com.google.devtools.build.lib.runtime; import com.google.devtools.build.lib.events.ExceptionListener; import com.google.devtools.build.lib.util.LoggingUtil; import com.google.devtools.build.lib.util.Preconditions; import java.util.logging.Level; /** * Reports precondition failures from within an event handler. * Necessary because the EventBus silently ignores exceptions thrown from within a handler. * This class logs the exceptions and creates some noise when a precondition check fails. */ public class EventHandlerPreconditions { private final ExceptionListener listener; /** * Creates a new precondition helper which outputs errors to the given reporter. */ public EventHandlerPreconditions(ExceptionListener listener) { this.listener = listener; } /** * Verifies that the given condition (a check on an argument) is true, * throwing an IllegalArgumentException if not. * * @param condition a condition to check for truth. * @throws IllegalArgumentException if the condition is false. */ @SuppressWarnings("unused") public void checkArgument(boolean condition) { checkArgument(condition, null); } /** * Verifies that the given condition (a check on an argument) is true, * throwing an IllegalArgumentException with the given message if not. * * @param condition a condition to check for truth. * @param message extra information to output if the condition is false. * @throws IllegalArgumentException if the condition is false. */ public void checkArgument(boolean condition, String message) { try { Preconditions.checkArgument(condition, message); } catch (IllegalArgumentException iae) { String error = "Event handler argument check failed"; LoggingUtil.logToRemote(Level.SEVERE, error, iae); listener.error(null, error, iae); throw iae; // Still terminate the handler. } } /** * Verifies that the given condition (a check against the program's current state) is true, * throwing an IllegalStateException if not. * * @param condition a condition to check for truth. * @throws IllegalStateException if the condition is false. */ public void checkState(boolean condition) { checkState(condition, null); } /** * Verifies that the given condition (a check against the program's current state) is true, * throwing an IllegalStateException with the given message if not. * * @param condition a condition to check for truth. * @param message extra information to output if the condition is false. * @throws IllegalStateException if the condition is false. */ public void checkState(boolean condition, String message) { try { Preconditions.checkState(condition, message); } catch (IllegalStateException ise) { String error = "Event handler state check failed"; LoggingUtil.logToRemote(Level.SEVERE, error, ise); listener.error(null, error, ise); throw ise; // Still terminate the handler. } } /** * Fails with an IllegalStateException when invoked. */ public void fail(String message) { String error = "Event handler failed: " + message; IllegalStateException ise = new IllegalStateException(message); LoggingUtil.logToRemote(Level.SEVERE, error, ise); listener.error(null, error, ise); throw ise; } /** * Verifies that the given argument is not null, throwing a NullPointerException if it is null. * Returns the original argument or throws. * * @param object an object to test for null. * @return the reference which was checked. * @throws NullPointerException if the object is null. */ public <T> T checkNotNull(T object) { return checkNotNull(object, null); } /** * Verifies that the given argument is not null, throwing a * NullPointerException with the given message if it is null. * Returns the original argument or throws. * * @param object an object to test for null. * @param message extra information to output if the object is null. * @return the reference which was checked. * @throws NullPointerException if the object is null. */ public <T> T checkNotNull(T object, String message) { try { return Preconditions.checkNotNull(object, message); } catch (NullPointerException npe) { String error = "Event handler not-null check failed"; LoggingUtil.logToRemote(Level.SEVERE, error, npe); listener.error(null, error, npe); throw npe; } } }