Return 404 for attachment documents when parent list item is deleted or not available.
b/11051596
Code Review : https://codereview.appspot.com/105790045/
diff --git a/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java b/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java
index 16e682a..dfb3af3 100644
--- a/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java
+++ b/src/com/google/enterprise/adaptor/sharepoint/SharePointAdaptor.java
@@ -2338,12 +2338,20 @@
log.exiting("SiteAdaptor", "getAttachmentDocContent", true);
return true;
}
- // TODO(ejona): Figure out a way to give a Not Found if the itemId is
- // wrong. getContentItem() will throw an exception if the itemId does not
- // exist.
+
ItemData itemData = siteDataClient.getContentItem(listId, itemId);
Xml xml = itemData.getXml();
Element data = getFirstChildWithName(xml, DATA_ELEMENT);
+ String itemCount = data.getAttribute("ItemCount");
+ if ("0".equals(itemCount)) {
+ log.fine("Could not get parent list item as ItemCount is 0.");
+ log.exiting("SiteAdaptor", "getAttachmentDocContent", false);
+ // Returing false here instead of returing 404 to avoid wrongly
+ // identifying file documents as attachments when DocumentLibrary has
+ // folder name Attachments. Returing false here would allow code
+ // to see if this document was a regular file in DocumentLibrary.
+ return false;
+ }
Element row = getChildrenWithName(data, ROW_ELEMENT).get(0);
String scopeId
= row.getAttribute(OWS_SCOPEID_ATTRIBUTE).split(";#", 2)[1];
diff --git a/test/com/google/enterprise/adaptor/sharepoint/SharePointAdaptorTest.java b/test/com/google/enterprise/adaptor/sharepoint/SharePointAdaptorTest.java
index 210a391..682b0e8 100644
--- a/test/com/google/enterprise/adaptor/sharepoint/SharePointAdaptorTest.java
+++ b/test/com/google/enterprise/adaptor/sharepoint/SharePointAdaptorTest.java
@@ -1207,6 +1207,54 @@
response.getDisplayUrl());
assertEquals(new Date(1335910481000L), response.getLastModified());
}
+
+ @Test
+ public void testGetDocContentAttachmentDeletedParent() throws Exception {
+ SiteDataSoap siteData = MockSiteData.blank()
+ .register(SITES_SITECOLLECTION_S_CONTENT_EXCHANGE)
+ .register(SITES_SITECOLLECTION_LISTS_CUSTOMLIST_URLSEG_EXCHANGE)
+ .register(SITES_SITECOLLECTION_LISTS_CUSTOMLIST_L_CONTENT_EXCHANGE)
+ .register(SITES_SITECOLLECTION_LISTS_CUSTOMLIST_2_LI_CONTENT_EXCHANGE
+ .replaceInContent("data ItemCount=\"1\"", "data ItemCount=\"0\""))
+ .register(new URLSegmentsExchange(
+ "http://localhost:1/sites/SiteCollection/Lists/Custom List"
+ + "/Attachments/2/1046000.pdf", false, null, null, null, null));
+
+ final String site = "http://localhost:1/sites/SiteCollection";
+ final String attachmentId = site
+ + "/Lists/Custom List/Attachments/2/1046000.pdf";
+ adaptor = new SharePointAdaptor(initableSoapFactory,
+ new HttpClient() {
+ @Override
+ public FileInfo issueGetRequest(URL url,
+ List<String> authenticationCookies) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public String getRedirectLocation(URL url,
+ List<String> authenticationCookies) throws IOException {
+ assertEquals(
+ "http://localhost:1/sites/SiteCollection/Lists/Custom%20List",
+ url.toString());
+
+ return "http://localhost:1/sites/SiteCollection/Lists/Custom List"
+ + "/AllItems.aspx";
+ }
+ }, executorFactory, new MockAuthenticationClientFactoryForms());
+ adaptor.init(new MockAdaptorContext(config, pusher));
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ GetContentsRequest request = new GetContentsRequest(
+ new DocId(attachmentId));
+ GetContentsResponse response = new GetContentsResponse(baos);
+ adaptor.new SiteAdaptor("http://localhost:1/sites/SiteCollection",
+ "http://localhost:1/sites/SiteCollection", siteData,
+ new UnsupportedUserGroupSoap(), new UnsupportedPeopleSoap(),
+ new UnsupportedCallable<MemberIdMapping>(),
+ new UnsupportedCallable<MemberIdMapping>())
+ .getDocContent(request, response);
+ assertTrue(response.isNotFound());
+ }
@Test
public void testGetDocContentAttachmentSpecialMimeType() throws Exception {