diff --git a/src/main/java/org/kohsuke/github/GHApp.java b/src/main/java/org/kohsuke/github/GHApp.java index b2178046d..eb1f8c35a 100644 --- a/src/main/java/org/kohsuke/github/GHApp.java +++ b/src/main/java/org/kohsuke/github/GHApp.java @@ -1,9 +1,12 @@ package org.kohsuke.github; +import org.kohsuke.github.internal.EnumUtils; + import java.io.IOException; import java.net.URL; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import static org.kohsuke.github.internal.Previews.MACHINE_MAN; @@ -20,7 +23,7 @@ public class GHApp extends GHObject { private String description; private String externalUrl; private Map permissions; - private List events; + private List events; private long installationsCount; private String htmlUrl; @@ -114,7 +117,9 @@ public class GHApp extends GHObject { * @return the events */ public List getEvents() { - return events; + return events.stream() + .map(e -> EnumUtils.getEnumOrDefault(GHEvent.class, e, GHEvent.UNKNOWN)) + .collect(Collectors.toList()); } /** @@ -126,7 +131,7 @@ public class GHApp extends GHObject { */ @Deprecated public void setEvents(List events) { - this.events = events; + this.events = events.stream().map(GHEvent::symbol).collect(Collectors.toList()); } /** diff --git a/src/main/java/org/kohsuke/github/GHAppInstallation.java b/src/main/java/org/kohsuke/github/GHAppInstallation.java index 7b1797fd5..ee5c732c2 100644 --- a/src/main/java/org/kohsuke/github/GHAppInstallation.java +++ b/src/main/java/org/kohsuke/github/GHAppInstallation.java @@ -1,12 +1,14 @@ package org.kohsuke.github; import com.fasterxml.jackson.annotation.JsonProperty; +import org.kohsuke.github.internal.EnumUtils; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import static org.kohsuke.github.internal.Previews.GAMBIT; import static org.kohsuke.github.internal.Previews.MACHINE_MAN; @@ -35,7 +37,7 @@ public class GHAppInstallation extends GHObject { @JsonProperty("target_type") private GHTargetType targetType; private Map permissions; - private List events; + private List events; @JsonProperty("single_file_name") private String singleFileName; @JsonProperty("repository_selection") @@ -250,7 +252,9 @@ public class GHAppInstallation extends GHObject { * @return the events */ public List getEvents() { - return events; + return events.stream() + .map(e -> EnumUtils.getEnumOrDefault(GHEvent.class, e, GHEvent.UNKNOWN)) + .collect(Collectors.toList()); } /** @@ -262,7 +266,7 @@ public class GHAppInstallation extends GHObject { */ @Deprecated public void setEvents(List events) { - this.events = events; + this.events = events.stream().map(GHEvent::symbol).collect(Collectors.toList()); } /** diff --git a/src/main/java/org/kohsuke/github/GHEvent.java b/src/main/java/org/kohsuke/github/GHEvent.java index 046d1ddf2..a8c3b245b 100644 --- a/src/main/java/org/kohsuke/github/GHEvent.java +++ b/src/main/java/org/kohsuke/github/GHEvent.java @@ -1,11 +1,7 @@ package org.kohsuke.github; -import org.kohsuke.github.internal.EnumUtils; - import java.util.Locale; -import javax.annotation.Nonnull; - /** * Hook event type. * @@ -24,6 +20,8 @@ public enum GHEvent { DEPLOY_KEY, DEPLOYMENT, DEPLOYMENT_STATUS, + DISCUSSION, + DISCUSSION_COMMENT, DOWNLOAD, FOLLOW, FORK, @@ -89,46 +87,4 @@ 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 43e178f9c..f550c9bcc 100644 --- a/src/main/java/org/kohsuke/github/GHEventInfo.java +++ b/src/main/java/org/kohsuke/github/GHEventInfo.java @@ -2,10 +2,9 @@ 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; +import java.util.*; /** * Represents an event. @@ -19,6 +18,16 @@ public class GHEventInfo extends GitHubInteractiveObject { private long id; private String created_at; + + /** + * Representation of GitHub Event API Event Type. + * + * This is not the same as the values used for hook methods such as + * {@link GHRepository#createHook(String, Map, Collection, boolean)}. + * + * @see GitHub event + * types + */ private String type; // these are all shallow objects @@ -41,13 +50,45 @@ public class GHEventInfo extends GitHubInteractiveObject { private String name; // owner/repo } + static final Map mapTypeStringToEvent = createEventMap(); + + /** + * Map for GitHub Event API Event Type to GHEvent. + * + * @see GitHub event + * types + */ + private static Map createEventMap() { + HashMap map = new HashMap<>(); + map.put("CommitCommentEvent", GHEvent.COMMIT_COMMENT); + map.put("CreateEvent", GHEvent.CREATE); + map.put("DeleteEvent", GHEvent.DELETE); + map.put("ForkEvent", GHEvent.FORK); + map.put("GollumEvent", GHEvent.GOLLUM); + map.put("IssueCommentEvent", GHEvent.ISSUE_COMMENT); + map.put("IssuesEvent", GHEvent.ISSUES); + map.put("MemberEvent", GHEvent.MEMBER); + map.put("PublicEvent", GHEvent.PUBLIC); + map.put("PullRequestEvent", GHEvent.PULL_REQUEST); + map.put("PullRequestReviewEvent", GHEvent.PULL_REQUEST_REVIEW); + map.put("PullRequestReviewCommentEvent", GHEvent.PULL_REQUEST_REVIEW_COMMENT); + map.put("PushEvent", GHEvent.PUSH); + map.put("ReleaseEvent", GHEvent.RELEASE); + map.put("WatchEvent", GHEvent.WATCH); + return Collections.unmodifiableMap(map); + } + + static GHEvent transformTypeToGHEvent(String type) { + return mapTypeStringToEvent.getOrDefault(type, GHEvent.UNKNOWN); + } + /** * Gets type. * * @return the type */ public GHEvent getType() { - return GitHubEventType.transformToGHEvent(type); + return transformTypeToGHEvent(type); } GHEventInfo wrapUp(GitHub root) { diff --git a/src/main/java/org/kohsuke/github/GHHook.java b/src/main/java/org/kohsuke/github/GHHook.java index 35fa7bd1f..0d8193213 100644 --- a/src/main/java/org/kohsuke/github/GHHook.java +++ b/src/main/java/org/kohsuke/github/GHHook.java @@ -1,13 +1,13 @@ package org.kohsuke.github; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import org.kohsuke.github.internal.EnumUtils; import java.io.IOException; import java.net.URL; import java.util.Collections; import java.util.EnumSet; import java.util.List; -import java.util.Locale; import java.util.Map; /** @@ -40,10 +40,7 @@ public abstract class GHHook extends GHObject { public EnumSet getEvents() { EnumSet s = EnumSet.noneOf(GHEvent.class); for (String e : events) { - if (e.equals("*")) - s.add(GHEvent.ALL); - else - s.add(Enum.valueOf(GHEvent.class, e.toUpperCase(Locale.ENGLISH))); + s.add(e.equals("*") ? GHEvent.ALL : EnumUtils.getEnumOrDefault(GHEvent.class, e, GHEvent.UNKNOWN)); } return s; } diff --git a/src/main/java/org/kohsuke/github/internal/EnumUtils.java b/src/main/java/org/kohsuke/github/internal/EnumUtils.java index 4e81b9f8c..7d247ad80 100644 --- a/src/main/java/org/kohsuke/github/internal/EnumUtils.java +++ b/src/main/java/org/kohsuke/github/internal/EnumUtils.java @@ -30,7 +30,7 @@ public final class EnumUtils { if (value == null) { return null; } - return getEnumOrDefault(enumClass, value.toUpperCase(Locale.ROOT), defaultEnum); + return getEnumOrDefault(enumClass, value, defaultEnum); } /** @@ -49,8 +49,8 @@ public final class EnumUtils { */ public static > E getEnumOrDefault(Class enumClass, String value, E defaultEnum) { try { - return Enum.valueOf(enumClass, value); - } catch (IllegalArgumentException e) { + return Enum.valueOf(enumClass, value.toUpperCase(Locale.ROOT)); + } catch (NullPointerException | IllegalArgumentException e) { LOGGER.warning("Unknown value " + value + " for enum class " + enumClass.getName() + ", defaulting to " + defaultEnum.name()); return defaultEnum; diff --git a/src/test/java/org/kohsuke/github/EnumTest.java b/src/test/java/org/kohsuke/github/EnumTest.java index a83a6267c..605d1c728 100644 --- a/src/test/java/org/kohsuke/github/EnumTest.java +++ b/src/test/java/org/kohsuke/github/EnumTest.java @@ -27,7 +27,7 @@ public class EnumTest extends AbstractGitHubWireMockTest { assertThat(GHDirection.values().length, equalTo(2)); - assertThat(GHEvent.values().length, equalTo(58)); + assertThat(GHEvent.values().length, equalTo(60)); assertThat(GHEvent.ALL.symbol(), equalTo("*")); assertThat(GHEvent.PULL_REQUEST.symbol(), equalTo(GHEvent.PULL_REQUEST.toString().toLowerCase())); diff --git a/src/test/java/org/kohsuke/github/GHEventTest.java b/src/test/java/org/kohsuke/github/GHEventTest.java index 97543a036..aea0fa14b 100644 --- a/src/test/java/org/kohsuke/github/GHEventTest.java +++ b/src/test/java/org/kohsuke/github/GHEventTest.java @@ -1,7 +1,6 @@ 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; @@ -26,10 +25,9 @@ public class GHEventTest { @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()))); + assertThat(GHEventInfo.transformTypeToGHEvent("NewlyAddedOrBogusEvent"), is(GHEvent.UNKNOWN)); + for (String eventInfoType : GHEventInfo.mapTypeStringToEvent.keySet()) { + assertThat(GHEventInfo.transformTypeToGHEvent(eventInfoType), is(oldTransformationFunction(eventInfoType))); } } } diff --git a/src/test/java/org/kohsuke/github/internal/EnumUtilsTest.java b/src/test/java/org/kohsuke/github/internal/EnumUtilsTest.java index ac5c686b6..0eb47385e 100644 --- a/src/test/java/org/kohsuke/github/internal/EnumUtilsTest.java +++ b/src/test/java/org/kohsuke/github/internal/EnumUtilsTest.java @@ -9,6 +9,8 @@ public class EnumUtilsTest { @Test public void testGetEnum() { + assertThat(EnumUtils.getEnumOrDefault(TestEnum.class, null, TestEnum.UNKNOWN), equalTo(TestEnum.UNKNOWN)); + assertThat(EnumUtils.getNullableEnumOrDefault(TestEnum.class, null, TestEnum.UNKNOWN), nullValue()); assertThat(EnumUtils.getNullableEnumOrDefault(TestEnum.class, "foobar", TestEnum.UNKNOWN), equalTo(TestEnum.UNKNOWN));