|  | // 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.actions.ActionLookupValue.ActionLookupKey; | 
|  | import com.google.devtools.build.lib.analysis.ConfiguredTarget; | 
|  | import com.google.devtools.build.lib.analysis.config.BuildConfiguration; | 
|  | import com.google.devtools.build.lib.cmdline.Label; | 
|  | import com.google.devtools.build.lib.util.Preconditions; | 
|  | import com.google.devtools.build.skyframe.SkyFunctionName; | 
|  | import java.util.Objects; | 
|  | import javax.annotation.Nullable; | 
|  |  | 
|  | /** | 
|  | * A (Label, Configuration) pair. Note that this pair may be used to look up the generating action | 
|  | * of an artifact. Callers may want to ensure that they have the correct configuration for this | 
|  | * purpose by passing in {@link BuildConfiguration#getArtifactOwnerConfiguration} in preference to | 
|  | * the raw configuration. | 
|  | */ | 
|  | public class ConfiguredTargetKey extends ActionLookupKey { | 
|  | private final Label label; | 
|  | @Nullable | 
|  | private final BuildConfiguration configuration; | 
|  |  | 
|  | public ConfiguredTargetKey(Label label, @Nullable BuildConfiguration configuration) { | 
|  | this.label = Preconditions.checkNotNull(label); | 
|  | this.configuration = configuration; | 
|  | } | 
|  |  | 
|  | public ConfiguredTargetKey(ConfiguredTarget rule) { | 
|  | this(rule.getTarget().getLabel(), rule.getConfiguration()); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public Label getLabel() { | 
|  | return label; | 
|  | } | 
|  |  | 
|  | @Override | 
|  | protected SkyFunctionName getType() { | 
|  | return SkyFunctions.CONFIGURED_TARGET; | 
|  | } | 
|  |  | 
|  | @Nullable | 
|  | public BuildConfiguration getConfiguration() { | 
|  | return configuration; | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public int hashCode() { | 
|  | int configVal = configuration == null ? 79 : configuration.hashCode(); | 
|  | return 31 * label.hashCode() + configVal; | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public boolean equals(Object obj) { | 
|  | if (this == obj) { | 
|  | return true; | 
|  | } | 
|  | if (obj == null) { | 
|  | return false; | 
|  | } | 
|  | if (!(obj instanceof ConfiguredTargetKey)) { | 
|  | return false; | 
|  | } | 
|  | ConfiguredTargetKey other = (ConfiguredTargetKey) obj; | 
|  | return Objects.equals(label, other.label) && Objects.equals(configuration, other.configuration); | 
|  | } | 
|  |  | 
|  | public String prettyPrint() { | 
|  | if (label == null) { | 
|  | return "null"; | 
|  | } | 
|  | return (configuration != null && configuration.isHostConfiguration()) | 
|  | ? (label + " (host)") : label.toString(); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public String toString() { | 
|  | return String.format( | 
|  | "%s %s (%s %s)", label, (configuration == null ? "null" : configuration), | 
|  | System.identityHashCode(this), | 
|  | (configuration == null ? "null" : System.identityHashCode(configuration))); | 
|  | } | 
|  |  | 
|  | } |