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