Commit 82c1deea authored by Greg Messner's avatar Greg Messner
Browse files

Added support for merge_request system hook (#332).

parent 44b47f3a
...@@ -15,6 +15,8 @@ import org.gitlab4j.api.HookManager; ...@@ -15,6 +15,8 @@ import org.gitlab4j.api.HookManager;
import org.gitlab4j.api.utils.HttpRequestUtils; import org.gitlab4j.api.utils.HttpRequestUtils;
import org.gitlab4j.api.utils.JacksonJson; import org.gitlab4j.api.utils.JacksonJson;
import com.fasterxml.jackson.databind.JsonNode;
/** /**
* This class provides a handler for processing GitLab System Hook callouts. * This class provides a handler for processing GitLab System Hook callouts.
*/ */
...@@ -77,15 +79,36 @@ public class SystemHookManager extends HookManager { ...@@ -77,15 +79,36 @@ public class SystemHookManager extends HookManager {
try { try {
SystemHookEvent event; SystemHookEvent event;
JsonNode tree;
if (LOGGER.isLoggable(Level.FINE)) { if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.fine(HttpRequestUtils.getShortRequestDump("System Hook", true, request)); LOGGER.fine(HttpRequestUtils.getShortRequestDump("System Hook", true, request));
String postData = HttpRequestUtils.getPostDataAsString(request); String postData = HttpRequestUtils.getPostDataAsString(request);
LOGGER.fine("Raw POST data:\n" + postData); LOGGER.fine("Raw POST data:\n" + postData);
event = jacksonJson.unmarshal(SystemHookEvent.class, postData); tree = jacksonJson.readTree(postData);
LOGGER.fine(event.getEventName() + "\n" + jacksonJson.marshal(event) + "\n");
} else { } else {
InputStreamReader reader = new InputStreamReader(request.getInputStream()); InputStreamReader reader = new InputStreamReader(request.getInputStream());
event = jacksonJson.unmarshal(SystemHookEvent.class, reader); tree = jacksonJson.readTree(reader);
}
if (tree.has("object_kind")) {
String objectKind = tree.asText("object_kind");
switch (objectKind) {
case MergeRequestSystemHookEvent.OBJECT_KIND:
event = jacksonJson.unmarshal(MergeRequestSystemHookEvent.class, tree);
break;
default:
String message = "Unsupported object_kind, object_kind=" + objectKind;
LOGGER.warning(message);
throw new GitLabApiException(message);
}
} else {
event = jacksonJson.unmarshal(SystemHookEvent.class, tree);
}
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.fine(event.getEventName() + "\n" + jacksonJson.marshal(event) + "\n");
} }
event.setRequestUrl(request.getRequestURL().toString()); event.setRequestUrl(request.getRequestURL().toString());
...@@ -161,6 +184,8 @@ public class SystemHookManager extends HookManager { ...@@ -161,6 +184,8 @@ public class SystemHookManager extends HookManager {
fireTagPushEvent((TagPushSystemHookEvent) event); fireTagPushEvent((TagPushSystemHookEvent) event);
} else if (event instanceof RepositorySystemHookEvent) { } else if (event instanceof RepositorySystemHookEvent) {
fireRepositoryEvent((RepositorySystemHookEvent) event); fireRepositoryEvent((RepositorySystemHookEvent) event);
} else if (event instanceof MergeRequestSystemHookEvent) {
fireMergeRequestEvent((MergeRequestSystemHookEvent) event);
} else { } else {
String message = "Unsupported event, event_named=" + event.getEventName(); String message = "Unsupported event, event_named=" + event.getEventName();
LOGGER.warning(message); LOGGER.warning(message);
...@@ -221,4 +246,10 @@ public class SystemHookManager extends HookManager { ...@@ -221,4 +246,10 @@ public class SystemHookManager extends HookManager {
listener.onRepositoryEvent(event); listener.onRepositoryEvent(event);
} }
} }
protected void fireMergeRequestEvent(MergeRequestSystemHookEvent event) {
for (SystemHookListener listener : systemHookListeners) {
listener.onMergeRequestEvent(event);
}
}
} }
...@@ -5,6 +5,7 @@ import static org.junit.Assert.assertTrue; ...@@ -5,6 +5,7 @@ import static org.junit.Assert.assertTrue;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import org.gitlab4j.api.systemhooks.MergeRequestSystemHookEvent;
import org.gitlab4j.api.utils.JacksonJson; import org.gitlab4j.api.utils.JacksonJson;
import org.gitlab4j.api.webhook.BuildEvent; import org.gitlab4j.api.webhook.BuildEvent;
import org.gitlab4j.api.webhook.Event; import org.gitlab4j.api.webhook.Event;
...@@ -53,6 +54,13 @@ public class TestGitLabApiEvents { ...@@ -53,6 +54,13 @@ public class TestGitLabApiEvents {
assertTrue(compareJson(mergeRequestEvent, "merge-request-event")); assertTrue(compareJson(mergeRequestEvent, "merge-request-event"));
} }
@Test
public void testMergeRequestSystemHookEvent() throws Exception {
MergeRequestSystemHookEvent mergeRequestEvent = makeFakeApiCall(MergeRequestSystemHookEvent.class, "merge-request-system-hook-event");
assertTrue(compareJson(mergeRequestEvent, "merge-request-system-hook-event"));
}
@Test @Test
public void testPipelineEvent() throws Exception { public void testPipelineEvent() throws Exception {
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment