|  | // Copyright 2015 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.devtools.build.skyframe.SkyFunction.Environment; | 
|  |  | 
|  | /** | 
|  | * Interface of an Action that is Skyframe-aware. | 
|  | * | 
|  | * <p><b>IMPORTANT</b>: actions that implement this interface should override | 
|  | * {@code Action.executeUnconditionally} and return true. See below for details. | 
|  | * | 
|  | * <p>Implementors of this interface can request Skyframe dependencies to perform arbitrary | 
|  | * computation or establish desired dependencies before they are executed but after their inputs | 
|  | * have been built. | 
|  | * | 
|  | * <p>The {@link ActionExecutionFunction} will make sure that all requested SkyValues are built and | 
|  | * that the {@link SkyframeAwareAction#establishSkyframeDependencies(Environment)} function | 
|  | * completed successfully before attempting to execute the action. | 
|  | * | 
|  | * <p><b>It is crucial to correct action reexecution that implementors override | 
|  | * {@code Action.executeUnconditionally} to always return true.</b> Skyframe tracks changes in both | 
|  | * the input files and in dependencies established through | 
|  | * {@link #establishSkyframeDependencies(Environment)}, but the action cache only knows about the | 
|  | * input files. So if only the extra "skyframe dependencies" change, the action cache will believe | 
|  | * the action to be up-to-date and skip actual execution. Therefore it's crucial to bypass action | 
|  | * cache checking by marking the action as unconditionally executed. | 
|  | */ | 
|  | public interface SkyframeAwareAction { | 
|  |  | 
|  | /** Wrapper and/or base class for exceptions raised in {@link #establishSkyframeDependencies}. */ | 
|  | class ExceptionBase extends Exception { | 
|  | public ExceptionBase(String message) { | 
|  | super(message); | 
|  | } | 
|  |  | 
|  | public ExceptionBase(Throwable cause) { | 
|  | super(cause.getMessage(), cause); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Establish dependencies on Skyframe values before executing the action. | 
|  | * | 
|  | * <p><b>IMPORTANT</b>: actions that implement this interface should override {@code | 
|  | * Action.executeUnconditionally} and return true. See {@link SkyframeAwareAction} why. | 
|  | * | 
|  | * <p>This method should perform as little computation as possible: ideally it should request one | 
|  | * or a few SkyValues, perhaps set some state somewhere and return. If this method needs to | 
|  | * perform anything more complicated than that, including perhaps some non-trivial computation, | 
|  | * you should implement that as a SkyFunction and request the corresponding SkyValue in this | 
|  | * method. | 
|  | * | 
|  | * <p>Because the requested SkyValues may not yet be present in the graph, this method must be | 
|  | * safe to call multiple times, and should always leave the action object in a consistent state. | 
|  | * | 
|  | * <p>This method should not attempt to handle errors or missing dependencies (other than wrapping | 
|  | * exceptions); that is the responsibility of the caller. It should return as soon as possible, | 
|  | * ready to be called again at a later time if need be. | 
|  | */ | 
|  | void establishSkyframeDependencies(Environment env) throws ExceptionBase, InterruptedException; | 
|  | } |