Skip to content

Commit 3a63262

Browse files
committed
Add handling of more automation events
1 parent 4fb5f0d commit 3a63262

16 files changed

+251
-36
lines changed

src/main/java/org/hibernate/infra/replicate/jira/resource/JiraWebHookListenerResource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public String somethingHappenedUpstream(@RestPath @NotNull @ConfiguredProject St
3535
@POST
3636
@Path("/mirror/{project}")
3737
@Consumes(MediaType.APPLICATION_JSON)
38-
public String somethingHappenedDownstream(@RestPath @NotNull @ConfiguredProject(upstream = false) String project,
38+
public String somethingHappenedDownstream(@RestPath @NotNull @ConfiguredProject String project,
3939
JiraActionEvent data) {
4040
Log.tracef("Received a downstream notification about %s project: %s...", project, data);
4141
jiraService.downstreamAcknowledge(project, data);

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,4 +371,8 @@ public boolean isDownstreamUserIgnored(String triggeredByUser) {
371371
public String upstreamUser(String mappedValue) {
372372
return projectGroupContext.upstreamUser(mappedValue);
373373
}
374+
375+
public String upstreamStatus(String mappedValue) {
376+
return projectGroupContext.upstreamStatus(mappedValue);
377+
}
374378
}

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

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public final class HandlerProjectGroupContext implements AutoCloseable {
2828
private final Semaphore downstreamRateLimiter;
2929
private final JiraConfig.JiraProjectGroup projectGroup;
3030
private final Map<String, String> invertedUsers;
31+
private final Map<String, String> invertedStatuses;
3132

3233
public HandlerProjectGroupContext(JiraConfig.JiraProjectGroup projectGroup) {
3334
this.projectGroup = projectGroup;
@@ -54,11 +55,16 @@ public HandlerProjectGroupContext(JiraConfig.JiraProjectGroup projectGroup) {
5455
downstreamEventHandlingExecutor = new ThreadPoolExecutor(processing.threads(), processing.threads(), 0L,
5556
TimeUnit.MILLISECONDS, downstreamWorkQueue);
5657

57-
Map<String, String> invertedUsers = new HashMap<>();
58-
for (var entry : projectGroup.users().mapping().entrySet()) {
59-
invertedUsers.put(entry.getValue(), entry.getKey());
58+
this.invertedUsers = invert(projectGroup.users().mapping());
59+
this.invertedStatuses = invert(projectGroup.statuses().mapping());
60+
}
61+
62+
private static Map<String, String> invert(Map<String, String> map) {
63+
Map<String, String> result = new HashMap<>();
64+
for (var entry : map.entrySet()) {
65+
result.put(entry.getValue(), entry.getKey());
6066
}
61-
this.invertedUsers = Collections.unmodifiableMap(invertedUsers);
67+
return Collections.unmodifiableMap(result);
6268
}
6369

6470
public void startProcessingEvent() throws InterruptedException {
@@ -116,4 +122,9 @@ private static void closeEventExecutor(ExecutorService executor) {
116122
public String upstreamUser(String mappedValue) {
117123
return invertedUsers.get(mappedValue);
118124
}
125+
126+
public String upstreamStatus(String mappedValue) {
127+
return invertedStatuses.get(mappedValue);
128+
}
129+
119130
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ public void acknowledge(String project, JiraWebHookEvent event, String triggered
315315
}
316316

317317
if (context.isUserIgnored(triggeredByUser)) {
318-
Log.infof("Event was triggered by %s user that is in the ignore list.", triggeredByUser);
318+
Log.infof("Event was triggered by %s user that is in the ignore list: %.200s", triggeredByUser, event);
319319
return;
320320
}
321321

src/main/java/org/hibernate/infra/replicate/jira/service/jira/handler/JiraEventHandler.java

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package org.hibernate.infra.replicate.jira.service.jira.handler;
22

33
import java.net.URI;
4-
import java.util.Collections;
54
import java.util.HashMap;
65
import java.util.List;
76
import java.util.Map;
@@ -13,10 +12,8 @@
1312
import org.hibernate.infra.replicate.jira.service.jira.HandlerProjectContext;
1413
import org.hibernate.infra.replicate.jira.service.jira.model.rest.JiraComment;
1514
import org.hibernate.infra.replicate.jira.service.jira.model.rest.JiraIssue;
16-
import org.hibernate.infra.replicate.jira.service.jira.model.rest.JiraIssueTransition;
1715
import org.hibernate.infra.replicate.jira.service.jira.model.rest.JiraSimpleObject;
1816
import org.hibernate.infra.replicate.jira.service.jira.model.rest.JiraTextContent;
19-
import org.hibernate.infra.replicate.jira.service.jira.model.rest.JiraTransitions;
2017
import org.hibernate.infra.replicate.jira.service.jira.model.rest.JiraUser;
2118
import org.hibernate.infra.replicate.jira.service.reporting.FailureCollector;
2219
import org.hibernate.infra.replicate.jira.service.reporting.ReportingConfig;
@@ -101,26 +98,6 @@ protected Optional<String> statusToTransition(String from, String to, Supplier<O
10198
"%s->%s".formatted(from, to), tk -> transitionFinder.get().orElse(null)));
10299
}
103100

104-
protected Optional<String> findRequiredTransitionId(String downstreamStatus, JiraIssue destIssue) {
105-
if (downstreamStatus != null) {
106-
List<JiraIssueTransition> jiraTransitions = null;
107-
try {
108-
JiraTransitions transitions = context.destinationJiraClient().availableTransitions(destIssue.key);
109-
jiraTransitions = transitions.transitions;
110-
} catch (Exception e) {
111-
failureCollector.warning("Failed to find a transition for %s".formatted(destIssue.key), e);
112-
jiraTransitions = Collections.emptyList();
113-
}
114-
for (JiraIssueTransition transition : jiraTransitions) {
115-
if (transition.to != null && downstreamStatus.equalsIgnoreCase(transition.to.name)) {
116-
return Optional.of(transition.id);
117-
}
118-
}
119-
}
120-
121-
return Optional.empty();
122-
}
123-
124101
protected Optional<String> linkType(String sourceId) {
125102
JiraConfig.ValueMapping mappedValues = context.projectGroup().issueLinkTypes();
126103
return Optional.ofNullable(JiraStaticFieldMappingCache.linkType(context.projectGroupName(), sourceId, pk -> {

src/main/java/org/hibernate/infra/replicate/jira/service/jira/handler/JiraIssueAbstractEventHandler.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.hibernate.infra.replicate.jira.service.jira.model.rest.JiraRemoteLink;
1919
import org.hibernate.infra.replicate.jira.service.jira.model.rest.JiraSimpleObject;
2020
import org.hibernate.infra.replicate.jira.service.jira.model.rest.JiraTransition;
21+
import org.hibernate.infra.replicate.jira.service.jira.model.rest.JiraTransitions;
2122
import org.hibernate.infra.replicate.jira.service.jira.model.rest.JiraUser;
2223
import org.hibernate.infra.replicate.jira.service.jira.model.rest.JiraVersion;
2324
import org.hibernate.infra.replicate.jira.service.reporting.ReportingConfig;
@@ -231,7 +232,9 @@ protected Optional<JiraTransition> prepareTransition(JiraSimpleObject sourceStat
231232

232233
protected Optional<JiraTransition> prepareTransition(String downstreamStatus, JiraIssue destIssue) {
233234
return statusToTransition(destIssue.fields.status.name, downstreamStatus,
234-
() -> findRequiredTransitionId(downstreamStatus, destIssue)).map(JiraTransition::new);
235+
() -> JiraTransitions.findRequiredTransitionId(context.destinationJiraClient(), failureCollector,
236+
downstreamStatus, destIssue))
237+
.map(JiraTransition::new);
235238
}
236239

237240
protected Optional<JiraIssueLink> prepareParentLink(String destinationKey, JiraIssue sourceIssue) {

src/main/java/org/hibernate/infra/replicate/jira/service/jira/handler/JiraStaticFieldMappingCache.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public class JiraStaticFieldMappingCache {
1010
private static final Map<String, Map<String, String>> priorities = new ConcurrentHashMap<>();
1111
private static final Map<String, Map<String, String>> issueType = new ConcurrentHashMap<>();
1212
private static final Map<String, Map<String, String>> status = new ConcurrentHashMap<>();
13+
private static final Map<String, Map<String, String>> statusUpstream = new ConcurrentHashMap<>();
1314
private static final Map<String, Map<String, String>> linkType = new ConcurrentHashMap<>();
1415
private static final Map<String, Map<String, String>> user = new ConcurrentHashMap<>();
1516

@@ -24,6 +25,15 @@ public static String issueType(String projectGroup, String sourceId,
2425
}
2526

2627
public static String status(String projectGroup, String transitionKey, Function<String, String> onMissing) {
28+
return status(status, projectGroup, transitionKey, onMissing);
29+
}
30+
31+
public static String statusUpstream(String projectGroup, String transitionKey, Function<String, String> onMissing) {
32+
return status(statusUpstream, projectGroup, transitionKey, onMissing);
33+
}
34+
35+
private static String status(Map<String, Map<String, String>> status, String projectGroup, String transitionKey,
36+
Function<String, String> onMissing) {
2737
Map<String, String> groupStatuses = status.computeIfAbsent(projectGroup, pg -> new ConcurrentHashMap<>());
2838

2939
String id = groupStatuses.get(transitionKey);
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package org.hibernate.infra.replicate.jira.service.jira.handler.action;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
import org.hibernate.infra.replicate.jira.service.jira.HandlerProjectContext;
7+
import org.hibernate.infra.replicate.jira.service.jira.model.action.JiraActionEvent;
8+
import org.hibernate.infra.replicate.jira.service.jira.model.rest.JiraFields;
9+
import org.hibernate.infra.replicate.jira.service.jira.model.rest.JiraIssue;
10+
import org.hibernate.infra.replicate.jira.service.jira.model.rest.JiraVersion;
11+
import org.hibernate.infra.replicate.jira.service.reporting.ReportingConfig;
12+
13+
abstract class JiraAbstractVersionActionEventHandler extends JiraActionEventHandler {
14+
15+
public JiraAbstractVersionActionEventHandler(ReportingConfig reportingConfig, HandlerProjectContext context,
16+
JiraActionEvent event) {
17+
super(reportingConfig, context, event);
18+
}
19+
20+
@Override
21+
protected void doRun() {
22+
JiraIssue issue = context.destinationJiraClient().getIssue(event.key);
23+
24+
JiraIssue updated = new JiraIssue();
25+
updated.fields = JiraFields.empty();
26+
27+
List<JiraVersion> versionList = versionList(issue);
28+
29+
List<JiraVersion> versions;
30+
if (versionList != null) {
31+
versions = new ArrayList<>(versionList.size());
32+
for (JiraVersion ver : versionList) {
33+
JiraVersion version = new JiraVersion();
34+
version.name = ver.name;
35+
versions.add(version);
36+
}
37+
} else {
38+
versions = List.of();
39+
}
40+
41+
setVersionList(updated, versions);
42+
43+
context.sourceJiraClient().update(toSourceKey(event.key), updated);
44+
}
45+
46+
protected abstract void setVersionList(JiraIssue issue, List<JiraVersion> versions);
47+
48+
protected abstract List<JiraVersion> versionList(JiraIssue issue);
49+
50+
@Override
51+
public String toString() {
52+
return this.getClass().getSimpleName() + "[" + "event=" + event + ", project=" + context.projectName() + ']';
53+
}
54+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.hibernate.infra.replicate.jira.service.jira.handler.action;
2+
3+
import java.util.List;
4+
5+
import org.hibernate.infra.replicate.jira.service.jira.HandlerProjectContext;
6+
import org.hibernate.infra.replicate.jira.service.jira.model.action.JiraActionEvent;
7+
import org.hibernate.infra.replicate.jira.service.jira.model.rest.JiraIssue;
8+
import org.hibernate.infra.replicate.jira.service.jira.model.rest.JiraVersion;
9+
import org.hibernate.infra.replicate.jira.service.reporting.ReportingConfig;
10+
11+
public class JiraAffectsVersionActionEventHandler extends JiraAbstractVersionActionEventHandler {
12+
13+
public JiraAffectsVersionActionEventHandler(ReportingConfig reportingConfig, HandlerProjectContext context,
14+
JiraActionEvent event) {
15+
super(reportingConfig, context, event);
16+
}
17+
18+
protected void setVersionList(JiraIssue issue, List<JiraVersion> versions) {
19+
issue.fields.versions = versions;
20+
}
21+
22+
protected List<JiraVersion> versionList(JiraIssue issue) {
23+
return issue.fields.versions;
24+
}
25+
26+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.hibernate.infra.replicate.jira.service.jira.handler.action;
2+
3+
import java.util.List;
4+
5+
import org.hibernate.infra.replicate.jira.service.jira.HandlerProjectContext;
6+
import org.hibernate.infra.replicate.jira.service.jira.model.action.JiraActionEvent;
7+
import org.hibernate.infra.replicate.jira.service.jira.model.rest.JiraIssue;
8+
import org.hibernate.infra.replicate.jira.service.jira.model.rest.JiraVersion;
9+
import org.hibernate.infra.replicate.jira.service.reporting.ReportingConfig;
10+
11+
public class JiraFixVersionActionEventHandler extends JiraAbstractVersionActionEventHandler {
12+
13+
public JiraFixVersionActionEventHandler(ReportingConfig reportingConfig, HandlerProjectContext context,
14+
JiraActionEvent event) {
15+
super(reportingConfig, context, event);
16+
}
17+
18+
protected void setVersionList(JiraIssue issue, List<JiraVersion> versions) {
19+
issue.fields.fixVersions = versions;
20+
}
21+
22+
protected List<JiraVersion> versionList(JiraIssue issue) {
23+
return issue.fields.fixVersions;
24+
}
25+
26+
}

0 commit comments

Comments
 (0)