| // 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.skyframe; | 
 |  | 
 | import com.google.devtools.build.lib.vfs.ModifiedFileSet; | 
 | import com.google.devtools.build.lib.vfs.Path; | 
 | import com.google.devtools.common.options.OptionsClassProvider; | 
 | import java.io.Closeable; | 
 | import javax.annotation.Nullable; | 
 |  | 
 | /** | 
 |  * Interface for computing modifications of files under a package path entry. | 
 |  * | 
 |  * <p> Skyframe has a {@link DiffAwareness} instance per package-path entry, and each instance is | 
 |  * responsible for all files under its path entry. At the beginning of each incremental build, | 
 |  * skyframe queries for changes using {@link #getDiff}. Ideally, {@link #getDiff} should be | 
 |  * constant-time; if it were linear in the number of files of interest, we might as well just | 
 |  * detect modifications manually. | 
 |  */ | 
 | public interface DiffAwareness extends Closeable { | 
 |  | 
 |   /** Factory for creating {@link DiffAwareness} instances. */ | 
 |   public interface Factory { | 
 |     /** | 
 |      * Returns a {@link DiffAwareness} instance suitable for managing changes to files under the | 
 |      * given package path entry, or {@code null} if this factory cannot create such an instance. | 
 |      * | 
 |      * <p> Skyframe has a collection of factories, and will create a {@link DiffAwareness} instance | 
 |      * per package path entry using one of the factories that returns a non-null value. | 
 |      */ | 
 |     @Nullable | 
 |     DiffAwareness maybeCreate(Path pathEntry); | 
 |   } | 
 |  | 
 |   /** Opaque view of the filesystem under a package path entry at a specific point in time. */ | 
 |   interface View { | 
 |   } | 
 |  | 
 |   /** | 
 |    * Returns the live view of the filesystem under the package path entry. | 
 |    * | 
 |    * @throws BrokenDiffAwarenessException if something is wrong and the caller should discard this | 
 |    *     {@link DiffAwareness} instance. The {@link DiffAwareness} is expected to close itself in | 
 |    *     this case. | 
 |    */ | 
 |   View getCurrentView(OptionsClassProvider options) throws BrokenDiffAwarenessException; | 
 |  | 
 |   /** | 
 |    * Returns the set of files of interest that have been modified between the given two views. | 
 |    * | 
 |    * <p>The given views must have come from previous calls to {@link #getCurrentView} on the | 
 |    * {@link DiffAwareness} instance (i.e. using a {@link View} from another instance is not | 
 |    * supported). | 
 |    * | 
 |    * @throws IncompatibleViewException if the given views are not compatible with this | 
 |    *     {@link DiffAwareness} instance. This probably indicates a bug. | 
 |    * @throws BrokenDiffAwarenessException if something is wrong and the caller should discard this | 
 |    *     {@link DiffAwareness} instance. The {@link DiffAwareness} is expected to close itself in | 
 |    *     this case. | 
 |    */ | 
 |   ModifiedFileSet getDiff(View oldView, View newView) | 
 |       throws IncompatibleViewException, BrokenDiffAwarenessException; | 
 |  | 
 |   /** @return the name of this implementation */ | 
 |   String name(); | 
 |  | 
 |   /** | 
 |    * Must be called whenever the {@link DiffAwareness} object is to be discarded. Using a | 
 |    * {@link DiffAwareness} instance after calling {@link #close} on it is unspecified behavior. | 
 |    */ | 
 |   @Override | 
 |   void close(); | 
 | } |