diff --git a/src/main/java/org/kohsuke/github/GHOrganization.java b/src/main/java/org/kohsuke/github/GHOrganization.java index 718c1b5f7..d327db393 100644 --- a/src/main/java/org/kohsuke/github/GHOrganization.java +++ b/src/main/java/org/kohsuke/github/GHOrganization.java @@ -5,6 +5,7 @@ import com.gargoylesoftware.htmlunit.html.HtmlForm; import com.gargoylesoftware.htmlunit.html.HtmlPage; import java.io.IOException; +import java.util.Map; /** * @author Kohsuke Kawaguchi @@ -15,6 +16,10 @@ public class GHOrganization { private String gravatar_id,login; private int public_repo_count, public_gist_count, following_count, id; + public String getLogin() { + return login; + } + /** * Creates a new repository. * @@ -40,4 +45,12 @@ public class GHOrganization { // r.root = root; // return r; } + + /** + * Teams by their names. + */ + public Map getTeams() throws IOException { + return root.retrieveWithAuth(root.getApiURL("/organizations/"+login+"/teams"),JsonTeams.class).toMap(this); + } + } diff --git a/src/main/java/org/kohsuke/github/GHTeam.java b/src/main/java/org/kohsuke/github/GHTeam.java new file mode 100644 index 000000000..bd5b3853e --- /dev/null +++ b/src/main/java/org/kohsuke/github/GHTeam.java @@ -0,0 +1,37 @@ +package org.kohsuke.github; + +import java.io.IOException; +import java.net.URL; +import java.util.Set; + +/** + * A team in GitHub organization. + * + * @author Kohsuke Kawaguchi + */ +public class GHTeam { + private String name,permission; + private int id; + + protected /*final*/ GHOrganization org; + + public String getName() { + return name; + } + + public String getPermission() { + return permission; + } + + public int getId() { + return id; + } + + public Set getMembers() throws IOException { + return org.root.retrieveWithAuth(getApiURL("/members"),JsonUsersWithDetails.class).toSet(org.root); + } + + private URL getApiURL(String tail) throws IOException { + return org.root.getApiURL("/organizations/"+org.getLogin()+"/teams/"+id+tail); + } +} diff --git a/src/main/java/org/kohsuke/github/GitHub.java b/src/main/java/org/kohsuke/github/GitHub.java index d3a26e9b8..93292f099 100644 --- a/src/main/java/org/kohsuke/github/GitHub.java +++ b/src/main/java/org/kohsuke/github/GitHub.java @@ -30,11 +30,14 @@ import org.apache.commons.io.IOUtils; import org.codehaus.jackson.map.DeserializationConfig.Feature; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.introspect.VisibilityChecker.Std; +import sun.misc.BASE64Encoder; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; @@ -104,6 +107,26 @@ public class GitHub { return MAPPER.readValue(getApiURL(tail),type); } + /*package*/ T retrieveWithAuth(URL url, Class type) throws IOException { + HttpURLConnection uc = (HttpURLConnection) url.openConnection(); + + BASE64Encoder enc = new sun.misc.BASE64Encoder(); + String userpassword = login + "/token" + ":" + token; + String encodedAuthorization = enc.encode(userpassword.getBytes()); + uc.setRequestProperty("Authorization", "Basic " + encodedAuthorization); + + try { + InputStreamReader r = new InputStreamReader(uc.getInputStream(), "UTF-8"); + if (type==null) { + String data = IOUtils.toString(r); + return null; + } + return MAPPER.readValue(r,type); + } catch (IOException e) { + throw (IOException)new IOException(IOUtils.toString(uc.getErrorStream(),"UTF-8")).initCause(e); + } + } + /** * Obtains the object that represents the named user. */ @@ -117,6 +140,19 @@ public class GitHub { return u; } + /** + * Interns the given {@link GHUser}. + */ + protected GHUser getUser(GHUser orig) throws IOException { + GHUser u = users.get(orig.getLogin()); + if (u==null) { + orig.root = this; + users.put(login,orig); + return orig; + } + return u; + } + public GHOrganization getOrganization(String name) throws IOException { GHOrganization o = orgs.get(name); if (o==null) { diff --git a/src/main/java/org/kohsuke/github/JsonTeams.java b/src/main/java/org/kohsuke/github/JsonTeams.java new file mode 100644 index 000000000..1f1db72ba --- /dev/null +++ b/src/main/java/org/kohsuke/github/JsonTeams.java @@ -0,0 +1,21 @@ +package org.kohsuke.github; + +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +/** + * @author Kohsuke Kawaguchi + */ +class JsonTeams { + public List teams; + + Map toMap(GHOrganization org) { + Map r = new TreeMap(); + for (GHTeam t : teams) { + t.org = org; + r.put(t.getName(),t); + } + return r; + } +} diff --git a/src/main/java/org/kohsuke/github/JsonUsersWithDetails.java b/src/main/java/org/kohsuke/github/JsonUsersWithDetails.java new file mode 100644 index 000000000..424e53c9d --- /dev/null +++ b/src/main/java/org/kohsuke/github/JsonUsersWithDetails.java @@ -0,0 +1,20 @@ +package org.kohsuke.github; + +import java.io.IOException; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * @author Kohsuke Kawaguchi + */ +class JsonUsersWithDetails { + public List users; + + public Set toSet(GitHub root) throws IOException { + Set r = new HashSet(); + for (GHUser u : users) + r.add(root.getUser(u)); + return r; + } +} diff --git a/src/main/java/org/kohsuke/github/Poster.java b/src/main/java/org/kohsuke/github/Poster.java index a6eafdf82..4ae23de89 100644 --- a/src/main/java/org/kohsuke/github/Poster.java +++ b/src/main/java/org/kohsuke/github/Poster.java @@ -100,7 +100,10 @@ class Poster { try { InputStreamReader r = new InputStreamReader(uc.getInputStream(), "UTF-8"); - if (type==null) return null; + if (type==null) { + String data = IOUtils.toString(r); + return null; + } return MAPPER.readValue(r,type); } catch (IOException e) { throw (IOException)new IOException(IOUtils.toString(uc.getErrorStream(),"UTF-8")).initCause(e); diff --git a/src/test/java/org/kohsuke/AppTest.java b/src/test/java/org/kohsuke/AppTest.java index ebbce47e3..084c42523 100644 --- a/src/test/java/org/kohsuke/AppTest.java +++ b/src/test/java/org/kohsuke/AppTest.java @@ -3,6 +3,7 @@ package org.kohsuke; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; +import org.kohsuke.github.GHRepository; import org.kohsuke.github.GitHub; import java.io.IOException; @@ -12,10 +13,15 @@ import java.io.IOException; */ public class AppTest extends TestCase { public void testApp() throws IOException { - GitHub hub = GitHub.connectAnonymously(); -// hub.createRepository("test","test repository",null,true); -// hub.getUser("kohsuke").getRepository("test").delete(); + System.out.println(GitHub.connect().getOrganization("HudsonLabs").getTeams().get("Core Developers").getMembers()); - System.out.println(hub.getUser("kohsuke").getRepository("hudson").getCollaborators()); +// GHRepository r = GitHub.connect().getOrganization("HudsonLabs").createRepository("auto-test", "some description", "http://kohsuke.org/", "Plugin Developers", true); + +// r. +// GitHub hub = GitHub.connectAnonymously(); +//// hub.createRepository("test","test repository",null,true); +//// hub.getUser("kohsuke").getRepository("test").delete(); +// +// System.out.println(hub.getUser("kohsuke").getRepository("hudson").getCollaborators()); } }