Skip to content

Commit 3d07576

Browse files
committed
[fixes #98][breaking change] Jobs results aren't including objects like tickets, users, orgs, ...
Add several new integration test cases to validate the behavior.
1 parent ff8108f commit 3d07576

File tree

5 files changed

+838
-246
lines changed

5 files changed

+838
-246
lines changed

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,12 @@
166166
<version>1.8</version>
167167
<scope>test</scope>
168168
</dependency>
169+
<dependency>
170+
<groupId>org.awaitility</groupId>
171+
<artifactId>awaitility</artifactId>
172+
<version>4.0.3</version>
173+
<scope>test</scope>
174+
</dependency>
169175
</dependencies>
170176

171177
<build>

src/main/java/org/zendesk/client/v2/Zendesk.java

Lines changed: 56 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -203,25 +203,27 @@ public void close() {
203203
// Action methods
204204
//////////////////////////////////////////////////////////////////////
205205

206-
public <T> JobStatus<T> getJobStatus(JobStatus<T> status) {
206+
public JobStatus getJobStatus(JobStatus status) {
207207
return complete(getJobStatusAsync(status));
208208
}
209209

210-
public <T> ListenableFuture<JobStatus<T>> getJobStatusAsync(JobStatus<T> status) {
211-
return submit(req("GET", tmpl("/job_statuses/{id}.json").set("id", status.getId())), handleJobStatus(status.getResultsClass()));
210+
public ListenableFuture<JobStatus> getJobStatusAsync(JobStatus status) {
211+
return submit(req("GET", tmpl("/job_statuses/{id}.json").set("id", status.getId())),
212+
handleJobStatus());
212213
}
213214

214-
public List<JobStatus<HashMap<String, Object>>> getJobStatuses(List<JobStatus> statuses) {
215+
public List<JobStatus> getJobStatuses(List<JobStatus> statuses) {
215216
return complete(getJobStatusesAsync(statuses));
216217
}
217218

218-
public ListenableFuture<List<JobStatus<HashMap<String, Object>>>> getJobStatusesAsync(List<JobStatus> statuses) {
219+
public ListenableFuture<List<JobStatus>> getJobStatusesAsync(List<JobStatus> statuses) {
219220
List<String> ids = new ArrayList<>(statuses.size());
220221
for (JobStatus status : statuses) {
221222
ids.add(status.getId());
222223
}
223-
Class<JobStatus<HashMap<String, Object>>> clazz = (Class<JobStatus<HashMap<String, Object>>>)(Object)JobStatus.class;
224-
return submit(req("GET", tmpl("/job_statuses/show_many.json{?ids}").set("ids", ids)), handleList(clazz, "job_statuses"));
224+
Class<JobStatus> clazz = (Class<JobStatus>) (Object) JobStatus.class;
225+
return submit(req("GET", tmpl("/job_statuses/show_many.json{?ids}").set("ids", ids)),
226+
handleList(clazz, "job_statuses"));
225227
}
226228

227229
public List<Brand> getBrands(){
@@ -250,17 +252,17 @@ JSON, json(Collections.singletonMap("ticket", ticketImport))),
250252
handle(Ticket.class, "ticket")));
251253
}
252254

253-
public JobStatus<Ticket> importTickets(TicketImport... ticketImports) {
255+
public JobStatus importTickets(TicketImport... ticketImports) {
254256
return importTickets(Arrays.asList(ticketImports));
255257
}
256258

257-
public JobStatus<Ticket> importTickets(List<TicketImport> ticketImports) {
259+
public JobStatus importTickets(List<TicketImport> ticketImports) {
258260
return complete(importTicketsAsync(ticketImports));
259261
}
260262

261-
public ListenableFuture<JobStatus<Ticket>> importTicketsAsync(List<TicketImport> ticketImports) {
263+
public ListenableFuture<JobStatus> importTicketsAsync(List<TicketImport> ticketImports) {
262264
return submit(req("POST", cnst("/imports/tickets/create_many.json"), JSON, json(
263-
Collections.singletonMap("tickets", ticketImports))), handleJobStatus(Ticket.class));
265+
Collections.singletonMap("tickets", ticketImports))), handleJobStatus());
264266
}
265267

266268
public Ticket getTicket(long id) {
@@ -278,11 +280,6 @@ public List<User> getTicketCollaborators(long id) {
278280
handleList(User.class, "users")));
279281
}
280282

281-
public JobStatus permanentlyDeleteTicket(Ticket ticket) {
282-
checkHasId(ticket);
283-
return permanentlyDeleteTicket(ticket.getId());
284-
}
285-
286283
/**
287284
* https://developer.zendesk.com/rest_api/docs/support/tickets#list-deleted-tickets
288285
*/
@@ -309,17 +306,22 @@ public void deleteTicket(long id) {
309306
complete(submit(req("DELETE", tmpl("/tickets/{id}.json").set("id", id)), handleStatus()));
310307
}
311308

309+
public JobStatus permanentlyDeleteTicket(Ticket ticket) {
310+
checkHasId(ticket);
311+
return permanentlyDeleteTicket(ticket.getId());
312+
}
313+
312314
public JobStatus permanentlyDeleteTicket(long id) {
313315
return complete(submit(
314316
req("DELETE", tmpl("/deleted_tickets/{id}.json").set("id", id)),
315-
handleJobStatus(JobStatus.class))
317+
handleJobStatus())
316318
);
317319
}
318320

319-
public ListenableFuture<JobStatus<Ticket>> queueCreateTicketAsync(Ticket ticket) {
321+
public ListenableFuture<JobStatus> queueCreateTicketAsync(Ticket ticket) {
320322
return submit(req("POST", cnst("/tickets.json?async=true"),
321323
JSON, json(Collections.singletonMap("ticket", ticket))),
322-
handleJobStatus(Ticket.class));
324+
handleJobStatus());
323325
}
324326

325327
public ListenableFuture<Ticket> createTicketAsync(Ticket ticket) {
@@ -332,17 +334,17 @@ public Ticket createTicket(Ticket ticket) {
332334
return complete(createTicketAsync(ticket));
333335
}
334336

335-
public JobStatus<Ticket> createTickets(Ticket... tickets) {
337+
public JobStatus createTickets(Ticket... tickets) {
336338
return createTickets(Arrays.asList(tickets));
337339
}
338340

339-
public JobStatus<Ticket> createTickets(List<Ticket> tickets) {
341+
public JobStatus createTickets(List<Ticket> tickets) {
340342
return complete(createTicketsAsync(tickets));
341343
}
342344

343-
public ListenableFuture<JobStatus<Ticket>> createTicketsAsync(List<Ticket> tickets) {
345+
public ListenableFuture<JobStatus> createTicketsAsync(List<Ticket> tickets) {
344346
return submit(req("POST", cnst("/tickets/create_many.json"), JSON, json(
345-
Collections.singletonMap("tickets", tickets))), handleJobStatus(Ticket.class));
347+
Collections.singletonMap("tickets", tickets))), handleJobStatus());
346348
}
347349

348350
public Ticket updateTicket(Ticket ticket) {
@@ -352,17 +354,17 @@ JSON, json(Collections.singletonMap("ticket", ticket))),
352354
handle(Ticket.class, "ticket")));
353355
}
354356

355-
public JobStatus<Ticket> updateTickets(Ticket... tickets) {
357+
public JobStatus updateTickets(Ticket... tickets) {
356358
return updateTickets(Arrays.asList(tickets));
357359
}
358360

359-
public JobStatus<Ticket> updateTickets(List<Ticket> tickets) {
361+
public JobStatus updateTickets(List<Ticket> tickets) {
360362
return complete(updateTicketsAsync(tickets));
361363
}
362364

363-
public ListenableFuture<JobStatus<Ticket>> updateTicketsAsync(List<Ticket> tickets) {
365+
public ListenableFuture<JobStatus> updateTicketsAsync(List<Ticket> tickets) {
364366
return submit(req("PUT", cnst("/tickets/update_many.json"), JSON, json(
365-
Collections.singletonMap("tickets", tickets))), handleJobStatus(Ticket.class));
367+
Collections.singletonMap("tickets", tickets))), handleJobStatus());
366368
}
367369

368370
public void markTicketAsSpam(Ticket ticket) {
@@ -380,11 +382,10 @@ public void deleteTickets(long id, long... ids) {
380382
}
381383

382384
public JobStatus permanentlyDeleteTickets(long id, long... ids) {
383-
384385
return complete(
385386
submit(
386387
req("DELETE", tmpl("/deleted_tickets/destroy_many.json{?ids}").set("ids", idArray(id, ids))),
387-
handleJobStatus(JobStatus.class))
388+
handleJobStatus())
388389
);
389390
}
390391

@@ -817,35 +818,35 @@ public User createUser(User user) {
817818
Collections.singletonMap("user", user))), handle(User.class, "user")));
818819
}
819820

820-
public JobStatus<User> createUsers(User... users) {
821+
public JobStatus createUsers(User... users) {
821822
return createUsers(Arrays.asList(users));
822823
}
823824

824-
public JobStatus<User> createUsers(List<User> users) {
825+
public JobStatus createUsers(List<User> users) {
825826
return complete(createUsersAsync(users));
826827
}
827828

828-
public ListenableFuture<JobStatus<User>> createUsersAsync(List<User> users) {
829+
public ListenableFuture<JobStatus> createUsersAsync(List<User> users) {
829830
return submit(req("POST", cnst("/users/create_many.json"), JSON, json(
830-
Collections.singletonMap("users", users))), handleJobStatus(User.class));
831+
Collections.singletonMap("users", users))), handleJobStatus());
831832
}
832833

833834
public User createOrUpdateUser(User user) {
834835
return complete(submit(req("POST", cnst("/users/create_or_update.json"), JSON, json(
835836
Collections.singletonMap("user", user))), handle(User.class, "user")));
836837
}
837838

838-
public JobStatus<User> createOrUpdateUsers(User... users) {
839+
public JobStatus createOrUpdateUsers(User... users) {
839840
return createOrUpdateUsers(Arrays.asList(users));
840841
}
841842

842-
public JobStatus<User> createOrUpdateUsers(List<User> users) {
843+
public JobStatus createOrUpdateUsers(List<User> users) {
843844
return complete(createOrUpdateUsersAsync(users));
844845
}
845846

846-
public ListenableFuture<JobStatus<User>> createOrUpdateUsersAsync(List<User> users) {
847+
public ListenableFuture<JobStatus> createOrUpdateUsersAsync(List<User> users) {
847848
return submit(req("POST", cnst("/users/create_or_update_many.json"), JSON, json(
848-
Collections.singletonMap("users", users))), handleJobStatus(User.class));
849+
Collections.singletonMap("users", users))), handleJobStatus());
849850
}
850851

851852
public User updateUser(User user) {
@@ -854,17 +855,17 @@ public User updateUser(User user) {
854855
Collections.singletonMap("user", user))), handle(User.class, "user")));
855856
}
856857

857-
public JobStatus<User> updateUsers(User... users) {
858+
public JobStatus updateUsers(User... users) {
858859
return updateUsers(Arrays.asList(users));
859860
}
860861

861-
public JobStatus<User> updateUsers(List<User> users) {
862+
public JobStatus updateUsers(List<User> users) {
862863
return complete(updateUsersAsync(users));
863864
}
864865

865-
public ListenableFuture<JobStatus<User>> updateUsersAsync(List<User> users) {
866+
public ListenableFuture<JobStatus> updateUsersAsync(List<User> users) {
866867
return submit(req("PUT", cnst("/users/update_many.json"), JSON, json(
867-
Collections.singletonMap("users", users))), handleJobStatus(User.class));
868+
Collections.singletonMap("users", users))), handleJobStatus());
868869
}
869870

870871
public void deleteUser(User user) {
@@ -1195,17 +1196,17 @@ public Organization createOrganization(Organization organization) {
11951196
Collections.singletonMap("organization", organization))), handle(Organization.class, "organization")));
11961197
}
11971198

1198-
public JobStatus<Organization> createOrganizations(Organization... organizations) {
1199+
public JobStatus createOrganizations(Organization... organizations) {
11991200
return createOrganizations(Arrays.asList(organizations));
12001201
}
12011202

12021203
public JobStatus createOrganizations(List<Organization> organizations) {
12031204
return complete(createOrganizationsAsync(organizations));
12041205
}
12051206

1206-
public ListenableFuture<JobStatus<Organization>> createOrganizationsAsync(List<Organization> organizations) {
1207+
public ListenableFuture<JobStatus> createOrganizationsAsync(List<Organization> organizations) {
12071208
return submit(req("POST", cnst("/organizations/create_many.json"), JSON, json(
1208-
Collections.singletonMap("organizations", organizations))), handleJobStatus(Organization.class));
1209+
Collections.singletonMap("organizations", organizations))), handleJobStatus());
12091210
}
12101211

12111212
public Organization updateOrganization(Organization organization) {
@@ -1214,17 +1215,17 @@ public Organization updateOrganization(Organization organization) {
12141215
Collections.singletonMap("organization", organization))), handle(Organization.class, "organization")));
12151216
}
12161217

1217-
public JobStatus<Organization> updateOrganizations(Organization... organizations) {
1218+
public JobStatus updateOrganizations(Organization... organizations) {
12181219
return updateOrganizations(Arrays.asList(organizations));
12191220
}
12201221

12211222
public JobStatus updateOrganizations(List<Organization> organizations) {
12221223
return complete(updateOrganizationsAsync(organizations));
12231224
}
12241225

1225-
public ListenableFuture<JobStatus<Organization>> updateOrganizationsAsync(List<Organization> organizations) {
1226+
public ListenableFuture<JobStatus> updateOrganizationsAsync(List<Organization> organizations) {
12261227
return submit(req("PUT", cnst("/organizations/update_many.json"), JSON, json(
1227-
Collections.singletonMap("organizations", organizations))), handleJobStatus(Organization.class));
1228+
Collections.singletonMap("organizations", organizations))), handleJobStatus());
12281229
}
12291230

12301231
public void deleteOrganization(Organization organization) {
@@ -1283,7 +1284,7 @@ public OrganizationMembership createOrganizationMembership(OrganizationMembershi
12831284
/**
12841285
* https://developer.zendesk.com/rest_api/docs/support/organization_memberships#create-many-memberships
12851286
*/
1286-
public JobStatus<OrganizationMembership> createOrganizationMemberships(OrganizationMembership... organizationMemberships) {
1287+
public JobStatus createOrganizationMemberships(OrganizationMembership... organizationMemberships) {
12871288
return createOrganizationMemberships(Arrays.asList(organizationMemberships));
12881289
}
12891290

@@ -1297,9 +1298,10 @@ public JobStatus createOrganizationMemberships(List<OrganizationMembership> orga
12971298
/**
12981299
* https://developer.zendesk.com/rest_api/docs/support/organization_memberships#create-many-memberships
12991300
*/
1300-
public ListenableFuture<JobStatus<OrganizationMembership>> createOrganizationMembershipsAsync(List<OrganizationMembership> organizationMemberships) {
1301+
public ListenableFuture<JobStatus> createOrganizationMembershipsAsync(
1302+
List<OrganizationMembership> organizationMemberships) {
13011303
return submit(req("POST", cnst("/organization_memberships/create_many.json"), JSON, json(
1302-
Collections.singletonMap("organization_memberships", organizationMemberships))), handleJobStatus(OrganizationMembership.class));
1304+
Collections.singletonMap("organization_memberships", organizationMemberships))), handleJobStatus());
13031305
}
13041306

13051307
public void deleteOrganizationMembership(long id) {
@@ -2413,17 +2415,16 @@ protected <T> ZendeskAsyncCompletionHandler<T> handle(final Class<T> clazz, fina
24132415
return new BasicAsyncCompletionHandler<>(clazz, name, typeParams);
24142416
}
24152417

2416-
protected <T> ZendeskAsyncCompletionHandler<JobStatus<T>> handleJobStatus(final Class<T> resultClass) {
2417-
return new BasicAsyncCompletionHandler<JobStatus<T>>(JobStatus.class, "job_status", resultClass) {
2418+
protected ZendeskAsyncCompletionHandler<JobStatus> handleJobStatus() {
2419+
return new BasicAsyncCompletionHandler<JobStatus>(JobStatus.class, "job_status") {
24182420
@Override
2419-
public JobStatus<T> onCompleted(Response response) throws Exception {
2420-
JobStatus<T> result = super.onCompleted(response);
2421+
public JobStatus onCompleted(Response response) throws Exception {
2422+
JobStatus result = super.onCompleted(response);
24212423
if (result == null) {
24222424
// null is when we receive a 404 response.
24232425
// For an async job we trigger an error
24242426
throw new ZendeskResponseException(response);
24252427
}
2426-
result.setResultsClass(resultClass);
24272428
return result;
24282429
}
24292430
};

0 commit comments

Comments
 (0)