From 72dc5c5d186639d42a9f28bf8ca802fc48ebebfb Mon Sep 17 00:00:00 2001 From: Akash Rindhe Date: Wed, 21 Apr 2021 20:07:10 +0800 Subject: [PATCH 1/2] (refactor) Replace complex parsing logic from GHEvent.type to GHEvent with static mapping [https://github.com/hub4j/github-api/issues/1099] --- src/main/java/org/kohsuke/github/GHEvent.java | 48 +++++++++++++++++++ .../java/org/kohsuke/github/GHEventInfo.java | 10 +--- .../java/org/kohsuke/github/GHEventTest.java | 34 +++++++++++++ 3 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 src/test/java/org/kohsuke/github/GHEventTest.java diff --git a/src/main/java/org/kohsuke/github/GHEvent.java b/src/main/java/org/kohsuke/github/GHEvent.java index ff61f057a6..923917c515 100644 --- a/src/main/java/org/kohsuke/github/GHEvent.java +++ b/src/main/java/org/kohsuke/github/GHEvent.java @@ -2,6 +2,8 @@ import java.util.Locale; +import javax.annotation.Nonnull; + /** * Hook event type. * @@ -85,4 +87,50 @@ String symbol() { return "*"; return name().toLowerCase(Locale.ENGLISH); } + + /** + * Representation of GitHub Event Type + * + * @see GitHub event + * types + */ + public enum GitHubEventType { + CommitCommentEvent(COMMIT_COMMENT), + CreateEvent(CREATE), + DeleteEvent(DELETE), + ForkEvent(FORK), + GollumEvent(GOLLUM), + IssueCommentEvent(ISSUE_COMMENT), + IssuesEvent(ISSUES), + MemberEvent(MEMBER), + PublicEvent(PUBLIC), + PullRequestEvent(PULL_REQUEST), + PullRequestReviewEvent(PULL_REQUEST_REVIEW), + PullRequestReviewCommentEvent(PULL_REQUEST_REVIEW_COMMENT), + PushEvent(PUSH), + ReleaseEvent(RELEASE), + WatchEvent(WATCH); + + private final GHEvent event; + GitHubEventType(GHEvent event) { + this.event = event; + } + + /** + * Required due to different naming conventions between different GitHub event names for Webhook events and + * GitHub events + * + * @param event + * the github event as a string to convert to Event enum + * @return GHEvent + */ + public static GHEvent transformToGHEvent(@Nonnull String event) { + try { + GitHubEventType gitHubEventType = GitHubEventType.valueOf(event); + return gitHubEventType.event; + } catch (IllegalArgumentException ignored) { + return UNKNOWN; + } + } + } } diff --git a/src/main/java/org/kohsuke/github/GHEventInfo.java b/src/main/java/org/kohsuke/github/GHEventInfo.java index e3214baa18..43e178f9c8 100644 --- a/src/main/java/org/kohsuke/github/GHEventInfo.java +++ b/src/main/java/org/kohsuke/github/GHEventInfo.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import org.kohsuke.github.GHEvent.GitHubEventType; import java.io.IOException; import java.util.Date; @@ -46,14 +47,7 @@ public static class GHEventRepository { * @return the type */ public GHEvent getType() { - String t = type; - if (t.endsWith("Event")) - t = t.substring(0, t.length() - 5); - for (GHEvent e : GHEvent.values()) { - if (e.name().replace("_", "").equalsIgnoreCase(t)) - return e; - } - return GHEvent.UNKNOWN; + return GitHubEventType.transformToGHEvent(type); } GHEventInfo wrapUp(GitHub root) { diff --git a/src/test/java/org/kohsuke/github/GHEventTest.java b/src/test/java/org/kohsuke/github/GHEventTest.java new file mode 100644 index 0000000000..adaa0fe30a --- /dev/null +++ b/src/test/java/org/kohsuke/github/GHEventTest.java @@ -0,0 +1,34 @@ +package org.kohsuke.github; + +import org.junit.Test; +import org.kohsuke.github.GHEvent.GitHubEventType; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +public class GHEventTest { + + /** + * Function from GHEventInfo to transform string event to GHEvent which has been replaced by static mapping due to + * complex parsing logic below + */ + private static GHEvent oldTransformationFunction(String t) { + if (t.endsWith("Event")) { + t = t.substring(0, t.length() - 5); + } + for (GHEvent e : GHEvent.values()) { + if (e.name().replace("_", "").equalsIgnoreCase(t)) { + return e; + } + } + return GHEvent.UNKNOWN; + } + + @Test + public void regressionTest() { + for (GitHubEventType gitHubEventType : GitHubEventType.values()) { + assertThat(GitHubEventType.transformToGHEvent(gitHubEventType.name()), + is(oldTransformationFunction(gitHubEventType.name()))); + } + } +} From 5c64fec0320661f2ce880a664525c46e10ac5588 Mon Sep 17 00:00:00 2001 From: Liam Newman Date: Wed, 21 Apr 2021 16:24:57 -0700 Subject: [PATCH 2/2] Streamline with EnumUtils --- src/main/java/org/kohsuke/github/GHEvent.java | 16 +++++++-------- .../kohsuke/github/internal/EnumUtils.java | 20 ++++++++++++++++++- .../java/org/kohsuke/github/GHEventTest.java | 1 + 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/kohsuke/github/GHEvent.java b/src/main/java/org/kohsuke/github/GHEvent.java index 923917c515..046d1ddf2b 100644 --- a/src/main/java/org/kohsuke/github/GHEvent.java +++ b/src/main/java/org/kohsuke/github/GHEvent.java @@ -1,5 +1,7 @@ package org.kohsuke.github; +import org.kohsuke.github.internal.EnumUtils; + import java.util.Locale; import javax.annotation.Nonnull; @@ -94,7 +96,7 @@ String symbol() { * @see GitHub event * types */ - public enum GitHubEventType { + enum GitHubEventType { CommitCommentEvent(COMMIT_COMMENT), CreateEvent(CREATE), DeleteEvent(DELETE), @@ -109,7 +111,8 @@ public enum GitHubEventType { PullRequestReviewCommentEvent(PULL_REQUEST_REVIEW_COMMENT), PushEvent(PUSH), ReleaseEvent(RELEASE), - WatchEvent(WATCH); + WatchEvent(WATCH), + UnknownEvent(UNKNOWN); private final GHEvent event; GitHubEventType(GHEvent event) { @@ -124,13 +127,8 @@ public enum GitHubEventType { * the github event as a string to convert to Event enum * @return GHEvent */ - public static GHEvent transformToGHEvent(@Nonnull String event) { - try { - GitHubEventType gitHubEventType = GitHubEventType.valueOf(event); - return gitHubEventType.event; - } catch (IllegalArgumentException ignored) { - return UNKNOWN; - } + static GHEvent transformToGHEvent(@Nonnull String event) { + return EnumUtils.getEnumOrDefault(GitHubEventType.class, event, UnknownEvent).event; } } } diff --git a/src/main/java/org/kohsuke/github/internal/EnumUtils.java b/src/main/java/org/kohsuke/github/internal/EnumUtils.java index 80a23ca230..4e81b9f8c5 100644 --- a/src/main/java/org/kohsuke/github/internal/EnumUtils.java +++ b/src/main/java/org/kohsuke/github/internal/EnumUtils.java @@ -30,8 +30,26 @@ public static > E getNullableEnumOrDefault(Class enumClass, if (value == null) { return null; } + return getEnumOrDefault(enumClass, value.toUpperCase(Locale.ROOT), defaultEnum); + } + + /** + * Returns an enum value matching the value if found, {@code defaultEnum} if the value is null or cannot be matched + * to a value of the enum. + * + * @param + * the type of the enum + * @param enumClass + * the type of the enum + * @param value + * the value to interpret + * @param defaultEnum + * the default enum value if the value doesn't match one of the enum value + * @return an enum value + */ + public static > E getEnumOrDefault(Class enumClass, String value, E defaultEnum) { try { - return Enum.valueOf(enumClass, value.toUpperCase(Locale.ROOT)); + return Enum.valueOf(enumClass, value); } catch (IllegalArgumentException e) { LOGGER.warning("Unknown value " + value + " for enum class " + enumClass.getName() + ", defaulting to " + defaultEnum.name()); diff --git a/src/test/java/org/kohsuke/github/GHEventTest.java b/src/test/java/org/kohsuke/github/GHEventTest.java index adaa0fe30a..97543a036a 100644 --- a/src/test/java/org/kohsuke/github/GHEventTest.java +++ b/src/test/java/org/kohsuke/github/GHEventTest.java @@ -26,6 +26,7 @@ private static GHEvent oldTransformationFunction(String t) { @Test public void regressionTest() { + assertThat(GitHubEventType.transformToGHEvent("NewlyAddedOrBogusEvent"), is(GHEvent.UNKNOWN)); for (GitHubEventType gitHubEventType : GitHubEventType.values()) { assertThat(GitHubEventType.transformToGHEvent(gitHubEventType.name()), is(oldTransformationFunction(gitHubEventType.name())));