-
Notifications
You must be signed in to change notification settings - Fork 731
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Enable creation and retrieval of org webhooks #192
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -11,22 +11,12 @@ | |
/** | ||
* @author Kohsuke Kawaguchi | ||
*/ | ||
public class GHHook extends GHObject { | ||
/** | ||
* Repository that the hook belongs to. | ||
*/ | ||
/*package*/ transient GHRepository repository; | ||
|
||
public abstract class GHHook extends GHObject { | ||
String name; | ||
List<String> events; | ||
boolean active; | ||
Map<String,String> config; | ||
|
||
/*package*/ GHHook wrap(GHRepository owner) { | ||
this.repository = owner; | ||
return this; | ||
} | ||
|
||
public String getName() { | ||
return name; | ||
} | ||
|
@@ -50,7 +40,7 @@ public Map<String, String> getConfig() { | |
* Deletes this hook. | ||
*/ | ||
public void delete() throws IOException { | ||
new Requester(repository.root).method("DELETE").to(String.format("/repos/%s/%s/hooks/%d", repository.getOwnerName(), repository.getName(), id)); | ||
new Requester(root()).method("DELETE").to(path()); | ||
} | ||
|
||
/** | ||
|
@@ -60,4 +50,8 @@ public void delete() throws IOException { | |
public URL getHtmlUrl() { | ||
return null; | ||
} | ||
|
||
abstract GitHub root(); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
|
||
abstract String path(); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,130 @@ | ||
package org.kohsuke.github; | ||
|
||
import java.io.IOException; | ||
import java.util.ArrayList; | ||
import java.util.Arrays; | ||
import java.util.Collection; | ||
import java.util.List; | ||
import java.util.Locale; | ||
import java.util.Map; | ||
|
||
/** | ||
* Utility class for creating and retrieving webhooks; removes duplication between GHOrganization and GHRepository | ||
* functionality | ||
*/ | ||
class GHHooks { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. GHHooksHelper? |
||
static abstract class Context { | ||
private final GitHub root; | ||
|
||
private Context(GitHub root) { | ||
this.root = root; | ||
} | ||
|
||
public List<GHHook> getHooks() throws IOException { | ||
List<GHHook> list = new ArrayList<GHHook>(Arrays.asList( | ||
root.retrieve().to(collection(), collectionClass()))); | ||
for (GHHook h : list) | ||
wrap(h); | ||
return list; | ||
} | ||
|
||
public GHHook getHook(int id) throws IOException { | ||
GHHook hook = root.retrieve().to(collection() + "/" + id, clazz()); | ||
return wrap(hook); | ||
} | ||
|
||
public GHHook createHook(String name, Map<String, String> config, Collection<GHEvent> events, boolean active) throws IOException { | ||
List<String> ea = null; | ||
if (events!=null) { | ||
ea = new ArrayList<String>(); | ||
for (GHEvent e : events) | ||
ea.add(e.name().toLowerCase(Locale.ENGLISH)); | ||
} | ||
|
||
GHHook hook = new Requester(root) | ||
.with("name", name) | ||
.with("active", active) | ||
._with("config", config) | ||
._with("events", ea) | ||
.to(collection(), clazz()); | ||
|
||
return wrap(hook); | ||
} | ||
|
||
abstract String collection(); | ||
|
||
abstract Class<? extends GHHook[]> collectionClass(); | ||
|
||
abstract Class<? extends GHHook> clazz(); | ||
|
||
abstract GHHook wrap(GHHook hook); | ||
} | ||
|
||
private static class RepoContext extends Context { | ||
private final GHRepository repository; | ||
private final GHUser owner; | ||
|
||
private RepoContext(GHRepository repository, GHUser owner) { | ||
super(repository.root); | ||
this.repository = repository; | ||
this.owner = owner; | ||
} | ||
|
||
@Override | ||
String collection() { | ||
return String.format("/repos/%s/%s/hooks", owner.getLogin(), repository.getName()); | ||
} | ||
|
||
@Override | ||
Class<? extends GHHook[]> collectionClass() { | ||
return GHRepoHook[].class; | ||
} | ||
|
||
@Override | ||
Class<? extends GHHook> clazz() { | ||
return GHRepoHook.class; | ||
} | ||
|
||
@Override | ||
GHHook wrap(GHHook hook) { | ||
return ((GHRepoHook)hook).wrap(repository); | ||
} | ||
} | ||
|
||
private static class OrgContext extends Context { | ||
private final GHOrganization organization; | ||
|
||
private OrgContext(GHOrganization organization) { | ||
super(organization.root); | ||
this.organization = organization; | ||
} | ||
|
||
@Override | ||
String collection() { | ||
return String.format("/orgs/%s/hooks", organization.getLogin()); | ||
} | ||
|
||
@Override | ||
Class<? extends GHHook[]> collectionClass() { | ||
return GHOrgHook[].class; | ||
} | ||
|
||
@Override | ||
Class<? extends GHHook> clazz() { | ||
return GHOrgHook.class; | ||
} | ||
|
||
@Override | ||
GHHook wrap(GHHook hook) { | ||
return ((GHOrgHook)hook).wrap(organization); | ||
} | ||
} | ||
|
||
static Context repoContext(GHRepository repository, GHUser owner) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Does it make sense to create new objects every operation? |
||
return new RepoContext(repository, owner); | ||
} | ||
|
||
static Context orgContext(GHOrganization organization) { | ||
return new OrgContext(organization); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
/* | ||
* © Copyright 2015 - SourceClear Inc | ||
*/ | ||
|
||
package org.kohsuke.github; | ||
|
||
class GHOrgHook extends GHHook { | ||
/** | ||
* Organization that the hook belongs to. | ||
*/ | ||
/*package*/ transient GHOrganization organization; | ||
|
||
/*package*/ GHOrgHook wrap(GHOrganization owner) { | ||
this.organization = owner; | ||
return this; | ||
} | ||
|
||
@Override | ||
GitHub root() { | ||
return organization.root; | ||
} | ||
|
||
@Override | ||
String path() { | ||
return String.format("/orgs/%s/hooks/%d", organization.getLogin(), id); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
package org.kohsuke.github; | ||
|
||
class GHRepoHook extends GHHook { | ||
/** | ||
* Repository that the hook belongs to. | ||
*/ | ||
/*package*/ transient GHRepository repository; | ||
|
||
/*package*/ GHRepoHook wrap(GHRepository owner) { | ||
this.repository = owner; | ||
return this; | ||
} | ||
|
||
@Override | ||
GitHub root() { | ||
return repository.root; | ||
} | ||
|
||
@Override | ||
String path() { | ||
return String.format("/repos/%s/%s/hooks/%d", repository.getOwnerName(), repository.getName(), id); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No way. It breaks the binary compatibility of the code