// 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.profiler; import com.google.common.base.Predicate; import com.google.common.collect.ImmutableList; import java.util.List; /** * A stat recorder that is able to look at the kind of object added and delegate to the appropriate * {@link StatRecorder} based on a predicate. * * <p> Note that the predicates are evaluated in order and delegated only to the first one. That * means that the most specific and cheapest predicates should be passed first. */ public class PredicateBasedStatRecorder implements StatRecorder { private final Predicate[] predicates; private final StatRecorder[] recorders; public PredicateBasedStatRecorder(List<RecorderAndPredicate> stats) { predicates = new Predicate[stats.size()]; recorders = new StatRecorder[stats.size()]; for (int i = 0; i < stats.size(); i++) { RecorderAndPredicate stat = stats.get(i); predicates[i] = stat.predicate; recorders[i] = stat.recorder; } } @SuppressWarnings("unchecked") @Override public void addStat(int duration, Object obj) { String description = obj.toString(); for (int i = 0; i < predicates.length; i++) { if (predicates[i].apply(description)) { recorders[i].addStat(duration, obj); return; } } } @Override public boolean isEmpty() { for (StatRecorder recorder : recorders) { if (!recorder.isEmpty()) { return false; } } return true; } @Override public String toString() { StringBuilder sb = new StringBuilder(); for (StatRecorder recorder : recorders) { if (recorder.isEmpty()) { continue; } sb.append(recorder); sb.append("\n"); } return sb.toString(); } /** * A Wrapper of a {@code StatRecorder} and a {@code Predicate}. Objects that matches the predicate * will be delegated to the StatRecorder. */ public static final class RecorderAndPredicate { private final StatRecorder recorder; private final Predicate<? super String> predicate; public RecorderAndPredicate(StatRecorder recorder, Predicate<? super String> predicate) { this.recorder = recorder; this.predicate = predicate; } } /** Returns all the delegate stat recorders. */ public ImmutableList<StatRecorder> getRecorders() { return ImmutableList.<StatRecorder>builder().add(recorders).build(); } }