diff --git a/pom.xml b/pom.xml index 9c587e216..a4f819001 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 org.kohsuke github-api - 1.128-SNAPSHOT + 1.129-SNAPSHOT GitHub API for Java https://github-api.kohsuke.org/ GitHub API for Java @@ -596,16 +596,6 @@ - - jdk11+ - - [11,) - - - - --add-opens java.base/java.net=ALL-UNNAMED - - ci-non-windows diff --git a/src/main/java/org/kohsuke/github/GHEvent.java b/src/main/java/org/kohsuke/github/GHEvent.java index ff61f057a..046d1ddf2 100644 --- a/src/main/java/org/kohsuke/github/GHEvent.java +++ b/src/main/java/org/kohsuke/github/GHEvent.java @@ -1,7 +1,11 @@ package org.kohsuke.github; +import org.kohsuke.github.internal.EnumUtils; + import java.util.Locale; +import javax.annotation.Nonnull; + /** * Hook event type. * @@ -85,4 +89,46 @@ public enum GHEvent { return "*"; return name().toLowerCase(Locale.ENGLISH); } + + /** + * Representation of GitHub Event Type + * + * @see GitHub event + * types + */ + 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), + UnknownEvent(UNKNOWN); + + 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 + */ + static GHEvent transformToGHEvent(@Nonnull String event) { + return EnumUtils.getEnumOrDefault(GitHubEventType.class, event, UnknownEvent).event; + } + } } diff --git a/src/main/java/org/kohsuke/github/GHEventInfo.java b/src/main/java/org/kohsuke/github/GHEventInfo.java index e3214baa1..43e178f9c 100644 --- a/src/main/java/org/kohsuke/github/GHEventInfo.java +++ b/src/main/java/org/kohsuke/github/GHEventInfo.java @@ -2,6 +2,7 @@ package org.kohsuke.github; 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 class GHEventInfo extends GitHubInteractiveObject { * @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/main/java/org/kohsuke/github/internal/EnumUtils.java b/src/main/java/org/kohsuke/github/internal/EnumUtils.java index 80a23ca23..4e81b9f8c 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 final class EnumUtils { 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 new file mode 100644 index 000000000..97543a036 --- /dev/null +++ b/src/test/java/org/kohsuke/github/GHEventTest.java @@ -0,0 +1,35 @@ +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() { + assertThat(GitHubEventType.transformToGHEvent("NewlyAddedOrBogusEvent"), is(GHEvent.UNKNOWN)); + for (GitHubEventType gitHubEventType : GitHubEventType.values()) { + assertThat(GitHubEventType.transformToGHEvent(gitHubEventType.name()), + is(oldTransformationFunction(gitHubEventType.name()))); + } + } +}