Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,13 @@ interface IssueLinkTypeValueMapping extends ValueMapping {
* {@code "globalId": "appId=5e7d6222-8225-3bcd-be58-5fe3980b0fae&issueId=65806"}
*/
Optional<String> 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<String> systemForRemoteLinkType();
}

interface IssueTypeValueMapping extends ValueMapping {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -100,7 +100,7 @@ public Optional<JiraIssue> 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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<String> appId = context.projectGroup().issueLinkTypes().applicationIdForRemoteLinkType();
link.globalId = appId.map(s -> "appId=%s&issueId=%s".formatted(s, sourceIssue.id))
.orElseGet(jiraLink::toString);
Optional<String> 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<String> applicationName = context.projectGroup().issueLinkTypes().applicationNameForRemoteLinkType();
link.application = applicationName.map(JiraRemoteLink.Application::new).orElse(null);
return link;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,13 +86,13 @@ private void createAsRemoteLink(JiraIssueLink sourceLink, String linkedIssueKey,
Optional<String> appId = context.projectGroup().issueLinkTypes().applicationIdForRemoteLinkType();
link.globalId = appId.map(s -> "appId=%s&issueId=%s".formatted(s, linkedIssueId))
.orElseGet(() -> sourceLink.self.toString());
Optional<String> 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<String> applicationName = context.projectGroup().issueLinkTypes().applicationNameForRemoteLinkType();
link.application = applicationName.map(JiraRemoteLink.Application::new).orElse(null);
context.destinationJiraClient().upsertRemoteLink(currentIssue, link);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -11,6 +13,19 @@ public class JiraRemoteLink extends JiraBaseObject {
public LinkObject object = new LinkObject();
public Application application;

public static Optional<String> createGlobalId(JiraConfig.IssueLinkTypeValueMapping issueLinkTypeValueMapping,
String sourceIssue) {
Optional<String> appId = issueLinkTypeValueMapping.applicationIdForRemoteLinkType();
if (appId.isPresent()) {
return appId.map(s -> "appId=%s&issueId=%s".formatted(s, sourceIssue));
}
Optional<String> 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
Expand Down