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

Sign up to get free protection for your applications and to get access to all the features.
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
  }