blob: 871faaf47efd3c6b4d22d7162f8e6df720d8ae36 [file] [log] [blame]
// 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.xcode.common;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.collect.ImmutableList;
import com.google.devtools.build.xcode.util.Equaling;
import com.google.devtools.build.xcode.util.Value;
import java.nio.file.Path;
import java.util.List;
/**
* Represents the path to an xcodeproj directory. Contains utilities for getting related
* information, including the project.pbxproj file and the project <em>name</em>, which is the
* .xcodeproj directory name without the ".xcodeproj" extension.
*
* @param <T> The type of the backing path, such as {@link java.nio.file.Path}.
*/
public class XcodeprojPath<T extends Comparable<T>>
extends Value<XcodeprojPath<T>>
implements Comparable<XcodeprojPath<T>> {
public static final String PBXPROJ_FILE_NAME = "project.pbxproj";
public static final String XCODEPROJ_DIRECTORY_SUFFIX = ".xcodeproj";
/**
* An object that knows how to create {@code XcodeprojPath}s from paths of some other type.
*/
public static class Converter<T extends Comparable<T>> {
private final PathTransformer<T> transformer;
public Converter(PathTransformer<T> transformer) {
this.transformer = checkNotNull(transformer);
}
/**
* Converts a path to an XcodeprojPath. The given path may point to the {@code project.pbxproj}
* file or the {@code *.xcodeproj} directory.
*/
public XcodeprojPath<T> fromPath(T path) {
if (Equaling.of(PBXPROJ_FILE_NAME, transformer.name(path))) {
path = transformer.parent(path);
}
return new XcodeprojPath<T>(path, transformer);
}
/**
* Converts normal paths to {@code ProjectFilePath}s using {@link #fromPath(Comparable)}.
*/
public List<XcodeprojPath<T>> fromPaths(Iterable<? extends T> pbxprojFiles) {
ImmutableList.Builder<XcodeprojPath<T>> result = new ImmutableList.Builder<>();
for (T pbxprojFile : pbxprojFiles) {
result.add(fromPath(pbxprojFile));
}
return result.build();
}
}
private final T xcodeprojDirectory;
private final PathTransformer<T> transformer;
public XcodeprojPath(T xcodeprojDirectory, PathTransformer<T> transformer) {
super(xcodeprojDirectory);
checkArgument(transformer.name(xcodeprojDirectory).endsWith(XCODEPROJ_DIRECTORY_SUFFIX),
"xcodeprojDirectory should end with %s, but it is '%s'", XCODEPROJ_DIRECTORY_SUFFIX,
xcodeprojDirectory);
this.xcodeprojDirectory = xcodeprojDirectory;
this.transformer = transformer;
}
/** Returns a converter which works for the Java {@code Path} class. */
public static Converter<Path> converter() {
return new Converter<>(PathTransformer.FOR_JAVA_PATH);
}
public final T getXcodeprojDirectory() {
return xcodeprojDirectory;
}
public final T getPbxprojFile() {
return transformer.join(xcodeprojDirectory, PBXPROJ_FILE_NAME);
}
/**
* Returns the package or directory in which the project is located. For instance, if the project
* file is {@code /foo/bar/App.xcodeproj/project.pbxproj}, then this method returns
* {@code /foo/bar}.
*/
public final T getXcodeprojContainerDir() {
return transformer.parent(xcodeprojDirectory);
}
/**
* Returns the name of the xcodeproj directory without the {@code .xcodeproj} extension or the
* containing directory. For instance, for an xcodeproj directory of
* {@code /client/foo.xcodeproj}, this method returns {@code "foo"}.
*/
public final String getProjectName() {
String pathStr = transformer.name(xcodeprojDirectory);
return pathStr.substring(0, pathStr.length() - XCODEPROJ_DIRECTORY_SUFFIX.length());
}
@Override
public final int compareTo(XcodeprojPath<T> o) {
return getXcodeprojDirectory().compareTo(o.getXcodeprojDirectory());
}
}