// 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.events; import java.util.Set; /** * A "latch" that just detects whether or not a particular type of event has happened, based on its * kind. * * <p>Be careful when using this class to track errors reported during some operation. Namely, this * pattern is not thread-safe: * * <pre><code> * EventSensor sensor = new EventSensor(EventKind.ERRORS); * reporter.addHandler(sensor); * someActionThatMightCreateErrors(reporter) * reporter.removeHandler(sensor); * boolean containsErrors = sensor.wasTriggered(); * </code></pre> * * <p>If other threads generate errors on the reporter, then containsErrors may be true even if * someActionThatMightCreateErrors() did not cause any errors. * * <p>As a workaround, run someActionThatMightCreateErrors() with a local reporter, merging its * events with those of the shared reporter. */ public class EventSensor extends AbstractEventHandler { private int triggerCount; /** * Constructs a sensor that will register all events matching the mask. */ public EventSensor(Set<EventKind> mask) { super(mask); } /** * Implements {@link EventHandler#handle(Event)}. */ @Override public void handle(Event event) { if (getEventMask().contains(event.getKind())) { triggerCount++; } } /** * Returns true iff a qualifying event was handled. */ public boolean wasTriggered() { return triggerCount > 0; } /** * Returns the number of times the qualifying event was handled. */ public int getTriggerCount() { return triggerCount; } }