/*
* Copyright 2015-present Facebook, Inc.
*
* 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.facebook.buck.model;
import com.facebook.buck.util.immutables.BuckStyleImmutable;
import com.facebook.buck.util.string.StringsUtils;
import com.google.common.base.Preconditions;
import com.google.common.collect.Interner;
import com.google.common.collect.Interners;
import com.google.common.primitives.Booleans;
import java.nio.file.Path;
import java.util.Optional;
import org.immutables.value.Value;
/**
* A build target in the form of
*
* <pre>cell//path:rule</pre>
*
* .
*/
@BuckStyleImmutable
@Value.Immutable(copy = false)
abstract class AbstractUnflavoredBuildTarget implements Comparable<AbstractUnflavoredBuildTarget> {
/** Interner for instances of UnflavoredBuildTarget. */
private static final Interner<UnflavoredBuildTarget> interner = Interners.newWeakInterner();
/** Builder for UnflavoredBuildTargets which routes values through BuildTargetInterner. */
public static class Builder extends UnflavoredBuildTarget.Builder {
@Override
public UnflavoredBuildTarget build() {
return interner.intern(super.build());
}
}
public static final String BUILD_TARGET_PREFIX = "//";
@Value.Check
protected void check() {
Preconditions.checkArgument(
getBaseName().startsWith(BUILD_TARGET_PREFIX),
"baseName must start with %s but was %s",
BUILD_TARGET_PREFIX,
getBaseName());
// On Windows, baseName may contain backslashes, which are not permitted.
Preconditions.checkArgument(
!getBaseName().contains("\\"), "baseName may not contain backslashes.");
Preconditions.checkArgument(
getShortName().lastIndexOf("#") == -1,
"Build target name cannot contain '#' but was: %s.",
getShortName());
Preconditions.checkArgument(
!getShortName().contains("#"),
"Build target name cannot contain '#' but was: %s.",
getShortName());
}
public abstract Path getCellPath();
public abstract Optional<String> getCell();
/**
* If this build target were //third_party/java/guava:guava-latest, then this would return
* "//third_party/java/guava".
*/
public abstract String getBaseName();
public abstract String getShortName();
/**
* If this build target is //third_party/java/guava:guava-latest, then this would return
* "//third_party/java/guava:guava-latest".
*/
public String getFullyQualifiedName() {
return (getCell().isPresent() ? getCell().get() : "") + getBaseName() + ":" + getShortName();
}
/**
* If this build target were //third_party/java/guava:guava-latest, then this would return the
* {@link Path} "third_party/java/guava". This does not contain the "//" prefix so that it can be
* appended to a file path.
*/
public Path getBasePath() {
return getCellPath()
.getFileSystem()
.getPath(getBaseName().substring(BUILD_TARGET_PREFIX.length()));
}
public boolean isInCellRoot() {
return getBaseName().equals("//");
}
public static Builder builder() {
return new Builder();
}
public static UnflavoredBuildTarget of(
Path cellPath, Optional<String> cellName, String baseName, String shortName) {
return builder()
.setCellPath(cellPath)
.setCell(cellName)
.setBaseName(baseName)
.setShortName(shortName)
.build();
}
/** @return {@link #getFullyQualifiedName()} */
@Override
public String toString() {
return getFullyQualifiedName();
}
@Override
public int compareTo(AbstractUnflavoredBuildTarget o) {
if (this == o) {
return 0;
}
int cmp = Booleans.compare(o.getCell().isPresent(), getCell().isPresent());
if (cmp != 0) {
return cmp;
}
if (getCell().isPresent() && o.getCell().isPresent()) {
cmp = StringsUtils.compareStrings(getCell().get(), o.getCell().get());
if (cmp != 0) {
return cmp;
}
}
cmp = StringsUtils.compareStrings(getBaseName(), o.getBaseName());
if (cmp != 0) {
return cmp;
}
return StringsUtils.compareStrings(getShortName(), o.getShortName());
}
}