aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/runtime/EventHandlerPreconditions.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/runtime/EventHandlerPreconditions.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/EventHandlerPreconditions.java143
1 files changed, 143 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/EventHandlerPreconditions.java b/src/main/java/com/google/devtools/build/lib/runtime/EventHandlerPreconditions.java
new file mode 100644
index 0000000000..f4ef8e3f22
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/runtime/EventHandlerPreconditions.java
@@ -0,0 +1,143 @@
+// Copyright 2014 Google Inc. 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.common.base.Preconditions;
+import com.google.devtools.build.lib.events.ExceptionListener;
+import com.google.devtools.build.lib.util.LoggingUtil;
+
+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;
+ }
+ }
+}