blob: fdb76a890aa28bafc8a4369dd4389e5feedf1601 [file] [log] [blame]
// Copyright 2012 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.enterprise.adaptor.sharepoint;
import static com.google.enterprise.adaptor.sharepoint.SharePointAdaptor.FileInfo;
import static com.google.enterprise.adaptor.sharepoint.SharePointAdaptor.HttpClient;
import static com.google.enterprise.adaptor.sharepoint.SharePointAdaptor.SiteDataFactory;
import static org.junit.Assert.*;
import com.google.common.util.concurrent.Callables;
import com.google.enterprise.adaptor.Acl;
import com.google.enterprise.adaptor.Config;
import com.google.enterprise.adaptor.DocId;
import com.google.enterprise.adaptor.DocIdPusher;
import com.google.enterprise.adaptor.Metadata;
import com.microsoft.schemas.sharepoint.soap.ArrayOfSFPUrl;
import com.microsoft.schemas.sharepoint.soap.ArrayOfSList;
import com.microsoft.schemas.sharepoint.soap.ArrayOfSListWithTime;
import com.microsoft.schemas.sharepoint.soap.ArrayOfSProperty;
import com.microsoft.schemas.sharepoint.soap.ArrayOfSWebWithTime;
import com.microsoft.schemas.sharepoint.soap.ArrayOfString;
import com.microsoft.schemas.sharepoint.soap.ObjectType;
import com.microsoft.schemas.sharepoint.soap.SListMetadata;
import com.microsoft.schemas.sharepoint.soap.SPContentDatabase;
import com.microsoft.schemas.sharepoint.soap.SSiteMetadata;
import com.microsoft.schemas.sharepoint.soap.SWebMetadata;
import com.microsoft.schemas.sharepoint.soap.SiteDataSoap;
import org.junit.*;
import org.junit.rules.ExpectedException;
import java.io.*;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.*;
import java.util.concurrent.Callable;
import java.util.concurrent.atomic.AtomicLong;
import javax.xml.ws.Holder;
import javax.xml.ws.WebServiceException;
/**
* Test cases for {@link SharePointAdaptor}.
*/
public class SharePointAdaptorTest {
private final Charset charset = Charset.forName("UTF-8");
private Config config;
private SharePointAdaptor adaptor;
@Rule
public ExpectedException thrown = ExpectedException.none();
/**
* JAXBContext is expensive to create and is created as part of the class'
* initialization. Do this in a separately so that the timing for this
* initalization does not count toward the first real test run. It looks like
* a bug when a faster test takes longer, just because it ran first.
*/
@BeforeClass
public static void initJaxbContext() {
SharePointAdaptor.init();
}
@Before
public void setup() {
config = new Config();
new SharePointAdaptor().initConfig(config);
config.overrideKey("sharepoint.server", "http://localhost:1");
config.overrideKey("sharepoint.username", "fakeuser");
config.overrideKey("sharepoint.password", "fakepass");
}
@After
public void teardown() {
if (adaptor != null) {
adaptor.destroy();
}
}
@Test
public void testConstructor() {
new SharePointAdaptor();
}
@Test
public void testNullSiteDataFactory() {
thrown.expect(NullPointerException.class);
new SharePointAdaptor(null, new UnsupportedHttpClient());
}
@Test
public void testNullHttpClient() {
thrown.expect(NullPointerException.class);
new SharePointAdaptor(new UnsupportedSiteDataFactory(), null);
}
@Test
public void testInitDestroy() throws IOException {
adaptor = new SharePointAdaptor(new UnsupportedSiteDataFactory(),
new UnsupportedHttpClient());
adaptor.init(new MockAdaptorContext(config, null));
adaptor.destroy();
adaptor = null;
}
@Test
public void testGetDocContentWrongServer() throws IOException {
class WrongServerSiteData extends UnsupportedSiteData {
@Override
public void getSiteAndWeb(String strUrl, Holder<Long> getSiteAndWebResult,
Holder<String> strSite, Holder<String> strWeb) {
assertEquals("http://wronghost:1/", strUrl);
setValue(getSiteAndWebResult, 1L);
setValue(strSite, null);
setValue(strWeb, null);
}
}
adaptor = new SharePointAdaptor(
new SingleSiteDataFactory(new WrongServerSiteData(),
"http://localhost:1/_vti_bin/SiteData.asmx"),
new UnsupportedHttpClient());
adaptor.init(new MockAdaptorContext(config, null));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GetContentsRequest request = new GetContentsRequest(
new DocId("http://wronghost:1/"));
GetContentsResponse response = new GetContentsResponse(baos);
adaptor.getDocContent(request, response);
assertTrue(response.isNotFound());
}
@Test
public void testGetDocContentWrongPage() throws IOException {
final String wrongPage = "http://localhost:1/wrongPage";
class WrongPageSiteData extends UnsupportedSiteData {
@Override
public void getSiteAndWeb(String strUrl, Holder<Long> getSiteAndWebResult,
Holder<String> strSite, Holder<String> strWeb) {
assertEquals(wrongPage, strUrl);
setValue(getSiteAndWebResult, 0L);
setValue(strSite, "http://localhost:1");
setValue(strWeb, "http://localhost:1");
}
@Override
public void getURLSegments(String strURL,
Holder<Boolean> getURLSegmentsResult, Holder<String> strWebID,
Holder<String> strBucketID, Holder<String> strListID,
Holder<String> strItemID) {
assertEquals(wrongPage, strURL);
setValue(getURLSegmentsResult, false);
setValue(strWebID, null);
setValue(strBucketID, null);
setValue(strListID, null);
setValue(strItemID, null);
}
}
adaptor = new SharePointAdaptor(
new SingleSiteDataFactory(new WrongPageSiteData(),
"http://localhost:1/_vti_bin/SiteData.asmx"),
new UnsupportedHttpClient());
adaptor.init(new MockAdaptorContext(config, null));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GetContentsRequest request = new GetContentsRequest(new DocId(wrongPage));
GetContentsResponse response = new GetContentsResponse(baos);
adaptor.getDocContent(request, response);
assertTrue(response.isNotFound());
}
@Test
public void testGetDocContentVirtualServer() throws IOException {
final String getContentVirtualServer
= "<VirtualServer>"
+ "<Metadata URL=\"http://localhost:1/\" />"
+ "<ContentDatabases>"
+ "<ContentDatabase ID=\"{4fb7dea1-2912-4927-9eda-1ea2f0977cf8}\" />"
+ "</ContentDatabases>"
+ "<Policies AnonymousGrantMask=\"0\" AnonymousDenyMask=\"0\">"
+ "<PolicyUser LoginName=\"NT AUTHORITY\\LOCAL SERVICE\""
+ " Sid=\"S-1-5-19\" GrantMask=\"4611686224789442657\" DenyMask=\"0\"/>"
+ "<PolicyUser LoginName=\"GDC-PSL\\spuser1\""
+ " Sid=\"S-1-5-21-736914693-3137354690-2813686979-1130\""
+ " GrantMask=\"4611686224789442657\" DenyMask=\"0\"/>"
+ "<PolicyUser LoginName=\"GDC-PSL\\Administrator\""
+ " Sid=\"S-1-5-21-736914693-3137354690-2813686979-500\""
+ " GrantMask=\"9223372036854775807\" DenyMask=\"0\"/>"
+ "</Policies></VirtualServer>";
final String getContentContentDatabase
= "<ContentDatabase>"
+ "<Metadata ChangeId=\"1;0;4fb7dea1-2912-4927-9eda-1ea2f0977cf8;634727"
+ "056594000000;603\""
+ " ID=\"{4fb7dea1-2912-4927-9eda-1ea2f0977cf8}\" />"
+ "<Sites>"
+ "<Site URL=\"http://localhost:1\""
+ " ID=\"{bb3bb2dd-6ea7-471b-a361-6fb67988755c}\" />"
+ "<Site URL=\"http://localhost:1/sites/SiteCollection\""
+ " ID=\"{5cbcd3b1-fca9-48b2-92db-3b5de26f837d}\" />"
+ "</Sites></ContentDatabase>";
class VirtualServerSiteData extends UnsupportedSiteData {
@Override
public void getContent(ObjectType objectType, String objectId,
String folderUrl, String itemId, boolean retrieveChildItems,
boolean securityOnly, Holder<String> lastItemIdOnPage,
Holder<String> getContentResult) {
setValue(lastItemIdOnPage, null);
if (ObjectType.VIRTUAL_SERVER.equals(objectType)) {
assertEquals(true, retrieveChildItems);
assertEquals(false, securityOnly);
setValue(getContentResult, getContentVirtualServer);
} else if (ObjectType.CONTENT_DATABASE.equals(objectType)) {
assertEquals(true, retrieveChildItems);
assertEquals(false, securityOnly);
assertEquals("{4fb7dea1-2912-4927-9eda-1ea2f0977cf8}", objectId);
setValue(getContentResult, getContentContentDatabase);
} else {
fail("Unknown object type: " + objectType);
throw new AssertionError();
}
}
}
adaptor = new SharePointAdaptor(
new SingleSiteDataFactory(new VirtualServerSiteData(),
"http://localhost:1/_vti_bin/SiteData.asmx"),
new UnsupportedHttpClient());
adaptor.init(new MockAdaptorContext(config, null));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GetContentsResponse response = new GetContentsResponse(baos);
adaptor.getDocContent(new GetContentsRequest(new DocId("")), response);
String responseString = new String(baos.toByteArray(), charset);
final String golden = "<!DOCTYPE html>\n"
+ "<html><head><title>Virtual Server http://localhost:1/</title></head>"
+ "<body><h1>Virtual Server http://localhost:1/</h1>"
+ "<p>Sites</p><ul>"
// These are relative URLs to DocIds that are URLs, and thus the "./"
// prefix is correct.
+ "<li><a href=\"./http://localhost:1\">localhost:1</a></li>"
+ "<li><a href=\"./http://localhost:1/sites/SiteCollection\">"
+ "SiteCollection</a></li>"
+ "</ul></body></html>";
assertEquals(golden, responseString);
List<String> permit = Arrays.asList("GDC-PSL\\Administrator",
"GDC-PSL\\spuser1", "NT AUTHORITY\\LOCAL SERVICE");
assertEquals(new Acl.Builder()
.setInheritanceType(Acl.InheritanceType.PARENT_OVERRIDES)
.setPermitUsers(permit).setPermitGroups(permit).build(),
response.getAcl());
}
@Test
public void testGetDocContentSiteCollection() throws IOException {
final String getContentSiteCollection
= "<Site>"
+ "<Metadata URL=\"http://localhost:1\""
+ " ID=\"{bb3bb2dd-6ea7-471b-a361-6fb67988755c}\""
+ " LastModified=\"2012-06-25 22:29:58Z\" PortalURL=\"\""
+ " UserProfileGUID=\"\""
+ " RootWebId=\"{b2ea1067-3a54-4ab7-a459-c8ec864b97eb}\""
+ " ChangeId=\"1;1;bb3bb2dd-6ea7-471b-a361-6fb67988755c;634762601982930"
+ "000;726\" />"
+ "<Groups><Group>"
+ "<Group ID=\"3\" Name=\"chinese1 Owners\""
+ " Description=\"Use this group to give people full control permission"
+ "s to the SharePoint site: chinese1\" OwnerID=\"3\""
+ " OwnerIsUser=\"False\" />"
+ "<Users>"
+ "<User ID=\"1\" Sid=\"S-1-5-21-736914693-3137354690-2813686979-500\""
+ " Name=\"GDC-PSL\\administrator\""
+ " LoginName=\"GDC-PSL\\administrator\" Email=\"\" Notes=\"\""
+ " IsSiteAdmin=\"True\" IsDomainGroup=\"False\" />"
+ "</Users></Group><Group>"
+ "<Group ID=\"5\" Name=\"chinese1 Members\""
+ " Description=\"Use this group to give people contribute permissions "
+ "to the SharePoint site: chinese1\" OwnerID=\"3\""
+ " OwnerIsUser=\"False\" />"
+ "<Users>"
+ "<User ID=\"6\" Sid=\"S-1-5-21-736914693-3137354690-2813686979-1132\""
+ " Name=\"spuser2\" LoginName=\"GDC-PSL\\spuser2\" Email=\"\""
+ " Notes=\"\" IsSiteAdmin=\"False\" IsDomainGroup=\"False\" />"
+ "<User ID=\"7\" Sid=\"S-1-5-32-545\" Name=\"BUILTIN\\users\""
+ " LoginName=\"BUILTIN\\users\" Email=\"\" Notes=\"\""
+ " IsSiteAdmin=\"False\" IsDomainGroup=\"True\" />"
+ "<User ID=\"9\" Sid=\"S-1-5-21-736914693-3137354690-2813686979-1134\""
+ " Name=\"spuser4\" LoginName=\"GDC-PSL\\spuser4\" Email=\"\""
+ " Notes=\"\" IsSiteAdmin=\"False\" IsDomainGroup=\"False\" />"
+ "</Users></Group><Group>"
+ "<Group ID=\"4\" Name=\"chinese1 Visitors\""
+ " Description=\"Use this group to give people read permissions to the"
+ " SharePoint site: chinese1\" OwnerID=\"3\" OwnerIsUser=\"False\" />"
+ "<Users /></Group></Groups>"
+ "<Web>"
+ "<Metadata URL=\"http://localhost:1\""
+ " LastModified=\"2012-06-25 22:29:58Z\""
+ " Created=\"2011-10-14 18:59:25Z\""
+ " ID=\"{b2ea1067-3a54-4ab7-a459-c8ec864b97eb}\" Title=\"chinese1\""
+ " Description=\"\" Author=\"GDC-PSL\\administrator\""
+ " Language=\"1033\" CRC=\"1158260233\" NoIndex=\"False\""
+ " DefaultHomePage=\"\" ExternalSecurity=\"False\""
+ " ScopeID=\"{01abac8c-66c8-4fed-829c-8dd02bbf40dd}\""
+ " AllowAnonymousAccess=\"False\" AnonymousViewListItems=\"False\""
+ " AnonymousPermMask=\"0\" />"
+ "<Users>"
+ "<User ID=\"1\" Sid=\"S-1-5-21-736914693-3137354690-2813686979-500\""
+ " Name=\"GDC-PSL\\administrator\""
+ " LoginName=\"GDC-PSL\\administrator\" Email=\"\" Notes=\"\""
+ " IsSiteAdmin=\"True\" IsDomainGroup=\"False\" />"
+ "<User ID=\"2\" Sid=\"S-1-5-21-736914693-3137354690-2813686979-1130\""
+ " Name=\"spuser1\" LoginName=\"GDC-PSL\\spuser1\" Email=\"\""
+ " Notes=\"\" IsSiteAdmin=\"True\" IsDomainGroup=\"False\" />"
+ "<User ID=\"6\" Sid=\"S-1-5-21-736914693-3137354690-2813686979-1132\""
+ " Name=\"spuser2\" LoginName=\"GDC-PSL\\spuser2\" Email=\"\""
+ " Notes=\"\" IsSiteAdmin=\"False\" IsDomainGroup=\"False\" />"
+ "</Users>"
+ "<ACL><permissions>"
+ "<permission memberid='2' mask='206292717568' />"
+ "<permission memberid='3' mask='9223372036854775807' />"
+ "<permission memberid='5' mask='1856436900591' />"
+ "<permission memberid='6' mask='206292717568' />"
+ "</permissions></ACL>"
+ "<Webs>"
+ "<Web URL=\"http://localhost:1/somesite\""
+ " ID=\"{ee63e7d0-da23-4553-9f14-359f1cc1bf1c}\""
+ " LastModified=\"2012-06-25 22:29:58Z\" />"
+ "</Webs><Lists>"
+ "<List ID=\"{133fcb96-7e9b-46c9-b5f3-09770a35ad8a}\""
+ " LastModified=\"2012-06-01 22:00:07Z\""
+ " DefaultViewUrl=\"/Lists/Announcements/AllItems.aspx\" />"
+ "<List ID=\"{648f6636-3d90-4565-86b9-2dd7611fc855}\""
+ " LastModified=\"2012-06-01 22:39:22Z\""
+ " DefaultViewUrl=\"/Shared Documents/Forms/AllItems.aspx\" />"
+ "</Lists>"
+ "<FPFolder><Folders>"
+ "<Folder URL=\"Lists\" ID=\"{c2c6cfcc-439e-4372-8a7a-87bec657eebf}\""
+ " LastModified=\"2012-06-25 22:29:58Z\" />"
+ "</Folders><Files>"
+ "<File URL=\"default.aspx\""
+ " ID=\"{1bdad8a3-376d-448c-b9c3-de91a6152687}\""
+ " LastModified=\"2012-06-25 22:29:58Z\" />"
+ "</Files></FPFolder></Web></Site>";
final String getContentSite
= "<Web>"
+ "<Metadata URL=\"http://localhost:1\""
+ " LastModified=\"2012-05-15 19:07:39Z\""
+ " Created=\"2011-10-14 18:59:25Z\""
+ " ID=\"{b2ea1067-3a54-4ab7-a459-c8ec864b97eb}\""
+ " Title=\"chinese1\" Description=\"\""
+ " Author=\"GDC-PSL\\administrator\" Language=\"1033\""
+ " CRC=\"558566148\" NoIndex=\"False\" DefaultHomePage=\"\""
+ " ExternalSecurity=\"False\""
+ " ScopeID=\"{01abac8c-66c8-4fed-829c-8dd02bbf40dd}\""
+ " AllowAnonymousAccess=\"False\" AnonymousViewListItems=\"False\""
+ " AnonymousPermMask=\"0\" />"
+ "<Users>"
+ "<User ID=\"1\" Sid=\"S-1-5-21-736914693-3137354690-2813686979-500\""
+ " Name=\"GDC-PSL\\administrator\""
+ " LoginName=\"GDC-PSL\\administrator\" Email=\"\" Notes=\"\""
+ " IsSiteAdmin=\"True\" IsDomainGroup=\"False\" />"
+ "<User ID=\"2\" Sid=\"S-1-5-21-736914693-3137354690-2813686979-1130\""
+ " Name=\"spuser1\" LoginName=\"GDC-PSL\\spuser1\" Email=\"\""
+ " Notes=\"\" IsSiteAdmin=\"True\" IsDomainGroup=\"False\" />"
+ "</Users>"
+ "<ACL><permissions>"
+ "<permission memberid='2' mask='9223372036854775807' />"
+ "<permission memberid='3' mask='9223372036854775807' />"
+ "<permission memberid='4' mask='756052856929' />"
+ "<permission memberid='5' mask='1856436900591' />"
+ "</permissions>"
+ "</ACL>"
+ "<Webs>"
+ "<Web URL=\"http://localhost:1/somesite\""
+ " ID=\"{ee63e7d0-da23-4553-9f14-359f1cc1bf1c}\""
+ " LastModified=\"2012-05-15 19:07:39Z\" />"
+ "</Webs><Lists>"
+ "<List ID=\"{133fcb96-7e9b-46c9-b5f3-09770a35ad8a}\""
+ " LastModified=\"2012-05-15 18:21:38Z\""
+ " DefaultViewUrl=\"/Lists/Announcements/AllItems.aspx\" />"
+ "<List ID=\"{648f6636-3d90-4565-86b9-2dd7611fc855}\""
+ " LastModified=\"2012-05-15 19:07:40Z\""
+ " DefaultViewUrl=\"/Shared Documents/Forms/AllItems.aspx\" />"
+ "</Lists>"
+ "<FPFolder><Folders>"
+ "<Folder URL=\"Lists\" ID=\"{c2c6cfcc-439e-4372-8a7a-87bec657eebf}\""
+ " LastModified=\"2012-05-15 19:07:39Z\" />"
+ "</Folders><Files>"
+ "<File URL=\"default.aspx\""
+ " ID=\"{1bdad8a3-376d-448c-b9c3-de91a6152687}\""
+ " LastModified=\"2012-05-15 19:07:39Z\" />"
+ "</Files></FPFolder></Web>";
class SiteCollectionSiteData extends UnsupportedSiteData {
private final String endpoint;
public SiteCollectionSiteData(String endpoint) {
this.endpoint = endpoint;
}
@Override
public void getSiteAndWeb(String strUrl, Holder<Long> getSiteAndWebResult,
Holder<String> strSite, Holder<String> strWeb) {
assertEquals(endpoint, "http://localhost:1/_vti_bin/SiteData.asmx");
assertEquals("http://localhost:1/sites/SiteCollection", strUrl);
setValue(getSiteAndWebResult, 0L);
setValue(strSite, "http://localhost:1/sites/SiteCollection");
setValue(strWeb, "http://localhost:1/sites/SiteCollection");
}
@Override
public void getURLSegments(String strURL,
Holder<Boolean> getURLSegmentsResult, Holder<String> strWebID,
Holder<String> strBucketID, Holder<String> strListID,
Holder<String> strItemID) {
assertEquals(endpoint,
"http://localhost:1/sites/SiteCollection/_vti_bin/SiteData.asmx");
assertEquals("http://localhost:1/sites/SiteCollection", strURL);
setValue(getURLSegmentsResult, true);
setValue(strWebID, null);
setValue(strBucketID, null);
setValue(strListID, null);
setValue(strItemID, null);
}
@Override
public void getContent(ObjectType objectType, String objectId,
String folderUrl, String itemId, boolean retrieveChildItems,
boolean securityOnly, Holder<String> lastItemIdOnPage,
Holder<String> getContentResult) {
if (objectType.equals(ObjectType.SITE)) {
assertEquals(true, retrieveChildItems);
assertEquals(false, securityOnly);
assertEquals(null, objectId);
setValue(lastItemIdOnPage, null);
setValue(getContentResult, getContentSite);
} else if (objectType.equals(ObjectType.SITE_COLLECTION)) {
assertEquals(true, retrieveChildItems);
assertEquals(false, securityOnly);
assertEquals(null, objectId);
setValue(lastItemIdOnPage, null);
setValue(getContentResult, getContentSiteCollection);
} else {
fail("Unexpected objectType: " + objectType);
}
}
}
adaptor = new SharePointAdaptor(new SiteDataFactory() {
@Override
public SiteDataSoap newSiteData(String endpoint) {
return new SiteCollectionSiteData(endpoint);
}
}, new UnsupportedHttpClient());
adaptor.init(new MockAdaptorContext(config, null));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GetContentsRequest request = new GetContentsRequest(
new DocId("http://localhost:1/sites/SiteCollection"));
GetContentsResponse response = new GetContentsResponse(baos);
adaptor.getDocContent(request, response);
String responseString = new String(baos.toByteArray(), charset);
final String golden = "<!DOCTYPE html>\n"
+ "<html><head><title>Site chinese1</title></head>"
+ "<body><h1>Site chinese1</h1>"
+ "<p>Sites</p>"
+ "<ul><li><a href=\"../somesite\">"
+ "http://localhost:1/somesite</a></li></ul>"
+ "<p>Lists</p>"
+ "<ul><li><a href=\"../Lists/Announcements/AllItems.aspx\">"
+ "/Lists/Announcements/AllItems.aspx</a></li>"
+ "<li><a href=\"../Shared%20Documents/Forms/AllItems.aspx\">"
+ "/Shared Documents/Forms/AllItems.aspx</a>"
+ "</li></ul>"
+ "<p>Folders</p>"
+ "<ul><li><a href=\"SiteCollection/Lists\">Lists</a></li></ul>"
+ "<p>List Items</p>"
+ "<ul><li><a href=\"SiteCollection/default.aspx\">"
+ "default.aspx</a></li></ul>"
+ "</body></html>";
assertEquals(golden, responseString);
assertEquals(new Acl.Builder()
.setInheritFrom(new DocId(""))
.setInheritanceType(Acl.InheritanceType.AND_BOTH_PERMIT)
.setPermitGroups(Arrays.asList("chinese1 Members", "chinese1 Owners",
"chinese1 Visitors"))
.setPermitUsers(Arrays.asList("GDC-PSL\\spuser1")).build(),
response.getAcl());
}
@Test
public void testGetDocContentList() throws IOException {
final String getContentListResponse
= "<List>"
+ "<Metadata ID=\"{6f33949a-b3ff-4b0c-ba99-93cb518ac2c0}\""
+ " LastModified=\"2012-05-04 21:24:32Z\" Title=\"Custom List\""
+ " DefaultTitle=\"True\" Description=\"\" BaseType=\"GenericList\""
+ " BaseTemplate=\"GenericList\""
+ " DefaultViewUrl=\"/sites/SiteCollection/Lists/Custom List/AllItems.a"
+ "spx\""
+ " DefaultViewItemUrl=\"/sites/SiteCollection/Lists/Custom List/DispFo"
+ "rm.aspx\""
+ " RootFolder=\"Lists/Custom List\" Author=\"System Account\""
+ " ItemCount=\"7\" ReadSecurity=\"1\" AllowAnonymousAccess=\"False\""
+ " AnonymousViewListItems=\"False\" AnonymousPermMask=\"0\""
+ " CRC=\"1334405648\" NoIndex=\"False\""
+ " ScopeID=\"{f9cb02b3-7f29-4cac-804f-ba6e14f1eb39}\" />"
+ "<ACL><permissions>"
+ "<permission memberid='1' mask='206292717568' />"
+ "<permission memberid='3' mask='9223372036854775807' />"
+ "<permission memberid='4' mask='756052856929' />"
+ "<permission memberid='5' mask='1856436900591' />"
+ "</permissions></ACL>"
+ "<Views>"
+ "<View URL=\"Lists/Custom List/AllItems.aspx\""
+ " ID=\"{18b67349-78bd-49a2-ba1a-cdbc048adf0b}\" Title=\"All Items\""
+ " />"
+ "</Views>"
+ "<Schema>"
+ "<Field Name=\"Title\" Title=\"Title\" Type=\"Text\" />"
+ "<Field Name=\"Additional_x0020_Info\" Title=\"Additional Info\""
+ " Type=\"Text\" />"
+ "<Field Name=\"ContentType\" Title=\"Content Type\" Type=\"Choice\""
+ " />"
+ "<Field Name=\"ID\" Title=\"ID\" Type=\"Counter\" />"
+ "<Field Name=\"Modified\" Title=\"Modified\" Type=\"DateTime\" />"
+ "<Field Name=\"Created\" Title=\"Created\" Type=\"DateTime\" />"
+ "<Field Name=\"Author\" Title=\"Created By\" Type=\"User\" />"
+ "<Field Name=\"Editor\" Title=\"Modified By\" Type=\"User\" />"
+ "<Field Name=\"_UIVersionString\" Title=\"Version\" Type=\"Text\" />"
+ "<Field Name=\"Attachments\" Title=\"Attachments\""
+ " Type=\"Attachments\" />"
+ "<Field Name=\"Edit\" Title=\"Edit\" Type=\"Computed\" />"
+ "<Field Name=\"LinkTitleNoMenu\" Title=\"Title\" Type=\"Computed\" />"
+ "<Field Name=\"LinkTitle\" Title=\"Title\" Type=\"Computed\" />"
+ "<Field Name=\"DocIcon\" Title=\"Type\" Type=\"Computed\" />"
+ "</Schema></List>";
final String getContentFolderResponse
= "<Folder><Metadata>"
+ "<scope id=\"{f9cb02b3-7f29-4cac-804f-ba6e14f1eb39}\">"
+ "<permissions>"
+ "<permission memberid='1' mask='206292717568' />"
+ "<permission memberid='3' mask='9223372036854775807' />"
+ "<permission memberid='4' mask='756052856929' />"
+ "<permission memberid='5' mask='1856436900591' />"
+ "</permissions>"
+ "</scope>"
+ "</Metadata>"
+ "<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'"
+ " xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'"
+ " xmlns:rs='urn:schemas-microsoft-com:rowset'"
+ " xmlns:z='#RowsetSchema'>"
+ "<s:Schema id='RowsetSchema'>"
+ "<s:ElementType name='row' content='eltOnly' rs:CommandTimeout='30'>"
+ "<s:AttributeType name='ows_ContentTypeId' rs:name='Content Type ID'"
+ " rs:number='1'>"
+ "<s:datatype dt:type='int' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Title' rs:name='Title' rs:number='2'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__ModerationComments'"
+ " rs:name='Approver Comments' rs:number='3'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_File_x0020_Type' rs:name='File Type'"
+ " rs:number='4'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Additional_x0020_Info'"
+ " rs:name='Additional Info' rs:number='5'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ContentType' rs:name='Content Type'"
+ " rs:number='6'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ID' rs:name='ID' rs:number='7'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Modified' rs:name='Modified'"
+ " rs:number='8'>"
+ "<s:datatype dt:type='datetime' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Created' rs:name='Created' rs:number='9'>"
+ "<s:datatype dt:type='datetime' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Author' rs:name='Created By'"
+ " rs:number='10'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Editor' rs:name='Modified By'"
+ " rs:number='11'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__HasCopyDestinations'"
+ " rs:name='Has Copy Destinations' rs:number='12'>"
+ "<s:datatype dt:type='boolean' dt:maxLength='1' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__CopySource' rs:name='Copy Source'"
+ " rs:number='13'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_owshiddenversion'"
+ " rs:name='owshiddenversion' rs:number='14'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_WorkflowVersion'"
+ " rs:name='Workflow Version' rs:number='15'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__UIVersion' rs:name='UI Version'"
+ " rs:number='16'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__UIVersionString' rs:name='Version'"
+ " rs:number='17'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Attachments' rs:name='Attachments'"
+ " rs:number='18'>"
+ "<s:datatype dt:type='boolean' dt:maxLength='1' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__ModerationStatus'"
+ " rs:name='Approval Status' rs:number='19'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkTitleNoMenu' rs:name='Title'"
+ " rs:number='20'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkTitle' rs:name='Title'"
+ " rs:number='21'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_SelectTitle' rs:name='Select'"
+ " rs:number='22'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_InstanceID' rs:name='Instance ID'"
+ " rs:number='23'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Order' rs:name='Order' rs:number='24'>"
+ "<s:datatype dt:type='float' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_GUID' rs:name='GUID' rs:number='25'>"
+ "<s:datatype dt:type='string' dt:maxLength='38' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_WorkflowInstanceID'"
+ " rs:name='Workflow Instance ID' rs:number='26'>"
+ "<s:datatype dt:type='string' dt:maxLength='38' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_FileRef' rs:name='URL Path'"
+ " rs:number='27'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_FileDirRef' rs:name='Path'"
+ " rs:number='28'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Last_x0020_Modified' rs:name='Modified'"
+ " rs:number='29'>"
+ "<s:datatype dt:type='datetime' dt:lookup='true' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Created_x0020_Date' rs:name='Created'"
+ " rs:number='30'>"
+ "<s:datatype dt:type='datetime' dt:lookup='true' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_FSObjType' rs:name='Item Type'"
+ " rs:number='31'>"
+ "<s:datatype dt:type='ui1' dt:lookup='true' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_PermMask'"
+ " rs:name='Effective Permissions Mask' rs:number='32'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_FileLeafRef' rs:name='Name'"
+ " rs:number='33'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_UniqueId' rs:name='Unique Id'"
+ " rs:number='34'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='38' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ProgId' rs:name='ProgId' rs:number='35'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ScopeId' rs:name='ScopeId'"
+ " rs:number='36'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='38' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_HTML_x0020_File_x0020_Type'"
+ " rs:name='HTML File Type' rs:number='37'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__EditMenuTableStart'"
+ " rs:name='Edit Menu Table Start' rs:number='38'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__EditMenuTableEnd'"
+ " rs:name='Edit Menu Table End' rs:number='39'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkFilenameNoMenu' rs:name='Name'"
+ " rs:number='40'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkFilename' rs:name='Name'"
+ " rs:number='41'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_DocIcon' rs:name='Type' rs:number='42'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ServerUrl' rs:name='Server Relative URL'"
+ " rs:number='43'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_EncodedAbsUrl'"
+ " rs:name='Encoded Absolute URL' rs:number='44'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_BaseName' rs:name='File Name'"
+ " rs:number='45'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_MetaInfo' rs:name='Property Bag'"
+ " rs:number='46'>"
+ "<s:datatype dt:type='int' dt:lookup='true' dt:maxLength='2147483646'"
+ " />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__Level' rs:name='Level' rs:number='47'>"
+ "<s:datatype dt:type='ui1' dt:maxLength='1' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__IsCurrentVersion'"
+ " rs:name='Is Current Version' rs:number='48'>"
+ "<s:datatype dt:type='boolean' dt:maxLength='1' />"
+ "</s:AttributeType>"
+ "</s:ElementType></s:Schema><scopes>"
+ "<scope id='{f9cb02b3-7f29-4cac-804f-ba6e14f1eb39}' >"
+ "<permission memberid='1' mask='206292717568' />"
+ "<permission memberid='3' mask='9223372036854775807' />"
+ "<permission memberid='4' mask='756052856929' />"
+ "<permission memberid='5' mask='1856436900591' />"
+ "</scope>"
+ "<scope id='{d3a69dbf-b1ee-4b8d-ad30-5f64b661bf41}' >"
+ "<permission memberid='1' mask='206292717568' />"
+ "<permission memberid='3' mask='9223372036854775807' />"
+ "</scope>"
+ "</scopes>"
+ "<rs:data ItemCount=\"4\">"
+ "<z:row ows_ContentTypeId='0x0100442459C9B5E59C4F9CFDC789A220FC92'"
+ " ows_Title='Outside Folder' ows_ContentType='Item' ows_ID='3'"
+ " ows_Modified='2012-05-01T22:14:17Z'"
+ " ows_Created='2012-05-01T22:14:17Z'"
+ " ows_Author='1073741823;#System Account'"
+ " ows_Editor='1073741823;#System Account' ows_owshiddenversion='1'"
+ " ows_WorkflowVersion='1' ows__UIVersion='512'"
+ " ows__UIVersionString='1.0' ows_Attachments='0'"
+ " ows__ModerationStatus='0' ows_LinkTitleNoMenu='Outside Folder'"
+ " ows_LinkTitle='Outside Folder' ows_SelectTitle='3'"
+ " ows_Order='300.000000000000'"
+ " ows_GUID='{10E17D90-375F-47A5-94EE-6E75A3EF0E2D}'"
+ " ows_FileRef='3;#sites/SiteCollection/Lists/Custom List/3_.000'"
+ " ows_FileDirRef='3;#sites/SiteCollection/Lists/Custom List'"
+ " ows_Last_x0020_Modified='3;#2012-05-01T22:14:17Z'"
+ " ows_Created_x0020_Date='3;#2012-05-01T22:14:17Z'"
+ " ows_FSObjType='3;#0' ows_PermMask='0x7fffffffffffffff'"
+ " ows_FileLeafRef='3;#3_.000'"
+ " ows_UniqueId='3;#{FD87F56D-DBE1-4EB1-8379-0B83082615E0}'"
+ " ows_ProgId='3;#'"
+ " ows_ScopeId='3;#{F9CB02B3-7F29-4CAC-804F-BA6E14F1EB39}'"
+ " ows__EditMenuTableStart='3_.000' ows__EditMenuTableEnd='3'"
+ " ows_LinkFilenameNoMenu='3_.000' ows_LinkFilename='3_.000'"
+ " ows_ServerUrl='/sites/SiteCollection/Lists/Custom List/3_.000'"
+ " ows_EncodedAbsUrl='http://w2k2r2-sp07-2.gdc-psl.net:2900/sites/Site"
+ "Collection/Lists/Custom%20List/3_.000' ows_BaseName='3_'"
+ " ows_MetaInfo='3;#' ows__Level='1' ows__IsCurrentVersion='1'"
+ " ows_ServerRedirected='0'/>"
+ "<z:row ows_ContentTypeId='0x01200077DD29735CE61148A73F540231F24430'"
+ " ows_Title='Test Folder' ows_ContentType='Folder' ows_ID='1'"
+ " ows_Modified='2012-05-01T22:13:47Z'"
+ " ows_Created='2012-05-01T22:13:47Z'"
+ " ows_Author='1073741823;#System Account'"
+ " ows_Editor='1073741823;#System Account' ows_owshiddenversion='1'"
+ " ows_WorkflowVersion='1' ows__UIVersion='512'"
+ " ows__UIVersionString='1.0' ows_Attachments='0'"
+ " ows__ModerationStatus='0' ows_LinkTitleNoMenu='Test Folder'"
+ " ows_LinkTitle='Test Folder' ows_SelectTitle='1'"
+ " ows_Order='100.000000000000'"
+ " ows_GUID='{C099F4ED-6E96-4A00-B94A-EE443061EE49}'"
+ " ows_FileRef='1;#sites/SiteCollection/Lists/Custom List/Test Folder'"
+ " ows_FileDirRef='1;#sites/SiteCollection/Lists/Custom List'"
+ " ows_Last_x0020_Modified='1;#2012-05-02T21:13:17Z'"
+ " ows_Created_x0020_Date='1;#2012-05-01T22:13:47Z'"
+ " ows_FSObjType='1;#1' ows_PermMask='0x7fffffffffffffff'"
+ " ows_FileLeafRef='1;#Test Folder'"
+ " ows_UniqueId='1;#{CE33B6B7-9F5E-4224-8D77-9C42E6290FE6}'"
+ " ows_ProgId='1;#'"
+ " ows_ScopeId='1;#{D3A69DBF-B1EE-4B8D-AD30-5F64B661BF41}'"
+ " ows__EditMenuTableStart='Test Folder' ows__EditMenuTableEnd='1'"
+ " ows_LinkFilenameNoMenu='Test Folder' ows_LinkFilename='Test Folder'"
+ " ows_ServerUrl='/sites/SiteCollection/Lists/Custom List/Test Folder'"
+ " ows_EncodedAbsUrl='http://w2k2r2-sp07-2.gdc-psl.net:2900/sites/Site"
+ "Collection/Lists/Custom%20List/Test%20Folder'"
+ " ows_BaseName='Test Folder' ows_MetaInfo='1;#' ows__Level='1'"
+ " ows__IsCurrentVersion='1' ows_ServerRedirected='0'/>"
+ "</rs:data>"
+ "</xml></Folder>";
SiteDataSoap siteData = new UnsupportedSiteData() {
@Override
public void getURLSegments(String strURL,
Holder<Boolean> getURLSegmentsResult, Holder<String> strWebID,
Holder<String> strBucketID, Holder<String> strListID,
Holder<String> strItemID) {
assertEquals("http://localhost:1/sites/SiteCollection/Lists/Custom List"
+ "/AllItems.aspx", strURL);
setValue(getURLSegmentsResult, true);
setValue(strWebID, null);
setValue(strBucketID, null);
setValue(strListID, "{6F33949A-B3FF-4B0C-BA99-93CB518AC2C0}");
setValue(strItemID, null);
}
@Override
public void getContent(ObjectType objectType, String objectId,
String folderUrl, String itemId, boolean retrieveChildItems,
boolean securityOnly, Holder<String> lastItemIdOnPage,
Holder<String> getContentResult) {
setValue(lastItemIdOnPage, null);
if (ObjectType.LIST.equals(objectType)) {
assertEquals(false, securityOnly);
assertEquals("{6F33949A-B3FF-4B0C-BA99-93CB518AC2C0}", objectId);
assertEquals(null, folderUrl);
assertEquals(null, itemId);
setValue(getContentResult, getContentListResponse);
} else if (ObjectType.FOLDER.equals(objectType)) {
assertEquals(false, securityOnly);
assertEquals("{6F33949A-B3FF-4B0C-BA99-93CB518AC2C0}", objectId);
assertEquals("", folderUrl);
assertEquals(null, itemId);
assertEquals(null, lastItemIdOnPage.value);
setValue(getContentResult, getContentFolderResponse);
setValue(lastItemIdOnPage, null);
} else {
fail("Unexpected object type: " + objectType);
throw new AssertionError();
}
}
};
final MemberIdMapping memberIdMapping;
{
Map<Integer, String> users = new HashMap<Integer, String>();
Map<Integer, String> groups = new HashMap<Integer, String>();
users.put(1, "GDC-PSL\\administrator");
groups.put(3, "SiteCollection Owners");
groups.put(4, "SiteCollection Visitors");
groups.put(5, "SiteCollection Members");
memberIdMapping = new MemberIdMapping(users, groups);
}
adaptor = new SharePointAdaptor(new UnsupportedSiteDataFactory(),
new UnsupportedHttpClient());
adaptor.init(new MockAdaptorContext(config, null));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GetContentsRequest request = new GetContentsRequest(
new DocId("http://localhost:1/sites/SiteCollection/Lists/Custom List/"
+ "AllItems.aspx"));
GetContentsResponse response = new GetContentsResponse(baos);
adaptor.new SiteDataClient("http://localhost:1/sites/SiteCollection",
"http://localhost:1/sites/SiteCollection",
siteData, Callables.returning(memberIdMapping))
.getDocContent(request, response);
String responseString = new String(baos.toByteArray(), charset);
final String golden
= "<!DOCTYPE html>\n"
+ "<html><head><title>List Custom List</title></head>"
+ "<body><h1>List Custom List</h1>"
+ "<p>List Items</p>"
+ "<ul>"
+ "<li><a href=\"3_.000\">Outside Folder</a></li>"
+ "<li><a href=\"Test%20Folder\">Test Folder</a></li>"
+ "</ul></body></html>";
assertEquals(golden, responseString);
assertEquals(new Acl.Builder()
.setInheritFrom(new DocId("http://localhost:1/sites/SiteCollection"))
.setInheritanceType(Acl.InheritanceType.AND_BOTH_PERMIT)
.setPermitGroups(Arrays.asList("SiteCollection Members",
"SiteCollection Owners", "SiteCollection Visitors")).build(),
response.getAcl());
}
@Test
public void testGetDocContentAttachment() throws IOException {
final String site = "http://localhost:1";
final String attachmentId = site + "/Lists/Custom List/Attachments/2/104600"
+ "0.pdf";
final String listId = site + "/Lists/Custom List/AllItems.aspx";
final String listGuid = "{6F33949A-B3FF-4B0C-BA99-93CB518AC2C0}";
final String getContentListItemAttachments
= "<Item Count=\"1\">"
+ "<Attachment URL=\"http://localhost:1/Lists/Custom List/Attachments/2"
+ "/1046000.pdf\" />"
+ "</Item>";
final String getContentListItemResponse
= "<Item>"
+ "<Metadata>"
+ "<scope id=\"{f9cb02b3-7f29-4cac-804f-ba6e14f1eb39}\"><permissions>"
+ "<permission memberid='1' mask='206292717568' />"
+ "<permission memberid='3' mask='9223372036854775807' />"
+ "<permission memberid='4' mask='756052856929' />"
+ "<permission memberid='5' mask='1856436900591' />"
+ "</permissions></scope>"
+ "</Metadata>"
+ "<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'"
+ " xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'"
+ " xmlns:rs='urn:schemas-microsoft-com:rowset'"
+ " xmlns:z='#RowsetSchema'>"
+ "<s:Schema id='RowsetSchema'>"
+ "<s:ElementType name='row' content='eltOnly' rs:CommandTimeout='30'>"
+ "<s:AttributeType name='ows_ContentTypeId' rs:name='Content Type ID'"
+ " rs:number='1'>"
+ "<s:datatype dt:type='int' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Title' rs:name='Title' rs:number='2'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__ModerationComments'"
+ " rs:name='Approver Comments' rs:number='3'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_File_x0020_Type' rs:name='File Type'"
+ " rs:number='4'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Additional_x0020_Info'"
+ " rs:name='Additional Info' rs:number='5'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ContentType' rs:name='Content Type'"
+ " rs:number='6'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ID' rs:name='ID' rs:number='7'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Modified' rs:name='Modified'"
+ " rs:number='8'>"
+ "<s:datatype dt:type='datetime' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Created' rs:name='Created' rs:number='9'>"
+ "<s:datatype dt:type='datetime' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Author' rs:name='Created By'"
+ " rs:number='10'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Editor' rs:name='Modified By'"
+ " rs:number='11'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__HasCopyDestinations'"
+ " rs:name='Has Copy Destinations' rs:number='12'>"
+ "<s:datatype dt:type='boolean' dt:maxLength='1' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__CopySource' rs:name='Copy Source'"
+ " rs:number='13'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_owshiddenversion'"
+ " rs:name='owshiddenversion' rs:number='14'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_WorkflowVersion'"
+ " rs:name='Workflow Version' rs:number='15'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__UIVersion' rs:name='UI Version'"
+ " rs:number='16'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__UIVersionString' rs:name='Version'"
+ " rs:number='17'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Attachments' rs:name='Attachments'"
+ " rs:number='18'>"
+ "<s:datatype dt:type='boolean' dt:maxLength='1' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__ModerationStatus'"
+ " rs:name='Approval Status' rs:number='19'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkTitleNoMenu' rs:name='Title'"
+ " rs:number='20'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkTitle' rs:name='Title'"
+ " rs:number='21'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_SelectTitle' rs:name='Select'"
+ " rs:number='22'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_InstanceID' rs:name='Instance ID'"
+ " rs:number='23'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Order' rs:name='Order' rs:number='24'>"
+ "<s:datatype dt:type='float' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_GUID' rs:name='GUID' rs:number='25'>"
+ "<s:datatype dt:type='string' dt:maxLength='38' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_WorkflowInstanceID'"
+ " rs:name='Workflow Instance ID' rs:number='26'>"
+ "<s:datatype dt:type='string' dt:maxLength='38' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_FileRef' rs:name='URL Path'"
+ " rs:number='27'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_FileDirRef' rs:name='Path'"
+ " rs:number='28'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Last_x0020_Modified' rs:name='Modified'"
+ " rs:number='29'>"
+ "<s:datatype dt:type='datetime' dt:lookup='true' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Created_x0020_Date' rs:name='Created'"
+ " rs:number='30'>"
+ "<s:datatype dt:type='datetime' dt:lookup='true' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_FSObjType' rs:name='Item Type'"
+ " rs:number='31'>"
+ "<s:datatype dt:type='ui1' dt:lookup='true' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_PermMask'"
+ " rs:name='Effective Permissions Mask' rs:number='32'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_FileLeafRef' rs:name='Name'"
+ " rs:number='33'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_UniqueId' rs:name='Unique Id'"
+ " rs:number='34'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='38' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ProgId' rs:name='ProgId' rs:number='35'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ScopeId' rs:name='ScopeId'"
+ " rs:number='36'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='38' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_HTML_x0020_File_x0020_Type'"
+ " rs:name='HTML File Type' rs:number='37'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__EditMenuTableStart'"
+ " rs:name='Edit Menu Table Start' rs:number='38'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__EditMenuTableEnd'"
+ " rs:name='Edit Menu Table End' rs:number='39'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkFilenameNoMenu' rs:name='Name'"
+ " rs:number='40'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkFilename' rs:name='Name'"
+ " rs:number='41'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_DocIcon' rs:name='Type' rs:number='42'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ServerUrl' rs:name='Server Relative URL'"
+ " rs:number='43'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_EncodedAbsUrl'"
+ " rs:name='Encoded Absolute URL' rs:number='44'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_BaseName' rs:name='File Name'"
+ " rs:number='45'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_MetaInfo' rs:name='Property Bag'"
+ " rs:number='46'>"
+ "<s:datatype dt:type='int' dt:lookup='true' dt:maxLength='2147483646'"
+ " />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__Level' rs:name='Level' rs:number='47'>"
+ "<s:datatype dt:type='ui1' dt:maxLength='1' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__IsCurrentVersion'"
+ " rs:name='Is Current Version' rs:number='48'>"
+ "<s:datatype dt:type='boolean' dt:maxLength='1' />"
+ "</s:AttributeType>"
+ "</s:ElementType></s:Schema><scopes>"
+ "<scope id='{f9cb02b3-7f29-4cac-804f-ba6e14f1eb39}' >"
+ "<permission memberid='1' mask='206292717568' />"
+ "<permission memberid='3' mask='9223372036854775807' />"
+ "<permission memberid='4' mask='756052856929' />"
+ "<permission memberid='5' mask='1856436900591' />"
+ "</scope>"
+ "<scope id='{2e29615c-59e7-493b-b08a-3642949cc069}' >"
+ "<permission memberid='1' mask='9223372036854775807' />"
+ "<permission memberid='3' mask='9223372036854775807' />"
+ "<permission memberid='4' mask='756052856929' />"
+ "<permission memberid='5' mask='1856436900591' />"
+ "</scope>"
+ "</scopes>"
+ "<rs:data ItemCount=\"1\">"
+ "<z:row ows_ContentTypeId='0x0100442459C9B5E59C4F9CFDC789A220FC92'"
+ " ows_Title='Inside Folder' ows_ContentType='Item' ows_ID='2'"
+ " ows_Modified='2012-05-04T21:24:32Z'"
+ " ows_Created='2012-05-01T22:14:06Z'"
+ " ows_Author='1073741823;#System Account'"
+ " ows_Editor='1073741823;#System Account' ows_owshiddenversion='4'"
+ " ows_WorkflowVersion='1' ows__UIVersion='512'"
+ " ows__UIVersionString='1.0' ows_Attachments='1'"
+ " ows__ModerationStatus='0' ows_LinkTitleNoMenu='Inside Folder'"
+ " ows_LinkTitle='Inside Folder' ows_SelectTitle='2'"
+ " ows_Order='200.000000000000'"
+ " ows_GUID='{2C5BEF60-18FA-42CA-B472-7B5E1EC405A5}'"
+ " ows_FileRef='2;#Lists/Custom List/Test Folder/2_.000'"
+ " ows_FileDirRef='2;#Lists/Custom List/Test Folder'"
+ " ows_Last_x0020_Modified='2;#2012-05-01T22:14:06Z'"
+ " ows_Created_x0020_Date='2;#2012-05-01T22:14:06Z'"
+ " ows_FSObjType='2;#0' ows_PermMask='0x7fffffffffffffff'"
+ " ows_FileLeafRef='2;#2_.000'"
+ " ows_UniqueId='2;#{E7156244-AC2F-4402-AA74-7A365726CD02}'"
+ " ows_ProgId='2;#'"
+ " ows_ScopeId='2;#{2E29615C-59E7-493B-B08A-3642949CC069}'"
+ " ows__EditMenuTableStart='2_.000' ows__EditMenuTableEnd='2'"
+ " ows_LinkFilenameNoMenu='2_.000' ows_LinkFilename='2_.000'"
+ " ows_ServerUrl='/Lists/Custom List/Test Folder/2_.000'"
+ " ows_EncodedAbsUrl='http://localhost:1/Lists/Custom%20List/Test%20Fo"
+ "lder/2_.000'"
+ " ows_BaseName='2_' ows_MetaInfo='2;#' ows__Level='1'"
+ " ows__IsCurrentVersion='1' ows_ServerRedirected='0'/>"
+ "</rs:data>"
+ "</xml></Item>";
class ListItemAttachmentsSiteData extends UnsupportedSiteData {
@Override
public void getSiteAndWeb(String strUrl, Holder<Long> getSiteAndWebResult,
Holder<String> strSite, Holder<String> strWeb) {
assertEquals(attachmentId, strUrl);
setValue(getSiteAndWebResult, 0L);
setValue(strSite, site);
setValue(strWeb, site);
}
@Override
public void getURLSegments(String strURL,
Holder<Boolean> getURLSegmentsResult, Holder<String> strWebID,
Holder<String> strBucketID, Holder<String> strListID,
Holder<String> strItemID) {
assertEquals(listId, strURL);
setValue(getURLSegmentsResult, true);
setValue(strWebID, null);
setValue(strBucketID, null);
setValue(strListID, listGuid);
setValue(strItemID, null);
}
@Override
public void getContent(ObjectType objectType, String objectId,
String folderUrl, String itemId, boolean retrieveChildItems,
boolean securityOnly, Holder<String> lastItemIdOnPage,
Holder<String> getContentResult) {
if (ObjectType.LIST_ITEM_ATTACHMENTS.equals(objectType)) {
assertEquals(listGuid, objectId);
assertEquals("", folderUrl);
assertEquals("2", itemId);
setValue(lastItemIdOnPage, null);
setValue(getContentResult, getContentListItemAttachments);
} else if (ObjectType.LIST_ITEM.equals(objectType)) {
assertEquals(false, securityOnly);
assertEquals(listGuid, objectId);
assertEquals("", folderUrl);
assertEquals("2", itemId);
setValue(lastItemIdOnPage, null);
setValue(getContentResult, getContentListItemResponse);
} else {
fail("Unexpected object type: " + objectType);
throw new AssertionError();
}
}
}
final String goldenContents = "attachment contents";
final String goldenContentType = "fake/type";
adaptor = new SharePointAdaptor(
new SingleSiteDataFactory(new ListItemAttachmentsSiteData(),
"http://localhost:1/_vti_bin/SiteData.asmx"),
new HttpClient() {
@Override
public FileInfo issueGetRequest(URL url) {
assertEquals(
"http://localhost:1/Lists/Custom%20List/Attachments/2/1046000.pdf",
url.toString());
InputStream contents = new ByteArrayInputStream(
goldenContents.getBytes(charset));
List<String> headers = Arrays.asList("not-the-Content-Type", "early",
"conTent-TypE", goldenContentType, "Content-Type", "late");
return new FileInfo.Builder(contents).setHeaders(headers).build();
}
});
adaptor.init(new MockAdaptorContext(config, null));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GetContentsRequest request = new GetContentsRequest(
new DocId(attachmentId));
GetContentsResponse response = new GetContentsResponse(baos);
adaptor.getDocContent(request, response);
String responseString = new String(baos.toByteArray(), charset);
assertEquals(goldenContents, responseString);
assertEquals(goldenContentType, response.getContentType());
assertEquals(new Acl.Builder()
.setInheritFrom(new DocId(
"http://localhost:1/Lists/Custom List/Test Folder/2_.000"))
.build(),
response.getAcl());
}
@Test
public void testGetDocContentListItem() throws IOException {
final String getContentListResponse
= "<List>"
+ "<Metadata ID=\"{6f33949a-b3ff-4b0c-ba99-93cb518ac2c0}\""
+ " LastModified=\"2012-05-04 21:24:32Z\" Title=\"Custom List\""
+ " DefaultTitle=\"True\" Description=\"\" BaseType=\"GenericList\""
+ " BaseTemplate=\"GenericList\""
+ " DefaultViewUrl=\"/sites/SiteCollection/Lists/Custom List/AllItems.a"
+ "spx\""
+ " DefaultViewItemUrl=\"/sites/SiteCollection/Lists/Custom List/DispFo"
+ "rm.aspx\""
+ " RootFolder=\"Lists/Custom List\" Author=\"System Account\""
+ " ItemCount=\"7\" ReadSecurity=\"1\" AllowAnonymousAccess=\"False\""
+ " AnonymousViewListItems=\"False\" AnonymousPermMask=\"0\""
+ " CRC=\"1334405648\" NoIndex=\"False\""
+ " ScopeID=\"{f9cb02b3-7f29-4cac-804f-ba6e14f1eb39}\" />"
+ "<ACL><permissions>"
+ "<permission memberid='1' mask='206292717568' />"
+ "<permission memberid='3' mask='9223372036854775807' />"
+ "<permission memberid='4' mask='756052856929' />"
+ "<permission memberid='5' mask='1856436900591' />"
+ "</permissions></ACL>"
+ "<Views>"
+ "<View URL=\"Lists/Custom List/AllItems.aspx\""
+ " ID=\"{18b67349-78bd-49a2-ba1a-cdbc048adf0b}\" Title=\"All Items\""
+ " />"
+ "</Views><Schema>"
+ "<Field Name=\"Title\" Title=\"Title\" Type=\"Text\" />"
+ "<Field Name=\"Additional_x0020_Info\" Title=\"Additional Info\""
+ " Type=\"Text\" />"
+ "<Field Name=\"ContentType\" Title=\"Content Type\" Type=\"Choice\""
+ " />"
+ "<Field Name=\"ID\" Title=\"ID\" Type=\"Counter\" />"
+ "<Field Name=\"Modified\" Title=\"Modified\" Type=\"DateTime\" />"
+ "<Field Name=\"Created\" Title=\"Created\" Type=\"DateTime\" />"
+ "<Field Name=\"Author\" Title=\"Created By\" Type=\"User\" />"
+ "<Field Name=\"Editor\" Title=\"Modified By\" Type=\"User\" />"
+ "<Field Name=\"_UIVersionString\" Title=\"Version\" Type=\"Text\" />"
+ "<Field Name=\"Attachments\" Title=\"Attachments\""
+ " Type=\"Attachments\" />"
+ "<Field Name=\"Edit\" Title=\"Edit\" Type=\"Computed\" />"
+ "<Field Name=\"LinkTitleNoMenu\" Title=\"Title\" Type=\"Computed\" />"
+ "<Field Name=\"LinkTitle\" Title=\"Title\" Type=\"Computed\" />"
+ "<Field Name=\"DocIcon\" Title=\"Type\" Type=\"Computed\" />"
+ "</Schema></List>";
final String getContentListItemResponse
= "<Item>"
+ "<Metadata>"
+ "<scope id=\"{f9cb02b3-7f29-4cac-804f-ba6e14f1eb39}\"><permissions>"
+ "<permission memberid='1' mask='206292717568' />"
+ "<permission memberid='3' mask='9223372036854775807' />"
+ "<permission memberid='4' mask='756052856929' />"
+ "<permission memberid='5' mask='1856436900591' />"
+ "</permissions></scope>"
+ "</Metadata>"
+ "<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'"
+ " xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'"
+ " xmlns:rs='urn:schemas-microsoft-com:rowset'"
+ " xmlns:z='#RowsetSchema'>"
+ "<s:Schema id='RowsetSchema'>"
+ "<s:ElementType name='row' content='eltOnly' rs:CommandTimeout='30'>"
+ "<s:AttributeType name='ows_ContentTypeId' rs:name='Content Type ID'"
+ " rs:number='1'>"
+ "<s:datatype dt:type='int' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Title' rs:name='Title' rs:number='2'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__ModerationComments'"
+ " rs:name='Approver Comments' rs:number='3'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_File_x0020_Type' rs:name='File Type'"
+ " rs:number='4'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Additional_x0020_Info'"
+ " rs:name='Additional Info' rs:number='5'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ContentType' rs:name='Content Type'"
+ " rs:number='6'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ID' rs:name='ID' rs:number='7'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Modified' rs:name='Modified'"
+ " rs:number='8'>"
+ "<s:datatype dt:type='datetime' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Created' rs:name='Created' rs:number='9'>"
+ "<s:datatype dt:type='datetime' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Author' rs:name='Created By'"
+ " rs:number='10'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Editor' rs:name='Modified By'"
+ " rs:number='11'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__HasCopyDestinations'"
+ " rs:name='Has Copy Destinations' rs:number='12'>"
+ "<s:datatype dt:type='boolean' dt:maxLength='1' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__CopySource' rs:name='Copy Source'"
+ " rs:number='13'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_owshiddenversion'"
+ " rs:name='owshiddenversion' rs:number='14'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_WorkflowVersion'"
+ " rs:name='Workflow Version' rs:number='15'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__UIVersion' rs:name='UI Version'"
+ " rs:number='16'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__UIVersionString' rs:name='Version'"
+ " rs:number='17'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Attachments' rs:name='Attachments'"
+ " rs:number='18'>"
+ "<s:datatype dt:type='boolean' dt:maxLength='1' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__ModerationStatus'"
+ " rs:name='Approval Status' rs:number='19'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkTitleNoMenu' rs:name='Title'"
+ " rs:number='20'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkTitle' rs:name='Title'"
+ " rs:number='21'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_SelectTitle' rs:name='Select'"
+ " rs:number='22'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_InstanceID' rs:name='Instance ID'"
+ " rs:number='23'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Order' rs:name='Order' rs:number='24'>"
+ "<s:datatype dt:type='float' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_GUID' rs:name='GUID' rs:number='25'>"
+ "<s:datatype dt:type='string' dt:maxLength='38' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_WorkflowInstanceID'"
+ " rs:name='Workflow Instance ID' rs:number='26'>"
+ "<s:datatype dt:type='string' dt:maxLength='38' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_FileRef' rs:name='URL Path'"
+ " rs:number='27'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_FileDirRef' rs:name='Path'"
+ " rs:number='28'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Last_x0020_Modified' rs:name='Modified'"
+ " rs:number='29'>"
+ "<s:datatype dt:type='datetime' dt:lookup='true' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Created_x0020_Date' rs:name='Created'"
+ " rs:number='30'>"
+ "<s:datatype dt:type='datetime' dt:lookup='true' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_FSObjType' rs:name='Item Type'"
+ " rs:number='31'>"
+ "<s:datatype dt:type='ui1' dt:lookup='true' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_PermMask'"
+ " rs:name='Effective Permissions Mask' rs:number='32'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_FileLeafRef' rs:name='Name'"
+ " rs:number='33'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_UniqueId' rs:name='Unique Id'"
+ " rs:number='34'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='38' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ProgId' rs:name='ProgId' rs:number='35'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ScopeId' rs:name='ScopeId'"
+ " rs:number='36'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='38' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_HTML_x0020_File_x0020_Type'"
+ " rs:name='HTML File Type' rs:number='37'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__EditMenuTableStart'"
+ " rs:name='Edit Menu Table Start' rs:number='38'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__EditMenuTableEnd'"
+ " rs:name='Edit Menu Table End' rs:number='39'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkFilenameNoMenu' rs:name='Name'"
+ " rs:number='40'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkFilename' rs:name='Name'"
+ " rs:number='41'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_DocIcon' rs:name='Type' rs:number='42'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ServerUrl' rs:name='Server Relative URL'"
+ " rs:number='43'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_EncodedAbsUrl'"
+ " rs:name='Encoded Absolute URL' rs:number='44'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_BaseName' rs:name='File Name'"
+ " rs:number='45'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_MetaInfo' rs:name='Property Bag'"
+ " rs:number='46'>"
+ "<s:datatype dt:type='int' dt:lookup='true' dt:maxLength='2147483646'"
+ " />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__Level' rs:name='Level' rs:number='47'>"
+ "<s:datatype dt:type='ui1' dt:maxLength='1' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__IsCurrentVersion'"
+ " rs:name='Is Current Version' rs:number='48'>"
+ "<s:datatype dt:type='boolean' dt:maxLength='1' />"
+ "</s:AttributeType>"
+ "</s:ElementType></s:Schema><scopes>"
+ "<scope id='{f9cb02b3-7f29-4cac-804f-ba6e14f1eb39}' >"
+ "<permission memberid='1' mask='206292717568' />"
+ "<permission memberid='3' mask='9223372036854775807' />"
+ "<permission memberid='4' mask='756052856929' />"
+ "<permission memberid='5' mask='1856436900591' />"
+ "</scope>"
+ "<scope id='{2e29615c-59e7-493b-b08a-3642949cc069}' >"
+ "<permission memberid='1' mask='9223372036854775807' />"
+ "<permission memberid='3' mask='9223372036854775807' />"
+ "<permission memberid='4' mask='756052856929' />"
+ "<permission memberid='5' mask='1856436900591' />"
+ "</scope>"
+ "</scopes>"
+ "<rs:data ItemCount=\"1\">"
+ "<z:row ows_ContentTypeId='0x0100442459C9B5E59C4F9CFDC789A220FC92'"
+ " ows_Title='Inside Folder' ows_ContentType='Item' ows_ID='2'"
+ " ows_Modified='2012-05-04T21:24:32Z'"
+ " ows_Created='2012-05-01T22:14:06Z'"
+ " ows_Author='1073741823;#System Account'"
+ " ows_Editor='1073741823;#System Account' ows_owshiddenversion='4'"
+ " ows_WorkflowVersion='1' ows__UIVersion='512'"
+ " ows__UIVersionString='1.0' ows_Attachments='1'"
+ " ows__ModerationStatus='0' ows_LinkTitleNoMenu='Inside Folder'"
+ " ows_LinkTitle='Inside Folder' ows_SelectTitle='2'"
+ " ows_Order='200.000000000000'"
+ " ows_GUID='{2C5BEF60-18FA-42CA-B472-7B5E1EC405A5}'"
+ " ows_FileRef='2;#sites/SiteCollection/Lists/Custom List/Test Folder/"
+ "2_.000'"
+ " ows_FileDirRef='2;#sites/SiteCollection/Lists/Custom List/Test Fold"
+ "er'"
+ " ows_Last_x0020_Modified='2;#2012-05-01T22:14:06Z'"
+ " ows_Created_x0020_Date='2;#2012-05-01T22:14:06Z'"
+ " ows_FSObjType='2;#0' ows_PermMask='0x7fffffffffffffff'"
+ " ows_FileLeafRef='2;#2_.000'"
+ " ows_UniqueId='2;#{E7156244-AC2F-4402-AA74-7A365726CD02}'"
+ " ows_ProgId='2;#'"
+ " ows_ScopeId='2;#{2E29615C-59E7-493B-B08A-3642949CC069}'"
+ " ows__EditMenuTableStart='2_.000' ows__EditMenuTableEnd='2'"
+ " ows_LinkFilenameNoMenu='2_.000' ows_LinkFilename='2_.000'"
+ " ows_ServerUrl='/sites/SiteCollection/Lists/Custom List/Test Folder/"
+ "2_.000'"
+ " ows_EncodedAbsUrl='http://localhost:1/sites/SiteCollection/Lists/Cu"
+ "stom%20List/Test%20Folder/2_.000'"
+ " ows_BaseName='2_' ows_MetaInfo='2;#' ows__Level='1'"
+ " ows__IsCurrentVersion='1' ows_ServerRedirected='0'/>"
+ "</rs:data>"
+ "</xml></Item>";
final String getContentListItemAttachmentsResponse
= "<Item Count=\"1\">"
+ "<Attachment URL=\"http://localhost:1/sites/SiteCollection/Lists/Cust"
+ "om List/Attachments/2/1046000.pdf\" />"
+ "</Item>";
SiteDataSoap siteData = new UnsupportedSiteData() {
@Override
public void getURLSegments(String strURL,
Holder<Boolean> getURLSegmentsResult, Holder<String> strWebID,
Holder<String> strBucketID, Holder<String> strListID,
Holder<String> strItemID) {
assertEquals("http://localhost:1/sites/SiteCollection/Lists/Custom List"
+ "/Test Folder/2_.000", strURL);
setValue(getURLSegmentsResult, true);
setValue(strWebID, null);
setValue(strBucketID, null);
setValue(strListID, "{6F33949A-B3FF-4B0C-BA99-93CB518AC2C0}");
setValue(strItemID, "2");
}
@Override
public void getContent(ObjectType objectType, String objectId,
String folderUrl, String itemId, boolean retrieveChildItems,
boolean securityOnly, Holder<String> lastItemIdOnPage,
Holder<String> getContentResult) {
setValue(lastItemIdOnPage, null);
if (ObjectType.LIST_ITEM.equals(objectType)) {
assertEquals(false, securityOnly);
assertEquals("{6F33949A-B3FF-4B0C-BA99-93CB518AC2C0}", objectId);
assertEquals("2", itemId);
setValue(getContentResult, getContentListItemResponse);
} else if (ObjectType.LIST_ITEM_ATTACHMENTS.equals(objectType)) {
assertEquals(false, securityOnly);
assertEquals("{6F33949A-B3FF-4B0C-BA99-93CB518AC2C0}", objectId);
assertEquals("2", itemId);
setValue(getContentResult, getContentListItemAttachmentsResponse);
} else if (objectType.equals(ObjectType.LIST)) {
assertEquals(false, retrieveChildItems);
assertEquals(false, securityOnly);
assertEquals("{6F33949A-B3FF-4B0C-BA99-93CB518AC2C0}", objectId);
setValue(getContentResult, getContentListResponse);
} else {
fail("Unexpected object type: " + objectType);
throw new AssertionError();
}
}
};
final MemberIdMapping memberIdMapping;
{
Map<Integer, String> users = new HashMap<Integer, String>();
Map<Integer, String> groups = new HashMap<Integer, String>();
users.put(1, "GDC-PSL\\administrator");
groups.put(3, "SiteCollection Owners");
groups.put(4, "SiteCollection Visitors");
groups.put(5, "SiteCollection Members");
memberIdMapping = new MemberIdMapping(users, groups);
}
adaptor = new SharePointAdaptor(new UnsupportedSiteDataFactory(),
new UnsupportedHttpClient());
adaptor.init(new MockAdaptorContext(config, null));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GetContentsRequest request = new GetContentsRequest(
new DocId("http://localhost:1/sites/SiteCollection/Lists/Custom List/"
+ "Test Folder/2_.000"));
GetContentsResponse response = new GetContentsResponse(baos);
adaptor.new SiteDataClient("http://localhost:1/sites/SiteCollection",
"http://localhost:1/sites/SiteCollection",
siteData, Callables.returning(memberIdMapping))
.getDocContent(request, response);
String responseString = new String(baos.toByteArray(), charset);
final String golden
= "<!DOCTYPE html>\n"
+ "<html><head><title>List Item Inside Folder</title></head>"
+ "<body><h1>List Item Inside Folder</h1>"
+ "<p>Attachments</p><ul>"
+ "<li><a href=\"../Attachments/2/1046000.pdf\">1046000.pdf</a></li>"
+ "</ul></body></html>";
final Metadata goldenMetadata;
{
Metadata meta = new Metadata();
meta.add("Attachments", "1");
meta.add("Author", "System Account");
meta.add("BaseName", "2_");
meta.add("ContentType", "Item");
meta.add("ContentTypeId", "0x0100442459C9B5E59C4F9CFDC789A220FC92");
meta.add("Created", "2012-05-01T22:14:06Z");
meta.add("Created_x0020_Date", "2012-05-01T22:14:06Z");
meta.add("Editor", "System Account");
meta.add("EncodedAbsUrl", "http://localhost:1/sites/SiteCollection/Lists/"
+ "Custom%20List/Test%20Folder/2_.000");
meta.add("FSObjType", "0");
meta.add("FileDirRef",
"sites/SiteCollection/Lists/Custom List/Test Folder");
meta.add("FileLeafRef", "2_.000");
meta.add("FileRef",
"sites/SiteCollection/Lists/Custom List/Test Folder/2_.000");
meta.add("GUID", "{2C5BEF60-18FA-42CA-B472-7B5E1EC405A5}");
meta.add("ID", "2");
meta.add("Last_x0020_Modified", "2012-05-01T22:14:06Z");
meta.add("LinkFilename", "2_.000");
meta.add("LinkFilenameNoMenu", "2_.000");
meta.add("LinkTitle", "Inside Folder");
meta.add("LinkTitleNoMenu", "Inside Folder");
meta.add("Modified", "2012-05-04T21:24:32Z");
meta.add("Order", "200.000000000000");
meta.add("PermMask", "0x7fffffffffffffff");
meta.add("ScopeId", "{2E29615C-59E7-493B-B08A-3642949CC069}");
meta.add("SelectTitle", "2");
meta.add("ServerRedirected", "0");
meta.add("ServerUrl",
"/sites/SiteCollection/Lists/Custom List/Test Folder/2_.000");
meta.add("Title", "Inside Folder");
meta.add("UniqueId", "{E7156244-AC2F-4402-AA74-7A365726CD02}");
meta.add("WorkflowVersion", "1");
meta.add("_EditMenuTableEnd", "2");
meta.add("_EditMenuTableStart", "2_.000");
meta.add("_IsCurrentVersion", "1");
meta.add("_Level", "1");
meta.add("_ModerationStatus", "0");
meta.add("_UIVersion", "512");
meta.add("_UIVersionString", "1.0");
meta.add("owshiddenversion", "4");
goldenMetadata = meta.unmodifiableView();
}
assertEquals(golden, responseString);
assertEquals(goldenMetadata, response.getMetadata());
assertEquals(new Acl.Builder()
.setInheritFrom(new DocId("http://localhost:1/sites/SiteCollection/"
+ "Lists/Custom List/Test Folder"))
.setInheritanceType(Acl.InheritanceType.AND_BOTH_PERMIT)
.setPermitGroups(Arrays.asList("SiteCollection Members",
"SiteCollection Owners", "SiteCollection Visitors"))
.setPermitUsers(Arrays.asList("GDC-PSL\\administrator")).build(),
response.getAcl());
}
@Test
public void testGetDocContentListItemScopeSameAsParent() throws IOException {
final String getContentListResponse
= "<List>"
+ "<Metadata ID=\"{b7f7c386-47b4-4a74-9811-b019c4f050b3}\""
+ " LastModified=\"2011-09-07 06:49:13Z\" Title=\"Announcements\""
+ " DefaultTitle=\"True\""
+ " Description=\"Use this list to track upcoming events, status"
+ " updates or other team news.\""
+ " BaseType=\"GenericList\" BaseTemplate=\"Announcements\""
+ " DefaultViewUrl=\"/tapasnay/Lists/Announcements/AllItems.aspx\""
+ " DefaultViewItemUrl=\"/tapasnay/Lists/Announcements/DispForm.aspx\""
+ " RootFolder=\"Lists/Announcements\""
+ " Author=\"GDC-PSL\\administrator\" ItemCount=\"1\""
+ " ReadSecurity=\"1\" AllowAnonymousAccess=\"False\""
+ " AnonymousViewListItems=\"False\" AnonymousPermMask=\"0\""
+ " CRC=\"4060703200\" NoIndex=\"False\" UseFormsForDisplay=\"True\""
+ " ScopeID=\"{1d857dc3-dd22-4326-95f0-01b27d6da6d6}\" /> "
+ "<ACL>"
+ "<permissions>"
+ "<permission memberid=\"1\" mask=\"206292717568\" />"
+ "</permissions></ACL>"
+ "<Views>"
+ "<View URL=\"Lists/Announcements/AllItems.aspx\""
+ " ID=\"{dbb495af-57a1-4474-a661-085658751de3}\" Title=\"All items\""
+ " AllowedInRoot=\"True\" />"
+ "</Views>"
+ "<Schema>"
+ "<Field Name=\"ID\" Title=\"ID\" Type=\"Counter\""
+ " IsSurveyQuestion=\"False\" />"
+ "<Field Name=\"ContentType\" Title=\"Content Type\" Type=\"Computed\""
+ " IsSurveyQuestion=\"False\" />"
+ "<Field Name=\"Title\" Title=\"Title\" Type=\"Text\""
+ " IsSurveyQuestion=\"False\" />"
+ "<Field Name=\"Modified\" Title=\"Modified\" Type=\"DateTime\""
+ " IsSurveyQuestion=\"False\" />"
+ "<Field Name=\"Created\" Title=\"Created\" Type=\"DateTime\""
+ " IsSurveyQuestion=\"False\" />"
+ "<Field Name=\"Author\" Title=\"Created By\" Type=\"User\""
+ " IsSurveyQuestion=\"False\" />"
+ "<Field Name=\"Editor\" Title=\"Modified By\" Type=\"User\""
+ " IsSurveyQuestion=\"False\" />"
+ "<Field Name=\"_UIVersionString\" Title=\"Version\" Type=\"Text\""
+ " IsSurveyQuestion=\"False\" />"
+ "<Field Name=\"Attachments\" Title=\"Attachments\""
+ " Type=\"Attachments\" IsSurveyQuestion=\"False\" />"
+ "<Field Name=\"Edit\" Title=\"Edit\" Type=\"Computed\""
+ " IsSurveyQuestion=\"False\" />"
+ "<Field Name=\"LinkTitleNoMenu\" Title=\"Title\" Type=\"Computed\""
+ " IsSurveyQuestion=\"False\" />"
+ "<Field Name=\"LinkTitle\" Title=\"Title\" Type=\"Computed\""
+ " IsSurveyQuestion=\"False\" />"
+ "<Field Name=\"DocIcon\" Title=\"Type\" Type=\"Computed\""
+ " IsSurveyQuestion=\"False\" />"
+ "<Field Name=\"ItemChildCount\" Title=\"Item Child Count\""
+ " Type=\"Lookup\" IsSurveyQuestion=\"False\" />"
+ "<Field Name=\"FolderChildCount\" Title=\"Folder Child Count\""
+ " Type=\"Lookup\" IsSurveyQuestion=\"False\" />"
+ "<Field Name=\"Body\" Title=\"Body\" Type=\"Note\""
+ " IsSurveyQuestion=\"False\" />"
+ "<Field Name=\"Expires\" Title=\"Expires\" Type=\"DateTime\""
+ " IsSurveyQuestion=\"False\" />"
+ "</Schema>"
+ "</List>";
final String getContentListItemResponse
= "<Item><Metadata>"
+ "<scope id=\"{1d857dc3-dd22-4326-95f0-01b27d6da6d6}\">"
+ "<permissions>"
+ "<permission memberid=\"1\" mask=\"206292717568\" />"
+ "</permissions>"
+ "</scope>"
+ "</Metadata>"
+ "<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'"
+ " xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'"
+ " xmlns:rs='urn:schemas-microsoft-com:rowset'"
+ " xmlns:z='#RowsetSchema'>"
+ "<s:Schema id='RowsetSchema'>"
+ "<s:ElementType name='row' content='eltOnly' rs:CommandTimeout='30'>"
+ "<s:AttributeType name='ows_ID' rs:name='ID' rs:number='1'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ContentTypeId' rs:name='Content Type ID'"
+ " rs:number='2'>"
+ "<s:datatype dt:type='int' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ContentType' rs:name='Content Type'"
+ " rs:number='3'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Title' rs:name='Title' rs:number='4'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Modified' rs:name='Modified'"
+ " rs:number='5'>"
+ "<s:datatype dt:type='datetime' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Created' rs:name='Created'"
+ " rs:number='6'>"
+ "<s:datatype dt:type='datetime' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Author' rs:name='Created By'"
+ " rs:number='7'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Editor' rs:name='Modified By'"
+ " rs:number='8'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__HasCopyDestinations'"
+ " rs:name='Has Copy Destinations' rs:number='9'>"
+ "<s:datatype dt:type='boolean' dt:maxLength='1' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__CopySource' rs:name='Copy Source'"
+ " rs:number='10'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_owshiddenversion'"
+ " rs:name='owshiddenversion' rs:number='11'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_WorkflowVersion'"
+ " rs:name='Workflow Version' rs:number='12'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__UIVersion'"
+ " rs:name='UI Version' rs:number='13'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__UIVersionString' rs:name='Version'"
+ " rs:number='14'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Attachments' rs:name='Attachments'"
+ " rs:number='15'>"
+ "<s:datatype dt:type='boolean' dt:maxLength='1' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__ModerationStatus'"
+ " rs:name='Approval Status' rs:number='16'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__ModerationComments'"
+ " rs:name='Approver Comments' rs:number='17'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkTitleNoMenu' rs:name='Title'"
+ " rs:number='18'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkTitle' rs:name='Title'"
+ " rs:number='19'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkTitle2' rs:name='Title'"
+ " rs:number='20'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_SelectTitle' rs:name='Select'"
+ " rs:number='21'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_InstanceID' rs:name='Instance ID'"
+ " rs:number='22'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Order' rs:name='Order' rs:number='23'>"
+ "<s:datatype dt:type='float' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_GUID' rs:name='GUID' rs:number='24'>"
+ "<s:datatype dt:type='string' dt:maxLength='38' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_WorkflowInstanceID'"
+ " rs:name='Workflow Instance ID' rs:number='25'>"
+ "<s:datatype dt:type='string' dt:maxLength='38' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_FileRef' rs:name='URL Path'"
+ " rs:number='26'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_FileDirRef' rs:name='Path'"
+ " rs:number='27'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Last_x0020_Modified' rs:name='Modified'"
+ " rs:number='28'>"
+ "<s:datatype dt:type='datetime' dt:lookup='true' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Created_x0020_Date' rs:name='Created'"
+ " rs:number='29'>"
+ "<s:datatype dt:type='datetime' dt:lookup='true' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_FSObjType' rs:name='Item Type'"
+ " rs:number='30'>"
+ "<s:datatype dt:type='ui1' dt:lookup='true' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_SortBehavior' rs:name='Sort Type'"
+ " rs:number='31'>"
+ "<s:datatype dt:type='ui1' dt:lookup='true' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_PermMask'"
+ " rs:name='Effective Permissions Mask' rs:number='32'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_FileLeafRef' rs:name='Name'"
+ " rs:number='33'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_UniqueId' rs:name='Unique Id'"
+ " rs:number='34'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='38' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_SyncClientId' rs:name='Client Id'"
+ " rs:number='35'>"
+ "<s:datatype dt:type='int' dt:lookup='true' dt:maxLength='2147483646'"
+ " />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ProgId' rs:name='ProgId' rs:number='36'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ScopeId' rs:name='ScopeId'"
+ " rs:number='37'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='38' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_File_x0020_Type' rs:name='File Type'"
+ " rs:number='38'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_HTML_x0020_File_x0020_Type'"
+ " rs:name='HTML File Type' rs:number='39'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__EditMenuTableStart'"
+ " rs:name='Edit Menu Table Start' rs:number='40'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__EditMenuTableStart2'"
+ " rs:name='Edit Menu Table Start' rs:number='41'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__EditMenuTableEnd'"
+ " rs:name='Edit Menu Table End' rs:number='42'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkFilenameNoMenu' rs:name='Name'"
+ " rs:number='43'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkFilename' rs:name='Name'"
+ " rs:number='44'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkFilename2' rs:name='Name'"
+ " rs:number='45'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_DocIcon' rs:name='Type' rs:number='46'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ServerUrl' rs:name='Server Relative URL'"
+ " rs:number='47'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_EncodedAbsUrl'"
+ " rs:name='Encoded Absolute URL' rs:number='48'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_BaseName' rs:name='File Name'"
+ " rs:number='49'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_MetaInfo' rs:name='Property Bag'"
+ " rs:number='50'>"
+ "<s:datatype dt:type='int' dt:lookup='true' dt:maxLength='2147483646'"
+ " />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__Level' rs:name='Level' rs:number='51'>"
+ "<s:datatype dt:type='ui1' dt:maxLength='1' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__IsCurrentVersion'"
+ " rs:name='Is Current Version' rs:number='52'>"
+ "<s:datatype dt:type='boolean' dt:maxLength='1' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ItemChildCount'"
+ " rs:name='Item Child Count' rs:number='53'>"
+ "<s:datatype dt:type='i4' dt:lookup='true' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_FolderChildCount'"
+ " rs:name='Folder Child Count' rs:number='54'>"
+ "<s:datatype dt:type='i4' dt:lookup='true' dt:maxLength='510' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Body' rs:name='Body' rs:number='55'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Expires' rs:name='Expires'"
+ " rs:number='56'>"
+ "<s:datatype dt:type='datetime' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "</s:ElementType></s:Schema><scopes>"
+ "</scopes>"
+ "<rs:data ItemCount=\"1\">"
+ "<z:row ows_ID='1'"
+ " ows_ContentTypeId='0x0104007B3DA16495E1404895F5E01885B11519'"
+ " ows_ContentType='Announcement'"
+ " ows_Title='Get Started with Microsoft SharePoint Foundation!'"
+ " ows_Modified='2011-09-07T06:49:13Z'"
+ " ows_Created='2011-09-07T06:49:13Z'"
+ " ows_Author='7;#GDC-PSL\\administrator'"
+ " ows_Editor='7;#GDC-PSL\\administrator' ows_owshiddenversion='1'"
+ " ows_WorkflowVersion='1' ows__UIVersion='512'"
+ " ows__UIVersionString='1.0' ows_Attachments='0'"
+ " ows__ModerationStatus='0'"
+ " ows_LinkTitleNoMenu='Get Started with Microsoft SharePoint "
+ "Foundation!'"
+ " ows_LinkTitle='Get Started with Microsoft SharePoint Foundation!'"
+ " ows_LinkTitle2='Get Started with Microsoft SharePoint Foundation!'"
+ " ows_SelectTitle='1' ows_Order='100.000000000000'"
+ " ows_GUID='{AAFA6C7F-B734-4981-BCCA-8EFF00A701CB}'"
+ " ows_FileRef='1;#tapasnay/Lists/Announcements/1_.000'"
+ " ows_FileDirRef='1;#tapasnay/Lists/Announcements'"
+ " ows_Last_x0020_Modified='1;#2011-09-07T06:49:13Z'"
+ " ows_Created_x0020_Date='1;#2011-09-07T06:49:13Z'"
+ " ows_FSObjType='1;#0' ows_SortBehavior='1;#0'"
+ " ows_PermMask='0x7fffffffffffffff' ows_FileLeafRef='1;#1_.000'"
+ " ows_UniqueId='1;#{08CCA823-9ECF-4F91-8642-510C568230A9}'"
+ " ows_ProgId='1;#'"
+ " ows_ScopeId='1;#{1D857DC3-DD22-4326-95F0-01B27D6DA6D6}'"
+ " ows__EditMenuTableStart='1_.000' ows__EditMenuTableStart2='1'"
+ " ows__EditMenuTableEnd='1' ows_LinkFilenameNoMenu='1_.000'"
+ " ows_LinkFilename='1_.000' ows_LinkFilename2='1_.000'"
+ " ows_ServerUrl='/tapasnay/Lists/Announcements/1_.000'"
+ " ows_EncodedAbsUrl='http://localhost/tapasnay/Lists/Announcements/"
+ "1_.000'"
+ " ows_BaseName='1_' ows_MetaInfo='1;#' ows__Level='1'"
+ " ows__IsCurrentVersion='1' ows_ItemChildCount='1;#0'"
+ " ows_FolderChildCount='1;#0'"
+ " ows_Body='Microsoft SharePoint Foundation helps you to be more"
+ " effective by connecting people, information, and documents. For"
+ " information on getting started, see Help.'"
+ " ows_Expires='2011-09-07T06:49:09Z' ows_ServerRedirected='0' />"
+ "</rs:data>"
+ "</xml></Item>";
SiteDataSoap siteData = new UnsupportedSiteData() {
@Override
public void getURLSegments(String strURL,
Holder<Boolean> getURLSegmentsResult, Holder<String> strWebID,
Holder<String> strBucketID, Holder<String> strListID,
Holder<String> strItemID) {
assertEquals("http://localhost:1/sites/SiteCollection/Lists/Custom List"
+ "/Test Folder/2_.000", strURL);
setValue(getURLSegmentsResult, true);
setValue(strWebID, null);
setValue(strBucketID, null);
setValue(strListID, "{6F33949A-B3FF-4B0C-BA99-93CB518AC2C0}");
setValue(strItemID, "2");
}
@Override
public void getContent(ObjectType objectType, String objectId,
String folderUrl, String itemId, boolean retrieveChildItems,
boolean securityOnly, Holder<String> lastItemIdOnPage,
Holder<String> getContentResult) {
setValue(lastItemIdOnPage, null);
if (ObjectType.LIST_ITEM.equals(objectType)) {
assertEquals(false, securityOnly);
assertEquals("{6F33949A-B3FF-4B0C-BA99-93CB518AC2C0}", objectId);
assertEquals("2", itemId);
setValue(getContentResult, getContentListItemResponse);
} else if (objectType.equals(ObjectType.LIST)) {
assertEquals(false, retrieveChildItems);
assertEquals(false, securityOnly);
assertEquals("{6F33949A-B3FF-4B0C-BA99-93CB518AC2C0}", objectId);
setValue(getContentResult, getContentListResponse);
} else {
fail("Unexpected object type: " + objectType);
throw new AssertionError();
}
}
};
final MemberIdMapping memberIdMapping;
{
Map<Integer, String> users = new HashMap<Integer, String>();
Map<Integer, String> groups = new HashMap<Integer, String>();
users.put(1, "SOMEHOST\\administrator");
memberIdMapping = new MemberIdMapping(users, groups);
}
adaptor = new SharePointAdaptor(new UnsupportedSiteDataFactory(),
new UnsupportedHttpClient());
adaptor.init(new MockAdaptorContext(config, null));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GetContentsRequest request = new GetContentsRequest(
new DocId("http://localhost:1/sites/SiteCollection/Lists/Custom List/"
+ "Test Folder/2_.000"));
GetContentsResponse response = new GetContentsResponse(baos);
adaptor.new SiteDataClient("http://localhost:1/sites/SiteCollection",
"http://localhost:1/sites/SiteCollection",
siteData, Callables.returning(memberIdMapping))
.getDocContent(request, response);
String responseString = new String(baos.toByteArray(), charset);
final String golden
= "<!DOCTYPE html>\n"
+ "<html><head><title>List Item Get Started with Microsoft SharePoint "
+ "Foundation!</title></head>"
+ "<body><h1>List Item Get Started with Microsoft SharePoint "
+ "Foundation!</h1>"
+ "</body></html>";
final Metadata goldenMetadata;
{
Metadata meta = new Metadata();
meta.add("Attachments", "0");
meta.add("Author", "GDC-PSL\\administrator");
meta.add("BaseName", "1_");
meta.add("Body", "Microsoft SharePoint Foundation helps you to be more "
+ "effective by connecting people, information, and documents. For "
+ "information on getting started, see Help.");
meta.add("ContentType", "Announcement");
meta.add("ContentTypeId", "0x0104007B3DA16495E1404895F5E01885B11519");
meta.add("Created", "2011-09-07T06:49:13Z");
meta.add("Created_x0020_Date", "2011-09-07T06:49:13Z");
meta.add("Editor", "GDC-PSL\\administrator");
meta.add("EncodedAbsUrl", "http://localhost/tapasnay/Lists/Announcements/"
+ "1_.000");
meta.add("Expires", "2011-09-07T06:49:09Z");
meta.add("FSObjType", "0");
meta.add("FileDirRef", "tapasnay/Lists/Announcements");
meta.add("FileLeafRef", "1_.000");
meta.add("FileRef", "tapasnay/Lists/Announcements/1_.000");
meta.add("FolderChildCount", "0");
meta.add("GUID", "{AAFA6C7F-B734-4981-BCCA-8EFF00A701CB}");
meta.add("ID", "1");
meta.add("ItemChildCount", "0");
meta.add("Last_x0020_Modified", "2011-09-07T06:49:13Z");
meta.add("LinkFilename", "1_.000");
meta.add("LinkFilename2", "1_.000");
meta.add("LinkFilenameNoMenu", "1_.000");
meta.add("LinkTitle",
"Get Started with Microsoft SharePoint Foundation!");
meta.add("LinkTitle2",
"Get Started with Microsoft SharePoint Foundation!");
meta.add("LinkTitleNoMenu",
"Get Started with Microsoft SharePoint Foundation!");
meta.add("Modified", "2011-09-07T06:49:13Z");
meta.add("Order", "100.000000000000");
meta.add("PermMask", "0x7fffffffffffffff");
meta.add("ScopeId", "{1D857DC3-DD22-4326-95F0-01B27D6DA6D6}");
meta.add("SelectTitle", "1");
meta.add("ServerRedirected", "0");
meta.add("ServerUrl", "/tapasnay/Lists/Announcements/1_.000");
meta.add("SortBehavior", "0");
meta.add("Title", "Get Started with Microsoft SharePoint Foundation!");
meta.add("UniqueId", "{08CCA823-9ECF-4F91-8642-510C568230A9}");
meta.add("WorkflowVersion", "1");
meta.add("_EditMenuTableEnd", "1");
meta.add("_EditMenuTableStart", "1_.000");
meta.add("_EditMenuTableStart2", "1");
meta.add("_IsCurrentVersion", "1");
meta.add("_Level", "1");
meta.add("_ModerationStatus", "0");
meta.add("_UIVersion", "512");
meta.add("_UIVersionString", "1.0");
meta.add("owshiddenversion", "1");
goldenMetadata = meta.unmodifiableView();
}
assertEquals(golden, responseString);
assertEquals(goldenMetadata, response.getMetadata());
// It looks odd that nobody can access the document since there are no
// groups and users, but the policy permits GDC-PSL\administrator. Thus, the
// policy's PARENT_OVERRIDE behavior is important.
assertEquals(new Acl.Builder()
.setInheritFrom(new DocId(
"http://localhost:1/tapasnay/Lists/Announcements"))
.setInheritanceType(Acl.InheritanceType.AND_BOTH_PERMIT).build(),
response.getAcl());
}
@Test
public void testGetDocContentFolder() throws IOException {
final String getContentListItemResponse
= "<Item><Metadata>"
+ "<scope id=\"{f9cb02b3-7f29-4cac-804f-ba6e14f1eb39}\">"
+ "<permissions><permission memberid='1' mask='206292717568' />"
+ "<permission memberid='3' mask='9223372036854775807' />"
+ "<permission memberid='4' mask='756052856929' />"
+ "<permission memberid='5' mask='1856436900591' />"
+ "</permissions></scope>"
+ "</Metadata>"
+ "<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'"
+ " xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'"
+ " xmlns:rs='urn:schemas-microsoft-com:rowset'"
+ " xmlns:z='#RowsetSchema'>"
+ "<s:Schema id='RowsetSchema'>"
+ "<s:ElementType name='row' content='eltOnly' rs:CommandTimeout='30'>"
+ "<s:AttributeType name='ows_ContentTypeId' rs:name='Content Type ID'"
+ " rs:number='1'>"
+ "<s:datatype dt:type='int' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Title' rs:name='Title' rs:number='2'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__ModerationComments'"
+ " rs:name='Approver Comments' rs:number='3'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_File_x0020_Type' rs:name='File Type'"
+ " rs:number='4'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Additional_x0020_Info'"
+ " rs:name='Additional Info' rs:number='5'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ContentType' rs:name='Content Type'"
+ " rs:number='6'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ID' rs:name='ID' rs:number='7'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Modified' rs:name='Modified'"
+ " rs:number='8'>"
+ "<s:datatype dt:type='datetime' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Created' rs:name='Created' rs:number='9'>"
+ "<s:datatype dt:type='datetime' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Author' rs:name='Created By'"
+ " rs:number='10'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Editor' rs:name='Modified By'"
+ " rs:number='11'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__HasCopyDestinations'"
+ " rs:name='Has Copy Destinations' rs:number='12'>"
+ "<s:datatype dt:type='boolean' dt:maxLength='1' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__CopySource' rs:name='Copy Source'"
+ " rs:number='13'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_owshiddenversion'"
+ " rs:name='owshiddenversion' rs:number='14'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_WorkflowVersion'"
+ " rs:name='Workflow Version' rs:number='15'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__UIVersion' rs:name='UI Version'"
+ " rs:number='16'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__UIVersionString' rs:name='Version'"
+ " rs:number='17'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Attachments' rs:name='Attachments'"
+ " rs:number='18'>"
+ "<s:datatype dt:type='boolean' dt:maxLength='1' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__ModerationStatus'"
+ " rs:name='Approval Status' rs:number='19'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkTitleNoMenu' rs:name='Title'"
+ " rs:number='20'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkTitle' rs:name='Title'"
+ " rs:number='21'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_SelectTitle' rs:name='Select'"
+ " rs:number='22'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_InstanceID' rs:name='Instance ID'"
+ " rs:number='23'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Order' rs:name='Order' rs:number='24'>"
+ "<s:datatype dt:type='float' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_GUID' rs:name='GUID' rs:number='25'>"
+ "<s:datatype dt:type='string' dt:maxLength='38' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_WorkflowInstanceID'"
+ " rs:name='Workflow Instance ID' rs:number='26'>"
+ "<s:datatype dt:type='string' dt:maxLength='38' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_FileRef' rs:name='URL Path'"
+ " rs:number='27'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_FileDirRef' rs:name='Path'"
+ " rs:number='28'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Last_x0020_Modified' rs:name='Modified'"
+ " rs:number='29'>"
+ "<s:datatype dt:type='datetime' dt:lookup='true' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Created_x0020_Date' rs:name='Created'"
+ " rs:number='30'>"
+ "<s:datatype dt:type='datetime' dt:lookup='true' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_FSObjType' rs:name='Item Type'"
+ " rs:number='31'>"
+ "<s:datatype dt:type='ui1' dt:lookup='true' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_PermMask'"
+ " rs:name='Effective Permissions Mask' rs:number='32'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_FileLeafRef' rs:name='Name'"
+ " rs:number='33'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_UniqueId' rs:name='Unique Id'"
+ " rs:number='34'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='38' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ProgId' rs:name='ProgId' rs:number='35'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ScopeId' rs:name='ScopeId'"
+ " rs:number='36'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='38' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_HTML_x0020_File_x0020_Type'"
+ " rs:name='HTML File Type' rs:number='37'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__EditMenuTableStart'"
+ " rs:name='Edit Menu Table Start' rs:number='38'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__EditMenuTableEnd'"
+ " rs:name='Edit Menu Table End' rs:number='39'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkFilenameNoMenu' rs:name='Name'"
+ " rs:number='40'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkFilename' rs:name='Name'"
+ " rs:number='41'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_DocIcon' rs:name='Type' rs:number='42'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ServerUrl' rs:name='Server Relative URL'"
+ " rs:number='43'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_EncodedAbsUrl'"
+ " rs:name='Encoded Absolute URL' rs:number='44'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_BaseName' rs:name='File Name'"
+ " rs:number='45'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_MetaInfo' rs:name='Property Bag'"
+ " rs:number='46'>"
+ "<s:datatype dt:type='int' dt:lookup='true' dt:maxLength='2147483646'"
+ " />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__Level' rs:name='Level' rs:number='47'>"
+ "<s:datatype dt:type='ui1' dt:maxLength='1' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__IsCurrentVersion'"
+ " rs:name='Is Current Version' rs:number='48'>"
+ "<s:datatype dt:type='boolean' dt:maxLength='1' />"
+ "</s:AttributeType>"
+ "</s:ElementType></s:Schema><scopes>"
+ "<scope id='{f9cb02b3-7f29-4cac-804f-ba6e14f1eb39}' >"
+ "<permission memberid='1' mask='206292717568' />"
+ "<permission memberid='3' mask='9223372036854775807' />"
+ "<permission memberid='4' mask='756052856929' />"
+ "<permission memberid='5' mask='1856436900591' />"
+ "</scope>"
+ "<scope id='{2e29615c-59e7-493b-b08a-3642949cc069}' >"
+ "<permission memberid='1' mask='9223372036854775807' />"
+ "<permission memberid='3' mask='9223372036854775807' />"
+ "<permission memberid='4' mask='756052856929' />"
+ "<permission memberid='5' mask='1856436900591' />"
+ "</scope>"
+ "</scopes>"
+ "<rs:data ItemCount=\"1\">"
+ "<z:row"
+ " ows_ContentTypeId='0x01200077DD29735CE61148A73F540231F24430'"
+ " ows_Title='Test Folder' ows_ContentType='Folder' ows_ID='1'"
+ " ows_Modified='2012-05-01T22:13:47Z'"
+ " ows_Created='2012-05-01T22:13:47Z'"
+ " ows_Author='1073741823;#System Account'"
+ " ows_Editor='1073741823;#System Account' ows_owshiddenversion='1'"
+ " ows_WorkflowVersion='1' ows__UIVersion='512'"
+ " ows__UIVersionString='1.0' ows_Attachments='0'"
+ " ows__ModerationStatus='0' ows_LinkTitleNoMenu='Test Folder'"
+ " ows_LinkTitle='Test Folder' ows_SelectTitle='1'"
+ " ows_Order='100.000000000000'"
+ " ows_GUID='{C099F4ED-6E96-4A00-B94A-EE443061EE49}'"
+ " ows_FileRef='1;#sites/SiteCollection/Lists/Custom List/Test Folder'"
+ " ows_FileDirRef='1;#sites/SiteCollection/Lists/Custom List'"
+ " ows_Last_x0020_Modified='1;#2012-05-02T21:13:17Z'"
+ " ows_Created_x0020_Date='1;#2012-05-01T22:13:47Z'"
+ " ows_FSObjType='1;#1' ows_PermMask='0x7fffffffffffffff'"
+ " ows_FileLeafRef='1;#Test Folder'"
+ " ows_UniqueId='1;#{CE33B6B7-9F5E-4224-8D77-9C42E6290FE6}'"
+ " ows_ProgId='1;#'"
+ " ows_ScopeId='1;#{2E29615C-59E7-493B-B08A-3642949CC069}'"
+ " ows__EditMenuTableStart='Test Folder' ows__EditMenuTableEnd='1'"
+ " ows_LinkFilenameNoMenu='Test Folder' ows_LinkFilename='Test Folder'"
+ " ows_ServerUrl='/sites/SiteCollection/Lists/Custom List/Test Folder'"
+ " ows_EncodedAbsUrl='http://localhost:1/sites/SiteCollection/Lists/Cu"
+ "stom%20List/Test%20Folder'"
+ " ows_BaseName='Test Folder' ows_MetaInfo='1;#' ows__Level='1'"
+ " ows__IsCurrentVersion='1' ows_ServerRedirected='0'/>"
+ "</rs:data>"
+ "</xml></Item>";
final String getContentListResponse
= "<List>"
+ "<Metadata ID=\"{6f33949a-b3ff-4b0c-ba99-93cb518ac2c0}\""
+ " LastModified=\"2012-05-04 21:24:32Z\" Title=\"Custom List\""
+ " DefaultTitle=\"True\" Description=\"\" BaseType=\"GenericList\""
+ " BaseTemplate=\"GenericList\""
+ " DefaultViewUrl=\"/sites/SiteCollection/Lists/Custom List/AllItems.a"
+ "spx\""
+ " DefaultViewItemUrl=\"/sites/SiteCollection/Lists/Custom List/DispFo"
+ "rm.aspx\""
+ " RootFolder=\"Lists/Custom List\" Author=\"System Account\""
+ " ItemCount=\"7\" ReadSecurity=\"1\" AllowAnonymousAccess=\"False\""
+ " AnonymousViewListItems=\"False\" AnonymousPermMask=\"0\""
+ " CRC=\"1334405648\" NoIndex=\"False\""
+ " ScopeID=\"{f9cb02b3-7f29-4cac-804f-ba6e14f1eb39}\" />"
+ "<ACL><permissions>"
+ "<permission memberid='1' mask='206292717568' />"
+ "<permission memberid='3' mask='9223372036854775807' />"
+ "<permission memberid='4' mask='756052856929' />"
+ "<permission memberid='5' mask='1856436900591' />"
+ "</permissions></ACL>"
+ "<Views>"
+ "<View URL=\"Lists/Custom List/AllItems.aspx\""
+ " ID=\"{18b67349-78bd-49a2-ba1a-cdbc048adf0b}\" Title=\"All Items\""
+ " />"
+ "</Views>"
+ "<Schema>"
+ "<Field Name=\"Title\" Title=\"Title\" Type=\"Text\" />"
+ "<Field Name=\"Additional_x0020_Info\" Title=\"Additional Info\""
+ " Type=\"Text\" />"
+ "<Field Name=\"ContentType\" Title=\"Content Type\" Type=\"Choice\""
+ " />"
+ "<Field Name=\"ID\" Title=\"ID\" Type=\"Counter\" />"
+ "<Field Name=\"Modified\" Title=\"Modified\" Type=\"DateTime\" />"
+ "<Field Name=\"Created\" Title=\"Created\" Type=\"DateTime\" />"
+ "<Field Name=\"Author\" Title=\"Created By\" Type=\"User\" />"
+ "<Field Name=\"Editor\" Title=\"Modified By\" Type=\"User\" />"
+ "<Field Name=\"_UIVersionString\" Title=\"Version\" Type=\"Text\" />"
+ "<Field Name=\"Attachments\" Title=\"Attachments\""
+ " Type=\"Attachments\" />"
+ "<Field Name=\"Edit\" Title=\"Edit\" Type=\"Computed\" />"
+ "<Field Name=\"LinkTitleNoMenu\" Title=\"Title\" Type=\"Computed\" />"
+ "<Field Name=\"LinkTitle\" Title=\"Title\" Type=\"Computed\" />"
+ "<Field Name=\"DocIcon\" Title=\"Type\" Type=\"Computed\" />"
+ "</Schema></List>";
final String getContentFolderResponse
= "<Folder><Metadata>"
+ "<scope id=\"{f9cb02b3-7f29-4cac-804f-ba6e14f1eb39}\">"
+ "<permissions><permission memberid='1' mask='206292717568' />"
+ "<permission memberid='3' mask='9223372036854775807' />"
+ "<permission memberid='4' mask='756052856929' />"
+ "<permission memberid='5' mask='1856436900591' />"
+ "</permissions></scope>"
+ "</Metadata>"
+ "<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'"
+ " xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'"
+ " xmlns:rs='urn:schemas-microsoft-com:rowset'"
+ " xmlns:z='#RowsetSchema'>"
+ "<s:Schema id='RowsetSchema'>"
+ "<s:ElementType name='row' content='eltOnly' rs:CommandTimeout='30'>"
+ "<s:AttributeType name='ows_ContentTypeId' rs:name='Content Type ID'"
+ " rs:number='1'>"
+ "<s:datatype dt:type='int' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Title' rs:name='Title' rs:number='2'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__ModerationComments'"
+ " rs:name='Approver Comments' rs:number='3'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_File_x0020_Type' rs:name='File Type'"
+ " rs:number='4'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Additional_x0020_Info'"
+ " rs:name='Additional Info' rs:number='5'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ContentType' rs:name='Content Type'"
+ " rs:number='6'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ID' rs:name='ID' rs:number='7'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Modified' rs:name='Modified'"
+ " rs:number='8'>"
+ "<s:datatype dt:type='datetime' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Created' rs:name='Created' rs:number='9'>"
+ "<s:datatype dt:type='datetime' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Author' rs:name='Created By'"
+ " rs:number='10'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Editor' rs:name='Modified By'"
+ " rs:number='11'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__HasCopyDestinations'"
+ " rs:name='Has Copy Destinations' rs:number='12'>"
+ "<s:datatype dt:type='boolean' dt:maxLength='1' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__CopySource' rs:name='Copy Source'"
+ " rs:number='13'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_owshiddenversion'"
+ " rs:name='owshiddenversion' rs:number='14'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_WorkflowVersion'"
+ " rs:name='Workflow Version' rs:number='15'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__UIVersion' rs:name='UI Version'"
+ " rs:number='16'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__UIVersionString' rs:name='Version'"
+ " rs:number='17'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Attachments' rs:name='Attachments'"
+ " rs:number='18'>"
+ "<s:datatype dt:type='boolean' dt:maxLength='1' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__ModerationStatus'"
+ " rs:name='Approval Status' rs:number='19'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkTitleNoMenu' rs:name='Title'"
+ " rs:number='20'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkTitle' rs:name='Title'"
+ " rs:number='21'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_SelectTitle' rs:name='Select'"
+ " rs:number='22'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_InstanceID' rs:name='Instance ID'"
+ " rs:number='23'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Order' rs:name='Order' rs:number='24'>"
+ "<s:datatype dt:type='float' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_GUID' rs:name='GUID' rs:number='25'>"
+ "<s:datatype dt:type='string' dt:maxLength='38' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_WorkflowInstanceID'"
+ " rs:name='Workflow Instance ID' rs:number='26'>"
+ "<s:datatype dt:type='string' dt:maxLength='38' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_FileRef' rs:name='URL Path'"
+ " rs:number='27'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_FileDirRef' rs:name='Path'"
+ " rs:number='28'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Last_x0020_Modified' rs:name='Modified'"
+ " rs:number='29'>"
+ "<s:datatype dt:type='datetime' dt:lookup='true' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_Created_x0020_Date' rs:name='Created'"
+ " rs:number='30'>"
+ "<s:datatype dt:type='datetime' dt:lookup='true' dt:maxLength='8' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_FSObjType' rs:name='Item Type'"
+ " rs:number='31'>"
+ "<s:datatype dt:type='ui1' dt:lookup='true' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_PermMask'"
+ " rs:name='Effective Permissions Mask' rs:number='32'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_FileLeafRef' rs:name='Name'"
+ " rs:number='33'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_UniqueId' rs:name='Unique Id'"
+ " rs:number='34'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='38' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ProgId' rs:name='ProgId' rs:number='35'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ScopeId' rs:name='ScopeId'"
+ " rs:number='36'>"
+ "<s:datatype dt:type='string' dt:lookup='true' dt:maxLength='38' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_HTML_x0020_File_x0020_Type'"
+ " rs:name='HTML File Type' rs:number='37'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__EditMenuTableStart'"
+ " rs:name='Edit Menu Table Start' rs:number='38'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__EditMenuTableEnd'"
+ " rs:name='Edit Menu Table End' rs:number='39'>"
+ "<s:datatype dt:type='i4' dt:maxLength='4' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkFilenameNoMenu' rs:name='Name'"
+ " rs:number='40'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_LinkFilename' rs:name='Name'"
+ " rs:number='41'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_DocIcon' rs:name='Type' rs:number='42'>"
+ "<s:datatype dt:type='string' dt:maxLength='512' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_ServerUrl' rs:name='Server Relative URL'"
+ " rs:number='43'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_EncodedAbsUrl'"
+ " rs:name='Encoded Absolute URL' rs:number='44'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_BaseName' rs:name='File Name'"
+ " rs:number='45'>"
+ "<s:datatype dt:type='string' dt:maxLength='1073741823' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows_MetaInfo' rs:name='Property Bag'"
+ " rs:number='46'>"
+ "<s:datatype dt:type='int' dt:lookup='true' dt:maxLength='2147483646'"
+ " />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__Level' rs:name='Level' rs:number='47'>"
+ "<s:datatype dt:type='ui1' dt:maxLength='1' />"
+ "</s:AttributeType>"
+ "<s:AttributeType name='ows__IsCurrentVersion'"
+ " rs:name='Is Current Version' rs:number='48'>"
+ "<s:datatype dt:type='boolean' dt:maxLength='1' />"
+ "</s:AttributeType>"
+ "</s:ElementType></s:Schema><scopes>"
+ "<scope id='{f9cb02b3-7f29-4cac-804f-ba6e14f1eb39}' >"
+ "<permission memberid='1' mask='206292717568' />"
+ "<permission memberid='3' mask='9223372036854775807' />"
+ "<permission memberid='4' mask='756052856929' />"
+ "<permission memberid='5' mask='1856436900591' />"
+ "</scope>"
+ "<scope id='{2e29615c-59e7-493b-b08a-3642949cc069}' >"
+ "<permission memberid='1' mask='9223372036854775807' />"
+ "<permission memberid='3' mask='9223372036854775807' />"
+ "<permission memberid='4' mask='756052856929' />"
+ "<permission memberid='5' mask='1856436900591' />"
+ "</scope>"
+ "</scopes>"
+ "<rs:data ItemCount=\"2\">"
+ "<z:row"
+ " ows_ContentTypeId='0x0100442459C9B5E59C4F9CFDC789A220FC92'"
+ " ows_Title='Inside Folder' ows_ContentType='Item' ows_ID='2'"
+ " ows_Modified='2012-05-04T21:24:32Z'"
+ " ows_Created='2012-05-01T22:14:06Z'"
+ " ows_Author='1073741823;#System Account'"
+ " ows_Editor='1073741823;#System Account' ows_owshiddenversion='4'"
+ " ows_WorkflowVersion='1' ows__UIVersion='512'"
+ " ows__UIVersionString='1.0' ows_Attachments='1'"
+ " ows__ModerationStatus='0' ows_LinkTitleNoMenu='Inside Folder'"
+ " ows_LinkTitle='Inside Folder' ows_SelectTitle='2'"
+ " ows_Order='200.000000000000'"
+ " ows_GUID='{2C5BEF60-18FA-42CA-B472-7B5E1EC405A5}'"
+ " ows_FileRef='2;#sites/SiteCollection/Lists/Custom List/Test Folder/"
+ "2_.000'"
+ " ows_FileDirRef='2;#sites/SiteCollection/Lists/Custom List/Test Fold"
+ "er'"
+ " ows_Last_x0020_Modified='2;#2012-05-01T22:14:06Z'"
+ " ows_Created_x0020_Date='2;#2012-05-01T22:14:06Z'"
+ " ows_FSObjType='2;#0' ows_PermMask='0x7fffffffffffffff'"
+ " ows_FileLeafRef='2;#2_.000'"
+ " ows_UniqueId='2;#{E7156244-AC2F-4402-AA74-7A365726CD02}'"
+ " ows_ProgId='2;#'"
+ " ows_ScopeId='2;#{2E29615C-59E7-493B-B08A-3642949CC069}'"
+ " ows__EditMenuTableStart='2_.000' ows__EditMenuTableEnd='2'"
+ " ows_LinkFilenameNoMenu='2_.000' ows_LinkFilename='2_.000'"
+ " ows_ServerUrl='/sites/SiteCollection/Lists/Custom List/Test Folder/"
+ "2_.000'"
+ " ows_EncodedAbsUrl='http://localhost:1/sites/SiteCollection/Lists/Cu"
+ "stom%20List/Test%20Folder/2_.000'"
+ " ows_BaseName='2_' ows_MetaInfo='2;#' ows__Level='1'"
+ " ows__IsCurrentVersion='1' ows_ServerRedirected='0'/>"
+ "<z:row"
+ " ows_ContentTypeId='0x01200077DD29735CE61148A73F540231F24430'"
+ " ows_Title='testing' ows_ContentType='Folder' ows_ID='5'"
+ " ows_Modified='2012-05-02T21:13:16Z'"
+ " ows_Created='2012-05-02T21:13:16Z'"
+ " ows_Author='1073741823;#System Account'"
+ " ows_Editor='1073741823;#System Account' ows_owshiddenversion='1'"
+ " ows_WorkflowVersion='1' ows__UIVersion='512'"
+ " ows__UIVersionString='1.0' ows_Attachments='0'"
+ " ows__ModerationStatus='0' ows_LinkTitleNoMenu='testing'"
+ " ows_LinkTitle='testing' ows_SelectTitle='5'"
+ " ows_Order='500.000000000000'"
+ " ows_GUID='{D803788D-7A3A-4222-AC66-BFD261412A28}'"
+ " ows_FileRef='5;#sites/SiteCollection/Lists/Custom List/Test Folder/"
+ "testing'"
+ " ows_FileDirRef='5;#sites/SiteCollection/Lists/Custom List/Test Fold"
+ "er'"
+ " ows_Last_x0020_Modified='5;#2012-05-04T17:49:23Z'"
+ " ows_Created_x0020_Date='5;#2012-05-02T21:13:17Z'"
+ " ows_FSObjType='5;#1' ows_PermMask='0x7fffffffffffffff'"
+ " ows_FileLeafRef='5;#testing'"
+ " ows_UniqueId='5;#{C2590C9A-C4E0-4411-BBB2-03ABC60AB073}'"
+ " ows_ProgId='5;#'"
+ " ows_ScopeId='5;#{2E29615C-59E7-493B-B08A-3642949CC069}'"
+ " ows__EditMenuTableStart='testing' ows__EditMenuTableEnd='5'"
+ " ows_LinkFilenameNoMenu='testing' ows_LinkFilename='testing'"
+ " ows_ServerUrl='/sites/SiteCollection/Lists/Custom List/Test Folder/"
+ "testing'"
+ " ows_EncodedAbsUrl='http://localhost:1/sites/SiteCollection/Lists/Cu"
+ "stom%20List/Test%20Folder/testing'"
+ " ows_BaseName='testing' ows_MetaInfo='5;#' ows__Level='1'"
+ " ows__IsCurrentVersion='1' ows_ServerRedirected='0'/>"
+ "</rs:data>"
+ "</xml></Folder>";
SiteDataSoap siteData = new UnsupportedSiteData() {
@Override
public void getURLSegments(String strURL,
Holder<Boolean> getURLSegmentsResult, Holder<String> strWebID,
Holder<String> strBucketID, Holder<String> strListID,
Holder<String> strItemID) {
assertEquals("http://localhost:1/sites/SiteCollection/Lists/Custom List"
+ "/Test Folder", strURL);
setValue(getURLSegmentsResult, true);
setValue(strWebID, null);
setValue(strBucketID, null);
setValue(strListID, "{6F33949A-B3FF-4B0C-BA99-93CB518AC2C0}");
setValue(strItemID, "1");
}
@Override
public void getContent(ObjectType objectType, String objectId,
String folderUrl, String itemId, boolean retrieveChildItems,
boolean securityOnly, Holder<String> lastItemIdOnPage,
Holder<String> getContentResult) {
setValue(lastItemIdOnPage, null);
if (ObjectType.LIST_ITEM.equals(objectType)) {
assertEquals(false, securityOnly);
assertEquals("{6F33949A-B3FF-4B0C-BA99-93CB518AC2C0}", objectId);
assertEquals("1", itemId);
setValue(getContentResult, getContentListItemResponse);
} else if (ObjectType.LIST.equals(objectType)) {
assertEquals(false, securityOnly);
assertEquals("{6F33949A-B3FF-4B0C-BA99-93CB518AC2C0}", objectId);
assertEquals(null, itemId);
setValue(getContentResult, getContentListResponse);
} else if (ObjectType.FOLDER.equals(objectType)) {
assertEquals(false, securityOnly);
assertEquals("{6F33949A-B3FF-4B0C-BA99-93CB518AC2C0}", objectId);
assertEquals(null, itemId);
assertEquals("Test Folder", folderUrl);
setValue(getContentResult, getContentFolderResponse);
setValue(lastItemIdOnPage, null);
} else {
fail("Unexpected object type: " + objectType);
throw new AssertionError();
}
}
};
final MemberIdMapping memberIdMapping;
{
Map<Integer, String> users = new HashMap<Integer, String>();
Map<Integer, String> groups = new HashMap<Integer, String>();
users.put(1, "GDC-PSL\\administrator");
groups.put(3, "SiteCollection Owners");
groups.put(4, "SiteCollection Visitors");
groups.put(5, "SiteCollection Members");
memberIdMapping = new MemberIdMapping(users, groups);
}
adaptor = new SharePointAdaptor(new UnsupportedSiteDataFactory(),
new UnsupportedHttpClient());
adaptor.init(new MockAdaptorContext(config, null));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GetContentsRequest request = new GetContentsRequest(
new DocId("http://localhost:1/sites/SiteCollection/Lists/Custom List/"
+ "Test Folder"));
GetContentsResponse response = new GetContentsResponse(baos);
adaptor.new SiteDataClient("http://localhost:1/sites/SiteCollection",
"http://localhost:1/sites/SiteCollection",
siteData, Callables.returning(memberIdMapping))
.getDocContent(request, response);
String responseString = new String(baos.toByteArray(), charset);
final String golden
= "<!DOCTYPE html>\n"
+ "<html><head><title>Folder Test Folder</title></head>"
+ "<body><h1>Folder Test Folder</h1>"
+ "<p>List Items</p>"
+ "<ul>"
+ "<li><a href=\"Test%20Folder/2_.000\">Inside Folder</a></li>"
+ "<li><a href=\"Test%20Folder/testing\">testing</a></li>"
+ "</ul></body></html>";
final Metadata goldenMetadata;
{
Metadata meta = new Metadata();
meta.add("Attachments", "0");
meta.add("Author", "System Account");
meta.add("BaseName", "Test Folder");
meta.add("ContentType", "Folder");
meta.add("ContentTypeId", "0x01200077DD29735CE61148A73F540231F24430");
meta.add("Created", "2012-05-01T22:13:47Z");
meta.add("Created_x0020_Date", "2012-05-01T22:13:47Z");
meta.add("Editor", "System Account");
meta.add("EncodedAbsUrl", "http://localhost:1/sites/SiteCollection/Lists/"
+ "Custom%20List/Test%20Folder");
meta.add("FSObjType", "1");
meta.add("FileDirRef", "sites/SiteCollection/Lists/Custom List");
meta.add("FileLeafRef", "Test Folder");
meta.add("FileRef", "sites/SiteCollection/Lists/Custom List/Test Folder");
meta.add("GUID", "{C099F4ED-6E96-4A00-B94A-EE443061EE49}");
meta.add("ID", "1");
meta.add("Last_x0020_Modified", "2012-05-02T21:13:17Z");
meta.add("LinkFilename", "Test Folder");
meta.add("LinkFilenameNoMenu", "Test Folder");
meta.add("LinkTitle", "Test Folder");
meta.add("LinkTitleNoMenu", "Test Folder");
meta.add("Modified", "2012-05-01T22:13:47Z");
meta.add("Order", "100.000000000000");
meta.add("PermMask", "0x7fffffffffffffff");
meta.add("ScopeId", "{2E29615C-59E7-493B-B08A-3642949CC069}");
meta.add("SelectTitle", "1");
meta.add("ServerRedirected", "0");
meta.add("ServerUrl",
"/sites/SiteCollection/Lists/Custom List/Test Folder");
meta.add("Title", "Test Folder");
meta.add("UniqueId", "{CE33B6B7-9F5E-4224-8D77-9C42E6290FE6}");
meta.add("WorkflowVersion", "1");
meta.add("_EditMenuTableEnd", "1");
meta.add("_EditMenuTableStart", "Test Folder");
meta.add("_IsCurrentVersion", "1");
meta.add("_Level", "1");
meta.add("_ModerationStatus", "0");
meta.add("_UIVersion", "512");
meta.add("_UIVersionString", "1.0");
meta.add("owshiddenversion", "1");
goldenMetadata = meta.unmodifiableView();
}
assertEquals(golden, responseString);
assertEquals(goldenMetadata, response.getMetadata());
assertEquals(new Acl.Builder()
.setInheritFrom(new DocId("http://localhost:1/sites/SiteCollection/"
+ "Lists/Custom List/AllItems.aspx"))
.setInheritanceType(Acl.InheritanceType.AND_BOTH_PERMIT)
.setPermitGroups(Arrays.asList("SiteCollection Members",
"SiteCollection Owners", "SiteCollection Visitors"))
.setPermitUsers(Arrays.asList("GDC-PSL\\administrator")).build(),
response.getAcl());
}
@Test
public void testGetDocIds() throws IOException, InterruptedException {
adaptor = new SharePointAdaptor(new UnsupportedSiteDataFactory(),
new UnsupportedHttpClient());
AccumulatingDocIdPusher pusher = new AccumulatingDocIdPusher();
adaptor.init(new MockAdaptorContext(config, pusher));
assertEquals(0, pusher.getRecords().size());
adaptor.getDocIds(pusher);
assertEquals(1, pusher.getRecords().size());
assertEquals(new DocIdPusher.Record.Builder(new DocId("")).build(),
pusher.getRecords().get(0));
}
@Test
public void testModifiedGetDocIds() throws IOException, InterruptedException {
final String getContentVirtualServer
= "<VirtualServer>"
+ "<Metadata URL=\"http://localhost:1/\" />"
+ "<ContentDatabases>"
+ "<ContentDatabase ID=\"{4fb7dea1-2912-4927-9eda-1ea2f0977cf8}\" />"
+ "<ContentDatabase ID=\"{3ac1e3b3-2326-7341-4afe-16751eafbc51}\" />"
+ "</ContentDatabases>"
+ "<Policies AnonymousGrantMask=\"0\" AnonymousDenyMask=\"0\">"
+ "<PolicyUser LoginName=\"NT AUTHORITY\\LOCAL SERVICE\""
+ " Sid=\"S-1-5-19\" GrantMask=\"4611686224789442657\" DenyMask=\"0\"/>"
+ "<PolicyUser LoginName=\"GDC-PSL\\spuser1\""
+ " Sid=\"S-1-5-21-736914693-3137354690-2813686979-1130\""
+ " GrantMask=\"4611686224789442657\" DenyMask=\"0\"/>"
+ "<PolicyUser LoginName=\"GDC-PSL\\Administrator\""
+ " Sid=\"S-1-5-21-736914693-3137354690-2813686979-500\""
+ " GrantMask=\"9223372036854775807\" DenyMask=\"0\"/>"
+ "</Policies></VirtualServer>";
final String getContentVirtualServer2
= "<VirtualServer>"
+ "<Metadata URL=\"http://localhost:1/\" />"
+ "<ContentDatabases>"
+ "<ContentDatabase ID=\"{4fb7dea1-2912-4927-9eda-1ea2f0977cf8}\" />"
+ "</ContentDatabases>"
+ "<Policies AnonymousGrantMask=\"0\" AnonymousDenyMask=\"0\">"
+ "<PolicyUser LoginName=\"NT AUTHORITY\\LOCAL SERVICE\""
+ " Sid=\"S-1-5-19\" GrantMask=\"4611686224789442657\" DenyMask=\"0\"/>"
+ "<PolicyUser LoginName=\"GDC-PSL\\spuser1\""
+ " Sid=\"S-1-5-21-736914693-3137354690-2813686979-1130\""
+ " GrantMask=\"4611686224789442657\" DenyMask=\"0\"/>"
+ "<PolicyUser LoginName=\"GDC-PSL\\Administrator\""
+ " Sid=\"S-1-5-21-736914693-3137354690-2813686979-500\""
+ " GrantMask=\"9223372036854775807\" DenyMask=\"0\"/>"
+ "</Policies></VirtualServer>";
final String getContentContentDatabase4fb
= "<ContentDatabase>"
+ "<Metadata ChangeId=\"1;0;4fb7dea1-2912-4927-9eda-1ea2f0977cf8;634727"
+ "056594000000;603\""
+ " ID=\"{4fb7dea1-2912-4927-9eda-1ea2f0977cf8}\" />"
+ "</ContentDatabase>";
final String getContentContentDatabase3ac
= "<ContentDatabase>"
+ "<Metadata ChangeId=\"1;0;3ac1e3b3-2326-7341-4afe-16751eafbc51;634882"
+ "028739000000;224\""
+ " ID=\"{3ac1e3b3-2326-7341-4afe-16751eafbc51}\" />"
+ "</ContentDatabase>";
final String getChangesContentDatabase4fb
= "<SPContentDatabase Change=\"Unchanged\" ItemCount=\"0\">"
+ "<ContentDatabase>"
+ "<Metadata ChangeId=\"1;0;4fb7dea1-2912-4927-9eda-1ea2f0977cf8;634727"
+ "056594000000;603\""
+ " ID=\"{4fb7dea1-2912-4927-9eda-1ea2f0977cf8}\" />"
+ "</ContentDatabase></SPContentDatabase>";
final AtomicLong atomicState = new AtomicLong();
final AtomicLong atomicNumberGetChangesCalls = new AtomicLong(0);
SiteDataSoap siteData = new UnsupportedSiteData() {
@Override
public void getContent(ObjectType objectType, String objectId,
String folderUrl, String itemId, boolean retrieveChildItems,
boolean securityOnly, Holder<String> lastItemIdOnPage,
Holder<String> getContentResult) {
long state = atomicState.get();
if (state == 0) {
throw new WebServiceException("fake IO error");
} else if (state == 1) {
setValue(lastItemIdOnPage, null);
if (ObjectType.VIRTUAL_SERVER.equals(objectType)) {
assertEquals(true, retrieveChildItems);
assertEquals(false, securityOnly);
setValue(getContentResult, getContentVirtualServer);
} else if (ObjectType.CONTENT_DATABASE.equals(objectType)) {
if ("{4fb7dea1-2912-4927-9eda-1ea2f0977cf8}".equals(objectId)) {
setValue(getContentResult, getContentContentDatabase4fb);
} else if ("{3ac1e3b3-2326-7341-4afe-16751eafbc51}"
.equals(objectId)) {
setValue(getContentResult, getContentContentDatabase3ac);
} else {
throw new AssertionError();
}
assertEquals(false, retrieveChildItems);
assertEquals(false, securityOnly);
} else {
throw new AssertionError();
}
} else if (state == 2) {
assertEquals(ObjectType.VIRTUAL_SERVER, objectType);
assertEquals(true, retrieveChildItems);
assertEquals(false, securityOnly);
setValue(lastItemIdOnPage, null);
setValue(getContentResult, getContentVirtualServer2);
} else {
throw new AssertionError();
}
}
@Override
public void getChanges(ObjectType objectType, String contentDatabaseId,
Holder<String> lastChangeId, Holder<String> currentChangeId,
Integer timeout, Holder<String> getChangesResult,
Holder<Boolean> moreChanges) {
long state = atomicState.get();
if (state == 0) {
throw new AssertionError();
} else if (state == 2) {
atomicNumberGetChangesCalls.getAndIncrement();
assertEquals(ObjectType.CONTENT_DATABASE, objectType);
assertEquals("{4fb7dea1-2912-4927-9eda-1ea2f0977cf8}",
contentDatabaseId);
assertEquals(
"1;0;4fb7dea1-2912-4927-9eda-1ea2f0977cf8;634727056594000000;603",
lastChangeId.value);
String newLastChangeId = "1;0;4fb7dea1-2912-4927-9eda-1ea2f0977cf8;63"
+ "4727056594000000;603";
setValue(lastChangeId, newLastChangeId);
setValue(currentChangeId, newLastChangeId);
setValue(getChangesResult, getChangesContentDatabase4fb);
setValue(moreChanges, false);
} else {
throw new AssertionError();
}
}
};
SiteDataFactory siteDataFactory = new SingleSiteDataFactory(siteData,
"http://localhost:1/_vti_bin/SiteData.asmx");
adaptor = new SharePointAdaptor(siteDataFactory,
new UnsupportedHttpClient());
AccumulatingDocIdPusher pusher = new AccumulatingDocIdPusher();
adaptor.init(new MockAdaptorContext(config, pusher));
// Error getting content databases, so content databases remains unchanged
// (empty).
atomicState.set(0);
adaptor.getModifiedDocIds(pusher);
assertEquals(0, pusher.getRecords().size());
assertEquals(0, atomicNumberGetChangesCalls.get());
// Find new content databases and get their current change id.
atomicState.set(1);
adaptor.getModifiedDocIds(pusher);
assertEquals(1, pusher.getRecords().size());
assertEquals(new DocIdPusher.Record.Builder(new DocId(""))
.setCrawlImmediately(true).build(),
pusher.getRecords().get(0));
assertEquals(0, atomicNumberGetChangesCalls.get());
pusher.reset();
// Discover one content database disappeared; get changes for other content
// database.
atomicState.set(2);
adaptor.getModifiedDocIds(pusher);
assertEquals(1, pusher.getRecords().size());
assertEquals(new DocIdPusher.Record.Builder(new DocId(""))
.setCrawlImmediately(true).build(),
pusher.getRecords().get(0));
assertEquals(1, atomicNumberGetChangesCalls.get());
}
@Test
public void testModifiedGetDocIdsBrokenSP2010() throws IOException,
InterruptedException {
final String getContentVirtualServer
= "<VirtualServer>"
+ "<Metadata URL=\"http://localhost:1/\" />"
+ "<ContentDatabases>"
+ "<ContentDatabase ID=\"{4fb7dea1-2912-4927-9eda-1ea2f0977cf8}\" />"
+ "</ContentDatabases>"
+ "<Policies AnonymousGrantMask=\"0\" AnonymousDenyMask=\"0\">"
+ "<PolicyUser LoginName=\"NT AUTHORITY\\LOCAL SERVICE\""
+ " Sid=\"S-1-5-19\" GrantMask=\"4611686224789442657\" DenyMask=\"0\"/>"
+ "<PolicyUser LoginName=\"GDC-PSL\\spuser1\""
+ " Sid=\"S-1-5-21-736914693-3137354690-2813686979-1130\""
+ " GrantMask=\"4611686224789442657\" DenyMask=\"0\"/>"
+ "<PolicyUser LoginName=\"GDC-PSL\\Administrator\""
+ " Sid=\"S-1-5-21-736914693-3137354690-2813686979-500\""
+ " GrantMask=\"9223372036854775807\" DenyMask=\"0\"/>"
+ "</Policies></VirtualServer>";
final String getContentContentDatabase4fb
= "<ContentDatabase>"
+ "<Metadata ChangeId=\"1;0;4fb7dea1-2912-4927-9eda-1ea2f0977cf8;634727"
+ "056594000000;603\""
+ " ID=\"{4fb7dea1-2912-4927-9eda-1ea2f0977cf8}\" />"
+ "</ContentDatabase>";
final String getChangesContentDatabase4fb
= "<SPContentDatabase Change=\"Unchanged\" ItemCount=\"0\">"
+ "<ContentDatabase>"
+ "<Metadata ChangeId=\"1;0;4fb7dea1-2912-4927-9eda-1ea2f0977cf9;634727"
+ "056595000000;604\""
+ " ID=\"{4fb7dea1-2912-4927-9eda-1ea2f0977cf8}\" />"
+ "</ContentDatabase></SPContentDatabase>";
final AtomicLong atomicNumberGetChangesCalls = new AtomicLong(0);
SiteDataSoap siteData = new UnsupportedSiteData() {
@Override
public void getContent(ObjectType objectType, String objectId,
String folderUrl, String itemId, boolean retrieveChildItems,
boolean securityOnly, Holder<String> lastItemIdOnPage,
Holder<String> getContentResult) {
setValue(lastItemIdOnPage, null);
if (ObjectType.VIRTUAL_SERVER.equals(objectType)) {
assertEquals(true, retrieveChildItems);
assertEquals(false, securityOnly);
setValue(getContentResult, getContentVirtualServer);
} else if (ObjectType.CONTENT_DATABASE.equals(objectType)) {
assertEquals("{4fb7dea1-2912-4927-9eda-1ea2f0977cf8}", objectId);
assertEquals(false, retrieveChildItems);
assertEquals(false, securityOnly);
setValue(getContentResult, getContentContentDatabase4fb);
} else {
throw new AssertionError();
}
}
@Override
public void getChanges(ObjectType objectType, String contentDatabaseId,
Holder<String> lastChangeId, Holder<String> currentChangeId,
Integer timeout, Holder<String> getChangesResult,
Holder<Boolean> moreChanges) {
atomicNumberGetChangesCalls.getAndIncrement();
assertEquals(ObjectType.CONTENT_DATABASE, objectType);
assertEquals("{4fb7dea1-2912-4927-9eda-1ea2f0977cf8}",
contentDatabaseId);
assertEquals(
"1;0;4fb7dea1-2912-4927-9eda-1ea2f0977cf8;634727056594000000;603",
lastChangeId.value);
// Purposefully make lastChangeId != currentChangeId, because SP 2010
// has been known to do this.
setValue(currentChangeId, "1;0;4fb7dea1-2912-4927-9eda-1ea2f0977cf9;634"
+ "727056595000000;604");
setValue(getChangesResult, getChangesContentDatabase4fb);
// Purposefully make moreChanges=true even though there are no more
// pages, because SP 2010 has been known to do this.
setValue(moreChanges, true);
}
};
SiteDataFactory siteDataFactory = new SingleSiteDataFactory(siteData,
"http://localhost:1/_vti_bin/SiteData.asmx");
adaptor = new SharePointAdaptor(siteDataFactory,
new UnsupportedHttpClient());
AccumulatingDocIdPusher pusher = new AccumulatingDocIdPusher();
adaptor.init(new MockAdaptorContext(config, pusher));
// Initialize changeIds.
adaptor.getModifiedDocIds(pusher);
assertEquals(0, atomicNumberGetChangesCalls.get());
// Check for changes. This should not go into an infinite loop.
adaptor.getModifiedDocIds(pusher);
assertEquals(1, atomicNumberGetChangesCalls.get());
}
@Test
public void testModifiedGetDocIdsClient() throws IOException,
InterruptedException {
final String getChangesContentDatabase
= "<SPContentDatabase Change=\"Unchanged\" ItemCount=\"1\">"
+ "<ContentDatabase>"
+ "<Metadata ChangeId=\"1;0;4fb7dea1-2912-4927-9eda-1ea2f0977cf8;634727"
+ "056594000000;603\""
+ " ID=\"{4fb7dea1-2912-4927-9eda-1ea2f0977cf8}\" />"
+ "</ContentDatabase>"
+ "<SPSite Change=\"Unchanged\" ItemCount=\"1\">"
+ "<Messages><Message>1;0;4fb7dea1-2912-4927-9eda-1ea2f0977cf8;63472702"
+ "8976500000;600 Microsoft.SharePoint.SPChangeItem Add Done </Message>"
+ "</Messages>"
+ "<Site>"
+ "<Metadata URL=\"http://localhost:1\""
+ " ID=\"{bb3bb2dd-6ea7-471b-a361-6fb67988755c}\""
+ " LastModified=\"2012-05-15 19:07:39Z\" PortalURL=\"\""
+ " UserProfileGUID=\"\""
+ " RootWebId=\"{b2ea1067-3a54-4ab7-a459-c8ec864b97eb}\""
+ " ChangeId=\"1;0;4fb7dea1-2912-4927-9eda-1ea2f0977cf8;634727056594000"
+ "000;603\" />"
+ "<Groups><Group><Group ID=\"3\" Name=\"chinese1 Owners\""
+ " Description=\"Use this group to give people full control permission"
+ "s to the SharePoint site: chinese1\" OwnerID=\"3\""
+ " OwnerIsUser=\"False\" />"
+ "<Users>"
+ "<User ID=\"1\" Sid=\"S-1-5-21-736914693-3137354690-2813686979-500\""
+ " Name=\"GDC-PSL\\administrator\""
+ " LoginName=\"GDC-PSL\\administrator\" Email=\"\" Notes=\"\""
+ " IsSiteAdmin=\"True\" IsDomainGroup=\"False\" />"
+ "<User ID=\"2\" Sid=\"S-1-5-21-736914693-3137354690-2813686979-1130\""
+ " Name=\"spuser1\" LoginName=\"GDC-PSL\\spuser1\" Email=\"\""
+ " Notes=\"\" IsSiteAdmin=\"True\" IsDomainGroup=\"False\" />"
+ "</Users></Group>"
+ "<Group><Group ID=\"4\" Name=\"chinese1 Visitors\""
+ " Description=\"Use this group to give people read permissions to the"
+ " SharePoint site: chinese1\""
+ " OwnerID=\"3\" OwnerIsUser=\"False\" />"
+ "<Users /></Group>"
+ "<Group><Group ID=\"5\" Name=\"chinese1 Members\""
+ " Description=\"Use this group to give people contribute permissions "
+ "to the SharePoint site: chinese1\""
+ " OwnerID=\"3\" OwnerIsUser=\"False\" />"
+ "<Users /></Group></Groups>"
+ "</Site>"
+ "<SPWeb Change=\"Unchanged\" ItemCount=\"1\">"
+ "<Web><Metadata URL=\"http://localhost:1\""
+ " LastModified=\"2012-05-15 19:07:39Z\""
+ " Created=\"2011-10-14 18:59:25Z\""
+ " ID=\"{b2ea1067-3a54-4ab7-a459-c8ec864b97eb}\" Title=\"chinese1\""
+ " Description=\"\" Author=\"GDC-PSL\\administrator\""
+ " Language=\"1033\" CRC=\"558566148\" NoIndex=\"False\""
+ " DefaultHomePage=\"default.aspx\" ExternalSecurity=\"False\""
+ " ScopeID=\"{01abac8c-66c8-4fed-829c-8dd02bbf40dd}\""
+ " AllowAnonymousAccess=\"False\" AnonymousViewListItems=\"False\""
+ " AnonymousPermMask=\"0\" />"
+ "<Users><User ID=\"1\""
+ " Sid=\"S-1-5-21-736914693-3137354690-2813686979-500\""
+ " Name=\"GDC-PSL\\administrator\""
+ " LoginName=\"GDC-PSL\\administrator\" Email=\"\" Notes=\"\""
+ " IsSiteAdmin=\"True\" IsDomainGroup=\"False\" />"
+ "<User ID=\"2\" Sid=\"S-1-5-21-736914693-3137354690-2813686979-1130\""
+ " Name=\"spuser1\" LoginName=\"GDC-PSL\\spuser1\" Email=\"\""
+ " Notes=\"\" IsSiteAdmin=\"True\" IsDomainGroup=\"False\" />"
+ "</Users>"
+ "<ACL><permissions>"
+ "<permission memberid='2' mask='9223372036854775807' />"
+ "<permission memberid='3' mask='9223372036854775807' />"
+ "<permission memberid='4' mask='756052856929' />"
+ "<permission memberid='5' mask='1856436900591' />"
+ "</permissions></ACL>"
+ "<Webs /><Lists />"
+ "</Web>"
+ "<SPList Change=\"Unchanged\" ItemCount=\"1\">"
+ "<List><Metadata ID=\"{133fcb96-7e9b-46c9-b5f3-09770a35ad8a}\""
+ " LastModified=\"2012-05-15 18:21:38Z\" Title=\"Announcements\""
+ " DefaultTitle=\"True\""
+ " Description=\"Use the Announcements list to post messages on the ho"
+ "me page of your site.\""
+ " BaseType=\"GenericList\" BaseTemplate=\"Announcements\""
+ " DefaultViewUrl=\"/Lists/Announcements/AllItems.aspx\""
+ " DefaultViewItemUrl=\"/Lists/Announcements/DispForm.aspx\""
+ " RootFolder=\"Lists/Announcements\" Author=\"System Account\""
+ " ItemCount=\"2\" ReadSecurity=\"1\" AllowAnonymousAccess=\"False\""
+ " AnonymousViewListItems=\"False\" AnonymousPermMask=\"0\""
+ " CRC=\"751515778\" NoIndex=\"False\""
+ " ScopeID=\"{01abac8c-66c8-4fed-829c-8dd02bbf40dd}\" />"
+ "<ACL><permissions>"
+ "<permission memberid='2' mask='9223372036854775807' />"
+ "<permission memberid='3' mask='9223372036854775807' />"
+ "<permission memberid='4' mask='756052856929' />"
+ "<permission memberid='5' mask='1856436900591' />"
+ "</permissions></ACL>"
+ "<Views><View URL=\"Lists/Announcements/AllItems.aspx\""
+ " ID=\"{54f41f88-ddf6-404c-bdf9-a104eabcd1a9}\" Title=\"All items\""
+ " /></Views>"
+ "<Schema>"
+ "<Field Name=\"ID\" Title=\"ID\" Type=\"Counter\" />"
+ "<Field Name=\"ContentType\" Title=\"Content Type\" Type=\"Text\" />"
+ "<Field Name=\"Title\" Title=\"Title\" Type=\"Text\" />"
+ "<Field Name=\"Modified\" Title=\"Modified\" Type=\"DateTime\" />"
+ "<Field Name=\"Created\" Title=\"Created\" Type=\"DateTime\" />"
+ "<Field Name=\"Author\" Title=\"Created By\" Type=\"User\" />"
+ "<Field Name=\"Editor\" Title=\"Modified By\" Type=\"User\" />"
+ "<Field Name=\"_UIVersionString\" Title=\"Version\" Type=\"Text\" />"
+ "<Field Name=\"Attachments\" Title=\"Attachments\""
+ " Type=\"Attachments\" />"
+ "<Field Name=\"Edit\" Title=\"Edit\" Type=\"Computed\" />"
+ "<Field Name=\"LinkTitleNoMenu\" Title=\"Title\" Type=\"Computed\" />"
+ "<Field Name=\"LinkTitle\" Title=\"Title\" Type=\"Computed\" />"
+ "<Field Name=\"DocIcon\" Title=\"Type\" Type=\"Computed\" />"
+ "<Field Name=\"Body\" Title=\"Body\" Type=\"Note\" />"
+ "<Field Name=\"Expires\" Title=\"Expires\" Type=\"DateTime\" />"
+ "</Schema> </List>"
+ "<SPListItem Change=\"Add\" ItemCount=\"0\" UpdateSecurity=\"False\""
+ " Id=\"{5085be94-b5c1-45c8-a047-d0f03344fe31}\""
+ " ParentId=\"{133fcb96-7e9b-46c9-b5f3-09770a35ad8a}_\""
+ " InternalUrl=\"/siteurl=/siteid={bb3bb2dd-6ea7-471b-a361-6fb67988755"
+ "c}/weburl=/webid={b2ea1067-3a54-4ab7-a459-c8ec864b97eb}/listid={13"
+ "3fcb96-7e9b-46c9-b5f3-09770a35ad8a}/folderurl=/itemid=2\""
+ " DisplayUrl=\"/Lists/Announcements/DispForm.aspx?ID=2\""
+ " ServerUrl=\"http://localhost:1\" CRC=\"0\" Url=\"2_.000\">"
+ "<ListItem>"
+ "<z:row xmlns:z='#RowsetSchema' ows_ID='2'"
+ " ows_ContentTypeId='0x010400FDF586FAF309684984C89E7FB272808F'"
+ " ows_ContentType='Announcement' ows_Title='Test Announcement'"
+ " ows_Modified='2012-05-15T18:21:38Z'"
+ " ows_Created='2012-05-15T18:21:38Z'"
+ " ows_Author='1073741823;#System Account'"
+ " ows_Editor='1073741823;#System Account' ows_owshiddenversion='1'"
+ " ows_WorkflowVersion='1' ows__UIVersion='512'"
+ " ows__UIVersionString='1.0' ows_Attachments='0'"
+ " ows__ModerationStatus='0' ows_LinkTitleNoMenu='Test Announcement'"
+ " ows_LinkTitle='Test Announcement' ows_SelectTitle='2'"
+ " ows_Order='200.000000000000'"
+ " ows_GUID='{986A1401-9DE7-4CD5-8CC0-9BBC64D5F146}'"
+ " ows_FileRef='2;#Lists/Announcements/2_.000'"
+ " ows_FileDirRef='2;#Lists/Announcements'"
+ " ows_Last_x0020_Modified='2;#2012-05-15T18:21:38Z'"
+ " ows_Created_x0020_Date='2;#2012-05-15T18:21:38Z'"
+ " ows_FSObjType='2;#0' ows_PermMask='0x7fffffffffffffff'"
+ " ows_FileLeafRef='2;#2_.000'"
+ " ows_UniqueId='2;#{5085BE94-B5C1-45C8-A047-D0F03344FE31}'"
+ " ows_ProgId='2;#'"
+ " ows_ScopeId='2;#{01ABAC8C-66C8-4FED-829C-8DD02BBF40DD}'"
+ " ows__EditMenuTableStart='2_.000' ows__EditMenuTableEnd='2'"
+ " ows_LinkFilenameNoMenu='2_.000' ows_LinkFilename='2_.000'"
+ " ows_ServerUrl='/Lists/Announcements/2_.000'"
+ " ows_EncodedAbsUrl='http://localhost:1/Lists/Announcements/2_.000'"
+ " ows_BaseName='2_' ows_MetaInfo='2;#' ows__Level='1'"
+ " ows__IsCurrentVersion='1'"
+ " ows_Body='This is the body of the announcement.'"
+ " ows_ServerRedirected='0'/>"
+ "<permissions>"
+ "<permission memberid='2' mask='9223372036854775807' />"
+ "<permission memberid='3' mask='9223372036854775807' />"
+ "<permission memberid='4' mask='756052856929' />"
+ "<permission memberid='5' mask='1856436900591' />"
+ "</permissions></ListItem></SPListItem>"
+ "</SPList>"
+ "</SPWeb>"
+ "</SPSite>"
+ "</SPContentDatabase>";
adaptor = new SharePointAdaptor(new UnsupportedSiteDataFactory(),
new UnsupportedHttpClient());
AccumulatingDocIdPusher pusher = new AccumulatingDocIdPusher();
adaptor.init(new MockAdaptorContext(config, pusher));
SharePointAdaptor.SiteDataClient client = adaptor.new SiteDataClient(
"http://localhost:1/sites/SiteCollection",
"http://localhost:1/sites/SiteCollection", new UnsupportedSiteData(),
new UnsupportedCallable<MemberIdMapping>());
SPContentDatabase result
= parseChanges(client, getChangesContentDatabase);
client.getModifiedDocIds(result, pusher);
assertEquals(1, pusher.getRecords().size());
assertEquals(new DocIdPusher.Record.Builder(new DocId(
"http://localhost:1/Lists/Announcements/2_.000"))
.setCrawlImmediately(true).build(), pusher.getRecords().get(0));
}
@Test
public void testParseError() throws Exception {
adaptor = new SharePointAdaptor(new UnsupportedSiteDataFactory(),
new UnsupportedHttpClient());
adaptor.init(new MockAdaptorContext(config, null));
SharePointAdaptor.SiteDataClient client = adaptor.new SiteDataClient(
"http://localhost:1", "http://localhost:1",
new UnsupportedSiteData(), new UnsupportedCallable<MemberIdMapping>());
String xml = "<broken";
thrown.expect(IOException.class);
client.jaxbParse(xml, SPContentDatabase.class);
}
@Test
public void testValidationError() throws Exception {
adaptor = new SharePointAdaptor(new UnsupportedSiteDataFactory(),
new UnsupportedHttpClient());
adaptor.init(new MockAdaptorContext(config, null));
SharePointAdaptor.SiteDataClient client = adaptor.new SiteDataClient(
"http://localhost:1", "http://localhost:1",
new UnsupportedSiteData(), new UnsupportedCallable<MemberIdMapping>());
// Lacks required child element.
String xml = "<SPContentDatabase"
+ " xmlns='http://schemas.microsoft.com/sharepoint/soap/'/>";
thrown.expect(IOException.class);
client.jaxbParse(xml, SPContentDatabase.class);
}
@Test
public void testDisabledValidation() throws Exception {
adaptor = new SharePointAdaptor(new UnsupportedSiteDataFactory(),
new UnsupportedHttpClient());
config.overrideKey("sharepoint.xmlValidation", "false");
adaptor.init(new MockAdaptorContext(config, null));
SharePointAdaptor.SiteDataClient client = adaptor.new SiteDataClient(
"http://localhost:1", "http://localhost:1",
new UnsupportedSiteData(), new UnsupportedCallable<MemberIdMapping>());
// Lacks required child element.
String xml = "<SPContentDatabase"
+ " xmlns='http://schemas.microsoft.com/sharepoint/soap/'/>";
assertNotNull(client.jaxbParse(xml, SPContentDatabase.class));
}
@Test
public void testParseUnknownXml() throws Exception {
adaptor = new SharePointAdaptor(new UnsupportedSiteDataFactory(),
new UnsupportedHttpClient());
adaptor.init(new MockAdaptorContext(config, null));
SharePointAdaptor.SiteDataClient client = adaptor.new SiteDataClient(
"http://localhost:1", "http://localhost:1",
new UnsupportedSiteData(), new UnsupportedCallable<MemberIdMapping>());
// Valid XML, but not any class that we know about.
String xml = "<html/>";
thrown.expect(IOException.class);
client.jaxbParse(xml, SPContentDatabase.class);
}
@Test
public void testFileInfoGetFirstHeaderWithNameMissing() {
FileInfo fi = new FileInfo.Builder(new ByteArrayInputStream(new byte[0]))
.setHeaders(Arrays.asList("Some-Header", "somevalue")).build();
assertEquals("somevalue", fi.getFirstHeaderWithName("some-heaDer"));
assertNull(fi.getFirstHeaderWithName("Missing-Header"));
}
@Test
public void testFileInfoNullContents() {
thrown.expect(NullPointerException.class);
new FileInfo.Builder(null);
}
@Test
public void testFileInfoNullHeaders() {
FileInfo.Builder builder
= new FileInfo.Builder(new ByteArrayInputStream(new byte[0]));
thrown.expect(NullPointerException.class);
builder.setHeaders(null);
}
@Test
public void testFileInfoOddHeadersLength() {
FileInfo.Builder builder
= new FileInfo.Builder(new ByteArrayInputStream(new byte[0]));
thrown.expect(IllegalArgumentException.class);
builder.setHeaders(Arrays.asList("odd-length"));
}
private <T> void setValue(Holder<T> holder, T value) {
if (holder != null) {
holder.value = value;
}
}
private SPContentDatabase parseChanges(
SharePointAdaptor.SiteDataClient client, String xml) throws IOException {
String xmlns = "http://schemas.microsoft.com/sharepoint/soap/";
xml = xml.replace("<SPContentDatabase ",
"<SPContentDatabase xmlns='" + xmlns + "' ");
return client.jaxbParse(xml, SPContentDatabase.class);
}
private static class UnsupportedSiteDataFactory implements SiteDataFactory {
@Override
public SiteDataSoap newSiteData(String endpoint) {
throw new UnsupportedOperationException();
}
}
private static class SingleSiteDataFactory implements SiteDataFactory {
private final SiteDataSoap siteData;
private final String expectedEndpoint;
public SingleSiteDataFactory(SiteDataSoap siteData,
String expectedEndpoint) {
this.siteData = siteData;
this.expectedEndpoint = expectedEndpoint;
}
@Override
public SiteDataSoap newSiteData(String endpoint) {
assertEquals(expectedEndpoint, endpoint);
return siteData;
}
}
private static class UnsupportedHttpClient implements HttpClient {
@Override
public FileInfo issueGetRequest(URL url) {
throw new UnsupportedOperationException();
}
}
/**
* Throw UnsupportedOperationException for all calls.
*/
private static class UnsupportedSiteData implements SiteDataSoap {
@Override
public void getSiteAndWeb(String strUrl, Holder<Long> getSiteAndWebResult,
Holder<String> strSite, Holder<String> strWeb) {
throw new UnsupportedOperationException();
}
@Override
public void getSite(Holder<Long> getSiteResult,
Holder<SSiteMetadata> sSiteMetadata, Holder<ArrayOfSWebWithTime> vWebs,
Holder<String> strUsers, Holder<String> strGroups,
Holder<ArrayOfString> vGroups) {
throw new UnsupportedOperationException();
}
@Override
public void getWeb(Holder<Long> getWebResult,
Holder<SWebMetadata> sWebMetadata, Holder<ArrayOfSWebWithTime> vWebs,
Holder<ArrayOfSListWithTime> vLists, Holder<ArrayOfSFPUrl> vFPUrls,
Holder<String> strRoles, Holder<ArrayOfString> vRolesUsers,
Holder<ArrayOfString> vRolesGroups) {
throw new UnsupportedOperationException();
}
@Override
public void getList(String strListName, Holder<Long> getListResult,
Holder<SListMetadata> sListMetadata,
Holder<ArrayOfSProperty> vProperties) {
throw new UnsupportedOperationException();
}
@Override
public String getListItems(String strListName, String strQuery,
String strViewFields, long uRowLimit) {
throw new UnsupportedOperationException();
}
@Override
public void enumerateFolder(String strFolderUrl,
Holder<Long> enumerateFolderResult, Holder<ArrayOfSFPUrl> vUrls) {
throw new UnsupportedOperationException();
}
@Override
public void getAttachments(String strListName, String strItemId,
Holder<Long> getAttachmentsResult, Holder<ArrayOfString> vAttachments) {
throw new UnsupportedOperationException();
}
@Override
public void getURLSegments(String strURL,
Holder<Boolean> getURLSegmentsResult, Holder<String> strWebID,
Holder<String> strBucketID, Holder<String> strListID,
Holder<String> strItemID) {
throw new UnsupportedOperationException();
}
@Override
public void getListCollection(Holder<Long> getListCollectionResult,
Holder<ArrayOfSList> vLists) {
throw new UnsupportedOperationException();
}
@Override
public void getContent(ObjectType objectType, String objectId,
String folderUrl, String itemId, boolean retrieveChildItems,
boolean securityOnly, Holder<String> lastItemIdOnPage,
Holder<String> getContentResult) {
throw new UnsupportedOperationException();
}
@Override
public void getSiteUrl(String url, Holder<Long> getSiteUrlResult,
Holder<String> siteUrl, Holder<String> siteId) {
throw new UnsupportedOperationException();
}
@Override
public void getChanges(ObjectType objectType, String contentDatabaseId,
Holder<String> lastChangeId, Holder<String> currentChangeId,
Integer timeout, Holder<String> getChangesResult,
Holder<Boolean> moreChanges) {
throw new UnsupportedOperationException();
}
@Override
public String getChangesEx(int version, String xmlInput) {
throw new UnsupportedOperationException();
}
}
private static class UnsupportedCallable<V> implements Callable<V> {
@Override
public V call() {
throw new UnsupportedOperationException();
}
}
}