embulk-input-marketo 0.5.7.alpha.6 → 0.6.0.alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/build.gradle +6 -6
  3. data/src/main/java/org/embulk/input/marketo/MarketoService.java +1 -1
  4. data/src/main/java/org/embulk/input/marketo/MarketoServiceImpl.java +4 -5
  5. data/src/main/java/org/embulk/input/marketo/MarketoUtils.java +45 -14
  6. data/src/main/java/org/embulk/input/marketo/delegate/ActivityBulkExtractInputPlugin.java +12 -11
  7. data/src/main/java/org/embulk/input/marketo/delegate/CampaignInputPlugin.java +4 -23
  8. data/src/main/java/org/embulk/input/marketo/delegate/LeadBulkExtractInputPlugin.java +18 -11
  9. data/src/main/java/org/embulk/input/marketo/delegate/LeadWithListInputPlugin.java +3 -18
  10. data/src/main/java/org/embulk/input/marketo/delegate/LeadWithProgramInputPlugin.java +5 -20
  11. data/src/main/java/org/embulk/input/marketo/delegate/MarketoBaseBulkExtractInputPlugin.java +213 -87
  12. data/src/main/java/org/embulk/input/marketo/delegate/MarketoBaseInputPluginDelegate.java +22 -0
  13. data/src/main/java/org/embulk/input/marketo/model/MarketoBulkExtractRequest.java +12 -1
  14. data/src/main/java/org/embulk/input/marketo/model/MarketoField.java +28 -2
  15. data/src/main/java/org/embulk/input/marketo/model/MarketoResponse.java +2 -1
  16. data/src/main/java/org/embulk/input/marketo/model/filter/DateRangeFilter.java +9 -0
  17. data/src/main/java/org/embulk/input/marketo/rest/MarketoBaseRestClient.java +4 -0
  18. data/src/main/java/org/embulk/input/marketo/rest/{MarketoFileResponseEntityReader.java → MarketoInputStreamResponseEntityReader.java} +2 -2
  19. data/src/main/java/org/embulk/input/marketo/rest/MarketoResponseJetty92EntityReader.java +4 -1
  20. data/src/main/java/org/embulk/input/marketo/rest/MarketoRestClient.java +76 -42
  21. data/src/main/java/org/embulk/input/marketo/rest/RecordPagingIterable.java +35 -11
  22. data/src/test/java/org/embulk/input/marketo/MarketoServiceImplTest.java +159 -0
  23. data/src/test/java/org/embulk/input/marketo/MarketoUtilsTest.java +87 -0
  24. data/src/test/java/org/embulk/input/marketo/delegate/ActivityBulkExtractInputPluginTest.java +84 -0
  25. data/src/test/java/org/embulk/input/marketo/delegate/CampaignInputPluginTest.java +73 -0
  26. data/src/test/java/org/embulk/input/marketo/delegate/LeadBulkExtractInputPluginTest.java +94 -0
  27. data/src/test/java/org/embulk/input/marketo/delegate/LeadWithListInputPluginTest.java +99 -0
  28. data/src/test/java/org/embulk/input/marketo/delegate/LeadWithProgramInputPluginTest.java +101 -0
  29. data/src/test/java/org/embulk/input/marketo/delegate/MarketoBaseBulkExtractInputPluginTest.java +114 -0
  30. data/src/test/java/org/embulk/input/marketo/rest/MarketoBaseRestClientTest.java +3 -15
  31. data/src/test/java/org/embulk/input/marketo/rest/MarketoRestClientTest.java +450 -0
  32. data/src/test/resources/config/activity_bulk_extract_config.yaml +7 -0
  33. data/src/test/resources/config/lead_bulk_extract_config.yaml +8 -0
  34. data/src/test/resources/config/rest_config.yaml +3 -0
  35. data/src/test/resources/fixtures/activity_extract1.csv +35 -0
  36. data/src/test/resources/fixtures/activity_extract2.csv +22 -0
  37. data/src/test/resources/fixtures/all_program_full.json +53 -0
  38. data/src/test/resources/fixtures/campaign_response.json +38 -0
  39. data/src/test/resources/fixtures/campaign_response_full.json +102 -0
  40. data/src/test/resources/fixtures/lead_by_list.json +33 -0
  41. data/src/test/resources/fixtures/lead_by_program_response.json +47 -0
  42. data/src/test/resources/fixtures/lead_describe.json +221 -0
  43. data/src/test/resources/fixtures/lead_describe_expected.json +66 -0
  44. data/src/test/resources/fixtures/lead_describe_marketo_fields_full.json +518 -0
  45. data/src/test/resources/fixtures/lead_extract1.csv +11 -0
  46. data/src/test/resources/fixtures/lead_response_full.json +2402 -0
  47. data/src/test/resources/fixtures/lead_with_program_full.json +17 -0
  48. data/src/test/resources/fixtures/leads_extract2.csv +10 -0
  49. data/src/test/resources/fixtures/lists_response.json +31 -0
  50. data/src/test/resources/fixtures/program_response.json +71 -0
  51. metadata +39 -8
  52. data/src/main/java/org/embulk/input/marketo/model/filter/ListFilter.java +0 -10
@@ -5,17 +5,23 @@ import org.embulk.base.restclient.DefaultServiceDataSplitter;
5
5
  import org.embulk.base.restclient.RestClientInputPluginDelegate;
6
6
  import org.embulk.base.restclient.RestClientInputTaskBase;
7
7
  import org.embulk.base.restclient.ServiceDataSplitter;
8
+ import org.embulk.base.restclient.record.RecordImporter;
9
+ import org.embulk.base.restclient.record.ServiceRecord;
8
10
  import org.embulk.config.Config;
9
11
  import org.embulk.config.ConfigDefault;
10
12
  import org.embulk.config.ConfigDiff;
11
13
  import org.embulk.config.TaskReport;
14
+ import org.embulk.input.marketo.MarketoService;
15
+ import org.embulk.input.marketo.MarketoServiceImpl;
12
16
  import org.embulk.input.marketo.rest.MarketoRestClient;
13
17
  import org.embulk.spi.Exec;
18
+ import org.embulk.spi.PageBuilder;
14
19
  import org.embulk.spi.Schema;
15
20
  import org.embulk.util.retryhelper.jetty92.DefaultJetty92ClientCreator;
16
21
  import org.embulk.util.retryhelper.jetty92.Jetty92RetryHelper;
17
22
  import org.joda.time.DateTime;
18
23
 
24
+ import java.util.Iterator;
19
25
  import java.util.List;
20
26
 
21
27
  /**
@@ -68,6 +74,22 @@ public abstract class MarketoBaseInputPluginDelegate<T extends MarketoBaseInputP
68
74
  task.setJobStartTime(DateTime.now());
69
75
  }
70
76
 
77
+ @Override
78
+ public TaskReport ingestServiceData(T task, RecordImporter recordImporter, int taskIndex, PageBuilder pageBuilder)
79
+ {
80
+ MarketoService marketoService = new MarketoServiceImpl(createMarketoRestClient(task));
81
+ Iterator<ServiceRecord> serviceRecords = getServiceRecords(marketoService, task);
82
+ int imported = 0;
83
+ while (serviceRecords.hasNext() && (imported < PREVIEW_RECORD_LIMIT || !Exec.isPreview())) {
84
+ ServiceRecord next = serviceRecords.next();
85
+ recordImporter.importRecord(next, pageBuilder);
86
+ imported++;
87
+ }
88
+ return Exec.newTaskReport();
89
+ }
90
+
91
+ protected abstract Iterator<ServiceRecord> getServiceRecords(MarketoService marketoService, T task);
92
+
71
93
  @VisibleForTesting
72
94
  public MarketoRestClient createMarketoRestClient(PluginTask task)
73
95
  {
@@ -2,6 +2,7 @@ package org.embulk.input.marketo.model;
2
2
 
3
3
  import org.embulk.input.marketo.model.filter.MarketoFilter;
4
4
 
5
+ import java.util.HashMap;
5
6
  import java.util.List;
6
7
  import java.util.Map;
7
8
 
@@ -15,7 +16,7 @@ public class MarketoBulkExtractRequest
15
16
 
16
17
  private Map<String, String> columnHeaderNames;
17
18
 
18
- private Map<String, MarketoFilter> filter;
19
+ private Map<String, MarketoFilter> filter = new HashMap<>();
19
20
 
20
21
  public List<String> getFields()
21
22
  {
@@ -56,4 +57,14 @@ public class MarketoBulkExtractRequest
56
57
  {
57
58
  this.filter = filter;
58
59
  }
60
+
61
+ @Override
62
+ public String toString()
63
+ {
64
+ return "MarketoBulkExtractRequest{" +
65
+ "format='" + format + '\'' +
66
+ ", columnHeaderNames=" + columnHeaderNames +
67
+ ", filter=" + filter +
68
+ '}';
69
+ }
59
70
  }
@@ -15,13 +15,15 @@ public class MarketoField
15
15
 
16
16
  private MarketoDataType marketoDataType;
17
17
 
18
+ public MarketoField(){}
18
19
 
19
20
  public MarketoField(String name, String dataType)
20
21
  {
21
22
  this.name = name;
22
23
  try {
23
24
  marketoDataType = MarketoDataType.valueOf(dataType.toUpperCase());
24
- } catch (IllegalArgumentException ex) {
25
+ }
26
+ catch (IllegalArgumentException ex) {
25
27
  marketoDataType = MarketoDataType.STRING;
26
28
  }
27
29
  }
@@ -30,7 +32,6 @@ public class MarketoField
30
32
  {
31
33
  this.name = name;
32
34
  this.marketoDataType = marketoDataType;
33
-
34
35
  }
35
36
 
36
37
  public String getName()
@@ -43,6 +44,31 @@ public class MarketoField
43
44
  return marketoDataType;
44
45
  }
45
46
 
47
+ @Override
48
+ public boolean equals(Object o)
49
+ {
50
+ if (this == o) {
51
+ return true;
52
+ }
53
+ if (o == null || getClass() != o.getClass()) {
54
+ return false;
55
+ }
56
+
57
+ MarketoField field = (MarketoField) o;
58
+
59
+ if (name != null ? !name.equals(field.name) : field.name != null) {
60
+ return false;
61
+ }
62
+ return marketoDataType == field.marketoDataType;
63
+ }
64
+
65
+ @Override
66
+ public int hashCode()
67
+ {
68
+ int result = name != null ? name.hashCode() : 0;
69
+ result = 31 * result + (marketoDataType != null ? marketoDataType.hashCode() : 0);
70
+ return result;
71
+ }
46
72
 
47
73
  public enum MarketoDataType
48
74
  {
@@ -1,5 +1,6 @@
1
1
  package org.embulk.input.marketo.model;
2
2
 
3
+ import java.util.ArrayList;
3
4
  import java.util.List;
4
5
 
5
6
  /**
@@ -17,7 +18,7 @@ public class MarketoResponse<T>
17
18
 
18
19
  private List<MarketoError> errors;
19
20
 
20
- private List<T> result;
21
+ private List<T> result = new ArrayList<>();
21
22
 
22
23
  public String getRequestId()
23
24
  {
@@ -28,4 +28,13 @@ public class DateRangeFilter implements MarketoFilter
28
28
  {
29
29
  this.endAt = endAt;
30
30
  }
31
+
32
+ @Override
33
+ public String toString()
34
+ {
35
+ return "DateRangeFilter{" +
36
+ "startAt='" + startAt + '\'' +
37
+ ", endAt='" + endAt + '\'' +
38
+ '}';
39
+ }
31
40
  }
@@ -21,6 +21,7 @@ import org.embulk.util.retryhelper.jetty92.Jetty92SingleRequester;
21
21
  import org.embulk.util.retryhelper.jetty92.StringJetty92ResponseEntityReader;
22
22
  import org.slf4j.Logger;
23
23
 
24
+ import java.io.EOFException;
24
25
  import java.io.IOException;
25
26
  import java.net.SocketTimeoutException;
26
27
  import java.nio.charset.StandardCharsets;
@@ -186,6 +187,9 @@ public class MarketoBaseRestClient implements AutoCloseable
186
187
  if (exception instanceof ExecutionException) {
187
188
  this.toRetry((Exception) exception.getCause());
188
189
  }
190
+ if (exception instanceof EOFException) {
191
+ return true;
192
+ }
189
193
  if (exception instanceof MarketoAPIException) {
190
194
  //Retry Authenticate Exception
191
195
  MarketoError error = ((MarketoAPIException) exception).getMarketoErrors().get(0);
@@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit;
19
19
  /**
20
20
  * Created by tai.khuu on 9/5/17.
21
21
  */
22
- public class MarketoFileResponseEntityReader implements Jetty92ResponseReader<InputStream>
22
+ public class MarketoInputStreamResponseEntityReader implements Jetty92ResponseReader<InputStream>
23
23
  {
24
24
  private static final ObjectReader OBJECT_READER = new ObjectMapper().readerFor(new TypeReference<MarketoResponse<ObjectNode>>(){ });
25
25
 
@@ -27,7 +27,7 @@ public class MarketoFileResponseEntityReader implements Jetty92ResponseReader<In
27
27
 
28
28
  private long timeout;
29
29
 
30
- public MarketoFileResponseEntityReader(long timeout)
30
+ public MarketoInputStreamResponseEntityReader(long timeout)
31
31
  {
32
32
  this.listener = new InputStreamResponseListener();
33
33
  this.timeout = timeout;
@@ -82,7 +82,10 @@ public class MarketoResponseJetty92EntityReader<T> implements Jetty92ResponseRea
82
82
  {
83
83
  InputStream inputStream = this.listener.getInputStream();
84
84
  try (InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8)) {
85
- return CharStreams.toString(inputStreamReader);
85
+ String reponseContent = CharStreams.toString(inputStreamReader);
86
+ //Reset this listener
87
+ this.listener = new InputStreamResponseListener();
88
+ return reponseContent;
86
89
  }
87
90
  }
88
91
  }
@@ -3,6 +3,7 @@ package org.embulk.input.marketo.rest;
3
3
  import com.fasterxml.jackson.core.JsonProcessingException;
4
4
  import com.fasterxml.jackson.databind.node.ObjectNode;
5
5
  import com.google.common.collect.ArrayListMultimap;
6
+ import com.google.common.collect.ImmutableListMultimap;
6
7
  import com.google.common.collect.ImmutableMap;
7
8
  import com.google.common.collect.Multimap;
8
9
  import org.apache.commons.lang3.StringUtils;
@@ -15,7 +16,6 @@ import org.embulk.input.marketo.model.MarketoError;
15
16
  import org.embulk.input.marketo.model.MarketoField;
16
17
  import org.embulk.input.marketo.model.MarketoResponse;
17
18
  import org.embulk.input.marketo.model.filter.DateRangeFilter;
18
- import org.embulk.input.marketo.model.filter.ListFilter;
19
19
  import org.embulk.input.marketo.model.filter.MarketoFilter;
20
20
  import org.embulk.spi.DataException;
21
21
  import org.embulk.spi.Exec;
@@ -41,10 +41,16 @@ public class MarketoRestClient extends MarketoBaseRestClient
41
41
 
42
42
  private static final String NEXT_PAGE_TOKEN = "nextPageToken";
43
43
 
44
+ private static final String OFFSET = "offset";
45
+
46
+ private static final String MAX_RETURN = "maxReturn";
47
+
44
48
  private String endPoint;
45
49
 
46
50
  private Integer batchSize;
47
51
 
52
+ private Integer maxReturn;
53
+
48
54
  private static final Logger LOGGER = Exec.getLogger(MarketoRestClient.class.getCanonicalName());
49
55
 
50
56
  private static final Map<String, Type> TYPE_MAPPING = new ImmutableMap.Builder<String, Type>()
@@ -85,18 +91,24 @@ public class MarketoRestClient extends MarketoBaseRestClient
85
91
  @ConfigDefault("300")
86
92
  Integer getBatchSize();
87
93
  void setBatchSize(Integer batchSize);
94
+
95
+ @Config("max_return")
96
+ @ConfigDefault("200")
97
+ Integer getMaxReturn();
98
+ void setMaxReturn(Integer maxReturn);
88
99
  }
89
100
 
90
101
  public MarketoRestClient(PluginTask task, Jetty92RetryHelper retryHelper)
91
102
  {
92
- this("https://" + task.getAccountId() + ".mktorest.com", "https://" + task.getAccountId() + ".mktorest.com/identity", task.getClientId(), task.getClientSecret(), task.getBatchSize(), task.getMarketoLimitIntervalMilis(), retryHelper);
103
+ this(MarketoUtils.getEndPoint(task.getAccountId()), MarketoUtils.getIdentityEndPoint(task.getAccountId()), task.getClientId(), task.getClientSecret(), task.getBatchSize(), task.getMaxReturn(), task.getMarketoLimitIntervalMilis(), retryHelper);
93
104
  }
94
105
 
95
- public MarketoRestClient(String endPoint, String identityEndPoint, String clientId, String clientSecret, Integer batchSize, int marketoLimitIntervalMilis, Jetty92RetryHelper retryHelper)
106
+ public MarketoRestClient(String endPoint, String identityEndPoint, String clientId, String clientSecret, Integer batchSize, Integer maxReturn, int marketoLimitIntervalMilis, Jetty92RetryHelper retryHelper)
96
107
  {
97
108
  super(identityEndPoint, clientId, clientSecret, marketoLimitIntervalMilis, retryHelper);
98
109
  this.endPoint = endPoint;
99
110
  this.batchSize = batchSize;
111
+ this.maxReturn = maxReturn;
100
112
  }
101
113
 
102
114
  public List<MarketoField> describeLead()
@@ -119,37 +131,32 @@ public class MarketoRestClient extends MarketoBaseRestClient
119
131
  return TYPE_MAPPING.containsKey(dataType.toLowerCase()) ? TYPE_MAPPING.get(dataType.toLowerCase()) : Types.STRING;
120
132
  }
121
133
 
122
- public String createLeadBulkExtract(Date startTime, Date endTime, List<String> extractFields)
134
+ public String createLeadBulkExtract(Date startTime, Date endTime, List<String> extractFields, String fitlerField)
123
135
  {
124
- SimpleDateFormat timeFormat = new SimpleDateFormat(MarketoUtils.MARKETO_DATE_SIMPLE_DATE_FORMAT);
125
- MarketoBulkExtractRequest marketoBulkExtractRequest = new MarketoBulkExtractRequest();
126
- marketoBulkExtractRequest.setFields(extractFields);
127
- marketoBulkExtractRequest.setFormat("CSV");
128
- Map<String, MarketoFilter> filterMap = new HashMap<>();
129
- DateRangeFilter dateRangeFilter = new DateRangeFilter();
130
- dateRangeFilter.setStartAt(timeFormat.format(startTime));
131
- dateRangeFilter.setEndAt(timeFormat.format(endTime));
132
- filterMap.put("createdAt", dateRangeFilter);
133
- marketoBulkExtractRequest.setFilter(filterMap);
136
+ MarketoBulkExtractRequest marketoBulkExtractRequest = getMarketoBulkExtractRequest(startTime, endTime, extractFields, fitlerField);
134
137
  return sendCreateBulkExtractRequest(marketoBulkExtractRequest, MarketoRESTEndpoint.CREATE_LEAD_EXTRACT);
135
138
  }
136
139
 
137
- public String createActitvityExtract(Date startTime, Date endTime, List<String> activityTypes)
140
+ private MarketoBulkExtractRequest getMarketoBulkExtractRequest(Date startTime, Date endTime, List<String> extractFields, String rangeFilterName)
138
141
  {
139
142
  SimpleDateFormat timeFormat = new SimpleDateFormat(MarketoUtils.MARKETO_DATE_SIMPLE_DATE_FORMAT);
140
143
  MarketoBulkExtractRequest marketoBulkExtractRequest = new MarketoBulkExtractRequest();
144
+ if (extractFields != null) {
145
+ marketoBulkExtractRequest.setFields(extractFields);
146
+ }
141
147
  marketoBulkExtractRequest.setFormat("CSV");
142
148
  Map<String, MarketoFilter> filterMap = new HashMap<>();
143
149
  DateRangeFilter dateRangeFilter = new DateRangeFilter();
144
150
  dateRangeFilter.setStartAt(timeFormat.format(startTime));
145
151
  dateRangeFilter.setEndAt(timeFormat.format(endTime));
146
- filterMap.put("createdAt", dateRangeFilter);
147
- if (activityTypes != null) {
148
- ListFilter activitiesTypeFilter = new ListFilter();
149
- activitiesTypeFilter.addAll(activityTypes);
150
- filterMap.put("activities", activitiesTypeFilter);
151
- }
152
+ filterMap.put(rangeFilterName, dateRangeFilter);
152
153
  marketoBulkExtractRequest.setFilter(filterMap);
154
+ return marketoBulkExtractRequest;
155
+ }
156
+
157
+ public String createActivityExtract(Date startTime, Date endTime)
158
+ {
159
+ MarketoBulkExtractRequest marketoBulkExtractRequest = getMarketoBulkExtractRequest(startTime, endTime, null, "createdAt");
153
160
  return sendCreateBulkExtractRequest(marketoBulkExtractRequest, MarketoRESTEndpoint.CREATE_ACTIVITY_EXTRACT);
154
161
  }
155
162
 
@@ -157,6 +164,7 @@ public class MarketoRestClient extends MarketoBaseRestClient
157
164
  {
158
165
  MarketoResponse<ObjectNode> marketoResponse = null;
159
166
  try {
167
+ LOGGER.info("Send bulk extract request [{}]", request);
160
168
  marketoResponse = doPost(endPoint + endpoint.getEndpoint(), null, null, OBJECT_MAPPER.writeValueAsString(request), new MarketoResponseJetty92EntityReader<ObjectNode>(READ_TIMEOUT_MILLIS));
161
169
  }
162
170
  catch (JsonProcessingException e) {
@@ -265,67 +273,93 @@ public class MarketoRestClient extends MarketoBaseRestClient
265
273
 
266
274
  private InputStream getBulkExtractResult(MarketoRESTEndpoint endpoint, String exportId)
267
275
  {
268
- InputStream fileStream = doGet(this.endPoint + endpoint.getEndpoint(new ImmutableMap.Builder().put("export_id", exportId).build()), null, null, new MarketoFileResponseEntityReader(READ_TIMEOUT_MILLIS));
269
- return fileStream;
276
+ return doGet(this.endPoint + endpoint.getEndpoint(new ImmutableMap.Builder().put("export_id", exportId).build()), null, null, new MarketoInputStreamResponseEntityReader(READ_TIMEOUT_MILLIS));
270
277
  }
271
278
 
272
279
  public RecordPagingIterable<ObjectNode> getLists()
273
280
  {
274
- return getRecordWithPagination(endPoint + MarketoRESTEndpoint.GET_LISTS.getEndpoint(), null, ObjectNode.class);
281
+ return getRecordWithTokenPagination(endPoint + MarketoRESTEndpoint.GET_LISTS.getEndpoint(), null, ObjectNode.class);
275
282
  }
276
283
 
277
284
  public RecordPagingIterable<ObjectNode> getPrograms()
278
285
  {
279
- return getRecordWithPagination(endPoint + MarketoRESTEndpoint.GET_PROGRAMS.getEndpoint(), null, ObjectNode.class);
286
+ return getRecordWithOffsetPagination(endPoint + MarketoRESTEndpoint.GET_PROGRAMS.getEndpoint(), null, ObjectNode.class);
280
287
  }
281
288
 
282
289
  public RecordPagingIterable<ObjectNode> getLeadsByProgram(String programId, List<String> fieldNames)
283
290
  {
284
291
  Multimap<String, String> multimap = ArrayListMultimap.create();
285
292
  multimap.put("fields", StringUtils.join(fieldNames, ","));
286
- return getRecordWithPagination(endPoint + MarketoRESTEndpoint.GET_LEADS_BY_PROGRAM.getEndpoint(new ImmutableMap.Builder().put("program_id", programId).build()), multimap, ObjectNode.class);
293
+ return getRecordWithTokenPagination(endPoint + MarketoRESTEndpoint.GET_LEADS_BY_PROGRAM.getEndpoint(new ImmutableMap.Builder().put("program_id", programId).build()), multimap, ObjectNode.class);
287
294
  }
288
295
 
289
296
  public RecordPagingIterable<ObjectNode> getLeadsByList(String listId, List<String> fieldNames)
290
297
  {
291
298
  Multimap<String, String> multimap = ArrayListMultimap.create();
292
299
  multimap.put("fields", StringUtils.join(fieldNames, ","));
293
- return getRecordWithPagination(endPoint + MarketoRESTEndpoint.GET_LEADS_BY_LIST.getEndpoint(new ImmutableMap.Builder().put("list_id", listId).build()), multimap, ObjectNode.class);
300
+ return getRecordWithTokenPagination(endPoint + MarketoRESTEndpoint.GET_LEADS_BY_LIST.getEndpoint(new ImmutableMap.Builder().put("list_id", listId).build()), multimap, ObjectNode.class);
294
301
  }
295
302
 
296
303
  public RecordPagingIterable<ObjectNode> getCampaign()
297
304
  {
298
- return getRecordWithPagination(endPoint + MarketoRESTEndpoint.GET_CAMPAIGN.getEndpoint(), null, ObjectNode.class);
305
+ return getRecordWithTokenPagination(endPoint + MarketoRESTEndpoint.GET_CAMPAIGN.getEndpoint(), null, ObjectNode.class);
299
306
  }
300
-
301
- private <T> RecordPagingIterable<T> getRecordWithPagination(final String endPoint, final Multimap<String, String> parameters, final Class<T> recordClass)
307
+ private <T> RecordPagingIterable<T> getRecordWithOffsetPagination(final String endPoint, final Multimap<String, String> parameters, final Class<T> recordClass)
302
308
  {
303
- return new RecordPagingIterable<>(new RecordPagingIterable.PagingFunction<RecordPagingIterable.MarketoPage<T>>()
309
+ return new RecordPagingIterable<>(new RecordPagingIterable.PagingFunction<RecordPagingIterable.OffsetPage<T>>()
304
310
  {
305
311
  @Override
306
- public RecordPagingIterable.MarketoPage<T> getNextPage(RecordPagingIterable.MarketoPage<T> currentPage)
312
+ public RecordPagingIterable.OffsetPage<T> getNextPage(RecordPagingIterable.OffsetPage<T> currentPage)
307
313
  {
308
- Multimap<String, String> params = ArrayListMultimap.create();
309
- params.put(NEXT_PAGE_TOKEN, currentPage.getNextPageToken());
310
- return gettMarketoPage(params);
314
+ return getOffsetPage(currentPage.getNextOffSet());
311
315
  }
312
316
 
313
317
  @Override
314
- public RecordPagingIterable.MarketoPage<T> getFirstPage()
318
+ public RecordPagingIterable.OffsetPage<T> getFirstPage()
315
319
  {
316
- return gettMarketoPage(null);
320
+ return getOffsetPage(0);
317
321
  }
318
- private RecordPagingIterable.MarketoPage<T> gettMarketoPage(Multimap<String, String> params)
322
+
323
+ private RecordPagingIterable.OffsetPage<T> getOffsetPage(int offset)
324
+ {
325
+ ImmutableListMultimap.Builder<String, String> params = new ImmutableListMultimap.Builder<>();
326
+ params.put(OFFSET, String.valueOf(offset));
327
+ params.put(MAX_RETURN, String.valueOf(maxReturn));
328
+ if (parameters != null) {
329
+ params.putAll(parameters);
330
+ }
331
+ MarketoResponse<T> marketoResponse = doGet(endPoint, null, params.build(), new MarketoResponseJetty92EntityReader<>(READ_TIMEOUT_MILLIS, recordClass));
332
+ return new RecordPagingIterable.OffsetPage<>(marketoResponse.getResult(), offset + marketoResponse.getResult().size(), marketoResponse.getResult().size() == maxReturn);
333
+ }
334
+ });
335
+ }
336
+ private <T> RecordPagingIterable<T> getRecordWithTokenPagination(final String endPoint, final Multimap<String, String> parameters, final Class<T> recordClass)
337
+ {
338
+ return new RecordPagingIterable<>(new RecordPagingIterable.PagingFunction<RecordPagingIterable.TokenPage<T>>()
339
+ {
340
+ @Override
341
+ public RecordPagingIterable.TokenPage<T> getNextPage(RecordPagingIterable.TokenPage<T> currentPage)
342
+ {
343
+ return getTokenPage(currentPage);
344
+ }
345
+ @Override
346
+ public RecordPagingIterable.TokenPage<T> getFirstPage()
347
+ {
348
+ return getTokenPage(null);
349
+ }
350
+
351
+ private RecordPagingIterable.TokenPage<T> getTokenPage(RecordPagingIterable.TokenPage page)
319
352
  {
320
- if (params == null) {
321
- params = ArrayListMultimap.create();
353
+ ImmutableListMultimap.Builder params = new ImmutableListMultimap.Builder<>();
354
+ if (page != null) {
355
+ params.put(NEXT_PAGE_TOKEN, page.getNextPageToken());
322
356
  }
323
357
  params.put(BATCH_SIZE, String.valueOf(batchSize));
324
358
  if (parameters != null) {
325
359
  params.putAll(parameters);
326
360
  }
327
- MarketoResponse<T> marketoResponse = doGet(endPoint, null, params, new MarketoResponseJetty92EntityReader<>(READ_TIMEOUT_MILLIS, recordClass));
328
- return new RecordPagingIterable.MarketoPage<>(marketoResponse.getResult(), marketoResponse.getNextPageToken(), marketoResponse.isMoreResult());
361
+ MarketoResponse<T> marketoResponse = doGet(endPoint, null, params.build(), new MarketoResponseJetty92EntityReader<>(READ_TIMEOUT_MILLIS, recordClass));
362
+ return new RecordPagingIterable.TokenPage<>(marketoResponse.getResult(), marketoResponse.getNextPageToken(), marketoResponse.getNextPageToken() != null);
329
363
  }
330
364
  });
331
365
  }