Skip to content

Commit 577e584

Browse files
authored
fix: refactor the pagination prefix and token processing (#1476)
Encapsulate pageTokenPrefix and paginationToken within a unified PageToken class or utility functions to simplify and generalize pagination logic. Issue : The logic to validate and extract the pageToken from the request is not standardized and has repetition for every case which makes it error prone. The change was already done for exporting release. This change adds generic methods to the StringPaginationToken class and refactors the export playlist method.
1 parent 69f77bc commit 577e584

File tree

2 files changed

+24
-50
lines changed

2 files changed

+24
-50
lines changed

extensions/data-transfer/portability-data-transfer-google/src/main/java/org/datatransferproject/datatransfer/google/music/GoogleMusicExporter.java

Lines changed: 8 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -132,42 +132,25 @@ public ExportResult<MusicContainerResource> export(
132132
}
133133
}
134134

135-
// TODO(@jzacsh): Replace pageTokenPrefix and paginationToken with simplified and general class or
136-
// functions.
137135
@VisibleForTesting
138136
ExportResult<MusicContainerResource> exportPlaylists(
139137
TokensAndUrlAuthData authData, Optional<PaginationData> paginationData, UUID jobId)
140138
throws IOException, InvalidTokenException, PermissionDeniedException {
141-
Optional<String> paginationToken = Optional.empty();
142-
String pageTokenPrefix = "";
143-
if (paginationData.isPresent()) {
144-
String token = ((StringPaginationToken) paginationData.get()).getToken();
145-
Preconditions.checkArgument(
146-
token.startsWith(PLAYLIST_TOKEN_PREFIX), "Invalid pagination token %s", token);
147-
pageTokenPrefix = token.substring(0, getTokenPrefixLength(token));
148-
if (getTokenPrefixLength(token) < token.length()) {
149-
paginationToken = Optional.of(token.substring(getTokenPrefixLength(token)));
150-
}
151-
}
152-
139+
Optional<String> paginationToken = getToken(PLAYLIST_TOKEN_PREFIX, paginationData);
153140
PlaylistExportResponse playlistExportResponse =
154141
getOrCreateMusicHttpApi(authData).exportPlaylists(paginationToken);
155142

156-
PaginationData nextPageData;
157-
String token = playlistExportResponse.getNextPageToken();
143+
PaginationData nextPageData = new StringPaginationToken("");
144+
String nextPageToken = playlistExportResponse.getNextPageToken();
158145
List<MusicPlaylist> playlists = new ArrayList<>();
159146
GooglePlaylist[] googlePlaylists = playlistExportResponse.getPlaylists();
160147
ResultType resultType = ResultType.END;
161148

162-
if (Strings.isNullOrEmpty(token)) {
163-
nextPageData =
164-
new StringPaginationToken(pageTokenPrefix.substring(PLAYLIST_TOKEN_PREFIX.length()));
165-
} else {
166-
nextPageData = new StringPaginationToken(pageTokenPrefix + token);
149+
if (!Strings.isNullOrEmpty(nextPageToken)) {
150+
nextPageData = new StringPaginationToken(PLAYLIST_TOKEN_PREFIX + nextPageToken);
167151
resultType = ResultType.CONTINUE;
168152
}
169153
ContinuationData continuationData = new ContinuationData(nextPageData);
170-
171154
if (googlePlaylists != null && googlePlaylists.length > 0) {
172155
for (GooglePlaylist googlePlaylist : googlePlaylists) {
173156
Instant createTime = googlePlaylist.getCreateTime() == null ? null
@@ -275,37 +258,13 @@ ExportResult<MusicContainerResource> exportReleases(TokensAndUrlAuthData authDat
275258
private Optional<String> getToken(String prefix, Optional<PaginationData> paginationData){
276259
Optional<String> paginationToken = Optional.empty();
277260
if (paginationData.isPresent()) {
278-
String token = ((StringPaginationToken) paginationData.get()).getToken();
279-
Preconditions.checkArgument(
280-
token.startsWith(prefix), "Invalid pagination token %s",
281-
token);
282-
if (prefix.length() < token.length()) {
283-
paginationToken = Optional.of(token.substring(prefix.length()));
284-
}
261+
StringPaginationToken tokenObject = ((StringPaginationToken) paginationData.get());
262+
tokenObject.verify(prefix);
263+
paginationToken = tokenObject.getParsedToken(prefix);
285264
}
286265
return paginationToken;
287266
}
288267

289-
290-
private int getTokenPrefixLength(String token) {
291-
final ImmutableList<String> knownPrefixes =
292-
ImmutableList.of(
293-
PLAYLIST_TRACK_RELEASE_TOKEN_PREFIX,
294-
PLAYLIST_TRACK_TOKEN_PREFIX,
295-
PLAYLIST_RELEASE_TOKEN_PREFIX,
296-
PLAYLIST_TOKEN_PREFIX,
297-
TRACK_RELEASE_TOKEN_PREFIX,
298-
TRACK_TOKEN_PREFIX,
299-
RELEASE_TOKEN_PREFIX);
300-
301-
for (String prefix : knownPrefixes) {
302-
if (token.startsWith(prefix)) {
303-
return prefix.length();
304-
}
305-
}
306-
return 0;
307-
}
308-
309268
private @Nullable List<MusicGroup> createMusicGroups(GoogleArtist[] artists) {
310269
if (artists == null) {
311270
return null;

portability-types-common/src/main/java/org/datatransferproject/types/common/StringPaginationToken.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
import com.fasterxml.jackson.annotation.JsonCreator;
44
import com.fasterxml.jackson.annotation.JsonProperty;
55
import com.fasterxml.jackson.annotation.JsonTypeName;
6-
import org.datatransferproject.types.common.PaginationData;
6+
import com.google.common.base.Preconditions;
7+
import java.util.Optional;
78

89
/**
910
* String pagination data.
@@ -25,4 +26,18 @@ public StringPaginationToken(@JsonProperty("token") String token) {
2526
public String getToken() {
2627
return token;
2728
}
29+
30+
public void verify(String prefix){
31+
Preconditions.checkArgument(
32+
getToken().startsWith(prefix), "Invalid pagination token %s",
33+
getToken());
34+
}
35+
36+
public Optional<String> getParsedToken(String prefix){
37+
Optional<String> parsedToken = Optional.empty();
38+
if (prefix.length() < token.length()) {
39+
parsedToken = Optional.of(token.substring(prefix.length()));
40+
}
41+
return parsedToken;
42+
}
2843
}

0 commit comments

Comments
 (0)