diff options
Diffstat (limited to 'src/tools/xcode-common/java/com/google/devtools/build/xcode/common/XcodeprojPath.java')
-rw-r--r-- | src/tools/xcode-common/java/com/google/devtools/build/xcode/common/XcodeprojPath.java | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/src/tools/xcode-common/java/com/google/devtools/build/xcode/common/XcodeprojPath.java b/src/tools/xcode-common/java/com/google/devtools/build/xcode/common/XcodeprojPath.java new file mode 100644 index 0000000000..eedf326d13 --- /dev/null +++ b/src/tools/xcode-common/java/com/google/devtools/build/xcode/common/XcodeprojPath.java @@ -0,0 +1,121 @@ +// Copyright 2014 Google Inc. 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()); + } +} |