From c3abfdfafc897b59eb4b51e406de5fbe2bdb626e Mon Sep 17 00:00:00 2001 From: Greg Gibeling Date: Tue, 18 Nov 2025 14:52:35 -0800 Subject: [PATCH] Upgraded Jira API client to 7.0.1 --- .../com/g2forge/project/report/Billing.java | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/pj-report/src/main/java/com/g2forge/project/report/Billing.java b/pj-report/src/main/java/com/g2forge/project/report/Billing.java index 3f3d619..95d91a3 100644 --- a/pj-report/src/main/java/com/g2forge/project/report/Billing.java +++ b/pj-report/src/main/java/com/g2forge/project/report/Billing.java @@ -179,7 +179,7 @@ public static void main(String[] args) throws Throwable { IStandardCommand.main(args, new Billing()); } - protected final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy/MM/dd"); + protected static final DateTimeFormatter DATE_FORMAT_SLASH = DateTimeFormatter.ofPattern("yyyy/MM/dd"); protected List computeChanges(ExtendedJiraRestClient client, Server server, Request request, IFunction1 userToFriendly, String issueKey, ZonedDateTime start, ZonedDateTime end) throws InterruptedException, ExecutionException { final Issue issue = client.getIssueClient().getIssue(issueKey, HCollection.asList(IssueRestClient.Expandos.CHANGELOG)).get(); @@ -212,17 +212,19 @@ protected List findRelevantIssues(ExtendedJiraRestClient client, String j final List retVal = new ArrayList<>(); for (String user : users) { log.info("Finding issues for {}", user); - final String compositeJQL = String.format("issuekey IN updatedBy(%1$s, \"%2$s\", \"%3$s\")", user, start.format(DATE_FORMAT), end.format(DATE_FORMAT)) + ((jql == null) ? "" : (" AND " + jql)); - final int desiredMax = 500; - int base = 0; + final String compositeJQL = String.format("issuekey IN updatedBy(%1$s, \"%2$s\", \"%3$s\")", user, start.format(DATE_FORMAT_SLASH), end.format(DATE_FORMAT_SLASH)) + ((jql == null) ? "" : (" AND " + jql)); + final int desiredMax = 5000; + int currentIssuesPerUser = 0; + String nextPageToken = null; while (true) { - final SearchResult searchResult = client.getSearchClient().searchJql(compositeJQL, desiredMax, base, null).get(); - final int actualMax = searchResult.getMaxResults(); - log.info("\tGot issues {} to {} of {}", base, base + Math.min(actualMax, searchResult.getTotal() - base), searchResult.getTotal()); - - retVal.addAll(HCollection.asListIterable(searchResult.getIssues())); - if ((base + actualMax) >= searchResult.getTotal()) break; - else base += actualMax; + final SearchResult searchResult = client.getSearchClient().enhancedSearchJql(compositeJQL, desiredMax, nextPageToken, HCollection.asSet("*all"), null).get(); + final List issues = HCollection.asListIterable(searchResult.getIssues()); + retVal.addAll(issues); + nextPageToken = searchResult.getNextPageToken(); + currentIssuesPerUser += issues.size(); + log.info("\tFound {} ({}) issues, {}", issues.size(), currentIssuesPerUser, nextPageToken == null ? "none remaining" : "more coming"); + retVal.addAll(issues); + if (nextPageToken == null) break; } } return retVal; @@ -246,6 +248,8 @@ protected List examineIssue(final ExtendedJiraRestClient client, Server public static final DateTimeFormatter DATETIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm[:ss]"); + public static final DateTimeFormatter DATE_FORMAT_DASH = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + @Override public IExit invoke(CommandInvocation invocation) throws Throwable { HLog.getLogControl().setLogLevel(Level.INFO); @@ -315,7 +319,8 @@ public IExit invoke(CommandInvocation invocation) thro billLines.add(new BillLine(component, assignees, issue, summary, hours, ranges.toString().strip(), link)); } } - final Path outputFile = Filename.replaceExtension(arguments.getRequest(), "csv"); + + final Path outputFile = arguments.getRequest().getParent().resolve(Filename.fromPath(arguments.getRequest()).getFirst() + " " + DATE_FORMAT_DASH.format(request.getStart()) + " - " + DATE_FORMAT_DASH.format(request.getEnd()) + ".csv"); log.info("Writing bill to {}", outputFile); BillLine.getMapper().write(billLines, outputFile);