From 86d75fd767f0c9b95f1bfe506ce1817a5a5dd3a2 Mon Sep 17 00:00:00 2001 From: OHTAKE Tomohiro Date: Thu, 4 Sep 2014 11:40:19 +0900 Subject: [PATCH 1/2] Introduce GitHubBuilder for flexible GitHub instance creation --- src/main/java/org/kohsuke/github/GitHub.java | 41 ++++-------- .../org/kohsuke/github/GitHubBuilder.java | 63 +++++++++++++++++++ 2 files changed, 74 insertions(+), 30 deletions(-) create mode 100644 src/main/java/org/kohsuke/github/GitHubBuilder.java diff --git a/src/main/java/org/kohsuke/github/GitHub.java b/src/main/java/org/kohsuke/github/GitHub.java index 5404b1f309..44c2ed7cf2 100644 --- a/src/main/java/org/kohsuke/github/GitHub.java +++ b/src/main/java/org/kohsuke/github/GitHub.java @@ -26,8 +26,6 @@ import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.ANY; import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.NONE; -import java.io.File; -import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.Reader; @@ -42,12 +40,10 @@ import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Properties; import java.util.Set; import java.util.TimeZone; import org.apache.commons.codec.binary.Base64; -import org.apache.commons.io.IOUtils; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; @@ -74,13 +70,6 @@ public class GitHub { private HttpConnector connector = HttpConnector.DEFAULT; - /** - * Connects to GitHub.com - */ - private GitHub(String login, String oauthAccessToken, String password) throws IOException { - this (GITHUB_URL, login, oauthAccessToken, password); - } - /** * Creates a client API root object. * @@ -115,7 +104,7 @@ private GitHub(String login, String oauthAccessToken, String password) throws IO * @param password * User's password. Always used in conjunction with the {@code login} parameter */ - private GitHub(String apiUrl, String login, String oauthAccessToken, String password) throws IOException { + /* package */ GitHub(String apiUrl, String login, String oauthAccessToken, String password) throws IOException { if (apiUrl.endsWith("/")) apiUrl = apiUrl.substring(0, apiUrl.length()-1); // normalize this.apiUrl = apiUrl; @@ -139,15 +128,7 @@ private GitHub(String apiUrl, String login, String oauthAccessToken, String pass * Obtains the credential from "~/.github" */ public static GitHub connect() throws IOException { - Properties props = new Properties(); - File homeDir = new File(System.getProperty("user.home")); - FileInputStream in = new FileInputStream(new File(homeDir, ".github")); - try { - props.load(in); - } finally { - IOUtils.closeQuietly(in); - } - return new GitHub(GITHUB_URL,props.getProperty("login"), props.getProperty("oauth"),props.getProperty("password")); + return GitHubBuilder.fromPropertyFile().build(); } /** @@ -159,15 +140,15 @@ public static GitHub connect() throws IOException { * For historical reasons, this parameter still accepts the bare domain name, but that's considered deprecated. */ public static GitHub connectToEnterprise(String apiUrl, String oauthAccessToken) throws IOException { - return connectUsingOAuth(apiUrl, oauthAccessToken); + return new GitHubBuilder().withEndpoint(apiUrl).withOAuthToken(oauthAccessToken).build(); } public static GitHub connectToEnterprise(String apiUrl, String login, String password) throws IOException { - return new GitHub(apiUrl, login, null, password); + return new GitHubBuilder().withEndpoint(apiUrl).withPassword(login, password).build(); } public static GitHub connect(String login, String oauthAccessToken) throws IOException { - return new GitHub(login,oauthAccessToken,null); + return new GitHubBuilder().withOAuthToken(oauthAccessToken, login).build(); } /** @@ -176,19 +157,19 @@ public static GitHub connect(String login, String oauthAccessToken) throws IOExc * Use {@link #connectUsingPassword(String, String)} or {@link #connectUsingOAuth(String)}. */ public static GitHub connect(String login, String oauthAccessToken, String password) throws IOException { - return new GitHub(login,oauthAccessToken,password); + return new GitHubBuilder().withOAuthToken(oauthAccessToken, login).withPassword(login, password).build(); } public static GitHub connectUsingPassword(String login, String password) throws IOException { - return new GitHub(login,null,password); + return new GitHubBuilder().withPassword(login, password).build(); } public static GitHub connectUsingOAuth(String oauthAccessToken) throws IOException { - return new GitHub(null, oauthAccessToken, null); + return new GitHubBuilder().withOAuthToken(oauthAccessToken).build(); } public static GitHub connectUsingOAuth(String githubServer, String oauthAccessToken) throws IOException { - return new GitHub(githubServer,null, oauthAccessToken,null); + return new GitHubBuilder().withEndpoint(githubServer).withOAuthToken(oauthAccessToken).build(); } /** * Connects to GitHub anonymously. @@ -196,7 +177,7 @@ public static GitHub connectUsingOAuth(String githubServer, String oauthAccessTo * All operations that requires authentication will fail. */ public static GitHub connectAnonymously() throws IOException { - return new GitHub(null,null,null); + return new GitHubBuilder().build(); } /** @@ -475,5 +456,5 @@ public boolean isCredentialValid() throws IOException { MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); } - private static final String GITHUB_URL = "https://api.github.com"; + /* package */ static final String GITHUB_URL = "https://api.github.com"; } diff --git a/src/main/java/org/kohsuke/github/GitHubBuilder.java b/src/main/java/org/kohsuke/github/GitHubBuilder.java new file mode 100644 index 0000000000..3959e400de --- /dev/null +++ b/src/main/java/org/kohsuke/github/GitHubBuilder.java @@ -0,0 +1,63 @@ +package org.kohsuke.github; + +import org.apache.commons.io.IOUtils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Properties; + +/** + * @since 1.59 + */ +public class GitHubBuilder { + private String endpoint = GitHub.GITHUB_URL; + private String user; + private String password; + private String oauthToken; + + public GitHubBuilder() { + } + + public static GitHubBuilder fromPropertyFile() throws IOException { + File homeDir = new File(System.getProperty("user.home")); + File propertyFile = new File(homeDir, ".github"); + return fromPropertyFile(propertyFile.getPath()); + } + public static GitHubBuilder fromPropertyFile(String propertyFileName) throws IOException { + Properties props = new Properties(); + FileInputStream in = null; + try { + in = new FileInputStream(propertyFileName); + props.load(in); + } finally { + IOUtils.closeQuietly(in); + } + GitHubBuilder self = new GitHubBuilder(); + self.withOAuthToken(props.getProperty("oauth"), props.getProperty("login")); + self.withPassword(props.getProperty("login"), props.getProperty("password")); + return self; + } + + public GitHubBuilder withEndpoint(String endpoint) { + this.endpoint = endpoint; + return this; + } + public GitHubBuilder withPassword(String user, String password) { + this.user = user; + this.password = password; + return this; + } + public GitHubBuilder withOAuthToken(String oauthToken) { + return withOAuthToken(oauthToken, null); + } + public GitHubBuilder withOAuthToken(String oauthToken, String user) { + this.oauthToken = oauthToken; + this.user = user; + return this; + } + + public GitHub build() throws IOException { + return new GitHub(endpoint, user, oauthToken, password); + } +} From d6627b1e34da3cfcf28db1030d0ace10d969eabd Mon Sep 17 00:00:00 2001 From: OHTAKE Tomohiro Date: Thu, 4 Sep 2014 11:45:40 +0900 Subject: [PATCH 2/2] Use custom HttpConnector when only OAuth token is given --- src/main/java/org/kohsuke/github/GitHub.java | 5 ++++- src/main/java/org/kohsuke/github/GitHubBuilder.java | 7 ++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/kohsuke/github/GitHub.java b/src/main/java/org/kohsuke/github/GitHub.java index 44c2ed7cf2..9037572c7c 100644 --- a/src/main/java/org/kohsuke/github/GitHub.java +++ b/src/main/java/org/kohsuke/github/GitHub.java @@ -103,10 +103,13 @@ public class GitHub { * Secret OAuth token. * @param password * User's password. Always used in conjunction with the {@code login} parameter + * @param connector + * HttpConnector to use. Pass null to use default connector. */ - /* package */ GitHub(String apiUrl, String login, String oauthAccessToken, String password) throws IOException { + /* package */ GitHub(String apiUrl, String login, String oauthAccessToken, String password, HttpConnector connector) throws IOException { if (apiUrl.endsWith("/")) apiUrl = apiUrl.substring(0, apiUrl.length()-1); // normalize this.apiUrl = apiUrl; + if (null != connector) this.connector = connector; if (oauthAccessToken!=null) { encodedAuthorization = "token "+oauthAccessToken; diff --git a/src/main/java/org/kohsuke/github/GitHubBuilder.java b/src/main/java/org/kohsuke/github/GitHubBuilder.java index 3959e400de..baf26a6415 100644 --- a/src/main/java/org/kohsuke/github/GitHubBuilder.java +++ b/src/main/java/org/kohsuke/github/GitHubBuilder.java @@ -15,6 +15,7 @@ public class GitHubBuilder { private String user; private String password; private String oauthToken; + private HttpConnector connector; public GitHubBuilder() { } @@ -56,8 +57,12 @@ public GitHubBuilder withOAuthToken(String oauthToken, String user) { this.user = user; return this; } + public GitHubBuilder withConnector(HttpConnector connector) { + this.connector = connector; + return this; + } public GitHub build() throws IOException { - return new GitHub(endpoint, user, oauthToken, password); + return new GitHub(endpoint, user, oauthToken, password, connector); } }