Skip to content

Commit 38d5a7c

Browse files
committed
Switch to search/jql where applicable
https://developer.atlassian.com/changelog/#CHANGE-2046
1 parent 06ab771 commit 38d5a7c

File tree

8 files changed

+45
-16
lines changed

8 files changed

+45
-16
lines changed

src/main/java/org/hibernate/infra/replicate/jira/service/jira/HandlerProjectContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public Optional<JiraIssue> getNextIssueToSync(Long latestSyncedJiraIssueKeyNumbe
8989
query = "project = %s ORDER BY key ASC".formatted(project.originalProjectKey(),
9090
project.originalProjectKey());
9191
}
92-
JiraIssues issues = projectGroupContext.sourceJiraClient().find(query, 0, 1);
92+
JiraIssues issues = projectGroupContext.sourceJiraClient().find(query, null, 1, List.of("key", "issuelinks"));
9393
if (issues.issues.isEmpty()) {
9494
return Optional.empty();
9595
} else {

src/main/java/org/hibernate/infra/replicate/jira/service/jira/JiraService.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -331,16 +331,16 @@ private void syncByQuery(String query, HandlerProjectGroupContext context) {
331331

332332
private void syncByQuery(String query, HandlerProjectGroupContext context, Consumer<JiraIssue> action) {
333333
JiraIssues issues = null;
334-
int start = 0;
334+
String nextPageToken = null;
335335
int max = 100;
336336
do {
337-
issues = context.sourceJiraClient().find(query, start, max);
338-
Log.infof("Sync by query \"%s\" will try syncing %s issues.",
339-
query.substring(0, Math.min(100, query.length())), issues.total);
337+
issues = context.sourceJiraClient().find(query, nextPageToken, max, List.of("*all"));
338+
Log.infof("Sync by query \"%s\" will try syncing issues.",
339+
query.substring(0, Math.min(100, query.length())));
340340
issues.issues.forEach(action);
341341

342-
start += max;
343-
} while (!issues.issues.isEmpty());
342+
nextPageToken = issues.nextPageToken;
343+
} while (!issues.isLast && nextPageToken != null);
344344
}
345345

346346
private void triggerSyncEvent(JiraIssue jiraIssue, HandlerProjectGroupContext context) {

src/main/java/org/hibernate/infra/replicate/jira/service/jira/client/JiraRestClient.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,23 @@ JiraIssueResponse update(@PathParam("issueKey") String issueKey, @PathParam("com
141141
@Path("/issueLink/{linkId}")
142142
void deleteIssueLink(@PathParam("linkId") String linkId);
143143

144+
/**
145+
* @param fields
146+
* A list of fields to return for each issue, use it to retrieve a
147+
* subset of fields. This parameter accepts a comma-separated list.
148+
* Expand options include:
149+
*
150+
* {@code *all} Returns all fields. id Returns only issue IDs. Any
151+
* issue field, prefixed with a minus to exclude. The default is id.
152+
*
153+
* Note: By default, this resource returns IDs only.
154+
*/
155+
@GET
156+
@Path("/search/jql")
157+
JiraIssues find(@QueryParam("jql") String query, @QueryParam("nextPageToken") String nextPageToken,
158+
@QueryParam("maxResults") int maxResults, @QueryParam("fields") List<String> fields);
159+
160+
// for Jira Data center where there is no /search/jql option available
144161
@GET
145162
@Path("/search")
146163
JiraIssues find(@QueryParam("jql") String query, @QueryParam("startAt") int startAt,

src/main/java/org/hibernate/infra/replicate/jira/service/jira/client/JiraRestClientBuilder.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,11 @@ public void deleteIssueLink(String linkId) {
242242
withRetry(() -> delegate.deleteIssueLink(linkId));
243243
}
244244

245+
@Override
246+
public JiraIssues find(String query, String nextPageToken, int maxResults, List<String> fields) {
247+
return withRetry(() -> delegate.find(query, nextPageToken, maxResults, fields));
248+
}
249+
245250
@Override
246251
public JiraIssues find(String query, int startAt, int maxResults) {
247252
return withRetry(() -> delegate.find(query, startAt, maxResults));

src/main/java/org/hibernate/infra/replicate/jira/service/jira/model/rest/JiraFields.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,9 @@ public String toString() {
4747
}
4848

4949
public static String formatSummary(String summary) {
50-
// for some reason Jira server does not like ` in the summaries and can result in very helpful "access denied" error responses
51-
return summary.replace( "`", "" );
50+
// for some reason Jira server does not like ` in the summaries and can result
51+
// in very helpful "access denied" error responses
52+
return summary.replace("`", "");
5253
}
5354

5455
}

src/main/java/org/hibernate/infra/replicate/jira/service/jira/model/rest/JiraIssues.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@
77
public class JiraIssues extends JiraBaseObject {
88

99
public List<JiraIssue> issues;
10-
public int startAt;
11-
public int maxResults;
12-
public int total;
10+
public String nextPageToken;
11+
public boolean isLast;
1312

1413
}

src/test/java/org/hibernate/infra/replicate/jira/export/ExportProjectTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ void export() throws IOException {
106106

107107
CSVFormat csvFormat = CSVFormat.DEFAULT.builder().setHeader(headers.toArray(String[]::new)).build();
108108

109-
int start = 0;
109+
String nextPageToken = null;
110110
int max = 100; // this seems to be a limit on the jira side.. requesting more didn't work.
111111

112112
JiraIssues issues;
@@ -117,7 +117,7 @@ void export() throws IOException {
117117
"target/jira-exported-project-%s-%s.csv".formatted(PROJECT_ID, LocalDate.now()));
118118
final CSVPrinter printer = new CSVPrinter(fw, csvFormat)) {
119119
do {
120-
issues = source.find(query, start, max);
120+
issues = source.find(query, nextPageToken, max, List.of("*all"));
121121
for (JiraIssue issue : issues.issues) {
122122
List<Object> row = new ArrayList<>();
123123
row.add(issue.key);
@@ -142,8 +142,8 @@ void export() throws IOException {
142142

143143
printer.printRecord(row);
144144
}
145-
start += max;
146-
} while (!issues.issues.isEmpty());
145+
nextPageToken = issues.nextPageToken;
146+
} while (!issues.isLast && nextPageToken != null);
147147
}
148148
}
149149

src/test/java/org/hibernate/infra/replicate/jira/mock/SampleJiraRestClient.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,13 @@ public void deleteIssueLink(String linkId) {
181181
// do nothing
182182
}
183183

184+
@Override
185+
public JiraIssues find(String query, String nextPageToken, int maxResults, List<String> fields) {
186+
JiraIssues issues = new JiraIssues();
187+
issues.issues = List.of();
188+
return issues;
189+
}
190+
184191
@Override
185192
public JiraIssues find(String query, int startAt, int maxResults) {
186193
JiraIssues issues = new JiraIssues();

0 commit comments

Comments
 (0)