use of org.dataportabilityproject.spi.transfer.types.ContinuationData in project data-transfer-project by google.
the class GoogleCalendarExporterTest method exportCalendarFirstSet.
@Test
public void exportCalendarFirstSet() throws IOException {
setUpSingleCalendarResponse();
// Looking at first page, with at least one page after it
calendarListResponse.setNextPageToken(NEXT_TOKEN);
// Run test
ExportResult<CalendarContainerResource> result = googleCalendarExporter.export(JOB_ID, null);
// Check results
// Verify correct methods were called
verify(calendarClient).calendarList();
verify(calendarCalendarList).list();
verify(calendarListRequest).execute();
// Check pagination token
ContinuationData continuationData = (ContinuationData) result.getContinuationData();
StringPaginationToken paginationToken = (StringPaginationToken) continuationData.getPaginationData();
assertThat(paginationToken.getToken()).isEqualTo(CALENDAR_TOKEN_PREFIX + NEXT_TOKEN);
// Check calendars
Collection<CalendarModel> actualCalendars = result.getExportedData().getCalendars();
assertThat(actualCalendars.stream().map(CalendarModel::getId).collect(Collectors.toList())).containsExactly(CALENDAR_ID);
// Check events (should be empty, even though there is an event in the calendar
Collection<CalendarEventModel> actualEvents = result.getExportedData().getEvents();
assertThat(actualEvents).isEmpty();
// Should be one container in the resource list
List<ContainerResource> actualResources = continuationData.getContainerResources();
assertThat(actualResources.stream().map(a -> ((IdOnlyContainerResource) a).getId()).collect(Collectors.toList())).containsExactly(CALENDAR_ID);
}
use of org.dataportabilityproject.spi.transfer.types.ContinuationData in project data-transfer-project by google.
the class GoogleContactsExporterTest method exportFirstPage.
@Test
public void exportFirstPage() throws IOException {
setUpSinglePersonResponse();
// Looking at first page, with at least one page after it
listConnectionsResponse.setNextPageToken(NEXT_PAGE_TOKEN);
ExportResult<ContactsModelWrapper> result = contactsService.export(UUID.randomUUID(), null);
// Check that correct methods were called
verify(connections).list(SELF_RESOURCE);
InOrder inOrder = Mockito.inOrder(getBatchGet);
inOrder.verify(getBatchGet).setResourceNames(Collections.singletonList(RESOURCE_NAME));
inOrder.verify(getBatchGet).setPersonFields(PERSON_FIELDS);
inOrder.verify(getBatchGet).execute();
// Check continuation data
ContinuationData continuationData = (ContinuationData) result.getContinuationData();
assertThat(continuationData.getContainerResources()).isEmpty();
StringPaginationToken paginationToken = (StringPaginationToken) ((ContinuationData) result.getContinuationData()).getPaginationData();
assertThat(paginationToken.getToken()).isEqualTo(NEXT_PAGE_TOKEN);
// Check that the right number of VCards was returned
JCardReader reader = new JCardReader(result.getExportedData().getVCards());
List<VCard> vCardList = reader.readAll();
assertThat(vCardList.size()).isEqualTo(connectionsList.size());
}
use of org.dataportabilityproject.spi.transfer.types.ContinuationData in project data-transfer-project by google.
the class FlickrPhotosExporterTest method exportAlbumInitial.
@Test
public void exportAlbumInitial() throws FlickrException {
// set up auth, flickr service
when(user.getId()).thenReturn("userId");
when(authInterface.checkToken(any(Token.class))).thenReturn(auth);
when(flickr.getPhotosetsInterface()).thenReturn(photosetsInterface);
when(flickr.getPhotosInterface()).thenReturn(photosInterface);
when(flickr.getAuthInterface()).thenReturn(authInterface);
// setup photoset
Photoset photoset = FlickrTestUtils.initializePhotoset("photosetId", "title", "description");
// setup photoset list (aka album view)
int page = 1;
Photosets photosetsList = new Photosets();
photosetsList.setPage(page);
photosetsList.setPages(page + 1);
photosetsList.setPhotosets(Collections.singletonList(photoset));
when(photosetsInterface.getList(anyString(), anyInt(), anyInt(), anyString())).thenReturn(photosetsList);
// run test
FlickrPhotosExporter exporter = new FlickrPhotosExporter(flickr);
AuthData authData = new TokenSecretAuthData("token", "secret");
ExportResult<PhotosContainerResource> result = exporter.export(UUID.randomUUID(), authData);
// make sure album and photo information is correct
assertThat(result.getExportedData().getPhotos()).isEmpty();
Collection<PhotoAlbum> albums = result.getExportedData().getAlbums();
assertThat(albums.size()).isEqualTo(1);
assertThat(albums).containsExactly(new PhotoAlbum("photosetId", "title", "description"));
// check continuation information
ContinuationData continuationData = (ContinuationData) result.getContinuationData();
assertThat(continuationData.getPaginationData()).isInstanceOf(IntPaginationToken.class);
assertThat(((IntPaginationToken) continuationData.getPaginationData()).getStart()).isEqualTo(page + 1);
Collection<? extends ContainerResource> subResources = continuationData.getContainerResources();
assertThat(subResources.size()).isEqualTo(1);
assertThat(subResources).containsExactly(new IdOnlyContainerResource("photosetId"));
}
use of org.dataportabilityproject.spi.transfer.types.ContinuationData in project data-transfer-project by google.
the class MicrosoftContactsExporter method doExport.
@SuppressWarnings("unchecked")
private ExportResult<ContactsModelWrapper> doExport(TokenAuthData authData, String url) {
Request.Builder graphReqBuilder = new Request.Builder().url(url);
graphReqBuilder.header("Authorization", "Bearer " + authData.getToken());
try (Response graphResponse = client.newCall(graphReqBuilder.build()).execute()) {
ResponseBody body = graphResponse.body();
if (body == null) {
return new ExportResult<>(ExportResult.ResultType.ERROR, "Error retrieving contacts: response body was null");
}
String graphBody = new String(body.bytes());
Map graphMap = objectMapper.reader().forType(Map.class).readValue(graphBody);
String nextLink = (String) graphMap.get(ODATA_NEXT);
ContinuationData continuationData = nextLink == null ? null : new ContinuationData(new GraphPagination(nextLink));
List<Map<String, Object>> rawContacts = (List<Map<String, Object>>) graphMap.get("value");
if (rawContacts == null) {
return new ExportResult<>(ExportResult.ResultType.END);
}
ContactsModelWrapper wrapper = transform(rawContacts);
return new ExportResult<>(ExportResult.ResultType.CONTINUE, wrapper, continuationData);
} catch (IOException e) {
// FIXME log error
e.printStackTrace();
return new ExportResult<>(ExportResult.ResultType.ERROR, "Error retrieving contacts: " + e.getMessage());
}
}
use of org.dataportabilityproject.spi.transfer.types.ContinuationData in project data-transfer-project by google.
the class PortabilityInMemoryDataCopier method copyHelper.
/**
* Transfers data from the given {@code exporter} optionally starting at the point specified in
* the provided {@code exportInformation}. Imports the data using the provided {@code importer}.
* If there is more data to required to be exported, recursively copies using the specific {@link
* ExportInformation} to continue the process.
*
* @param exportAuthData The auth data for the export
* @param importAuthData The auth data for the import
* @param exportInformation Any pagination or resource information to use for subsequent calls.
*/
private void copyHelper(UUID jobId, AuthData exportAuthData, AuthData importAuthData, ExportInformation exportInformation) {
logger.debug("copy iteration: {}", COPY_ITERATION_COUNTER.incrementAndGet());
// NOTE: order is important below, do the import of all the items, then do continuation
// then do sub resources, this ensures all parents are populated before children get
// processed.
logger.debug("Starting export, ExportInformation: {}", exportInformation);
ExportResult<?> exportResult = exporter.get().export(jobId, exportAuthData, exportInformation);
logger.debug("Finished export, results: {}", exportResult);
logger.debug("Starting import");
importer.get().importItem(jobId, importAuthData, exportResult.getExportedData());
logger.debug("Finished import");
ContinuationData continuationData = (ContinuationData) exportResult.getContinuationData();
if (null != continuationData) {
// Process the next page of items for the resource
if (null != continuationData.getPaginationData()) {
logger.debug("start off a new copy iteration with pagination info");
copyHelper(jobId, exportAuthData, importAuthData, new ExportInformation(continuationData.getPaginationData(), exportInformation.getContainerResource()));
}
// Start processing sub-resources
if (continuationData.getContainerResources() != null && !continuationData.getContainerResources().isEmpty()) {
for (ContainerResource resource : continuationData.getContainerResources()) {
copyHelper(jobId, exportAuthData, importAuthData, new ExportInformation(null, resource));
}
}
}
}
Aggregations