Quote replacement for metadata named decoding

$ and \ are special characters in regex replacements, so we need to
properly encode the replacement so that we have literal characters.
diff --git a/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java b/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java
index 65bfb90..3de9a5c 100644
--- a/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java
+++ b/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java
@@ -854,7 +854,7 @@
     StringBuffer sb = new StringBuffer();
     while (m.find()) {
       char c = (char) Integer.parseInt(m.group(1), 16);
-      m.appendReplacement(sb, "" + c);
+      m.appendReplacement(sb, Matcher.quoteReplacement("" + c));
     }
     m.appendTail(sb);
     return sb.toString();
diff --git a/test/com/google/enterprise/adaptor/sharepoint/SharePointAdaptorTest.java b/test/com/google/enterprise/adaptor/sharepoint/SharePointAdaptorTest.java
index 8223d39..fa5ad7c 100644
--- a/test/com/google/enterprise/adaptor/sharepoint/SharePointAdaptorTest.java
+++ b/test/com/google/enterprise/adaptor/sharepoint/SharePointAdaptorTest.java
@@ -361,9 +361,9 @@
         SharePointAdaptor.decodeMetadataName("_x020__x00020__0020__x0020"));
     assertEquals("Simple Space",
         SharePointAdaptor.decodeMetadataName("Simple_x0020_Space"));
-    assertEquals("Multiple \u0394Replacements\u2ee8",
+    assertEquals("Multiple \u0394Replacements\u2ee8$",
         SharePointAdaptor.decodeMetadataName(
-            "Multiple_x0020__x0394_Replacements_x2ee8_"));
+            "Multiple_x0020__x0394_Replacements_x2ee8__x0024_"));
   }
 
   @Test