blob: 2c786a0fa845ac08f075c8b7faff82e218a8b1d8 [file] [log] [blame]
// 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;
}
}
}