Moved Paths.transformFileToAbsolutePath to MorePaths.

Summary: No point in using java.nio.text.Paths in this one, so just moving it to the new utility class.

Test Plan: ant clean test
diff --git a/src/com/facebook/buck/android/DxStep.java b/src/com/facebook/buck/android/DxStep.java
index 089fa28..23866bf 100644
--- a/src/com/facebook/buck/android/DxStep.java
+++ b/src/com/facebook/buck/android/DxStep.java
@@ -19,24 +19,26 @@
 import com.facebook.buck.shell.ShellStep;
 import com.facebook.buck.step.ExecutionContext;
 import com.facebook.buck.util.AndroidPlatformTarget;
+import com.facebook.buck.util.ProjectFilesystem;
 import com.facebook.buck.util.Verbosity;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 
+import java.nio.file.Path;
 import java.util.Set;
 
 public class DxStep extends ShellStep {
 
   private final String outputDexFile;
-  private final Set<String> filesToDex;
+  private final Set<Path> filesToDex;
 
   /**
    * @param outputDexFile path to the file where the generated classes.dex should go
    * @param filesToDex each element in this set is a path to a .class file, a zip file of .class
    *     files, or a directory of .class files
    */
-  public DxStep(String outputDexFile, Iterable<String> filesToDex) {
+  public DxStep(String outputDexFile, Iterable<Path> filesToDex) {
     this.outputDexFile = Preconditions.checkNotNull(outputDexFile);
     this.filesToDex = ImmutableSet.copyOf(filesToDex);
   }
@@ -60,8 +62,9 @@
     }
 
     builder.add("--output", outputDexFile);
-    for (String fileToDex : filesToDex) {
-      builder.add(fileToDex);
+    ProjectFilesystem projectFilesystem = context.getProjectFilesystem();
+    for (Path fileToDex : filesToDex) {
+      builder.add(projectFilesystem.resolve(fileToDex).toString());
     }
 
     return builder.build();
diff --git a/src/com/facebook/buck/android/ProGuardObfuscateStep.java b/src/com/facebook/buck/android/ProGuardObfuscateStep.java
index 7644019..ec5c682 100644
--- a/src/com/facebook/buck/android/ProGuardObfuscateStep.java
+++ b/src/com/facebook/buck/android/ProGuardObfuscateStep.java
@@ -23,10 +23,10 @@
 import com.facebook.buck.step.ExecutionContext;
 import com.facebook.buck.step.Step;
 import com.facebook.buck.util.AndroidPlatformTarget;
-import com.facebook.buck.util.Functions;
 import com.facebook.buck.zip.CustomZipOutputStream;
 import com.facebook.buck.zip.ZipOutputStreams;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Functions;
 import com.google.common.base.Joiner;
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
@@ -267,7 +267,8 @@
 
       // -libraryjars
       Iterable<String> bootclasspathPaths = Iterables.transform(
-          androidPlatformTarget.getBootclasspathEntries(), Functions.FILE_TO_ABSOLUTE_PATH);
+          androidPlatformTarget.getBootclasspathEntries(),
+          Functions.toStringFunction());
       Iterable<String> libraryJars = Iterables.concat(bootclasspathPaths,
           additionalLibraryJarsForProguard);
       args.add("-libraryjars").add(pathJoiner.join(libraryJars));
diff --git a/src/com/facebook/buck/android/SmartDexingStep.java b/src/com/facebook/buck/android/SmartDexingStep.java
index b08245b..fc41a9d 100644
--- a/src/com/facebook/buck/android/SmartDexingStep.java
+++ b/src/com/facebook/buck/android/SmartDexingStep.java
@@ -27,7 +27,6 @@
 import com.facebook.buck.step.fs.RmStep;
 import com.facebook.buck.step.fs.WriteFileStep;
 import com.facebook.buck.step.fs.XzStep;
-import com.facebook.buck.util.Paths;
 import com.facebook.buck.util.ProjectFilesystem;
 import com.facebook.buck.zip.RepackZipEntriesStep;
 import com.facebook.buck.zip.ZipStep;
@@ -38,7 +37,6 @@
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Throwables;
-import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.ImmutableSet;
@@ -54,7 +52,6 @@
 import java.io.File;
 import java.io.IOException;
 import java.nio.file.Path;
-import java.util.Collection;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.Executors;
@@ -236,7 +233,13 @@
       // the outside world (commands generally seen as external, and rules are generated by parsing
       // JSON input).
       pseudoRules.add(new DxPseudoRule(context,
-          ImmutableSet.copyOf(Paths.transformFileToAbsolutePath(outputToInputs.get(outputFile))),
+          ImmutableSet.copyOf(Iterables.transform(outputToInputs.get(outputFile), new Function<File, Path>() {
+
+            @Override
+            public Path apply(File input) {
+              return input.toPath();
+            }
+          })),
           outputFile.getPath(),
           context.getProjectFilesystem().resolve(successDir.resolve(outputFile.getName()))));
     }
@@ -334,13 +337,13 @@
   @VisibleForTesting
   static class DxPseudoRule {
     private final ExecutionContext context;
-    private final Set<String> srcs;
+    private final Set<Path> srcs;
     private final String outputPath;
     private final Path outputHashPath;
     private String newInputsHash;
 
     public DxPseudoRule(ExecutionContext context,
-        Set<String> srcs,
+        Set<Path> srcs,
         String outputPath,
         Path outputHashPath) {
       this.context = Preconditions.checkNotNull(context);
@@ -383,14 +386,7 @@
       // entry contents but change on disk due to entry metadata.
       ClasspathTraverser traverser = new DefaultClasspathTraverser();
       try {
-        Collection<Path> paths = FluentIterable.from(srcs)
-            .transform(new Function<String, Path>() {
-                @Override
-                public Path apply(String input) {
-                  return java.nio.file.Paths.get(input);
-                }
-            }).toList();
-        traverser.traverse(new ClasspathTraversal(paths) {
+        traverser.traverse(new ClasspathTraversal(srcs) {
           @Override
           public void visit(FileLike fileLike) {
             try {
diff --git a/src/com/facebook/buck/java/JUnitStep.java b/src/com/facebook/buck/java/JUnitStep.java
index ff67de0..1465e68 100644
--- a/src/com/facebook/buck/java/JUnitStep.java
+++ b/src/com/facebook/buck/java/JUnitStep.java
@@ -28,6 +28,7 @@
 import com.google.common.collect.Lists;
 
 import java.io.File;
+import java.nio.file.Path;
 import java.util.List;
 import java.util.Set;
 
@@ -149,8 +150,8 @@
     // Next, add the bootclasspath entries specific to the Android platform being targeted.
     if (context.getAndroidPlatformTargetOptional().isPresent()) {
       AndroidPlatformTarget androidPlatformTarget = context.getAndroidPlatformTarget();
-      for (File bootclasspathEntry : androidPlatformTarget.getBootclasspathEntries()) {
-        classpath.add(bootclasspathEntry.getAbsolutePath());
+      for (Path bootclasspathEntry : androidPlatformTarget.getBootclasspathEntries()) {
+        classpath.add(bootclasspathEntry.toString());
       }
     }
 
diff --git a/src/com/facebook/buck/rules/BuildContext.java b/src/com/facebook/buck/rules/BuildContext.java
index e5ed128..e4e7efd 100644
--- a/src/com/facebook/buck/rules/BuildContext.java
+++ b/src/com/facebook/buck/rules/BuildContext.java
@@ -32,7 +32,6 @@
 import com.google.common.base.Suppliers;
 import com.google.common.util.concurrent.ListeningExecutorService;
 
-import java.io.File;
 import java.nio.file.Path;
 import java.util.List;
 
@@ -245,7 +244,7 @@
           @Override
           @Nullable
           public String get() {
-            List<File> bootclasspathEntries = androidPlatformTarget.getBootclasspathEntries();
+            List<Path> bootclasspathEntries = androidPlatformTarget.getBootclasspathEntries();
             Preconditions.checkState(!bootclasspathEntries.isEmpty(),
                 "There should be entries for the bootclasspath");
             return Joiner.on(":").join(bootclasspathEntries);
diff --git a/src/com/facebook/buck/util/AndroidPlatformTarget.java b/src/com/facebook/buck/util/AndroidPlatformTarget.java
index f233aa6..09c70c0 100644
--- a/src/com/facebook/buck/util/AndroidPlatformTarget.java
+++ b/src/com/facebook/buck/util/AndroidPlatformTarget.java
@@ -29,6 +29,7 @@
 import java.io.File;
 import java.io.FileFilter;
 import java.io.FilenameFilter;
+import java.nio.file.Path;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
@@ -48,7 +49,7 @@
 
   private final String name;
   private final File androidJar;
-  private final List<File> bootclasspathEntries;
+  private final List<Path> bootclasspathEntries;
   private final File aaptExecutable;
   private final File adbExecutable;
   private final File aidlExecutable;
@@ -62,7 +63,7 @@
   private AndroidPlatformTarget(
       String name,
       File androidJar,
-      List<File> bootclasspathEntries,
+      List<Path> bootclasspathEntries,
       File aaptExecutable,
       File adbExecutable,
       File aidlExecutable,
@@ -99,7 +100,10 @@
     return androidJar;
   }
 
-  public List<File> getBootclasspathEntries() {
+  /**
+   * @return bootclasspath entries as absolute {@link Path}s
+   */
+  public List<Path> getBootclasspathEntries() {
     return bootclasspathEntries;
   }
 
@@ -175,15 +179,15 @@
    * Resolves all of the jarPaths against the androidSdkDir path.
    * @return a mutable list
    */
-  private static LinkedList<File> resolvePaths(final File androidSdkDir, Set<String> jarPaths) {
-    return Lists.newLinkedList(Iterables.transform(jarPaths, new Function<String, File>() {
+  private static LinkedList<Path> resolvePaths(final File androidSdkDir, Set<String> jarPaths) {
+    return Lists.newLinkedList(Iterables.transform(jarPaths, new Function<String, Path>() {
       @Override
-      public File apply(String jarPath) {
+      public Path apply(String jarPath) {
         File jar = new File(androidSdkDir, jarPath);
         if (!jar.isFile()) {
           throw new RuntimeException("File not found: " + jar.getAbsolutePath());
         }
-        return jar;
+        return jar.toPath();
       }
     }));
   }
@@ -199,12 +203,15 @@
       File androidSdkDir,
       String platformDirectoryPath,
       Set<String> additionalJarPaths) {
+    if (!androidSdkDir.isAbsolute()) {
+      throw new HumanReadableException("Path to Android SDK must be absolute but was: %s.", androidSdkDir);
+    }
     File platformDirectory = new File(androidSdkDir, platformDirectoryPath);
     File androidJar = new File(platformDirectory, "android.jar");
-    LinkedList<File> bootclasspathEntries = resolvePaths(androidSdkDir, additionalJarPaths);
+    LinkedList<Path> bootclasspathEntries = resolvePaths(androidSdkDir, additionalJarPaths);
 
     // Make sure android.jar is at the front of the bootclasspath.
-    bootclasspathEntries.addFirst(androidJar);
+    bootclasspathEntries.addFirst(androidJar.toPath());
 
     File buildToolsDir = new File(androidSdkDir, "build-tools");
 
diff --git a/src/com/facebook/buck/util/Functions.java b/src/com/facebook/buck/util/Functions.java
deleted file mode 100644
index c817389..0000000
--- a/src/com/facebook/buck/util/Functions.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2012-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.util;
-
-import com.google.common.base.Function;
-
-import java.io.File;
-
-public final class Functions {
-
-  /** Utility class: do not instantiate. */
-  private Functions() {}
-
-  public static Function<File, String> FILE_TO_ABSOLUTE_PATH = new Function<File, String>() {
-    @Override
-    public String apply(File file) {
-      return file.getAbsolutePath();
-    }
-  };
-
-}
diff --git a/src/com/facebook/buck/util/Paths.java b/src/com/facebook/buck/util/Paths.java
index e71f6a9..3a685e4 100644
--- a/src/com/facebook/buck/util/Paths.java
+++ b/src/com/facebook/buck/util/Paths.java
@@ -16,18 +16,10 @@
 
 package com.facebook.buck.util;
 
-import com.google.common.collect.Iterables;
-
-import java.io.File;
-
 public class Paths {
 
   private Paths() {}
 
-  public static Iterable<String> transformFileToAbsolutePath(Iterable<File> files) {
-    return Iterables.transform(files, Functions.FILE_TO_ABSOLUTE_PATH);
-  }
-
   /**
    * Returns normalized path. On Windows \ will be replaced with /.
    * @return Normalized path
diff --git a/test/com/facebook/buck/android/SmartDexingStepTest.java b/test/com/facebook/buck/android/SmartDexingStepTest.java
index 29ce2e9..02a13f6 100644
--- a/test/com/facebook/buck/android/SmartDexingStepTest.java
+++ b/test/com/facebook/buck/android/SmartDexingStepTest.java
@@ -118,7 +118,7 @@
     Path outputHashFile = new File(tmpDir.getRoot(), "out.dex.hash").toPath();
     Files.write("dummy", outputHashFile.toFile(), Charsets.UTF_8);
 
-    DxPseudoRule rule = new DxPseudoRule(context, ImmutableSet.of(testIn.getPath()),
+    DxPseudoRule rule = new DxPseudoRule(context, ImmutableSet.of(testIn.toPath()),
         outputFile.getPath(), outputHashFile);
     assertFalse("'dummy' is not a matching input hash", rule.checkIsCached());
 
diff --git a/test/com/facebook/buck/java/DefaultJavaLibraryRuleTest.java b/test/com/facebook/buck/java/DefaultJavaLibraryRuleTest.java
index afe1292..8baffea 100644
--- a/test/com/facebook/buck/java/DefaultJavaLibraryRuleTest.java
+++ b/test/com/facebook/buck/java/DefaultJavaLibraryRuleTest.java
@@ -89,6 +89,8 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -778,9 +780,9 @@
                                           @Nullable String bootclasspath,
                                           @Nullable ProjectFilesystem projectFilesystem) {
     AndroidPlatformTarget platformTarget = EasyMock.createMock(AndroidPlatformTarget.class);
-    ImmutableList<File> bootclasspathEntries = (bootclasspath == null)
-        ? ImmutableList.<File>of(new File("I am not used"))
-        : ImmutableList.of(new File(bootclasspath));
+    ImmutableList<Path> bootclasspathEntries = (bootclasspath == null)
+        ? ImmutableList.<Path>of(Paths.get("I am not used"))
+        : ImmutableList.of(Paths.get(bootclasspath));
     EasyMock.expect(platformTarget.getBootclasspathEntries()).andReturn(bootclasspathEntries)
         .anyTimes();
     replay(platformTarget);
diff --git a/test/com/facebook/buck/rules/BuildContextTest.java b/test/com/facebook/buck/rules/BuildContextTest.java
index 1b66822..a27cdff 100644
--- a/test/com/facebook/buck/rules/BuildContextTest.java
+++ b/test/com/facebook/buck/rules/BuildContextTest.java
@@ -23,7 +23,6 @@
 import com.facebook.buck.testutil.TestConsole;
 import com.facebook.buck.util.AndroidPlatformTarget;
 import com.facebook.buck.util.HumanReadableException;
-import com.facebook.buck.util.Paths;
 import com.facebook.buck.util.ProjectFilesystem;
 import com.facebook.buck.util.Verbosity;
 import com.google.common.base.Optional;
@@ -33,7 +32,8 @@
 import org.easymock.EasyMock;
 import org.junit.Test;
 
-import java.io.File;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.List;
 
 public class BuildContextTest {
@@ -51,10 +51,10 @@
     builder.setEventBus(BuckEventBusFactory.newInstance());
 
     AndroidPlatformTarget androidPlatformTarget = EasyMock.createMock(AndroidPlatformTarget.class);
-    List<File> entries = ImmutableList.of(
-        new File("add-ons/addon-google_apis-google-15/libs/effects.jar"),
-        new File("add-ons/addon-google_apis-google-15/libs/maps.jar"),
-        new File("add-ons/addon-google_apis-google-15/libs/usb.jar"));
+    List<Path> entries = ImmutableList.of(
+        Paths.get("add-ons/addon-google_apis-google-15/libs/effects.jar"),
+        Paths.get("add-ons/addon-google_apis-google-15/libs/maps.jar"),
+        Paths.get("add-ons/addon-google_apis-google-15/libs/usb.jar"));
     EasyMock.expect(androidPlatformTarget.getBootclasspathEntries()).andReturn(entries);
 
     EasyMock.replay(androidPlatformTarget);
@@ -64,7 +64,8 @@
     BuildContext context = builder.build();
     Supplier<String> androidBootclasspathSupplier = context.getAndroidBootclasspathSupplier();
 
-    String androidBootclasspath = Paths.normalizePathSeparator(androidBootclasspathSupplier.get());
+    String androidBootclasspath = com.facebook.buck.util.Paths.normalizePathSeparator(
+        androidBootclasspathSupplier.get());
     assertEquals(
         "add-ons/addon-google_apis-google-15/libs/effects.jar:" +
         "add-ons/addon-google_apis-google-15/libs/maps.jar:" +
diff --git a/test/com/facebook/buck/util/AndroidPlatformTargetTest.java b/test/com/facebook/buck/util/AndroidPlatformTargetTest.java
index bcdf058..43f67bf 100644
--- a/test/com/facebook/buck/util/AndroidPlatformTargetTest.java
+++ b/test/com/facebook/buck/util/AndroidPlatformTargetTest.java
@@ -46,7 +46,7 @@
         .createFromDefaultDirectoryStructure(
             name, androidSdkDir, platformDirectoryPath, additionalJarPaths);
     assertEquals(name, androidPlatformTarget.getName());
-    assertEquals(ImmutableList.of(new File("/home/android/platforms/android-16/android.jar")),
+    assertEquals(ImmutableList.of(java.nio.file.Paths.get("/home/android/platforms/android-16/android.jar")),
         androidPlatformTarget.getBootclasspathEntries());
     assertEquals(new File("/home/android/platforms/android-16/android.jar"),
         androidPlatformTarget.getAndroidJar());
@@ -88,10 +88,10 @@
     assertEquals(platformId, androidPlatformTarget.getName());
     assertEquals(
         ImmutableList.of(
-            new File(androidSdkDir, "platforms/android-17/android.jar"),
-            new File(androidSdkDir, "add-ons/addon-google_apis-google-17/libs/effects.jar"),
-            new File(androidSdkDir, "add-ons/addon-google_apis-google-17/libs/maps.jar"),
-            new File(androidSdkDir, "add-ons/addon-google_apis-google-17/libs/usb.jar")),
+            MorePaths.newPathInstance(new File(androidSdkDir, "platforms/android-17/android.jar")),
+            MorePaths.newPathInstance(new File(androidSdkDir, "add-ons/addon-google_apis-google-17/libs/effects.jar")),
+            MorePaths.newPathInstance(new File(androidSdkDir, "add-ons/addon-google_apis-google-17/libs/maps.jar")),
+            MorePaths.newPathInstance(new File(androidSdkDir, "add-ons/addon-google_apis-google-17/libs/usb.jar"))),
         androidPlatformTarget.getBootclasspathEntries());
     assertEquals(new File(androidSdkDir, "platforms/android-17/android.jar"),
         androidPlatformTarget.getAndroidJar());
@@ -129,10 +129,10 @@
     assertEquals(platformId, androidPlatformTarget.getName());
     assertEquals(
         ImmutableList.of(
-            new File(androidSdkDir, "platforms/android-17/android.jar"),
-            new File(androidSdkDir, "add-ons/addon-google_apis-google-17/libs/effects.jar"),
-            new File(androidSdkDir, "add-ons/addon-google_apis-google-17/libs/maps.jar"),
-            new File(androidSdkDir, "add-ons/addon-google_apis-google-17/libs/usb.jar")),
+            MorePaths.newPathInstance(new File(androidSdkDir, "platforms/android-17/android.jar")),
+            MorePaths.newPathInstance(new File(androidSdkDir, "add-ons/addon-google_apis-google-17/libs/effects.jar")),
+            MorePaths.newPathInstance(new File(androidSdkDir, "add-ons/addon-google_apis-google-17/libs/maps.jar")),
+            MorePaths.newPathInstance(new File(androidSdkDir, "add-ons/addon-google_apis-google-17/libs/usb.jar"))),
         androidPlatformTarget.getBootclasspathEntries());
     assertEquals(new File(androidSdkDir, "platforms/android-17/android.jar"),
         androidPlatformTarget.getAndroidJar());