@Override public ExportResult<SocialActivityContainerResource> export( UUID jobId, TokensAndUrlAuthData authData, Optional<ExportInformation> exportInformation) throws IOException { Plus plus = getOrCreatePeopleService(authData); Plus.Activities.List listActivities = plus.activities().list("me", "public"); if (exportInformation.isPresent()) { StringPaginationToken pageToken = (StringPaginationToken) exportInformation.get().getPaginationData(); listActivities.setPageToken(pageToken.getToken()); } ActivityFeed activityFeed = listActivities.execute(); List<Activity> activities = activityFeed.getItems(); ContinuationData continuationData = null; SocialActivityContainerResource results = null; if (activities != null && !activities.isEmpty()) { List<com.ibm.common.activitystreams.Activity> parsedActivities = new ArrayList<>(); continuationData = new ContinuationData(new StringPaginationToken(activityFeed.getNextPageToken())); for (Activity activity : activities) { parsedActivities.add(postToActivityStream(activity)); } results = new SocialActivityContainerResource(jobId.toString(), parsedActivities, null); } return new ExportResult<>( ResultType.CONTINUE, results, continuationData); }
@Test(expected = IllegalStateException.class) public void testIllegalExport() { facebookPhotosExporter.export( uuid, new TokensAndUrlAuthData("accessToken", null, null), Optional.of(new ExportInformation(new StringPaginationToken(PHOTO_TOKEN_PREFIX), null))); } }
private Optional<String> getPhotosPaginationToken(Optional<PaginationData> paginationData) { Optional<String> paginationToken = Optional.empty(); if (paginationData.isPresent()) { String token = ((StringPaginationToken) paginationData.get()).getToken(); Preconditions .checkArgument(token.startsWith(PHOTO_TOKEN_PREFIX), "Invalid pagination token " + token); if (token.length() > PHOTO_TOKEN_PREFIX.length()) { paginationToken = Optional.of(token.substring(PHOTO_TOKEN_PREFIX.length())); } } return paginationToken; }
@VisibleForTesting ExportResult<PhotosContainerResource> exportPhotos(TokensAndUrlAuthData authData, Optional<IdOnlyContainerResource> albumData, Optional<PaginationData> paginationData, UUID jobId) throws IOException { Optional<String> albumId = Optional.empty(); if (albumData.isPresent()) { albumId = Optional.of(albumData.get().getId()); } Optional<String> paginationToken = getPhotosPaginationToken(paginationData); MediaItemSearchResponse mediaItemSearchResponse = getOrCreatePhotosInterface(authData) .listMediaItems(albumId, paginationToken); PaginationData nextPageData = null; if (!Strings.isNullOrEmpty(mediaItemSearchResponse.getNextPageToken())) { nextPageData = new StringPaginationToken( PHOTO_TOKEN_PREFIX + mediaItemSearchResponse.getNextPageToken()); } ContinuationData continuationData = new ContinuationData(nextPageData); PhotosContainerResource containerResource = null; GoogleMediaItem[] mediaItems = mediaItemSearchResponse.getMediaItems(); if (mediaItems != null && mediaItems.length > 0) { List<PhotoModel> photos = convertPhotosList(albumId, mediaItems, jobId); containerResource = new PhotosContainerResource(null, photos); } ResultType resultType = ResultType.CONTINUE; if (nextPageData == null) { resultType = ResultType.END; } return new ExportResult<>(resultType, containerResource, continuationData); }
private Optional<String> stripTokenPrefix( Optional<StringPaginationToken> paginationData, String prefix) { Optional<String> paginationToken = Optional.empty(); if (paginationData.isPresent()) { String token = paginationData.get().getToken(); Preconditions.checkArgument(token.startsWith(prefix), "Invalid pagination token " + token); paginationToken = Optional.of(token.substring(prefix.length())); } return paginationToken; }
Optional<String> paginationToken = Optional.empty(); if (paginationData.isPresent()) { String token = ((StringPaginationToken) paginationData.get()).getToken(); Preconditions.checkArgument( token.startsWith(ALBUM_TOKEN_PREFIX), "Invalid pagination token " + token); nextPageData = new StringPaginationToken(PHOTO_TOKEN_PREFIX); } else { nextPageData = new StringPaginationToken(ALBUM_TOKEN_PREFIX + token);
@Test public void exportPhotoSubsequentSet() throws IOException { setUpSingleAlbum(); when(albumListResponse.getNextPageToken()).thenReturn(null); GoogleMediaItem mediaItem = setUpSinglePhoto(IMG_URI, PHOTO_ID); when(mediaItemSearchResponse.getMediaItems()).thenReturn(new GoogleMediaItem[]{mediaItem}); when(mediaItemSearchResponse.getNextPageToken()).thenReturn(null); StringPaginationToken inputPaginationToken = new StringPaginationToken(PHOTO_TOKEN_PREFIX + PHOTO_TOKEN); IdOnlyContainerResource idOnlyContainerResource = new IdOnlyContainerResource(ALBUM_ID); // Run test ExportResult<PhotosContainerResource> result = googlePhotosExporter .exportPhotos(null, Optional.of(idOnlyContainerResource), Optional.of(inputPaginationToken), uuid); // Check results // Verify correct methods were called verify(photosInterface).listMediaItems(Optional.of(ALBUM_ID), Optional.of(PHOTO_TOKEN)); verify(mediaItemSearchResponse).getMediaItems(); // Check pagination token ContinuationData continuationData = result.getContinuationData(); PaginationData paginationToken = continuationData.getPaginationData(); assertNull(paginationToken); }
@Override public ExportResult<CalendarContainerResource> export( UUID jobId, TokensAndUrlAuthData authData, Optional<ExportInformation> exportInformation) { if (!exportInformation.isPresent()) { return exportCalendars(authData, Optional.empty()); } else { StringPaginationToken paginationToken = (StringPaginationToken) exportInformation.get().getPaginationData(); if (paginationToken != null && paginationToken.getToken().startsWith(CALENDAR_TOKEN_PREFIX)) { // Next thing to export is more calendars return exportCalendars(authData, Optional.of(paginationToken)); } else { // Next thing to export is events IdOnlyContainerResource idOnlyContainerResource = (IdOnlyContainerResource) exportInformation.get().getContainerResource(); Optional<PaginationData> pageData = Optional.ofNullable(paginationToken); return getCalendarEvents(authData, idOnlyContainerResource.getId(), pageData); } } }
StringPaginationToken pageData = (StringPaginationToken) exportInformation.get().getPaginationData(); if (!Strings.isNullOrEmpty(pageData.getToken())) { maxId = pageData.getToken(); lastId = status.getId(); continuationData = new ContinuationData(new StringPaginationToken(lastId));
ExportResult.ResultType.END, new PhotosContainerResource(null, exportPhotos)); } else { PaginationData nextPageData = new StringPaginationToken(PHOTO_TOKEN_PREFIX + token); ContinuationData continuationData = new ContinuationData(nextPageData); continuationData.addContainerResource(containerResource);
&& paginationDataPresent && paginationToken.getToken().startsWith(ALBUM_TOKEN_PREFIX)) { return exportAlbums(authData, Optional.of(paginationToken)); } else {
private ExportResult<TaskContainerResource> getTasksList( Tasks tasksService, Optional<PaginationData> paginationData) throws IOException { Tasks.Tasklists.List query = tasksService.tasklists().list().setMaxResults(PAGE_SIZE); if (paginationData.isPresent()) { query.setPageToken(((StringPaginationToken) paginationData.get()).getToken()); } TaskLists result = query.execute(); ImmutableList.Builder<TaskListModel> newTaskListsBuilder = ImmutableList.builder(); ImmutableList.Builder<IdOnlyContainerResource> newResourcesBuilder = ImmutableList.builder(); for (TaskList taskList : result.getItems()) { newTaskListsBuilder.add(new TaskListModel(taskList.getId(), taskList.getTitle())); newResourcesBuilder.add(new IdOnlyContainerResource(taskList.getId())); } PaginationData newPage = null; ResultType resultType = ResultType.END; if (result.getNextPageToken() != null) { newPage = new StringPaginationToken(result.getNextPageToken()); resultType = ResultType.CONTINUE; } List<IdOnlyContainerResource> newResources = newResourcesBuilder.build(); if (!newResources.isEmpty()) { resultType = ResultType.CONTINUE; } TaskContainerResource taskContainerResource = new TaskContainerResource(newTaskListsBuilder.build(), null); ContinuationData continuationData = new ContinuationData(newPage); newResourcesBuilder.build().forEach(continuationData::addContainerResource); return new ExportResult<>(resultType, taskContainerResource, continuationData); }
private ExportResult<PhotosContainerResource> exportAlbums( TokensAndUrlAuthData authData, Optional<StringPaginationToken> paginationData) { Optional<String> paginationToken = stripTokenPrefix(paginationData, ALBUM_TOKEN_PREFIX); ArrayList<PhotoAlbum> exportAlbums = new ArrayList<>(); // Get albums Connection<Album> connection = getOrCreatePhotosInterface(authData).getAlbums(paginationToken); PaginationData nextPageData = null; String token = connection.getAfterCursor(); if (!Strings.isNullOrEmpty(token)) { nextPageData = new StringPaginationToken(ALBUM_TOKEN_PREFIX + token); } ContinuationData continuationData = new ContinuationData(nextPageData); List<Album> albums = connection.getData(); for (Album album : albums) { exportAlbums.add(new PhotoAlbum(album.getId(), album.getName(), album.getDescription())); continuationData.addContainerResource(new IdOnlyContainerResource(album.getId())); } return new ExportResult<>( ExportResult.ResultType.CONTINUE, new PhotosContainerResource(exportAlbums, null), continuationData); }
&& paginationToken.getToken().startsWith(ALBUM_TOKEN_PREFIX)) {
StringPaginationToken paginationToken = (StringPaginationToken) pageData.get(); Preconditions.checkState( paginationToken.getToken().startsWith(EVENT_TOKEN_PREFIX), "Token is not applicable"); listRequest.setPageToken( ((StringPaginationToken) pageData.get()) .getToken() .substring(EVENT_TOKEN_PREFIX.length())); nextPageData = new StringPaginationToken(EVENT_TOKEN_PREFIX + listResult.getNextPageToken());
@Test public void exportCalendarSubsequentSet() throws IOException { setUpSingleCalendarResponse(); // Looking at subsequent page, with no page after it PaginationData paginationData = new StringPaginationToken(CALENDAR_TOKEN_PREFIX + NEXT_TOKEN); ExportInformation exportInformation = new ExportInformation(paginationData, null); calendarListResponse.setNextPageToken(null); // Run test ExportResult<CalendarContainerResource> result = googleCalendarExporter.export(UUID.randomUUID(), null, Optional.of(exportInformation)); // Check results // Verify correct calls were made InOrder inOrder = Mockito.inOrder(calendarListRequest); inOrder.verify(calendarListRequest).setPageToken(NEXT_TOKEN); inOrder.verify(calendarListRequest).execute(); // Check pagination token ContinuationData continuationData = (ContinuationData) result.getContinuationData(); StringPaginationToken paginationToken = (StringPaginationToken) continuationData.getPaginationData(); assertThat(paginationToken).isNull(); }
StringPaginationToken paginationToken = (StringPaginationToken) continuationData.getPaginationData(); assertThat(paginationToken.getToken()).isEqualTo(NEXT_TOKEN);
StringPaginationToken paginationToken = (StringPaginationToken) pageData.get(); Preconditions.checkState( paginationToken.getToken().startsWith(CALENDAR_TOKEN_PREFIX), "Token is not applicable"); listRequest.setPageToken( ((StringPaginationToken) pageData.get()) .getToken() .substring(CALENDAR_TOKEN_PREFIX.length())); if (listResult.getNextPageToken() != null) { nextPageData = new StringPaginationToken(CALENDAR_TOKEN_PREFIX + listResult.getNextPageToken());
@Test public void exportSubsequentPage() throws IOException { setUpSinglePersonResponse(); // Looking at a subsequent page, with no pages after it PaginationData paginationData = new StringPaginationToken(NEXT_PAGE_TOKEN); ExportInformation exportInformation = new ExportInformation(paginationData, null); listConnectionsResponse.setNextPageToken(null); when(listConnectionsRequest.setPageToken(NEXT_PAGE_TOKEN)).thenReturn(listConnectionsRequest); // Run test ExportResult<ContactsModelWrapper> result = contactsService.export(UUID.randomUUID(), null, Optional.of(exportInformation)); // Verify correct calls were made - i.e., token was added before execution InOrder inOrder = Mockito.inOrder(listConnectionsRequest); inOrder.verify(listConnectionsRequest).setPageToken(NEXT_PAGE_TOKEN); inOrder.verify(listConnectionsRequest).execute(); // Check continuation data ContinuationData continuationData = (ContinuationData) result.getContinuationData(); assertThat(continuationData.getContainerResources()).isEmpty(); assertThat(continuationData.getPaginationData()).isNull(); }
@Test public void exportPhotoFirstSet() throws IOException { setUpSingleAlbum(); when(albumListResponse.getNextPageToken()).thenReturn(null); GoogleMediaItem mediaItem = setUpSinglePhoto(IMG_URI, PHOTO_ID); when(mediaItemSearchResponse.getMediaItems()).thenReturn(new GoogleMediaItem[]{mediaItem}); when(mediaItemSearchResponse.getNextPageToken()).thenReturn(PHOTO_TOKEN); IdOnlyContainerResource idOnlyContainerResource = new IdOnlyContainerResource(ALBUM_ID); ExportResult<PhotosContainerResource> result = googlePhotosExporter .exportPhotos(null, Optional.of(idOnlyContainerResource), Optional.empty(), uuid); // Check results // Verify correct methods were called verify(photosInterface).listMediaItems(Optional.of(ALBUM_ID), Optional.empty()); verify(mediaItemSearchResponse).getMediaItems(); // Check pagination ContinuationData continuationData = result.getContinuationData(); StringPaginationToken paginationToken = (StringPaginationToken) continuationData.getPaginationData(); assertThat(paginationToken.getToken()).isEqualTo(PHOTO_TOKEN_PREFIX + PHOTO_TOKEN); // Check albums field of container (should be empty) Collection<PhotoAlbum> actualAlbums = result.getExportedData().getAlbums(); assertThat(actualAlbums).isEmpty(); // Check photos field of container Collection<PhotoModel> actualPhotos = result.getExportedData().getPhotos(); assertThat(actualPhotos.stream().map(PhotoModel::getFetchableUrl).collect(Collectors.toList())) .containsExactly(IMG_URI + "=d"); // for download assertThat(actualPhotos.stream().map(PhotoModel::getAlbumId).collect(Collectors.toList())) .containsExactly(ALBUM_ID); }