Fix b/15940781 FsAdaptor.getDocContent throws InvalidPathException

This change catches InvalidPathException thrown by Paths.get()
and handles it the same as the subsequent check for docid validity.

Code Review: http://codereview.appspot.com/106580044
diff --git a/src/com/google/enterprise/adaptor/fs/FsAdaptor.java b/src/com/google/enterprise/adaptor/fs/FsAdaptor.java
index 609588b..6f549aa 100644
--- a/src/com/google/enterprise/adaptor/fs/FsAdaptor.java
+++ b/src/com/google/enterprise/adaptor/fs/FsAdaptor.java
@@ -41,6 +41,7 @@
 import java.io.Writer;
 import java.nio.charset.Charset;
 import java.nio.file.AccessDeniedException;
+import java.nio.file.InvalidPathException;
 import java.nio.file.NoSuchFileException;
 import java.nio.file.Path;
 import java.nio.file.attribute.AclFileAttributeView;
@@ -454,11 +455,20 @@
     log.entering("FsAdaptor", "getDocContent",
         new Object[] {req, resp});
     DocId id = req.getDocId();
-    Path doc = delegate.getPath(id.getUniqueId());
+    Path doc;
+
+    try {
+      doc = delegate.getPath(id.getUniqueId());
+    } catch (InvalidPathException e) {
+      log.log(Level.WARNING,
+          "The docid {0} is not a valid id generated by the adaptor.", id);
+      resp.respondNotFound();
+      return;
+    }
 
     if (!id.equals(delegate.newDocId(doc))) {
       log.log(Level.WARNING,
-          "The {0} is not a valid id generated by the adaptor.", id);
+          "The docid {0} is not a valid id generated by the adaptor.", id);
       resp.respondNotFound();
       return;
     }
diff --git a/test/com/google/enterprise/adaptor/fs/FsAdaptorTest.java b/test/com/google/enterprise/adaptor/fs/FsAdaptorTest.java
index 6a5b25f..85e31c7 100644
--- a/test/com/google/enterprise/adaptor/fs/FsAdaptorTest.java
+++ b/test/com/google/enterprise/adaptor/fs/FsAdaptorTest.java
@@ -313,6 +313,14 @@
   }
 
   @Test
+  public void testGetDocContentInvalidPath() throws Exception {
+    adaptor.init(context);
+    MockResponse response = new MockResponse();
+    adaptor.getDocContent(new MockRequest(new DocId("")), response);
+    assertTrue(response.notFound);
+  }
+
+  @Test
   public void testGetDocContentUnsupportedPath() throws Exception {
     root.addChildren(new MockFile("unsupported").setIsRegularFile(false));
     adaptor.init(context);
diff --git a/test/com/google/enterprise/adaptor/fs/MockFileDelegate.java b/test/com/google/enterprise/adaptor/fs/MockFileDelegate.java
index c8fd6a1..f03f444 100644
--- a/test/com/google/enterprise/adaptor/fs/MockFileDelegate.java
+++ b/test/com/google/enterprise/adaptor/fs/MockFileDelegate.java
@@ -15,6 +15,7 @@
 package com.google.enterprise.adaptor.fs;
 
 import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
 import com.google.enterprise.adaptor.AsyncDocIdPusher;
 import com.google.enterprise.adaptor.DocId;
 
@@ -25,6 +26,7 @@
 import java.nio.file.attribute.BasicFileAttributes;
 import java.nio.file.attribute.FileTime;
 import java.nio.file.DirectoryStream;
+import java.nio.file.InvalidPathException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.concurrent.BlockingQueue;
@@ -68,7 +70,10 @@
 
   @Override
   public Path getPath(String pathname) throws IOException {
-    Preconditions.checkNotNull(pathname, "pathname cannot be null");
+    if (Strings.isNullOrEmpty(pathname)) {
+      throw new InvalidPathException(pathname,
+                                     "pathname cannot be null or empty");
+    }
     return Paths.get(pathname);
   }