com.google.devtools.build.lib.skyframe.PackageProgressReceiver.java Source code

Java tutorial

Introduction

Here is the source code for com.google.devtools.build.lib.skyframe.PackageProgressReceiver.java

Source

// Copyright 2016 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.skyframe;

import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
import com.google.devtools.build.lib.util.Pair;
import java.util.LinkedHashSet;

/**
 * A class that, when beeing told about start and end of a package
 * being loaded, keeps track of the loading progress and provides it
 * as a human-readable string intended for the progress bar.
 */
public class PackageProgressReceiver {

    private int packagesCompleted;
    private LinkedHashSet<PackageIdentifier> pendingSet = new LinkedHashSet<>();

    /** Register that loading a package has started. */
    synchronized void startReadPackage(PackageIdentifier packageId) {
        pendingSet.add(packageId);
    }

    /** Register that loding a package has completed. */
    synchronized void doneReadPackage(PackageIdentifier packageId) {
        packagesCompleted++;
        pendingSet.remove(packageId);
    }

    /**
     * Reset all instance variables of this object to a state equal to that of a newly
     * constructed object.
     */
    public synchronized void reset() {
        packagesCompleted = 0;
        pendingSet = new LinkedHashSet<>();
    }

    /**
     * Return the ordered pair of a consistent snapshot of the state, consisting of a human-readable
     * description of the progress achieved so far and a human readable description of the currently
     * running activities. The later always include the oldest loading package not finished loading.
     */
    public synchronized Pair<String, String> progressState() {
        String progress = "" + packagesCompleted + " packages loaded";
        StringBuffer activity = new StringBuffer();
        if (pendingSet.size() > 0) {
            activity.append("currently loading: ").append(Iterables.getFirst(pendingSet, null).toString());
            if (pendingSet.size() > 1) {
                activity.append(" ... (" + pendingSet.size() + " packages)");
            }
        }
        return new Pair<String, String>(progress, activity.toString());
    }
}