Bump to 2.12-SNAPSHOT and use of java.nio.Path

Change-Id: I72fb8c5cfc2f37096f0b2892b11d0baa832b559e
diff --git a/src/main/java/com/googlesource/gerrit/plugins/scripting/scala/ScalaPluginProvider.java b/src/main/java/com/googlesource/gerrit/plugins/scripting/scala/ScalaPluginProvider.java
index 9eeffb5..eb4fa13 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/scripting/scala/ScalaPluginProvider.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/scripting/scala/ScalaPluginProvider.java
@@ -24,7 +24,7 @@
 
 import org.eclipse.jgit.internal.storage.file.FileSnapshot;
 
-import java.io.File;
+import java.nio.file.Path;
 
 /**
  * Scala scripting plugins.
@@ -62,7 +62,7 @@
   }
 
   @Override
-  public ServerPlugin get(File srcFile,
+  public ServerPlugin get(Path srcFile,
       FileSnapshot snapshot, PluginDescription description)
       throws InvalidPluginException {
     ScalaPluginScriptEngine scriptEngine = scriptEngineProvider.get();
@@ -73,13 +73,13 @@
   }
 
   @Override
-  public boolean handles(File srcFile) {
-    return srcFile.getName().toLowerCase().endsWith(SCALA_EXTENSION);
+  public boolean handles(Path srcFile) {
+    return srcFile.toString().toLowerCase().endsWith(SCALA_EXTENSION);
   }
 
   @Override
-  public String getPluginName(File srcFile) {
-    String srcFileName = srcFile.getName();
+  public String getPluginName(Path srcFile) {
+    String srcFileName = srcFile.getFileName().toString();
     int endPos = srcFileName.lastIndexOf('-');
     if (endPos == -1) {
       endPos = srcFileName.lastIndexOf('.');
diff --git a/src/main/java/com/googlesource/gerrit/plugins/scripting/scala/ScalaPluginScanner.java b/src/main/java/com/googlesource/gerrit/plugins/scripting/scala/ScalaPluginScanner.java
index 485a87c..e3135dd 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/scripting/scala/ScalaPluginScanner.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/scripting/scala/ScalaPluginScanner.java
@@ -21,16 +21,16 @@
 
 import com.googlesource.gerrit.plugins.web.WebPluginScanner;
 
-import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.file.Path;
 import java.util.Enumeration;
 import java.util.Set;
 
 public class ScalaPluginScanner extends AbstractPreloadedPluginScanner {
   private final WebPluginScanner webScanner;
 
-  public ScalaPluginScanner(String pluginName, File srcFile,
+  public ScalaPluginScanner(String pluginName, Path srcFile,
       ScalaPluginScriptEngine scriptEngine) throws InvalidPluginException {
     super(pluginName, getPluginVersion(srcFile), loadScriptClasses(srcFile,
         scriptEngine), Plugin.ApiType.PLUGIN);
@@ -38,8 +38,8 @@
     this.webScanner = new WebPluginScanner(srcFile);
   }
 
-  private static String getPluginVersion(File srcFile) {
-    String srcFileName = srcFile.getName();
+  private static String getPluginVersion(Path srcFile) {
+    String srcFileName = srcFile.getFileName().toString();
     int startPos = srcFileName.lastIndexOf('-');
     if (startPos == -1) {
       return "0";
@@ -48,7 +48,7 @@
     return srcFileName.substring(startPos + 1, endPos);
   }
 
-  private static Set<Class<?>> loadScriptClasses(File srcFile,
+  private static Set<Class<?>> loadScriptClasses(Path srcFile,
       ScalaPluginScriptEngine scriptEngine) throws InvalidPluginException {
     try {
       return scriptEngine.eval(srcFile);
@@ -58,14 +58,17 @@
     }
   }
 
-  public Optional<PluginEntry> getEntry(String resourcePath) {
+  @Override
+  public Optional<PluginEntry> getEntry(String resourcePath) throws IOException {
     return webScanner.getEntry(resourcePath);
   }
 
+  @Override
   public InputStream getInputStream(PluginEntry entry) throws IOException {
     return webScanner.getInputStream(entry);
   }
 
+  @Override
   public Enumeration<PluginEntry> entries() {
     return webScanner.entries();
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/scripting/scala/ScalaPluginScriptEngine.java b/src/main/java/com/googlesource/gerrit/plugins/scripting/scala/ScalaPluginScriptEngine.java
index 91b8eb1..ccabb82 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/scripting/scala/ScalaPluginScriptEngine.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/scripting/scala/ScalaPluginScriptEngine.java
@@ -16,6 +16,7 @@
 import static scala.collection.JavaConversions.asScalaBuffer;
 
 import com.google.common.base.Function;
+import com.google.common.base.Joiner;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import com.google.inject.Inject;
@@ -36,10 +37,8 @@
 import scala.tools.nsc.Global;
 import scala.tools.nsc.Global.Run;
 
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
 import java.io.IOException;
+import java.nio.charset.Charset;
 import java.nio.file.FileVisitOption;
 import java.nio.file.FileVisitResult;
 import java.nio.file.Files;
@@ -158,11 +157,11 @@
     this.reporter = reporter;
   }
 
-  public Set<Class<?>> eval(File scalaFile) throws IOException,
+  public Set<Class<?>> eval(Path scalaFile) throws IOException,
       ClassNotFoundException {
-    if (scalaFile.isFile()) {
+    if (Files.isRegularFile(scalaFile)) {
       return evalFiles(Arrays.asList(scalaFile));
-    } else if (scalaFile.isDirectory()) {
+    } else if (Files.isDirectory(scalaFile)) {
       return evalDirectory(scalaFile);
     } else {
       throw new IOException("File " + scalaFile
@@ -170,20 +169,19 @@
     }
   }
 
-  private Set<Class<?>> evalDirectory(File scalaFile) throws IOException,
+  private Set<Class<?>> evalDirectory(Path scalaFile) throws IOException,
       ClassNotFoundException {
-    final List<File> scalaFiles = Lists.newArrayList();
+    final List<Path> scalaFiles = Lists.newArrayList();
 
-    Files.walkFileTree(scalaFile.toPath(),
+    Files.walkFileTree(scalaFile,
         EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE,
         new SimpleFileVisitor<Path>() {
           @Override
           public FileVisitResult visitFile(Path path, BasicFileAttributes attrs)
               throws IOException {
-            File file = path.toFile();
-            String fileName = file.getName();
-            if (file.isFile() && fileName.endsWith(ScalaPluginProvider.SCALA_EXTENSION)) {
-              scalaFiles.add(file);
+            String fileName = path.getFileName().toString();
+            if (Files.isRegularFile(path) && fileName.endsWith(ScalaPluginProvider.SCALA_EXTENSION)) {
+              scalaFiles.add(path);
             }
             return FileVisitResult.CONTINUE;
           }
@@ -191,15 +189,15 @@
     return evalFiles(scalaFiles);
   }
 
-  private Set<Class<?>> evalFiles(List<File> scalaFiles) throws IOException,
+  private Set<Class<?>> evalFiles(List<Path> scalaFiles) throws IOException,
       ClassNotFoundException {
     Set<Class<?>> classes = Sets.newHashSet();
 
-    List<SourceFile> scalaSourceFiles = Lists.transform(scalaFiles, new Function<File,SourceFile>() {
+    List<SourceFile> scalaSourceFiles = Lists.transform(scalaFiles, new Function<Path,SourceFile>() {
       @Override
-      public SourceFile apply(File scalaFile) {
+      public SourceFile apply(Path scalaFile) {
         try {
-          return new BatchSourceFile(scalaFile.getName(), readScalaFile(scalaFile));
+          return new BatchSourceFile(scalaFile.toString(), readScalaFile(scalaFile));
         } catch (IOException e) {
           throw new IllegalArgumentException("Cannot load scala file " + scalaFile, e);
         }
@@ -227,20 +225,11 @@
     return classes;
   }
 
-  private Seq<Object> readScalaFile(File scalaFile) throws IOException {
-    BufferedReader reader = new BufferedReader(new FileReader(scalaFile));
-    StringBuilder scalaCode = new StringBuilder();
-    try {
-      String line;
-      while (null != (line = reader.readLine())) {
-        scalaCode.append(line);
-        scalaCode.append("\n");
-      }
-    } finally {
-      reader.close();
-    }
+  private Seq<Object> readScalaFile(Path scalaFile) throws IOException {
+    List<String> scalaFileLines = Files.readAllLines(scalaFile, Charset.forName("UTF-8"));
+    String scalaCode = Joiner.on('\n').join(scalaFileLines);
 
-    List<Object> chars = new ArrayList<Object>();
+    List<Object> chars = new ArrayList<>();
     for (char c : scalaCode.toString().toCharArray()) {
       chars.add(Char.unbox(c));
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/web/LookAheadFileInputStream.java b/src/main/java/com/googlesource/gerrit/plugins/web/LookAheadFileInputStream.java
index e8c858f..d1a672e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/web/LookAheadFileInputStream.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/web/LookAheadFileInputStream.java
@@ -14,9 +14,9 @@
 package com.googlesource.gerrit.plugins.web;
 
 import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.Arrays;
 
 class LookAheadFileInputStream extends BufferedInputStream {
@@ -29,14 +29,14 @@
 
   private final String fileExtension;
   private final String fileName;
-  private final File currentDir;
+  private final Path currentDir;
 
-  public LookAheadFileInputStream(File inputFile) throws IOException {
-    super(new FileInputStream(inputFile), BUFFER_SIZE);
+  public LookAheadFileInputStream(Path inputFile) throws IOException {
+    super(Files.newInputStream(inputFile), BUFFER_SIZE);
 
-    fileName = inputFile.getName();
+    fileName = inputFile.getFileName().toString();
     fileExtension = fileName.substring(fileName.lastIndexOf('.') + 1);
-    currentDir = inputFile.getParentFile();
+    currentDir = inputFile.getParent();
   }
 
   @Override
@@ -45,6 +45,7 @@
         + " buffer=\'" + new String(buf, pos, count - pos) + "'";
   }
 
+  @Override
   public synchronized int read() throws IOException {
     lastChar = super.read();
     if (isNewLine()) {
@@ -99,7 +100,7 @@
     return fileName;
   }
 
-  public File getCurrentDir() {
+  public Path getCurrentDir() {
     return currentDir;
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/web/SSIPageInputStream.java b/src/main/java/com/googlesource/gerrit/plugins/web/SSIPageInputStream.java
index a112dd3..965b97a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/web/SSIPageInputStream.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/web/SSIPageInputStream.java
@@ -13,9 +13,10 @@
 // limitations under the License.
 package com.googlesource.gerrit.plugins.web;
 
-import java.io.File;
 import java.io.FilterInputStream;
 import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.Stack;
 
 public class SSIPageInputStream extends FilterInputStream {
@@ -25,11 +26,11 @@
 
   private LookAheadFileInputStream currentIs;
   private Stack<LookAheadFileInputStream> fileInputStreamStack;
-  private final File basePath;
+  private final Path basePath;
 
-  public SSIPageInputStream(File basePath, String filePath)
+  public SSIPageInputStream(Path basePath, String filePath)
       throws IOException {
-    super(new LookAheadFileInputStream(new File(basePath, filePath)));
+    super(new LookAheadFileInputStream(basePath.resolve(filePath)));
 
     this.basePath = basePath;
     this.fileInputStreamStack = new Stack<>();
@@ -60,8 +61,8 @@
 
   private void push(String includeFileName) throws IOException {
     fileInputStreamStack.push(currentIs);
-    File inputFile = getFile(includeFileName);
-    if (!inputFile.exists()) {
+    Path inputFile = getFile(includeFileName);
+    if (!Files.exists(inputFile)) {
       throw new IOException("Cannot find file '" + includeFileName
           + "' included in " + currentIs.getFileName() + ":"
           + currentIs.getLineNr());
@@ -70,11 +71,11 @@
     in = currentIs;
   }
 
-  private File getFile(String includeFileName) {
+  private Path getFile(String includeFileName) {
     if (includeFileName.startsWith("/")) {
-      return new File(basePath, includeFileName);
+      return basePath.resolve(includeFileName);
     } else {
-      return new File(currentIs.getCurrentDir(), includeFileName);
+      return currentIs.getCurrentDir().resolve(includeFileName);
     }
   }
 
@@ -110,10 +111,12 @@
     }
   }
 
+  @Override
   public int read(byte b[]) throws IOException {
     return read(b, 0, b.length);
   }
 
+  @Override
   public int read(byte b[], int off, int len) throws IOException {
     if (b == null) {
       throw new NullPointerException();
diff --git a/src/main/java/com/googlesource/gerrit/plugins/web/WebPluginScanner.java b/src/main/java/com/googlesource/gerrit/plugins/web/WebPluginScanner.java
index fc73408..f2af09b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/web/WebPluginScanner.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/web/WebPluginScanner.java
@@ -20,8 +20,6 @@
 import com.google.gerrit.server.plugins.PluginEntry;
 import com.google.inject.Inject;
 
-import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.annotation.Annotation;
@@ -39,10 +37,10 @@
 import java.util.jar.Manifest;
 
 public class WebPluginScanner implements PluginContentScanner {
-  private final File staticResourcesPath;
+  private final Path staticResourcesPath;
 
   @Inject
-  public WebPluginScanner(File rootDir) {
+  public WebPluginScanner(Path rootDir) {
     this.staticResourcesPath = rootDir;
   }
 
@@ -59,32 +57,33 @@
   }
 
   @Override
-  public Optional<PluginEntry> getEntry(String resourcePath) {
-    File resourceFile = getResourceFile(resourcePath);
-    if (resourceFile.exists() && resourceFile.length() > 0) {
+  public Optional<PluginEntry> getEntry(String resourcePath) throws IOException {
+    Path resourceFile = getResourceFile(resourcePath);
+    if (Files.exists(resourceFile) && Files.size(resourceFile) > 0) {
       return resourceOf(resourcePath);
     } else {
       return Optional.absent();
     }
   }
 
-  private Optional<PluginEntry> resourceOf(String resourcePath) {
-    File file = getResourceFile(resourcePath);
-    if (file.exists() && file.length() > 0) {
+  private Optional<PluginEntry> resourceOf(String resourcePath) throws IOException {
+    Path file = getResourceFile(resourcePath);
+    long fileSize = Files.size(file);
+    if (Files.exists(file) && fileSize > 0) {
+      long fileLastModifiedTimeMillis = Files.getLastModifiedTime(file).toMillis();
       if (resourcePath.endsWith("html")) {
-        return Optional.of(new PluginEntry(resourcePath, file.lastModified()));
+        return Optional.of(new PluginEntry(resourcePath, fileLastModifiedTimeMillis));
       } else {
-        return Optional.of(new PluginEntry(resourcePath, file.lastModified(),
-            Optional.of(file.length())));
+        return Optional.of(new PluginEntry(resourcePath, fileLastModifiedTimeMillis,
+            Optional.of(fileSize)));
       }
     } else {
       return Optional.absent();
     }
   }
 
-  private File getResourceFile(String resourcePath) {
-    File resourceFile = new File(staticResourcesPath, resourcePath);
-    return resourceFile;
+  private Path getResourceFile(String resourcePath) {
+    return staticResourcesPath.resolve(resourcePath);
   }
 
   @Override
@@ -94,7 +93,7 @@
     if(name.endsWith("html")) {
       return new SSIPageInputStream(staticResourcesPath, name);
     } else {
-    return new FileInputStream(getResourceFile(name));
+    return Files.newInputStream(getResourceFile(name));
     }
   }
 
@@ -102,10 +101,10 @@
   public Enumeration<PluginEntry> entries() {
     final List<PluginEntry> resourcesList = Lists.newArrayList();
     try {
-      Files.walkFileTree(staticResourcesPath.toPath(),
+      Files.walkFileTree(staticResourcesPath,
           EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE,
           new SimpleFileVisitor<Path>() {
-            private int basicPathLength = staticResourcesPath.getAbsolutePath()
+            private int basicPathLength = staticResourcesPath.toAbsolutePath().toString()
                 .length();
 
             @Override