diff --git a/src/main/java/org/hibernate/infra/replicate/jira/JiraConfig.java b/src/main/java/org/hibernate/infra/replicate/jira/JiraConfig.java index 0222b54..b3a91b3 100644 --- a/src/main/java/org/hibernate/infra/replicate/jira/JiraConfig.java +++ b/src/main/java/org/hibernate/infra/replicate/jira/JiraConfig.java @@ -290,6 +290,13 @@ interface IssueLinkTypeValueMapping extends ValueMapping { * {@code "globalId": "appId=5e7d6222-8225-3bcd-be58-5fe3980b0fae&issueId=65806"} */ Optional applicationIdForRemoteLinkType(); + + /** + * @return the appId to be used to create a globalId for a remote link, e.g.: + * Jira Cloud has the format: + * {@code "globalId": "system=http://www.mycompany.com/support&id=1"} + */ + Optional systemForRemoteLinkType(); } interface IssueTypeValueMapping extends ValueMapping { diff --git a/src/main/java/org/hibernate/infra/replicate/jira/service/jira/HandlerProjectContext.java b/src/main/java/org/hibernate/infra/replicate/jira/service/jira/HandlerProjectContext.java index 3608c1c..898109f 100644 --- a/src/main/java/org/hibernate/infra/replicate/jira/service/jira/HandlerProjectContext.java +++ b/src/main/java/org/hibernate/infra/replicate/jira/service/jira/HandlerProjectContext.java @@ -72,7 +72,7 @@ public AtomicLong currentIssueKeyNumber() { public Long getLargestSyncedJiraIssueKeyNumber() { JiraIssues issues = projectGroupContext.destinationJiraClient() .find("project = %s and summary !~\"%s\" ORDER BY key DESC".formatted(project.projectId(), - SYNC_ISSUE_PLACEHOLDER_SUMMARY), 0, 1); + SYNC_ISSUE_PLACEHOLDER_SUMMARY), null, 1, List.of("key")); if (issues.issues.isEmpty()) { return 0L; } else { @@ -100,7 +100,7 @@ public Optional getNextIssueToSync(Long latestSyncedJiraIssueKeyNumbe private Long getCurrentLatestJiraIssueKeyNumber() { try { JiraIssues issues = projectGroupContext.destinationJiraClient() - .find("project = %s ORDER BY created DESC".formatted(project.projectId()), 0, 1); + .find("project = %s ORDER BY created DESC".formatted(project.projectId()), null, 1, List.of("key")); if (issues.issues.isEmpty()) { return 0L; } else { diff --git a/src/main/java/org/hibernate/infra/replicate/jira/service/jira/handler/JiraEventHandler.java b/src/main/java/org/hibernate/infra/replicate/jira/service/jira/handler/JiraEventHandler.java index 75ce051..e264aff 100644 --- a/src/main/java/org/hibernate/infra/replicate/jira/service/jira/handler/JiraEventHandler.java +++ b/src/main/java/org/hibernate/infra/replicate/jira/service/jira/handler/JiraEventHandler.java @@ -21,7 +21,7 @@ import jakarta.ws.rs.core.UriBuilder; public abstract class JiraEventHandler implements Runnable { - protected static final int MAX_CONTENT_SIZE = 65_535; + protected static final int MAX_CONTENT_SIZE = 32_766; protected final Long objectId; protected final FailureCollector failureCollector; diff --git a/src/main/java/org/hibernate/infra/replicate/jira/service/jira/handler/JiraIssueAbstractEventHandler.java b/src/main/java/org/hibernate/infra/replicate/jira/service/jira/handler/JiraIssueAbstractEventHandler.java index 28ffc19..7980c25 100644 --- a/src/main/java/org/hibernate/infra/replicate/jira/service/jira/handler/JiraIssueAbstractEventHandler.java +++ b/src/main/java/org/hibernate/infra/replicate/jira/service/jira/handler/JiraIssueAbstractEventHandler.java @@ -94,17 +94,15 @@ protected JiraRemoteLink remoteSelfLink(JiraIssue sourceIssue) { // And if the appid/names are available then we can make it also look as if it // is not a remote link: - Optional appId = context.projectGroup().issueLinkTypes().applicationIdForRemoteLinkType(); - link.globalId = appId.map(s -> "appId=%s&issueId=%s".formatted(s, sourceIssue.id)) - .orElseGet(jiraLink::toString); + Optional formattedId = JiraRemoteLink.createGlobalId(context.projectGroup().issueLinkTypes(), + sourceIssue.key); + link.globalId = formattedId.orElseGet(jiraLink::toString); link.relationship = "Upstream issue"; link.object.title = sourceIssue.key; link.object.url = jiraLink; link.object.summary = "Link to an upstream JIRA issue, from which this one was cloned."; - Optional applicationName = context.projectGroup().issueLinkTypes().applicationNameForRemoteLinkType(); - link.application = applicationName.map(JiraRemoteLink.Application::new).orElse(null); return link; } diff --git a/src/main/java/org/hibernate/infra/replicate/jira/service/jira/handler/JiraIssueLinkUpsertEventHandler.java b/src/main/java/org/hibernate/infra/replicate/jira/service/jira/handler/JiraIssueLinkUpsertEventHandler.java index ae07118..137d35f 100644 --- a/src/main/java/org/hibernate/infra/replicate/jira/service/jira/handler/JiraIssueLinkUpsertEventHandler.java +++ b/src/main/java/org/hibernate/infra/replicate/jira/service/jira/handler/JiraIssueLinkUpsertEventHandler.java @@ -86,13 +86,13 @@ private void createAsRemoteLink(JiraIssueLink sourceLink, String linkedIssueKey, Optional appId = context.projectGroup().issueLinkTypes().applicationIdForRemoteLinkType(); link.globalId = appId.map(s -> "appId=%s&issueId=%s".formatted(s, linkedIssueId)) .orElseGet(() -> sourceLink.self.toString()); + Optional formattedId = JiraRemoteLink.createGlobalId(context.projectGroup().issueLinkTypes(), + linkedIssueKey); + link.globalId = formattedId.orElseGet(jiraLink::toString); + link.relationship = sourceLink.type.name; link.object.title = linkedIssueKey; link.object.url = jiraLink; - - Optional applicationName = context.projectGroup().issueLinkTypes().applicationNameForRemoteLinkType(); - link.application = applicationName.map(JiraRemoteLink.Application::new).orElse(null); - context.destinationJiraClient().upsertRemoteLink(currentIssue, link); } @Override diff --git a/src/main/java/org/hibernate/infra/replicate/jira/service/jira/model/rest/JiraRemoteLink.java b/src/main/java/org/hibernate/infra/replicate/jira/service/jira/model/rest/JiraRemoteLink.java index 8bc0049..bf5b08a 100644 --- a/src/main/java/org/hibernate/infra/replicate/jira/service/jira/model/rest/JiraRemoteLink.java +++ b/src/main/java/org/hibernate/infra/replicate/jira/service/jira/model/rest/JiraRemoteLink.java @@ -1,7 +1,9 @@ package org.hibernate.infra.replicate.jira.service.jira.model.rest; import java.net.URI; +import java.util.Optional; +import org.hibernate.infra.replicate.jira.JiraConfig; import org.hibernate.infra.replicate.jira.service.jira.model.JiraBaseObject; public class JiraRemoteLink extends JiraBaseObject { @@ -11,6 +13,19 @@ public class JiraRemoteLink extends JiraBaseObject { public LinkObject object = new LinkObject(); public Application application; + public static Optional createGlobalId(JiraConfig.IssueLinkTypeValueMapping issueLinkTypeValueMapping, + String sourceIssue) { + Optional appId = issueLinkTypeValueMapping.applicationIdForRemoteLinkType(); + if (appId.isPresent()) { + return appId.map(s -> "appId=%s&issueId=%s".formatted(s, sourceIssue)); + } + Optional system = issueLinkTypeValueMapping.systemForRemoteLinkType(); + if (system.isPresent()) { + return system.map(s -> "system=%s&id=%s".formatted(s, sourceIssue)); + } + return Optional.empty(); + } + @Override public String toString() { return "JiraRemoteLink{" + "globalId='" + globalId + '\'' + ", self=" + self + ", relationship='" + relationship