| // 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; | |
| } | |
| } | |
| } |