Fix ACL fragments when Doc-Controls is enabled
diff --git a/src/com/google/enterprise/adaptor/DocumentHandler.java b/src/com/google/enterprise/adaptor/DocumentHandler.java
index c18dd88..04ba831 100644
--- a/src/com/google/enterprise/adaptor/DocumentHandler.java
+++ b/src/com/google/enterprise/adaptor/DocumentHandler.java
@@ -360,6 +360,14 @@
     }
     if (null != acl.getInheritFrom()) {
       URI from = enc.encodeDocId(acl.getInheritFrom());
+      try {
+        // Although it is named "fragment", we use a query parameter because the
+        // GSA "normalizes" away fragments.
+        from = new URI(from.getScheme(), from.getAuthority(), from.getPath(),
+            acl.getInheritFromFragment(), null);
+      } catch (URISyntaxException ex) {
+        throw new AssertionError(ex);
+      }
       gsaAcl.put("inherit_from", "" + from);
     }
     if (acl.getInheritanceType() != Acl.InheritanceType.LEAF_NODE) {
diff --git a/test/com/google/enterprise/adaptor/DocumentHandlerTest.java b/test/com/google/enterprise/adaptor/DocumentHandlerTest.java
index 7ed5d4d..e33ec08 100644
--- a/test/com/google/enterprise/adaptor/DocumentHandlerTest.java
+++ b/test/com/google/enterprise/adaptor/DocumentHandlerTest.java
@@ -902,6 +902,15 @@
   }
 
   @Test
+  public void testFormNamespacedAclHeaderFragment() {
+    DocIdEncoder enc = new MockDocIdCodec();
+    String golden = "{\"inherit_from\":\"http:\\/\\/localhost\\/t?f?=$%25\"}";
+    String aclHeader = DocumentHandler.formNamespacedAclHeader(new Acl.Builder()
+        .setInheritFrom(new DocId("t"), "f?=$%").build(), enc);
+    assertEquals(golden, aclHeader);
+  }
+
+  @Test
   public void testFormNamespacedAclHeaderBusy() {
     DocIdEncoder enc = new MockDocIdCodec();
     String golden = "{"