// 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 static java.nio.charset.StandardCharsets.UTF_8; import com.google.devtools.build.lib.util.Preconditions; import java.io.Serializable; import java.util.Arrays; import java.util.Objects; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; /** * An event is a situation encountered by the build system that's worth * reporting: A 3-tuple of ({@link EventKind}, {@link Location}, message). */ @Immutable public final class Event implements Serializable { private final EventKind kind; private final Location location; private final String message; /** * An alternative representation for message. * *
Exactly one of message or messageBytes will be non-null. If messageBytes is non-null, then
* it contains the UTF-8-encoded bytes of the message. We do this to avoid converting back and
* forth between Strings and bytes.
*/
private final byte[] messageBytes;
@Nullable
private final String tag;
private final int hashCode;
private Event(EventKind kind, @Nullable Location location, String message, @Nullable String tag) {
this.kind = Preconditions.checkNotNull(kind);
this.location = location;
this.message = Preconditions.checkNotNull(message);
this.messageBytes = null;
this.tag = tag;
this.hashCode = Objects.hash(kind, location, message, tag, Arrays.hashCode(messageBytes));
}
private Event(
EventKind kind, @Nullable Location location, byte[] messageBytes, @Nullable String tag) {
this.kind = Preconditions.checkNotNull(kind);
this.location = location;
this.message = null;
this.messageBytes = Preconditions.checkNotNull(messageBytes);
this.tag = tag;
this.hashCode = Objects.hash(kind, location, message, tag, Arrays.hashCode(messageBytes));
}
public Event withTag(String tag) {
if (this.message != null) {
return new Event(this.kind, this.location, this.message, tag);
} else {
return new Event(this.kind, this.location, this.messageBytes, tag);
}
}
public String getMessage() {
return message != null ? message : new String(messageBytes, UTF_8);
}
public byte[] getMessageBytes() {
return messageBytes != null ? messageBytes : message.getBytes(UTF_8);
}
public EventKind getKind() {
return kind;
}
/**
* the tag is typically the action that generated the event.
*/
@Nullable
public String getTag() {
return tag;
}
/**
* Returns the location of this event, if any. Returns null iff the event
* wasn't associated with any particular location, for example, a progress
* message.
*/
@Nullable public Location getLocation() {
return location;
}
/**
* Returns some moderately sane representation of the event. Should never be used in
* user-visible places, only for debugging and testing.
*/
@Override
public String toString() {
return kind + " " + (location != null ? location.print() : "