Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

initial version

  • Loading branch information...
commit ecbfdd7315ef2cf04b2be7f11a072ce0bd00c396 0 parents
@kohsuke authored
4 .gitignore
@@ -0,0 +1,4 @@
+target
+*.iml
+*.ipr
+*.iws
96 pom.xml
@@ -0,0 +1,96 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.kohsuke</groupId>
+ <artifactId>github-api</artifactId>
+ <packaging>jar</packaging>
+ <version>1.0-SNAPSHOT</version>
+ <name>GitHub API for Java</name>
+ <url>http://kohsuke.org/github-api/</url>
+ <description>GitHub API for Java</description>
+
+ <distributionManagement>
+ <repository>
+ <id>java.net-m2-repository</id>
+ <url>java-net:/maven2-repository/trunk/repository/</url>
+ </repository>
+ <site>
+ <id>kohsuke.org</id>
+ <url>scp://kohsuke.org/home/kohsuke/kohsuke.org/github-api/</url>
+ </site>
+ </distributionManagement>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.5</source>
+ <target>1.5</target>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-release-plugin</artifactId>
+ <version>2.0</version>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.maven.scm</groupId>
+ <artifactId>maven-scm-provider-gitexe</artifactId>
+ <version>1.2</version>
+ </dependency>
+ </dependencies>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-scm-plugin</artifactId>
+ <version>1.3</version>
+ </plugin>
+ </plugins>
+ <extensions>
+ <extension>
+ <groupId>org.jvnet.wagon-svn</groupId>
+ <artifactId>wagon-svn</artifactId>
+ <version>1.9</version>
+ </extension>
+ </extensions>
+ </build>
+
+ <scm>
+ <connection>scm:git:git@github.com:kohsuke/github-api.git</connection>
+ </scm>
+
+ <developers>
+ <developer>
+ <id>kohsuke</id>
+ <name>Kohsuke Kawaguchi</name>
+ </developer>
+ </developers>
+
+ <licenses>
+ <license>
+ <name>MIT License</name>
+ <distribution>repository</distribution>
+ <url>http://www.opensource.org/licenses/mit-license.php</url>
+ </license>
+ </licenses>
+
+ <dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.jackson</groupId>
+ <artifactId>jackson-mapper-asl</artifactId>
+ <version>1.5.0</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.4</version>
+ </dependency>
+ </dependencies>
+</project>
31 src/main/java/org/kohsuke/github/DeleteToken.java
@@ -0,0 +1,31 @@
+/*
+ * The MIT License
+ *
+ * Copyright (c) 2010, Kohsuke Kawaguchi
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package org.kohsuke.github;
+
+/**
+ * @author Kohsuke Kawaguchi
+ */
+class DeleteToken {
+ public String delete_token;
+}
150 src/main/java/org/kohsuke/github/GHRepository.java
@@ -0,0 +1,150 @@
+/*
+ * The MIT License
+ *
+ * Copyright (c) 2010, Kohsuke Kawaguchi
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package org.kohsuke.github;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import static java.util.Arrays.asList;
+
+/**
+ * @author Kohsuke Kawaguchi
+ */
+public class GHRepository {
+ /*package almost final*/ GitHub root;
+
+ private String description, homepage, url, name, owner;
+ private boolean has_issues, has_wiki, fork, _private, has_downloads;
+ private int watchers,forks;
+
+ public String getDescription() {
+ return description;
+ }
+
+ public String getHomepage() {
+ return homepage;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public GHUser getOwner() throws IOException {
+ return root.getUser(owner);
+ }
+
+ public boolean hasIssues() {
+ return has_issues;
+ }
+
+ public boolean hasWiki() {
+ return has_wiki;
+ }
+
+ public boolean isFork() {
+ return fork;
+ }
+
+ public int getForks() {
+ return forks;
+ }
+
+ public boolean isPrivate() {
+ return _private;
+ }
+
+ public boolean hasDownloads() {
+ return has_downloads;
+ }
+
+ public int getWatchers() {
+ return watchers;
+ }
+
+ /**
+ * Gets the collaborators on this repository.
+ * This set always appear to include the owner.
+ */
+ public Set<GHUser> getCollaborators() throws IOException {
+ Set<GHUser> r = new HashSet<GHUser>();
+ for (String u : root.retrieve("/repos/show/"+owner+"/"+name+"/collaborators",JsonCollaborators.class).collaborators)
+ r.add(root.getUser(u));
+ return Collections.unmodifiableSet(r);
+ }
+
+ public void addCollaborators(GHUser... users) throws IOException {
+ addCollaborators(asList(users));
+ }
+
+ public void addCollaborators(Collection<GHUser> users) throws IOException {
+ modifyCollaborators(users, "/add/");
+ }
+
+ public void removeCollaborators(GHUser... users) throws IOException {
+ removeCollaborators(asList(users));
+ }
+
+ public void removeCollaborators(Collection<GHUser> users) throws IOException {
+ modifyCollaborators(users, "/remove/");
+ }
+
+ private void modifyCollaborators(Collection<GHUser> users, String op) throws IOException {
+ root.requireCredential();
+ verifyMine();
+ for (GHUser user : users) {
+ new Poster(root).withCredential().to(root.getApiURL("/repos/collaborators/"+name+ op +user.getLogin()));
+ }
+ }
+
+ /**
+ * Deletes this repository.
+ */
+ public void delete() throws IOException {
+ root.requireCredential();
+ verifyMine();
+ Poster poster = new Poster(root).withCredential();
+ URL url = root.getApiURL("/repos/delete/" + name);
+
+ DeleteToken token = poster.to(url, DeleteToken.class);
+ poster.with("delete_token",token.delete_token).to(url);
+ }
+
+ private void verifyMine() throws IOException {
+ if (!root.login.equals(owner))
+ throw new IOException("Operation not applicable to a repository owned by someone else: "+owner);
+ }
+
+ @Override
+ public String toString() {
+ return "Repository:"+owner+":"+name;
+ }
+}
164 src/main/java/org/kohsuke/github/GHUser.java
@@ -0,0 +1,164 @@
+/*
+ * The MIT License
+ *
+ * Copyright (c) 2010, Kohsuke Kawaguchi
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package org.kohsuke.github;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Collections;
+import java.util.Map;
+import java.util.TreeMap;
+
+import static org.kohsuke.github.GitHub.MAPPER;
+
+/**
+ * Represents an user of GitHub.
+ *
+ * @author Kohsuke Kawaguchi
+ */
+public class GHUser {
+ /*package almost final*/ GitHub root;
+
+ private String gravatar_id,name,company,location,created_at,blog,login,email;
+ private int public_gist_count,public_repo_count,following_count,id,followers_count;
+
+ /**
+ * Repositories that this user owns.
+ */
+ private transient Map<String,GHRepository> repositories;
+
+ /**
+ * Gravatar ID of this user, like 0cb9832a01c22c083390f3c5dcb64105
+ */
+ public String getGravatarId() {
+ return gravatar_id;
+ }
+
+ /**
+ * Gets the human-readable name of the user, like "Kohsuke Kawaguchi"
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Gets the company name of this user, like "Sun Microsystems, Inc."
+ */
+ public String getCompany() {
+ return company;
+ }
+
+ /**
+ * Gets the location of this user, like "Santa Clara, California"
+ */
+ public String getLocation() {
+ return location;
+ }
+
+ public String getCreatedAt() {
+ return created_at;
+ }
+
+ /**
+ * Gets the blog URL of this user.
+ */
+ public String getBlog() {
+ return blog;
+ }
+
+ /**
+ * Gets the login ID of this user, like 'kohsuke'
+ */
+ public String getLogin() {
+ return login;
+ }
+
+ /**
+ * Gets the e-mail address of the user.
+ */
+ public String getEmail() {
+ return email;
+ }
+
+ public int getPublicGistCount() {
+ return public_gist_count;
+ }
+
+ public int getPublicRepoCount() {
+ return public_repo_count;
+ }
+
+ public int getFollowingCount() {
+ return following_count;
+ }
+
+ /**
+ * What appears to be a GitHub internal unique number that identifies this user.
+ */
+ public int getId() {
+ return id;
+ }
+
+ public int getFollowersCount() {
+ return followers_count;
+ }
+
+ /**
+ * Gets the repositories this user owns.
+ */
+ public Map<String,GHRepository> getRepositories() throws IOException {
+ if (repositories==null) {
+ repositories = new TreeMap<String, GHRepository>();
+ URL url = new URL("http://github.com/api/v2/json/repos/show/" + login);
+ for (GHRepository r : MAPPER.readValue(url, JsonRepositories.class).repositories) {
+ r.root = root;
+ repositories.put(r.getName(),r);
+ }
+ }
+
+ return Collections.unmodifiableMap(repositories);
+ }
+
+ public GHRepository getRepository(String name) throws IOException {
+ return getRepositories().get(name);
+ }
+
+ @Override
+ public String toString() {
+ return "User:"+login;
+ }
+
+ @Override
+ public int hashCode() {
+ return login.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof GHUser) {
+ GHUser that = (GHUser) obj;
+ return this.login.equals(that.login);
+ }
+ return false;
+ }
+}
108 src/main/java/org/kohsuke/github/GitHub.java
@@ -0,0 +1,108 @@
+/*
+ * The MIT License
+ *
+ * Copyright (c) 2010, Kohsuke Kawaguchi
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package org.kohsuke.github;
+
+import org.codehaus.jackson.map.DeserializationConfig.Feature;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.map.introspect.VisibilityChecker.Std;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.ANY;
+import static org.codehaus.jackson.annotate.JsonAutoDetect.Visibility.NONE;
+
+/**
+ * Root of the GitHub API.
+ *
+ * @author Kohsuke Kawaguchi
+ */
+public class GitHub {
+ /*package*/ final String login;
+ /*package*/ final String token;
+
+ private final Map<String,GHUser> users = new HashMap<String, GHUser>();
+
+ /**
+ * Connects to GitHub anonymously.
+ *
+ * All operations that requires authentication will fail.
+ */
+ public GitHub() {
+ this(null,null);
+ }
+
+ public GitHub(String login, String apiToken) {
+ this.login = login;
+ this.token = apiToken;
+ }
+
+ /*package*/ void requireCredential() {
+ if (login ==null || token ==null)
+ throw new IllegalStateException("This operation requires a credential but none is given to the GitHub constructor");
+ }
+
+ /*package*/ URL getApiURL(String tail) throws IOException {

Sorry, why not URI?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+ return new URL("http://github.com/api/v2/json"+tail);
+ }
+
+ /*package*/ <T> T retrieve(String tail, Class<T> type) throws IOException {
+ return MAPPER.readValue(getApiURL(tail),type);
+ }
+
+ public GHUser getUser(String login) throws IOException {
+ GHUser u = users.get(login);
+ if (u==null) {
+ u = MAPPER.readValue(getApiURL("/user/show/"+login), JsonUser.class).user;
+ u.root = this;
+ users.put(login,u);
+ }
+ return u;
+ }
+
+ /**
+ * Creates a new repository.
+ *
+ * @return
+ * Newly created repository.
+ */
+ public GHRepository createRepository(String name, String description, String homepage, boolean isPublic) throws IOException {
+ requireCredential();
+ GHRepository r = new Poster(this).withCredential()
+ .with("name", name).with("description", description).with("homepage", homepage)
+ .with("public", isPublic ? 1 : 0).to(getApiURL("/repos/create"), JsonRepository.class).repository;
+ r.root = this;
+ return r;
+ }
+
+
+ /*package*/ static final ObjectMapper MAPPER = new ObjectMapper();
+
+ static {
+ MAPPER.setVisibilityChecker(new Std(NONE, NONE, NONE, NONE, ANY));
+ MAPPER.getDeserializationConfig().set(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ }
+}
33 src/main/java/org/kohsuke/github/JsonCollaborators.java
@@ -0,0 +1,33 @@
+/*
+ * The MIT License
+ *
+ * Copyright (c) 2010, Kohsuke Kawaguchi
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package org.kohsuke.github;
+
+import java.util.List;
+
+/**
+ * @author Kohsuke Kawaguchi
+ */
+class JsonCollaborators {
+ List<String> collaborators;
+}
33 src/main/java/org/kohsuke/github/JsonRepositories.java
@@ -0,0 +1,33 @@
+/*
+ * The MIT License
+ *
+ * Copyright (c) 2010, Kohsuke Kawaguchi
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package org.kohsuke.github;
+
+import java.util.List;
+
+/**
+ * @author Kohsuke Kawaguchi
+ */
+class JsonRepositories {
+ public List<GHRepository> repositories;
+}
31 src/main/java/org/kohsuke/github/JsonRepository.java
@@ -0,0 +1,31 @@
+/*
+ * The MIT License
+ *
+ * Copyright (c) 2010, Kohsuke Kawaguchi
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package org.kohsuke.github;
+
+/**
+ * @author Kohsuke Kawaguchi
+ */
+class JsonRepository {
+ public GHRepository repository;
+}
31 src/main/java/org/kohsuke/github/JsonUser.java
@@ -0,0 +1,31 @@
+/*
+ * The MIT License
+ *
+ * Copyright (c) 2010, Kohsuke Kawaguchi
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package org.kohsuke.github;
+
+/**
+ * @author Kohsuke Kawaguchi
+ */
+class JsonUser {
+ public GHUser user;
+}
108 src/main/java/org/kohsuke/github/Poster.java
@@ -0,0 +1,108 @@
+/*
+ * The MIT License
+ *
+ * Copyright (c) 2010, Kohsuke Kawaguchi
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package org.kohsuke.github;
+
+import org.apache.commons.io.IOUtils;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import static org.kohsuke.github.GitHub.MAPPER;
+
+/**
+ * Handles HTTP POST.
+ * @author Kohsuke Kawaguchi
+ */
+class Poster {
+ private final GitHub root;
+ private final Map<String,String> args = new HashMap<String, String>();
+
+ Poster(GitHub root) {
+ this.root = root;
+ }
+
+ public Poster withCredential() {
+ return with("login",root.login).with("token",root.token);
+ }
+
+ public Poster with(String key, int value) {
+ return with(key,String.valueOf(value));
+ }
+
+ public Poster with(String key, String value) {
+ if (value!=null)
+ this.args.put(key,value);
+ return this;
+ }
+
+ public void to(URL url) throws IOException {
+ to(url,null);
+ }
+
+ /**
+ * POSTs the form to the specified URL.
+ *
+ * @throws IOException
+ * if the server returns 4xx/5xx responses.
+ * @return
+ * {@link Reader} that reads the response.
+ */
+ public <T> T to(URL url, Class<T> type) throws IOException {
+ HttpURLConnection uc = (HttpURLConnection) url.openConnection();
+
+ uc.setDoOutput(true);
+ uc.setRequestProperty("Content-type","application/x-www-form-urlencoded");
+ uc.setRequestMethod("POST");
+
+
+ StringBuilder body = new StringBuilder();
+ for (Entry<String, String> e : args.entrySet()) {
+ if (body.length()>0) body.append('&');
+ body.append(URLEncoder.encode(e.getKey(),"UTF-8"));
+ body.append('=');
+ body.append(URLEncoder.encode(e.getValue(),"UTF-8"));
+ }
+
+ OutputStreamWriter o = new OutputStreamWriter(uc.getOutputStream(), "UTF-8");
+ o.write(body.toString());
+ o.close();
+
+
+ try {
+ InputStreamReader r = new InputStreamReader(uc.getInputStream(), "UTF-8");
+ if (type==null) return null;
+ return MAPPER.readValue(r,type);
+ } catch (IOException e) {
+ throw (IOException)new IOException(IOUtils.toString(uc.getErrorStream(),"UTF-8")).initCause(e);
+ }
+ }
+}
21 src/test/java/org/kohsuke/AppTest.java
@@ -0,0 +1,21 @@
+package org.kohsuke;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import org.kohsuke.github.GitHub;
+
+import java.io.IOException;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest extends TestCase {
+ public void testApp() throws IOException {
+ GitHub hub = new GitHub("kohsuke","9138245daf860415dfc66419177d95da");
+// hub.createRepository("test","test repository",null,true);
+// hub.getUser("kohsuke").getRepository("test").delete();
+
+ System.out.println(hub.getUser("kohsuke").getRepository("hudson").getCollaborators());
+ }
+}
Please sign in to comment.
Something went wrong with that request. Please try again.