From 6656bd9015e552f252974b1e06c792257f02cb01 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Wed, 14 Jul 2010 17:55:05 +0500 Subject: [PATCH 01/95] Misc. refactorings. --- .../github/api/v2/services/UserService.java | 4 +- .../v2/services/constant/ParameterNames.java | 4 ++ .../v2/services/impl/CommitServiceImpl.java | 8 +++ .../v2/services/impl/GitHubApiGateway.java | 8 +-- .../v2/services/impl/IssueServiceImpl.java | 5 +- .../v2/services/impl/NetworkServiceImpl.java | 6 +++ .../services/impl/RepositoryServiceImpl.java | 16 +++--- .../api/v2/services/impl/UserServiceImpl.java | 8 +-- .../constant/GitHubApiUrls.properties | 2 +- .../com/github/api/v2/services/AllTests.java | 2 +- .../v2/services/BaseGitHubServiceTest.java | 7 +-- .../api/v2/services/GistServiceTest.java | 2 +- .../v2/services/RepositoryServiceTest.java | 28 +++++------ .../api/v2/services/UserServiceTest.java | 10 ++-- .../constant/TestConstants.properties | 12 ++--- dist/all-jars.xml | 16 ++++++ dist/pom.xml | 49 +++++++++++++++++++ .../services/example/RepositoryApiSample.java | 5 ++ .../v2/services/example/UserApiSample.java | 2 +- github-api.txt | 6 ++- pom.xml | 1 + .../java/com/github/api/v2/schema/Commit.java | 18 +++---- .../java/com/github/api/v2/schema/Id.java | 37 ++++++++++++++ 23 files changed, 194 insertions(+), 62 deletions(-) create mode 100644 dist/all-jars.xml create mode 100644 dist/pom.xml create mode 100644 schema/src/main/java/com/github/api/v2/schema/Id.java diff --git a/core/src/main/java/com/github/api/v2/services/UserService.java b/core/src/main/java/com/github/api/v2/services/UserService.java index c70eb82..9432840 100644 --- a/core/src/main/java/com/github/api/v2/services/UserService.java +++ b/core/src/main/java/com/github/api/v2/services/UserService.java @@ -15,8 +15,8 @@ */ public interface UserService extends GitHubService { public List searchUsersByName(String name); - public List searchUsersByEmail(String email); - public User getUser(String userName); + public User getUserByEmail(String email); + public User getUserByUsername(String userName); public User getCurrentUser(); public void updateUser(User user); public List getUserFollowers(String userName); diff --git a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java index 7bc2950..fae6394 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java +++ b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java @@ -114,5 +114,9 @@ public interface ParameterNames { /** The Constant SCOPE. */ public static final String SCOPE = "scope"; + + public static final String PUBLIC = "public"; + + public static final String DELETE_TOKEN = "delete_token"; } diff --git a/core/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java index 8d4888b..26d36d5 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java @@ -10,6 +10,7 @@ import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; +import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; @@ -48,4 +49,11 @@ public List getCommits(String userName, String repositoryName, return unmarshall(new TypeToken>(){}, json.get("commits")); } + + @Override + protected GsonBuilder getGsonBuilder() { + GsonBuilder gson = super.getGsonBuilder(); + gson.setDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + return gson; + } } diff --git a/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java b/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java index 32607f3..820d2d6 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java +++ b/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java @@ -222,7 +222,8 @@ protected InputStream callApiGet(String apiUrl, int expected) { request.connect(); if (request.getResponseCode() != expected) { - throw new GitHubException(convertStreamToString(request.getErrorStream())); + throw new GitHubException(convertStreamToString(getWrappedInputStream(request.getErrorStream(), + GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())))); } else { return getWrappedInputStream(request.getInputStream(), GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())); @@ -283,7 +284,7 @@ protected InputStream callApiPost(String apiUrl, Map parameters, request.connect(); - if (request.getResponseCode() == HttpURLConnection.HTTP_INTERNAL_ERROR) { + if (request.getResponseCode() != expected) { return getWrappedInputStream(request.getErrorStream(), GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())); } else { @@ -358,7 +359,8 @@ protected InputStream callApiMethod(String apiUrl, String xmlContent, String con request.connect(); if (request.getResponseCode() != expected) { - throw new GitHubException(convertStreamToString(request.getErrorStream())); + throw new GitHubException(convertStreamToString(getWrappedInputStream(request.getErrorStream(), + GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())))); } else { return getWrappedInputStream(request.getInputStream(), GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())); diff --git a/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java index 4d8fd2b..12082e4 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java @@ -31,9 +31,7 @@ public void addComment(String userName, String repositoryName, String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.ISSUE_NUMBER, String.valueOf(issueNumber)).buildUrl(); Map parameters = new HashMap(); parameters.put(ParameterNames.COMMENT, comment); - JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); - - unmarshall(new TypeToken(){}, json.get("comment")); + callApiPost(apiUrl, parameters); } @Override @@ -142,5 +140,4 @@ public void updateIssue(String userName, String repositoryName, parameters.put(ParameterNames.BODY, body); callApiPost(apiUrl, parameters); } - } diff --git a/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java index 7e3656d..13b3a9f 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java @@ -11,6 +11,7 @@ import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; +import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; @@ -49,4 +50,9 @@ public Network getNetworkMeta(String userName, String repositoryName) { return unmarshall(new TypeToken(){}, json); } + protected GsonBuilder getGsonBuilder() { + GsonBuilder gson = super.getGsonBuilder(); + gson.setDateFormat("yyyy-MM-dd HH:mm:ss"); + return gson; + } } diff --git a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java index 663a5dd..c4789de 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java @@ -61,11 +61,10 @@ public void createRepository(String name, String description, GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.CREATE_REPOSITORY_URL); String apiUrl = builder.buildUrl(); Map parameters = new HashMap(); - parameters.put(ParameterNames.DESCRIPTION, ""); - parameters.put(ParameterNames.HOME_PAGE, ""); - parameters.put(ParameterNames.HAS_WIKI, ""); - parameters.put(ParameterNames.HAS_ISSUES, ""); - parameters.put(ParameterNames.HAS_DOWNLOADS, ""); + parameters.put(ParameterNames.NAME, name); + parameters.put(ParameterNames.DESCRIPTION, description); + parameters.put(ParameterNames.HOME_PAGE, homePage); + parameters.put(ParameterNames.PUBLIC, ((visibility == Visibility.PUBLIC)? "1" : "0")); JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); unmarshall(new TypeToken(){}, json.get("repository")); @@ -76,8 +75,11 @@ public void deleteRepository(String repositoryName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.DELETE_REPOSITORY_URL); String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); - - unmarshall(new TypeToken(){}, json.get("repository")); + if (json.has("delete_token")) { + Map parameters = new HashMap(); + parameters.put(ParameterNames.DELETE_TOKEN, json.get("delete_token").getAsString()); + callApiPost(apiUrl, parameters); + } } @Override diff --git a/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java index cfedbf3..d75de96 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java @@ -78,7 +78,7 @@ public List getKeys() { } @Override - public User getUser(String userName) { + public User getUserByUsername(String userName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_USER_URL); String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); @@ -132,12 +132,12 @@ public void removeKey(String id) { } @Override - public List searchUsersByEmail(String email) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.SEARCH_USERS_BY_NAME_URL); + public User getUserByEmail(String email) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.SEARCH_USERS_BY_EMAIL_URL); String apiUrl = builder.withField(ParameterNames.EMAIL, email).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("users")); + return unmarshall(new TypeToken(){}, json.get("user")); } @Override diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index 4721bc4..420d705 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -36,7 +36,7 @@ com.github.api.v2.services.issueService.updateIssue=http://github.com/api/{versi com.github.api.v2.services.issueService.getIssueLabels=http://github.com/api/{version}/{format}/issues/labels/{userName}/{repositoryName} com.github.api.v2.services.issueService.addLabel=http://github.com/api/{version}/{format}/issues/label/add/{userName}/{repositoryName}/{label}/{issueNumber} com.github.api.v2.services.issueService.removeLabel=http://github.com/api/{version}/{format}/issues/label/remove/{userName}/{repositoryName}/{label}/{issueNumber} -com.github.api.v2.services.issueService.addComment=http://github.com/api/{version}/{format}//issues/comment/{userName}/{repositoryName}/{issueNumber} +com.github.api.v2.services.issueService.addComment=http://github.com/api/{version}/{format}/issues/comment/{userName}/{repositoryName}/{issueNumber} # Gist API com.github.api.v2.services.gistService.getGist=http://gist.github.com/api/v1/{format}/{gistId} diff --git a/core/src/test/java/com/github/api/v2/services/AllTests.java b/core/src/test/java/com/github/api/v2/services/AllTests.java index 64e07be..4042268 100644 --- a/core/src/test/java/com/github/api/v2/services/AllTests.java +++ b/core/src/test/java/com/github/api/v2/services/AllTests.java @@ -8,7 +8,7 @@ public class AllTests { public static Test suite() { TestSuite suite = new TestSuite("Test for com.github.api.v2.services"); //$JUnit-BEGIN$ - suite.addTestSuite(OAuthServiceTest.class); +// suite.addTestSuite(OAuthServiceTest.class); suite.addTestSuite(CommitServiceTest.class); suite.addTestSuite(RepositoryServiceTest.class); suite.addTestSuite(IssueServiceTest.class); diff --git a/core/src/test/java/com/github/api/v2/services/BaseGitHubServiceTest.java b/core/src/test/java/com/github/api/v2/services/BaseGitHubServiceTest.java index 701a226..ae70a1b 100644 --- a/core/src/test/java/com/github/api/v2/services/BaseGitHubServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/BaseGitHubServiceTest.java @@ -15,7 +15,7 @@ import org.junit.Before; import com.github.api.v2.services.auth.Authentication; -import com.github.api.v2.services.auth.OAuthAuthentication; +import com.github.api.v2.services.auth.LoginTokenAuthentication; import com.github.api.v2.services.constant.TestConstants; /** @@ -34,8 +34,9 @@ public class BaseGitHubServiceTest extends TestCase { @Before public void setUp() throws Exception { super.setUp(); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Access Token."), TestConstants.TEST_ACCESS_TOKEN); - authentication = new OAuthAuthentication(TestConstants.TEST_ACCESS_TOKEN); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test API Key."), TestConstants.TEST_API_KEY); + authentication = new LoginTokenAuthentication(TestConstants.TEST_USER_NAME, TestConstants.TEST_API_KEY); factory = GitHubServiceFactory.newInstance(); } diff --git a/core/src/test/java/com/github/api/v2/services/GistServiceTest.java b/core/src/test/java/com/github/api/v2/services/GistServiceTest.java index 89fa652..c99267a 100644 --- a/core/src/test/java/com/github/api/v2/services/GistServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/GistServiceTest.java @@ -37,7 +37,7 @@ public void testGetGist() { public void testGetGistContent() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Gist Id."), TestConstants.TEST_GIST_ID); assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Gist File."), TestConstants.TEST_GIST_FILE); - InputStream gistContent = service.getGistContent(TestConstants.TEST_GIST_ID, ""); + InputStream gistContent = service.getGistContent(TestConstants.TEST_GIST_ID, TestConstants.TEST_GIST_FILE); assertNotNullOrEmpty("Gist content cannot be null or empty", convertStreamToString(gistContent)); } diff --git a/core/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java b/core/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java index d7a23a7..1285225 100644 --- a/core/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java @@ -29,6 +29,15 @@ public void tearDown() throws Exception { service = null; } + @Test + public void testCreateRepository() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository Description."), TestConstants.TEST_REPOSITORY_DESC); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository Homepage."), TestConstants.TEST_REPOSITORY_PAGE); + service.createRepository(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_REPOSITORY_DESC, TestConstants.TEST_REPOSITORY_PAGE, Repository.Visibility.PUBLIC); + } + + @Test public void testAddCollaborator() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -50,20 +59,6 @@ public void testChangeVisibility() { service.changeVisibility(TestConstants.TEST_REPOSITORY_NAME, Repository.Visibility.PRIVATE); } - @Test - public void testCreateRepository() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository Description."), TestConstants.TEST_REPOSITORY_DESC); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository Homepage."), TestConstants.TEST_REPOSITORY_PAGE); - service.createRepository(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_REPOSITORY_DESC, TestConstants.TEST_REPOSITORY_PAGE, Repository.Visibility.PUBLIC); - } - - @Test - public void testDeleteRepository() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - service.deleteRepository(TestConstants.TEST_REPOSITORY_NAME); - } - @Test public void testForkRepository() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -216,4 +211,9 @@ public void testWatchRepository() { service.watchRepository(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); } + @Test + public void testDeleteRepository() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); +// service.deleteRepository(TestConstants.TEST_REPOSITORY_NAME); + } } diff --git a/core/src/test/java/com/github/api/v2/services/UserServiceTest.java b/core/src/test/java/com/github/api/v2/services/UserServiceTest.java index f937f3a..0f3b1e2 100644 --- a/core/src/test/java/com/github/api/v2/services/UserServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/UserServiceTest.java @@ -72,9 +72,9 @@ public void testGetKeys() { } @Test - public void testGetUser() { + public void testGetUserByUsername() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - User user = service.getUser(TestConstants.TEST_USER_NAME); + User user = service.getUserByUsername(TestConstants.TEST_USER_NAME); assertNotNull("User cannot be null.", user); } @@ -112,10 +112,10 @@ public void testRemoveKey() { } @Test - public void testSearchUsersByEmail() { + public void testGetUserByEmail() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Email."), TestConstants.TEST_EMAIL); - List users = service.searchUsersByEmail(TestConstants.TEST_EMAIL); - assertNotNullOrEmpty("Users cannot be null or empty.", users); + User user = service.getUserByEmail(TestConstants.TEST_EMAIL); + assertNotNull("User cannot be null or empty.", user); } @Test diff --git a/core/src/test/resources/com/github/api/v2/services/constant/TestConstants.properties b/core/src/test/resources/com/github/api/v2/services/constant/TestConstants.properties index e3cc714..78da444 100644 --- a/core/src/test/resources/com/github/api/v2/services/constant/TestConstants.properties +++ b/core/src/test/resources/com/github/api/v2/services/constant/TestConstants.properties @@ -9,19 +9,19 @@ com.github.api.v2.services.apiKey=5842ac9d1fb8ce4f7a5f0effd414e11d com.github.api.v2.services.referrer=http://github.com/nabeelmukhtar/github-java-sdk com.github.api.v2.services.testQuery=java com.github.api.v2.services.testUserName=githubapitest -com.github.api.v2.services.testRepositoryName=tornado +com.github.api.v2.services.testRepositoryName=githubapitest com.github.api.v2.services.testEmail=nmukhtar@csquareonline.com com.github.api.v2.services.testIssueNo=1 -com.github.api.v2.services.testCommitHash=7b80c2f4db226d6fa3a7 -com.github.api.v2.services.testGistId=289179 -com.github.api.v2.services.testGistFile=TimeZoneDSTUtil.java +com.github.api.v2.services.testCommitHash=a4c927926744a7531676 +com.github.api.v2.services.testGistId=475364 +com.github.api.v2.services.testGistFile=GistServiceTest.java com.github.api.v2.services.testIssueComment=This is a test issue comment. com.github.api.v2.services.testIssueLabel=bug com.github.api.v2.services.testIssueTitle=Title of the test issue. com.github.api.v2.services.testIssueBody=Body of the test issue. com.github.api.v2.services.testNetworkHash=7b80c2f4db226d6fa3a7f3dfa59277da1d642f91 -com.github.api.v2.services.testTreeHash=7b80c2f4db226d6fa3a7 -com.github.api.v2.services.testFilePath= +com.github.api.v2.services.testTreeHash=a4c927926744a75316768b0be1b0a905f52978db +com.github.api.v2.services.testFilePath=numerical-recipes-j/.classpath com.github.api.v2.services.testKeyTitle=Test Key Title com.github.api.v2.services.testKey=ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIB1b/KmaoKhvv2Zy1TAsXNQDGvMGA0KLJZLxOz/Qfnz0pjSDs7m+qId0/0lR81RXetYaGPDi8u317naouBChmeen9z22J0uXBRGUpR21BfaGNCwy4jjbv0dahhbesBvBvzAF1JowbWZLjZCwe2iEAIH3CdRvicRcGtV/At8qXt+ow== com.github.api.v2.services.testRepositoryDesc=Test Repository Description diff --git a/dist/all-jars.xml b/dist/all-jars.xml new file mode 100644 index 0000000..58c60e4 --- /dev/null +++ b/dist/all-jars.xml @@ -0,0 +1,16 @@ + + + release + + jar + + false + + + true + false + + + \ No newline at end of file diff --git a/dist/pom.xml b/dist/pom.xml new file mode 100644 index 0000000..b41e96e --- /dev/null +++ b/dist/pom.xml @@ -0,0 +1,49 @@ + + 4.0.0 + + com.github.api.v2 + github-java-sdk + 0.1 + + github-java-sdk-release + jar + + + com.github.api.v2 + github-java-schema + 0.1 + jar + compile + + + com.github.api.v2 + github-java-core + 0.1 + jar + compile + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 2.2-beta-5 + + + package-all + package + + single + + + + all-jars.xml + + + + + + + + \ No newline at end of file diff --git a/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java b/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java index 74c8ca5..06efd19 100644 --- a/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java @@ -19,6 +19,8 @@ import com.github.api.v2.schema.Repository; import com.github.api.v2.services.GitHubServiceFactory; import com.github.api.v2.services.RepositoryService; +import com.github.api.v2.services.auth.OAuthAuthentication; +import com.github.api.v2.services.constant.TestConstants; /** * The Class WebSample. @@ -69,6 +71,9 @@ private static void processCommandLine(CommandLine line, Options options) { } Map breakDown = service.getLanguageBreakdown("facebook", "tornado"); System.out.println(breakDown); + service.setAuthentication(new OAuthAuthentication(TestConstants.TEST_ACCESS_TOKEN)); + List pushableRepositories = service.getPushableRepositories(); + System.out.println(pushableRepositories.size()); // } else { // printHelp(options); } diff --git a/examples/src/java/com/github/api/v2/services/example/UserApiSample.java b/examples/src/java/com/github/api/v2/services/example/UserApiSample.java index b86de4a..dd8aa0f 100644 --- a/examples/src/java/com/github/api/v2/services/example/UserApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/UserApiSample.java @@ -65,7 +65,7 @@ private static void processCommandLine(CommandLine line, Options options) { for (User user : users) { printResult(user); } - User user = service.getUser("defunkt"); + User user = service.getUserByEmail("nabeelmukhtar@yahoo.com"); printResult(user); // } else { // printHelp(options); diff --git a/github-api.txt b/github-api.txt index b885075..12a3797 100644 --- a/github-api.txt +++ b/github-api.txt @@ -6,4 +6,8 @@ http://support.github.com/discussions/api http://support.github.com/discussions/api/28-oauth2-busy-developers-guide http://github.com/account/applications/59 http://github.com/account/applications/61 -githubapitest \ No newline at end of file +githubapitest + +Commit class is not complete. +Network and commit should be separate. +Remove commons cli. \ No newline at end of file diff --git a/pom.xml b/pom.xml index 31b2666..079b739 100644 --- a/pom.xml +++ b/pom.xml @@ -30,6 +30,7 @@ schema core + dist diff --git a/schema/src/main/java/com/github/api/v2/schema/Commit.java b/schema/src/main/java/com/github/api/v2/schema/Commit.java index 32e18bf..bb1bd2d 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Commit.java +++ b/schema/src/main/java/com/github/api/v2/schema/Commit.java @@ -18,7 +18,7 @@ public class Commit extends SchemaEntity { private static final long serialVersionUID = 9155892708485181542L; private String message; private long time; - private List parents; + private List parents; private Date date; private User author; private String id; @@ -30,8 +30,8 @@ public class Commit extends SchemaEntity { private Date authoredDate; private String tree; private User committer; - private List added; - private List removed; + private List added; + private List removed; private List modified; /** @@ -61,13 +61,13 @@ public void setTime(long time) { /** * @return the parents */ - public List getParents() { + public List getParents() { return parents; } /** * @param parents the parents to set */ - public void setParents(List parents) { + public void setParents(List parents) { this.parents = parents; } /** @@ -205,25 +205,25 @@ public void setCommitter(User committer) { /** * @return the added */ - public List getAdded() { + public List getAdded() { return added; } /** * @param added the added to set */ - public void setAdded(List added) { + public void setAdded(List added) { this.added = added; } /** * @return the removed */ - public List getRemoved() { + public List getRemoved() { return removed; } /** * @param removed the removed to set */ - public void setRemoved(List removed) { + public void setRemoved(List removed) { this.removed = removed; } /** diff --git a/schema/src/main/java/com/github/api/v2/schema/Id.java b/schema/src/main/java/com/github/api/v2/schema/Id.java new file mode 100644 index 0000000..f55006f --- /dev/null +++ b/schema/src/main/java/com/github/api/v2/schema/Id.java @@ -0,0 +1,37 @@ +/** + * + */ +package com.github.api.v2.schema; + +/** + * @author nmukhtar + * + */ +public class Id extends SchemaEntity { + + /** + * + */ + private static final long serialVersionUID = 9155892708485181542L; + + private String id; + /** + * @return the id + */ + public String getId() { + return id; + } + /** + * @param id the id to set + */ + public void setId(String id) { + this.id = id; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Id [id=" + id + "]"; + } +} From 06294f6904ef087db26bbacf29b6591603344f88 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Wed, 14 Jul 2010 18:06:05 +0500 Subject: [PATCH 02/95] Removed the dependency on commons-cli. --- .classpath | 1 - dev-lib/commons-cli-1.2.jar | Bin 41123 -> 0 bytes .../v2/services/example/CommitApiSample.java | 104 ++--------------- .../v2/services/example/GistApiSample.java | 94 +--------------- .../v2/services/example/IssueApiSample.java | 100 ++--------------- .../v2/services/example/NetworkApiSample.java | 96 +--------------- .../v2/services/example/ObjectApiSample.java | 106 ++---------------- .../services/example/RepositoryApiSample.java | 106 ++---------------- .../v2/services/example/UserApiSample.java | 100 ++--------------- github-api.txt | 2 +- 10 files changed, 60 insertions(+), 649 deletions(-) delete mode 100644 dev-lib/commons-cli-1.2.jar diff --git a/.classpath b/.classpath index 27cf4c6..094e399 100644 --- a/.classpath +++ b/.classpath @@ -9,7 +9,6 @@ - diff --git a/dev-lib/commons-cli-1.2.jar b/dev-lib/commons-cli-1.2.jar deleted file mode 100644 index ce4b9fffe40c41669797cd806ac989471b2acd84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41123 zcma&N1GFx|k|lg>+qP}nwr$(CZQHi)v2EMNy~mjQx?j({e*fRIrq(Ka--=w7mARuT zV#iJeXH`8_d9c8AS zZ|Bfu13|O+x-(~ncU;|}aLXkX2xm=p?%+!#rGcRMKK8AL$(Ci>s9TMMt;2)Lm6yfM zwp9ukRyQI|XJx~~x~kH7hPg$5iWdr~N+bXt2I;ftZXdxz1C)$nOXGye1XNRam*AlYpw%~6 zjgep1+?D$DHOtW4swgDIn>40|HwCe5QT3w>CQiJ0F~#FAXk$NJZOl(R>B&g1gy!`?H3kd)K=l=$nzhD5ccQXIqSo!~2K>yRi(818y!u0=Q zi2UCTjqPo1?d_cZrNPC&-5dS?zk#uh<^OI3@gE&#DDl3xfd>H4qxm=J%18=}$|;M| zxp=tjXlXldjiUO^)vr61DO-Y-U8U2%e0=FFvN;>K(_`;W_I?7P@9OV;^`J$sqoNRwW*UwDnTaazb zvBg@XUJnD1HmC{(Zy&$v?mjP@|jqM;?AeV~4#Y<>W7fK@`wE#2=Fz>|x zhW7w%b?RZoaA_!`3~8bAv5>d`k`LaC(*>Q9T52nMO8N{ost?DVI)FVptZgh2=il5F z7$&I}3kS!a=}E!F9f^eYosgc<+W^`&ACRsHxqaOW#fYIG<-pBU_M0Seby1*k{=>oHUo=l^7KipFH?h@TAfkuQOt8dj?TpiRa=|T(w6F3H9v{% z7P6#<7D!B09U5*Y%}A65kfLT`iWX`|cLw5Tmxu6%rWV5XQ=n?_o#H_}89xOOAAhZG zEiB&cr-_-~J2tY{0`6?U0@`%^@@cwmEiQBrWFCo0qo1e;Si_ixBxD07v{|AuB~c887iEM{~B12 zCogCSrNCa3yA!9shwzhZ0eS=~sGJNJ2yh>I%f% zKY*~eq4dy5);wV_uqA{Bwe5|7<_Pdgv4!Uz5(;pGaMp{Er+e2Mn2k@6iQUjAqt>CU z#_x}Umnsn4zUBaOh<{?cFMml|2NQgVbvf^eQ)(RKWq2p_!l-tjc0xZL^edmz1q0i! z0ki@zDN}{d(uq`rDSPlFLeW@XzlRj@U_aY94mC_wh9e5Cp*Lh+Qc&t=>RrLTcDj60 z=7Hl-m0$dYFn0R1I%M(ONBq!drLiJ~`=tD5QK_Ur_Z*|Psftqo&jo+N0XqUMCRwiS zl8HkX7-2&zO@$G@rQGG4Ny&rnb%+ z;u{9Hy>Fmq0=6!xaA7W3dQ#~1U6i@B;&7c0{44zhNJIs;&Ne_Ph^6L4l*%~nc7ay9 zFvs$?q9G(@rPw?9`j^IAMy*I)Dt7O0$|9 zFk+cG>;r_jV=tXJGnd4!+Gae2FI!`=KxfL*R$K$V5TdV07%z4tgjzG|x^@(g`dRZ5 z3g6+{!#W`_zoe%VFcDvycy<&nMYAG;yZ|ODAty!dU2@WV<(_y%K3F>~?0WVTE7C5_ z7e+*1Ry2O1+CiKB;RA3p(p6$~b^J>6j7*vtClz%?5)pHP00dxe$d_jHXGghaVc^CSzCph_NJbl2Qby_yLQ-bV+`=T}|K1%{O_%aa!{>sz7pCMS` zc2H`9F|U{-nEzz*p&mjpEhnB z4MdO=wb+i$!Pl;GTCy9O+5-9W3lz9k`gyPDw@8}?OO*PEfZqX$B5Lweap)nyj^S6; zv=wtC_EkB1M)7qJt#)*2tnd8KLU0LC##~&c^V({HcBJ1j1ZUVU(JBo@?QNr-=q3z2 zVwPgZ@}HPI^rFNscFVwct%}-oKn9HkK8GOU6|Xq`in0bHx%REeIZT{q2yv*N3rNbK zj4~r-i5L{h7Gl0-A!5WQ8T6iks*bMxD57_v8i{lWZBTtM1L(ETiw*KM7*Ktg(cG!> zVW%yw)bNlSaf%QQ3gC9k1I6YVc%2}Y#5Qa|D*Iu}n*P%Vf$#Dpl+RNxGM}ENDRR<9eTAY7kcL=|8aa5FiIc`b% z%9*g9w@ths_sJA3uZtV}&kEy45Q3fs-7(0wdAn@9Lpm@PDUh{aXfcHwb1r60+nQB@ zNi+~WoL2{x-2t$0@#(fW>@t9g`eCG38t)f$324-yJe3m@A)yusOSAd0;|XTZonb0p z(=)J(%@YJCRl^`?RWNzTvXYr+;VK;-B;}<4EL*IQ2C4o2W&b(9(!4VB^*HkfCh5+R zz}tB9jW@x`{Ns2dRj@x(hO?38jT#wMOCFLh1@%t`<@vH^GZBSk&XbuDPX!{=z2G^- z$k{q8vh(hs`Hj>77!wvLZkzI3$}YX+2GlSFn=kHiir|>Zl}VwbN~gK&DNM)+&zSl;|)C-t-jS9Xg6e7eqz=kHlyc+#|Lil+$+?n${ z1977QQr7$juDfA`e!1D~r|fZ{_65grFdh+W{kTHe@lt1o6bXF$Y?-HIVDeU#Bx+m@w)uoeDPtU&aprm@jw=vy zxR3Nq+%L#|J=R76cJw>$ilVrjGCad#CF2iiq-N+Ojy(>X=5d>h)Y!&699`0~cy2s+ zr;JP6$BQTbr7X`ZQ7bdRA)<^fwS(uxwfgCR=))V>mGszyGMFVd=^NZMM5UQn1-P6l z6nzjwEEBp1Y{u?=KuQh9HWBUf3yOPqKH&;t<@l;;g1i8Btl_HK7N2^TZSU9a0DfQ; zFrY&OG-f;7~2(CAb({SN=uvp=e z61J79J@Fg+_=W=Rd&o2wCrT8*rNcigR={dtyNZK=z0^iafytZ6Z#Ls)`|SF#vnc>= z%lfB>QruR#_ls?4_yPVwx^Rq;MOE3r>M6NY>*x=Me5Tt^BA z9HX=NV~?gHo#`FxKoj`2Yet-Sk@;y>r(79s!%x2C+3)T~!bf&?j9h>9=tXCDe`h$(%*ZK8)zj?XpN95Pv?S6u2(fMigY483B5&m}b{MDuRbOj7ef8^!}4(I)2 z=SXh1x3{xfQ{TDyXloeE4qf06pKaCUT9A!-3srsql-FF=j&;F_+Yxp?C{FQ>bZGXZ zl*h&eo&yn&y|2YBOUv7wEkK2rzP`b{o@LU4?Ov>$X(0MML7LTx~2!{ zT%J7vj|RBU%3>XoOQ<|IR%=ie4P-tc9)_#cmZhOyNf+&*tve&e>FD?@`N3~M1kn6F zb{C^KH>$Al%N-9 z-z(JpYU75P1O-96Pf7r2h*`HM;YkQs=x7@D_o!p*3Ac02VWZkn?So^n^ePVVXv}Bq zZ4WcE&I~yi`rK|Lc_NZ|mhz2j@*Et$kRqEey`xk_j)BOCb!GN~6Kj$zuUq7{ z0wT{78N@D-!Tss;er#%R{{V+bkRMOP6VoAst{Qw6ouu{8JD5oTyO2lcK=c{Rs~sI0 z=_*KzkbvH{XCjnq8VbIf#7_BzmyhP_wX3#4;mIsUUeIERv(ttgv--YmD-jQ11u?9t zIu)PDoUuZ@A9xh^ircG|BvwSDW_Ce0L-weAVMKe6$hzR^lsc^g-Zc82{zX7RM^s_@QRU( zZ4c*r6Jp%+05l1NCCI;yv{C_WSY2{Q8AZ7Fqxi-q$ts zNA;I`b|q8%yQKZQZ)S9qZ`P;_7Q%TeU`^vfSo}eiVu@UzT2*CEKv1BhTtWZf_7o^0 z=jSW?W(Xga%=?vFgrG=;6?b1va$anDZxqCLL=Yf4eLo*Oi=JB_ zY^iw+Vk#w^#4f+)Ld(pYm}?<|DZ-GCay?F8@NM7LK0iRJrKCB-b9qPjpIOYP2{Eg3 zdya!r!S8-$m{0$by+DuTja4aG6$nAO7BC~QxK&$m2#x{}1+=as_K(jNk_T6JFFJ_o zAAtX&6aF(hkL;Bv_xqd5*Zkf8!2$el{z*<=d!(D@9#~5uYh5saO$J(yd+$y~5XgwUH6aMT}M}!$7 z9Yd|(nrXUs_vjQ%beU-OG*17B+jb9rXt)J|nKIA)XgPq^+t@;bH4HC$JZz?gOSOvrgDdwyZUETfkq>gl^__0_iFY+_C}Pwk_K zW@QL-40|{V<+oO^9!&qmXTsoiIT#~mZ3e?LSQRz~wklvwYc?&6mI;IG8uTQQtcfSIr18V4 z9oEUrwClu=AnxF+$yq>R-x{KANRi`4Dj!mWmbg6Od?wh#(x+||Z^+`E6#8gR*9QUv zEaId=C`|Rc$VFz!8MhD|zc^m2l;;wy){%izr)kZiy%0fwDV-nSqs(D#;*u&$90+uq zz@A6wfXohXGP|F|QKD{3w~qe27@p$PkLdXu!1uxfJW>c;Qfo1bg_7wF?!B}=`NCiy zK#cBJ{D6)jzVHu7i6ljX)Q^U>hG61#7m|^f`0o%DRZkhurhbe!<&Y>6O(~*;ao@51 zH9Sux&~}tUM8K|)-$@M4QjhZw$L{51dx{kszy3S2rx5gBME^3p3V+c}@joM5$k5r+ zSi#WA+0^Mj!5pe6D-Fzu;JZ}c+PbO5F9?DPZ>zZGEvg`>kVd8ARZ;E|yESg7?)wma=@l2m^eFAqSzUPTb^3XToO23e|17|KU{oL$RT=unBr zS$GOL(Vc8De&o#t1G{veGB?N<9a>v%A{Z|s#Br~J(_u6HiRkW&Dk?=*hY$4GBAN0p55dX||qMH5Gc zh^`e=Ki5)Sx&w4AJQu0CX^>)X24*jiB(P;~J7Q=Q=YlR4#2V|dOR zuD26`wRM9D)tU%XjB=0VQdBqd`L!Y(Y#^Bq&W;4C-EqnwazJySQfx)t07v zRm%oa+L9j}>oV-74JfQL>yw>j>of3wp9;+-FdO>6WPH|Nrv3ji6~ccxQbRiv8B06U z|D1|g^$&lP71WAfxad$)=7CT{rVY z1!^Pdizzj0{q^uo^_CSZN*a+W+SQ=aXUqK6ws&j(FX(sSiGW@7vtyAKwR4fa?3WFl+~r5n(JI4yEv`2S!xLPT+^hX@Zot!R1+i+*FHdr?^Z!Sv8qbrzZ-byl3QBcoT=1s~mh zzhb<-VdNrDr4ePJOKqWrcF{ZTqPMz)_dE+Tk*Ag@^Wmots@v6jU>@p(Jmm*rSV9~` z=DFxy8(KYtVB|lqhzK%7Dw}vgI?OdR@Emd?bWqWAn!iAy0d*GohAW)atE zX-Nu@!VPvxriV-`7icCO?lT_+RoBylwu;e+K|*~du?|{8Xm&-R4ymNpASE->wB3$u zhM1pxd|1!7ff6?LuFub6-EgJFt{?v&oO9t8>JvICqtJAC7;T*=dlcjYRIsN|?Uf;n~RiQwh3 z8xzCDAI=D}uCG9- zTe8f3!8!A6&gb?LPqp(VOi`Hm%{6v@qFlWLwSbmMk#1=5t! zg4kjXLZv1?X`LxoYKxRC-MzY;_WmQ55VmJE1~a_YBbe~2uOw$hBQ-Sl>32@z_~y2V z(gfsNTOjZUMe`74v;k3J0jow|#dyGI^N_M-H0nrtEIw1|C}Llml3XDqn0u;Y=`{E4 z8q~CHu^t$iw9z8sQbb~2?9zp#GD%jtShNc^uFtr9zCZTf>-z4n8*2Swb)^+8+kLE^umMJUWOXe?0o*6T0k03+b56+Sk~dbX zbH&rXCVGZ3wNCErEe4j^H}4hA)hGu5Ie&q)#9Ya#y;qK z>SkZh7MNEd^a3j83h37N*#g&9*S^@xK$b0-p+r$+CzfjhEe8p#=Fu=$*>g9U3d36) z!?_{VoAoGLmafog`!Tq#KZH{66e|Rg-PJ-co2N4k#ttn~Fdku?3fh#!MhFPsZSh>Y zDMqx2I6O*2c~GNzs#e#?sxc=Mmjb;PAmlgKv5JYy z&K~VSjeVRh6rU))dAZf7cw19oKE1VlJX}v5r;aR>e&`=#3m8aWFVlvd;M`_(y=YlO ztwxm&J*2}6P@wdM-f)8Oj%ttgyNA`83j5?%w0XuYd1Fx1PV)H$ALN+%J=hnh8g#}N z#GKZdao(h+mTTQD!kV;Xk{eu-hV^!?7qF(g_oyT&9O6rQhF-l`zEddF}`Y0`RHsjDX8X{oWGBBOKJC{m zCc7(S;{uD=318G<*JPT`QnL=@%3|dZ7fTjsSbIy=e#$8>Skd*JYtVSH^#}O2t&6Gt zw1_PS8=E5BZwuEba?Q;J1p1*vVFvmN&B)#iPwY=2A&X2AesLog-;{``Z&(qD`tUjl+fo$yAquPs znJ@TVEUKxR!eblP2KFu2bQp0gY5c30m}ZQJ7{o@BB{i@JcEb%XrD# za_JM0rde(y(#upmk+Unhc*v=VE*#htVFfCJktholL0qEEAp##A?htECaAu}TiC$S$ z&+4|-Aj>>47QuDWFI*sEzT!%RAT9Q}si_9d)E@RnikNXm`QDF(DmUjC6Y;(xX6u0$u#P0@M#BW_#DxlaqBefQsRPl$YvJKb!&x- zOa!mR#R>3e@UVl2`P$L?@iU9Ph)y*|)m2|?*<6KXcM*^~cRKODLRWt#Oj7sC@4ioR5y+g%(rM3o@8h=n#rLJ}`~CL= zGC*-hk_f#R3XVKcP$EYRi4w+6C^AO$QHe%R?l9$XGR7FUk*8J$q#;xgYo&oy%o0=_ zB}ef-O)!roH(S10#ARnS%pzyI5o3u|n=vg5`x=e?h)y+f5@n}pv){^Zo5tG!r1}lM zp@XC=RoG_3H0v})H+FX2G4@H0ya>->mIAY|^c>z^OL0=J4x zzxL^<8%Zv4{2rm@5zZuSnDtUH_HG=A zTjYpvWP@U_c!7=bLe^IV`-(8;e}J2p5sbne6tp7IROwlQHFCoc7YU!grifGgHew5C zM-UCl4U~J6QrI8?gN#OWrsz1i_y6zCFKqAuQTW&C5C86eWi$UF^7*HP=f9LW{}9?p znA$jq**n=9y11A+kud%<3yqP58e~8S-FsEn?naQ`FX~|N0xLY96qQF9n#W%(DN($) zqT>k&M=Gw{ehUMCVw`^Q*u4c{lOPsBL=sY3Z&uD(%YuyNy`pQcOWkeOW`87tbaZ6x zGt#eyU>=<8QW}@5iVAJAwU(t%sT-NIZX*pyz>6_#UuwGRB%j_BDlDZOd01|E47tX~ zP8(qDXCGpKU>STJad_DyLQJG_Fbzl>D|P{kUN#~Y7DuW>eoeC5qM4Xelc6J)15J|mFgTE4c&SW=i|_8KfcjJ5*^3G9RS@O9USyd+MKYe6 zH0f}LhZT%lf|aW6hIQ^$`&OLi_I2!r8L?usq;%PU;W*IFW3Zf8^-}8@6_D+Fb*UnH z6GEd^(F{O%Bik-4IBU1~p>B}D6-2ns6|cHZ!LWb7<(L6-*f8Vv3(HM^?wANX-0&;^ zrh9!PFV+{GkBZG=m;A>SsOxrymx-pdtPqO$hsw#i%kg5tHN=Z{mNHSj%c(3)YOq7O zTg}PDm?CCxAkxOgC^Lc!f8H&vcf#QdC~CWpXed zoHWy|R{iO`t=or2M7PvcS45&v(rq89UEyof#&^B3y3(@7Z`*0>_LZFL++)`_3xhQI z&}RRof9rnRdzSa~>nzWEwsT?%-~VC?z-rihy8{TnqXCfr^i(?*G!}iZFd+_fuSbD#)+`aC~H(+*umwkCUt&c`*znl_8z@iWb zXweF|Le9{cSR=zTOmKF&JV(Zp)6pY@F6@(O1-i!^qCG;WZ4Pw&j!<S1E3k&SH`<5ebh+ZUX&vgT>0RrcU+<{hInjxoyFlRJ{~ z3Wq4EQ&=bDLo+sZRXN7+Un_Eo!axv^wY>4{u6$D;DDG!Y%<-vfTqB^-<%?a6}+d9*-z1lQruyBpTgjl#nl>i{W%LWD{dJ6e-Bt(#a zc2^5cSlHGPurZ*~y-!l(oN*@X#%fq_Nc5OGZ@z{jGdl#iz2~r`TF+t#meBG6U*6>3djpcJT48 zEA?_?#KFB!mkgphTWw=UI9C?eH=AgTM;A4JS#6Z1y-QUBubp8(T-(SjWMMNz`)+ zn8`fINKVATK9|6jr>%~8YYhVTu((BCK*LJIkQaZg7$2FyegvHxuyiU2)K=(_7qAX@ zNeBTNTVUd?BSqFj+F!&sP#WhRe7hcaqG0gQ? zl#{ueIQR0b&osZh;WUl-qaj`cI|)zSI7)`C)GYU1gL0`n=jTMU79=2Q=hqh3%^bVH zDuO2QhzUJCWjOoLGpLZ60QAHK-nA|gRyyGqc9o=@nrqo9aHC(~!fWjs8lK$P8tDM9 zDO-bnK2Cb>PwRyfei<9mO=Lpn?M{ZpGKN0x-rrL6HDLROB*H*uh@r51vQ>knF%7r7B6TW%hm zs=>ED#XN_RIgitd1IsL_h{Yf{&5<<6?h+dD()psKmhyx1w};Z~dB`IjSz8H7+n8s* zZq5zy)L7*fUm2gSXTy7Vh81jxcpj0+a9TjxyVJS0vvohhX z4iI&2k!U(C$K?LsjLj^HIv0>H%7&~w2$(W#c6Tuu?mZO6I+WNkq*D|kwy|!aUF$sg zYY#AaC#R&kEeCSA^$4N$2c}Uvow>s3=~1dCnN28WnC+KG5BG4-vf&!F(X2+aLwe=L z@VD*}Zn`>TTsTI(bad$0IEPTWHYnLHjhZ2#Qu5x$E{&otTq5aoL`B-@yvzHdpUre$ zk^p@{^_N6a4WjuSNsazPgzu1BCoVFkYY0MWto={H+rt_c3F{(bnr#AOcH5FT(5^nv zd#fX=HZi#!ieuOw%46If>gbMc%&j#wGU$?e-jx`uBWjJZ=vy0V_6K{ep9wjl*9hE| z2c*7-R=PUGb*>RtE{?q&fk-PNJt0l~8J*hgzZJ6zwipP1xaf^lt*+WU zY$%ZAZxax`jG9b9RE&ovl%cR610_5RzBM{!k!y!03J;cJWM+51h9Y-m1Qy*XIu=Cl z65%P2sbBQGU3mM8iD&KGd0$r`nkCIl=5>-t$m0TZWH4dJo84 zr6yNXl$|ie-c&P>5t2!%O?gmZ1!OcxO#;l7XK9?I!p)h`m=wfGu_oHm?v5>IGfllP z4->XCv0379djg!a&u|DTB8Y?W79QGO1=*qULRG&!Lyk60?{P)tS^DXf~M36v9g#Ck$yBP8fC*UKsk_CfpGI9Y=hh2S$DVj1NYBz8qgnZ$8~019ZUn z-Yr5=h6`qI$w_}ri5ncxYD)5vsY#d`$^o;?fH`VB=p>{pDM953YLS28@b+{Ir z!htuI`EhPv4EaDPscL==kA}>_SZmwqH(k@`j*?K}fT@(hWqk=OsM`UVvRdmkaNB;f zLSBQ&#>svj3jrJSxVba1VsqeiIct0@@Ua>4_?Z*X-`_l$$m6t~ffgGAar0Tl<^WFC zas*mz3Fyv1ov``*pb`Ghb_8`c1b6dU z?qh&X?U2WLIRZKx0({eu$Mw#@4<^8GthH}5m^4oIas+uc1o&qlkL;a+$EJXYa_b>i zFaqCfWG>sg#!GPAmfIK1(8H~I!y=7T! z9Q{9E~x#xC6&F#jOPKdh9gK)B9~Er$>mEEM?CJiic(wAF>x$l3i(py)5Cs zsU_aUD0wX$^2NB6;}7m2L9aLsE+LZ@ZGZm(5pJ#q!m>4#YD@C#xR@D`I>o9uffxnxPw|hV~{{w@-3;xhXNg*Xy`iq zK`j%A);$%iM=Dy66trF`X#HZy7|PbToO>n8k3i)#A>mIkG}g zkX+M-<^~%#SiXl`(53-RqkwE$P-qE89#N&Zj6yOg&)?q6kyVyQ%+XbrM>koXW-uFk6iuXH=!V2eP`vIYu_Ad%D~Pe1V*XSO>l>=Fl%>uv^Smn#Y4#2f9_9<_!QU z!s#*CMO@Yb;swkGS@PRI4t|6Ya|leo{6x~@>o zu~6dCs6I9>W`fL}L>W%0TrWg1PG>@Pr$k*Z25FSfj2%nC;wjG|k2j8hX-1TGz#w*E zu%^t3SK>VFC*rCoeob;YI$AZvZHK$+aMc)doaU)HI^CfvX?Vx^W0N5Uc{Jsb2Ui^> zm5+We?;-;AQ#jV6eK*g=w|KijT(Jf0KF*#W+kYlN41JEFRW&VK!89uXZBaI17Mj5V zCupplg-pH&`9{Yi^Oi;GMhI`hS?7d^Gf8wz9j#cxV$ii1(K+eFLP6~ixftVC8cWj& zg=iX!`X{&rzAcIjm(w)Wu2Y+kvaMKXF3hY`JJseL)n{e<2AXBaZBs)iBWP4jm{`LF zNclWhi1$|FI737p&3NA^x!R9i>Y~|$9V)mF%-9a{!-1F?1F6{!^SHXqCa5grK(T9I zxl6I`_W_S7LUamYjZ%_Exy=abUtiZm=>=C>}>4@bT$Ww(J^AGDRp8OzSr(I(s26Gzsxv6YO2fmqE~ zbgZN8ch(-8!>(`#M+pjMz~zl#KyS%ZeY17bo5BFyLyf#t&6JOQrRVwFuKe3&V5BK0 z;keM!=|LqkL&|0+yG$7AtP&2Ijq_WXk+q35o%&v*4O`k7hVL^a+?RJ+pDlngG{rsX#;eMLe1n>j z;saq#%`*k-+)9dR$(qhtYL{X^zF z%e-HANJVd$36K4m)9#Iqb95}8Z@osdz}h)XMxGgD_Xp*OFaU4olDvo zOzv6q@Jlyq?iYs?JGxLT)s*p$YDq*d1NaW0Uve8aMAcFSbaJfBTVHa&Y@KZd3H(9+ zezNkzG7m8yh5P~QI|IH37i+>_X)Qw*L@cgv9O2Cn-k>_qtM94y224)6DHQd{?LCnR zPiSdWc1NL3K2pMW3p*Zxw~Kn>dnds?blwo=sQJgFC+Y8HPt;!%AGLi-KJk7je-l8Z z@I&Q4Hr^+rt5-y2R96*gwnn;E3IDFLV=TEe%Fd#%Q|~=gb8YI7{}b(dsq!GoN|2`# zU7Fq}FtPv@)q>Obcpis4_G_^|`f%dKba-_{$0oV?%?LZT=@(jrnGNIX@J33027P=l z^U0Nn?@q+ENM@g0isw-zlRb~(XsmnG*aPmPKX;ExoRIGU=gSkC^5_ z?1hS!v)?@gKku_%xn}NhPaykDkSXcJ;kq*e#=KO;qK>xp(^g9FeOQo>|Jp>(J&L?q`g9N2;!LdhsA*Hl(Ud~DDdoH{O@8Q9gJKi@o1b>&YAgD4 zlGc_7RHa2DjtQf_gDcziC631m7E1M5u}W^VrxoqxGIXPWZUmSs@Wxepr>^`k^uCW0hjcf`fywrWdw%O*T2`pip1)06=rG0_xkvH^0ra&xZYPE@5Ap5X<2cqzMH<_8B~(QcIQ z)or@L<~8+8R(&W;nR&%+#>&>>wa`<)bY33@b0lF(Y!eW-L-zVDHsY_VNs$NGd1p0u?16jHvu zL3RxO7Rf!Q7I9j=tV)IFWkmOHKL>9m=GmQiX|%cDt_Ndsav`b z`Q1{2mM|VqSale$hz~ISo#b)3{6INhu+s}8^)j)AiLzJZP2Q3ke>TnSfFG}yzVr(s z+tf(4B4AS>CHZy~Eac#u`Tua>|5)g{igyzG__r9i^S220f0261S~@#h+L;SFnY-GW z+PVC@)Kh88Zb<-vH#<5PV@b$js+Q2MaG#?T4AP^ZLP_vmNGdUkO7(JTb*CfRh`R|F z#2*xi1WCdN06#RNRaP5OXk_YoV`Ia4cKS9xU;h_yM>s3+Swls!WkCowYs<0~rp92C z5IZb}MvZbusj=voEf_6U2@@2i)(*w9F5mucqC+nQL=l5yZ=XwhbC4^QFOhJj9mDk2 zPWvaW`v=eOom`f*!e6_)rWHKVaG*mr>S2c~3>*j#*nacnGR4@QJ-?=mE1yN1lJF+} z4iL)@Z6?WZ59Y^^K*+_@OWx~^2)sy=1HW;e!(f9={z5d9_KRqj?(aU6_POib^~kVB zay^NYUe1~AtR~~X#VHtQe=TpW>pvnja(6ij8a?|BUWzs+^$+VzhQ+l*j0*!*k=;}o z9CQ2MXDt|NW!oMzMKOQpWrV}$Uqtnn(SYk+3m+${pT}b!5lfV31U8w)77iRvS z8Qy<_=s(K}{|+IQEhS_@1YTqy%{0<}B)X{df&xjl20cVTML`7uND2s2K3YQvX;RJY z9gP(K!)*H=t5l~2D*k@^`;9pSZ#HTWAhox}CFicQ-?AvApWR8eQRfAKZw(bPK7jC&7-&`#5%5A7CK2c|;*8Op zo3raIQE|ggm%|=b=cVg1*ObeS;FyQq=7 zQ%~}Qxr9J(ImBjRb6UyjVu@QK>ZZS0(gu7;Ud+TGcJO_%vKuv}`K zTxZdv6}$L%U1$!>o)a(NR7u&nEm7m7Q8P6*4>jI2qblD!y=tARm>kkOx)8hX0%F7k z$Z*62bdtO=xp$mfaR|6Yt+YkALH;=OK9A;xF!CXJ0Nvx}lx9ajbikSJpedvCVbr_M z5}!Ip;SFI!bXLeS=m7C7gVi{kKoPz;F&MSSP#(A#)Hu{KX}Y z!*sFYBqU!fOzB9QV0^x++PgU z!96)8I_XIk`0|XaNOW|B;y`%VI^uN?Kr(y+MuC*=NtXpg=O{bmTVy+`?dEueOYZEq zI^Lb|2JlTx%-oE7df)RC^~|IYT_1Q81)L1PfwDEU3hsZ71ayzSF}~ceJPFg=`%;Qlt>* zu&&AD7KM-;-&!Vx+BquV)CS#Hv!zR#&Ef(Diwg>5&F-X?BJjkmt~CIWy$RbV*@Sp5B-9^C<}aiFJ}B$(U)v zu(8Frd%w#pNX&0K3`)7GlO@e}mCEC_5J+3cppe_Ki)0=>7E$6UCX(NgNLc(a&Aj?tqe8?H%VO_c`K@i0@MuqPO@9_b&ZgFrpX$8z>`=C{31`tP4aPZ)Jm&W>)%WnEV=k$WL z{{|dJ;x4?k>aj4os2K3%tgW^z#g)z%?%l~)(iEtgPCG3(V2@rBbOZ!t0mW*kAD+%} zifVthbjEeByTF#Dvr$TkkE0tSCneQO4&t>d_{8ndN-)t=p zg(smSFf_HaTDx!h42b@1ZV&UJqG>>Y&Fqd#UpnPPm)hO8l3$5{7xd=xqp19SDZV zmxfDKX{mWmG}p{TNVkxYSMUU#O?@D0$-f+JU+y(ZzkWuguewshq1ub-fA9l&QfOKx z$-T~3%nM_P>i#aMjZLf42jzit5vWHN#ViQJ*ip8=hEkD@{#pY0Un}yNJq_V zTosl;3A#+C5d2&*nrhXXNXWN1xy1K5)itB(Mcv>(9RzbF7TKLRY(NPH9H2Q%$xmxJ zdzZm^G_e&E`aWiq)@ciYIJiKq_H(w5Y$hGw!!8Qvq*gz>AOLIDBGiF-A|4rBj9-qS z*r0d=WyZf#L;C|2=H^J7zOEk$-O__KsC?cT?90A()3;W76D{Vo{WFSjCHc6c!~FkJOI81#CyMe}_E6z$xpy%}uH zD$^BItst{^R7*W=?3;C!^D;Lxm{#D+n!9R!%kxyj_xX-ch_Rwt>KacltvIR5l(jYQ z>LVCr$nAwP4ztGT;tMVBZK$jyp=g-lY@K*8qFGOrt9L&t2C}ryCrR0^XtF&Qh}6Zn z4J@C||Mjd~R^pEb6mO}PrtxFQt*Lr{e`L=@$=>ko%3nIzbm17sD+JH_GG0>ovn3Sub zG(qdD4@xKQQ_<2Yr#GZ+De}ILHL$UPk*le4KqyM#1arDU9Og*w;sp!7|IA?t6{_%t z#(41EL-Niniq~m1(uJd`*plZ-PtGH#DB_yxAIgl8Juy92VcU0M1IpwEChVGBBt0^= zx$!p_^MDyUPM{OQt~oqU~yk z(!65Kk?3JuM`JFqKkg^M!f{7aWN|Uh?Vw)za)*8sD+AMtnFcP=!3SQm>h@4nw3v9T zhcHHRY#}9HNz8~kBa4RJq(Bke%b>@kuzW!*N1gTnJLcmKrtLSYy&RUB56sI}$)<7y z@VF-p_%%)GjYY=xA9I5!YF8$5#)PWzi0sEFE?l_Pk`r(1{&wL!JPGi$zSm9EIG5^L zWtXy%PCWUydo%;J6;hH8LR&UKYeNarwt_fMUe~LU;ln($lqkDJs;6%wg@%Kg-J6Ku z5h{3anOd&4Op@H{1*Uy&U(VnvzM>j^DWh4=;E8PAoMp*$S5d=|Z@hSs^K(8=eBXj= zzm5vEoNK>3f8)z=|GqQ23zf(tWK$P*fg|`d7sjYlX1g=E>V=R~TUFM4NLs@LOq-}Q zC*6FmJq+$ZRW@%NAQI4e4w}b#%r*wjn|YlVmCe(LgXf-Pf5!=iJqDCdD1xCYi-0(2oO1998xg zShOuiL}d^`=(|BqZ^n3>ooR$0!<#Nw`5bD{k(j1hbYa+6jd zt@ut83~xpbIq&9KuC=@-;~8us6mUVSZ^qy{3tB`Hvqhn>#gJ-|5cbjBa7`l@M@E+C zVMRwDvh>4pd!h=+dk?f*WdLO|fa9(4wBZOwv^kwfcQSH+!P8LtyitYM;fN#>4O~jO z1QK{|z>Z=vW=RYf`Wu&&w{2*#-q%jMA!=APBom5EACvz=F@>e25)3!O5)Qo2<6i41 z^DJ_AxDnK~8*1x6j!|K7`H}=VVyx*Luj)|tp-qFI{HQ!&ZCg68ur#Wsx)^b1Ul>}H z^Cn`5Og~nlj?lcp;#aE1zfpg#3GJ6nT^U`;=#6{MCEW%qE!-W@d+dvv9LW5IeP!y2 zIqMiDIo?7NiHjfkxKEJ*JYqDj^W?wg+=6jj>$^79njd0{H^KFsLY+%-6j=hbWf@n)?2%KNqno2gR+9o#>}x>A z0V~Z&Za@++M+<7kVNGj>`Tb9;&`PURtWkarCe=$h*+wDR<~i7}XnBEh*uG_0+Ph1& z1^bC*%B-wrLcoH~58Mkf_2oIQBiJm(a_ z2&kGo{c8bpc*Yr5@x#+REaRJyZ%(wiLu? zmyKkdPZkx12*VCA)>K;Ma=kF^aY86mL4W6lx8RGcm@X%fWldGWGRA#}jkZ$LX0tS* zv8fup1nF^vx~yCBO;gPVbq{_-{JzQ@TLnDfjbieSwtDE=KvT(HhI*(&x!sB6bK0-} zf^EH#t^dyc9_R@W{#$J8KPM9rcWXPd|5=ty(~xyU(?tKQW4$qD8H^%MwG{Q@LD~nS zKSVKr2@2Z&iR>vY{C zUboJrFJOxI8IE#!SC0LTo&Wj{3krUGLV+;uu@Y=JlLyy&vBpYQmX~c@VFcrZJ-} zIK+?tjOC^%WO}o*Tav4EgoWv~B}$oJ3})V5F|K9dOb{D2%uKHjrGO#aOv4Nlj!w<; zXSXyjSBzgYapx(o9jI7X^t;);Tsqhcapy>L@=ON#Tj{jKxJrAN%Xu7Xy|1;oE$5`? zw_>KyejrR|L8?3Q8E^_&`c*mTrafh)fzLO|oOLqC!!u%C5BNF^aYk#uRZiG>o%8%*APD3IR1$yl#=Fnnp#a zH+J-WIWIYuq?s;s%~BhAGxjMpG6XFGUXiB5&`mk?_T1YW@jTi)@;umEj%w-2zldz5ElV?_acDG3#9lXS z0l7{_=@)L1v*YbT_wR1)seO?&zps0MOTORB_;`<%NX>)F2W=&`=nm4Ae(pa+QXGc_uJHS_7zT z47e{49f*+W$Yt@@bL5>$C%)QUa;ebAGNz zE$mtMCuU=#7)S~>{qSS*iJUv{!}b`uMVRg&{vHuWHlTwAR0^zh6C6=q&gg&t4^KVfrB}M*kO%NXl=^GYFp^H=crciyA(?Z zoW_H7**E-O+5dlJPh8jb4kzD0IN`S_^}lIg|K|!X>Eh__^nV9X8v3eu>evAa&@Wn; zu+*i7%O#(hDhsE>=ze^!yYdb?lwQ!qGFMkwj*e_K9x#Ekl*5{n@-7n&> zcu1L6aUQC$KB*qKbCAIbODD~q_^-Toj`^-u2tQw*5(Gi<2PJU{MQLI|5kO0dtcHGv z|HG~tkoD5$pROEfSm&zeV6ejOv%;>onsrvL9O(y?7{jUHV%0D2u^7bcx|ezvBT@`6 zkrE7xL9hf%hb2WB$^5B>E+YjL$u%2Kh9l zSY5Xxv*<^4(7!^37N>pL@R{zwbX69PYO?6OG&rQiGlT}yw6h)$LWODoS?sP^2Mxzs z9kJ`42TQ?+75>Z=$UHWObXS=|^4<1gKUeJ)r66q&4~&d0^mvY^ZfexDJhJiSSq?i( z;C)onX&VI1d9zBgI2Tk|vf3;yr1-L?b;gJbPN+v1s4SFSO^PZ|PT~Yt%d7wGF^PJ> zI9*YA!Sj*+5q6bGzK-|O72odsS2M0PCsV9G7v|w!cOO1+y4g-`NuhL}Cp*#ft8D(S z_u*nIq;fH zT8~!auH6#zg3{$|7CZdxcm}s{XZ?{4uLuG^>5(n~ z%CJ1aRiWg_+q00-4ETf?<31D*kK1OybDfU6Uqz^pFRf;V`+e0?&(vE&hpss{o4}M+ zri-EZ+L-aLs#@D2Wtc{c>2dG)hwLD8=Q~Irf~fLkQFnFQ^(u9-9+E5>6Smq@o2td5 znpZEt(4DkD!eN>RY~#WtU0j=euSl!G4n>|}?r=nA{83z4e64+&Pl~%Cnwa=Z_@tk~ z5f{S0n=|Sv!kSyM!Kyike$_Hws^iRfqv>C@c~dS9ODjLkk68kaZ~-St4(pBYfnEtM zw<8L|$X(Z5kE#K|1t%c+2MNXd6ZmjnQ*}qYGI$DD1yCJ4;kYtFrY0~X&R9V)vK87w z*PJ^*YJnws$b2-i+lAEoBL4h7Vt1TfZ9dI@9#J~;jnroXVN;aWVHOc~Z29+2#0#eS zf@A-N^deChIq3-JP^aLxJn~i1&+Hyp4;bcLVwOYp-d@Ou3m28*@b*=SOl z5RR!KoHBhx#rOxhbKWQ;vchDt!i!bSD|ZETyN0?)zrZLb%n_d>!ce=gW*d3{i2j?f zGKDOqi92j(yAJnuLM3|{?qYS0QYD_`u*!q!qjbXLRnKE=m);P>Tprmc?C{xA% zCRQn&@J!KlAU=m5`w+{X2z6pt5zUR^*d0gPWH1hT)YlMILM+6t67C%S zC5l@u?inL_tg~oL$b$+9A$`s~e1+h>p^i9XmH6Tgc@ECIC%5nE2kAKyG~H=P+%ZAj z=^K9P_6gWEze97_wG@1Y0JoF;YdDFEVMC38Vu0<>H6%8e`ELO~1LQEEU|{X*|4{-% zgZ#&8*`+ueAOHmdl8X!iLiYcc)Vu!YN?EIE>xrj{v89QWKo^ImtFU>b&AwPk%8e-v zXAf*kEb#`Y(?#O(PJ?61n)>2v7sr<*rb-6QrgQoyVz#HIw;>ajmduVigO#ES+yo5; z4HD)@(7*U<$qZSM7MnNC` z6OJl2AsZTPn;LPFyJd&&mAJW8Cf^rYvtT+)EZ};ol0c;~x7g%=O2!YV+A^FC-ljWk zJWGE(7%VOHu00Y!gTVdOYjcwdWa3ltX$9H6>`v$1#jeT|Sh!^$lQXT00UKE+<^*Vw zW>Y4^je74ln9pB~32g1ykRJ7k`{&VDsooktFHq#;Nf#{YcBhIEV!PN0OF#G4g)3~@ zd?g?pY=wJaw@1;F=fvS`b+v!aRpZ)<80~zG_M5PW%Xnaf9|EvlP5VF44yDs~lQn(E zQ&P%mR<0xUJy?zcWb^g6$Ss7b&H-3Ns3%p--m_E+&0Qw|G|$u3ur7#BTSrgc_-`<$ z))d+E93V+UFwhWwb>aoOvvfmZFn`Ve?S;TVs6TraFqppq*F#=yu>-BGeUG?^>T_>^pV%Z-7w zxOHdG8X`pP@oZu$oELptdDmZS7d{Dcm_%V>gxN(X|48@%pfQn)69_`HKoK3toZ zcCemR>7c0zA`p&iTq7To@Tt%>P1*E3d}Ytb2d7r7dg~=mEspe!`V+qa<;rtY<7$AH z&LaQM3BZk*W$^z{;;J;_oZ4Uey?VrAG!w)bZ7q zWaF_(8w~;5d}&34kVRsiv&`m4YgHQf)>t!p+9&JI^4x;f=H-&ks`D7*T^$s|^Z9kB zxK}IsGe4HNBg;Yk{GiJzPB;eg(LH3D|A?k{D=8p`c4K& z7lxp}g})p61CCG-9wdhVNJ7wGS) zfdn_+kz}(E(3A7Y54MZ;YstnlU z{{R#Nm`#WtyLvUD@poOhl!d)OQG!HM@40KD|3)d9fD#DAJ}?@k_2TcNYru8KP4E5t zgzenlppA@IZp;(mOj~(o_SpL)IKt>-FobdhC;$q(?FHBk68oe{pduyLk&;=$i*iMy zUq$fC2=;oOI|sf7oMxOir-lOxD8uidDz1R*#B~}#Y&V#T&gfR)d@=jT9>cE0jVa(fJkF~3wF7l3LEouo*Tbu${=+NU`ZHsSbbN zwQ>HwBao~-Z)eh;N6&KWCwNXo|qI@y&C!+ z=mcCHE05(xum9`zT=#czMLvYCin~HRGly)hz^nn*`>{h4PPp_cB8jyf-Tnc~$fkQp<eU9D;0}4veqiA-{_{hZ_Wc2fc?{VuVsLswyLg()1V| zB^u}!NO}@jmjx9D%<4>|$dd(Q?RC@iEsHL8TFCrLDECm#ypf<7p!Z=;l4ruym*Gx| zXT%up*y-1Ar~;_{717MGP|PTU;NiWQ4WYb!y9tz-IH|FJOqkdXLe2T;>*?{PU3=`3 z$&;Ji9T;3BM?VUco#BcGk!RKv1cqYt7_q6h40M}oRb)8DZF){%H*^llwD#)$#j@ym zscvB}k%k|6U9$fgP^DT8PIFPe2LZRAzn9k>zoF$Ufkb@U1*poX@4Juft6Rh^zUVv_-@!JC94$NDi=B zlw^{(wfKhCkj<7EBPOtune98cM4h%Bx)`UKNIILv0WNW;l`DR_;O46ld{#@s@1eEb zP1GZNmtNHVfK0_%Yk9ZtP9eBc{$wrxLt=@x_#1=~6TvpD@XGOn-?R!dv~xv<|Mkgw zv^C+Db7*ECTKQ_dsoZ*G?}{udG&g-1&FH8?2wgb!Xf$8H&>~9Rm}>?AB#}rcLAfoT zmDGo7jnbf=k9E^`!Lp0M6wo8VxsI&`$f;C=IYBDV6F0S?$nbpqtS-3sxus3bGlLW` zhx1JSgnc)y^;P1S?MUb>^@m9JK#2{d;abrN!mTV9hg@fv{wfYqG79t>+hWr94%JFX%I)QvdLonG!MA7( zq#JJuP!uJ*$|S3oxZkCzo3k%x3iY7LO1OS&=BQ1cRfH4k!DZzsmM+q;9NEMFH+S?I=i?}{cdklQui?)GL)d`ej11UWvj z)Dq?tXB=u1axt!{lmzRNd;#ZArW?a_(epKp*}D<@+2i)4^E(Hx+7WX}?Tt4(ee&M5 zydpP|Q~pbQ_+b(vXkhb2WIlIMPWG^BeC?;Y^#T3M@A~}I{FULgLLr?~ z*{v6#=RdSeTb?TWc@$@h5ZrX?r#vieVgAo>#XA#a=;b?D5y$>-!JhwJD^jZo=clXw z4fb%1$fItUbgFv^A zpdvvR4~3b~puh`e5r-5@iin1W7en`sBq6!`+RCx8&S^_2`1|g1$$cDfb@k}GS@dE|H;I6*~d&5o) zkRDk1L)8%GCps|I^dgVraI>!qP}g#t5Up=`G|9kg_uU(4-+GRB+9Hm*ijLBhmH7z zze}@5T$vTc1m=gf==gA?_7vLUhN_y!KUmwwSCRMQ>zPrRL~LWVl$I;yC5uR<8dD;g zOV=WYrm$PRfEFb7LonvWYYgdL8?0JoX=w?U^$Ga&A^ML=u8|At!-+{!nZ{w{#p^C@ zQ-m!2|JZ5K8jS${pPjdKIk3|efa=*-V>86_9U%~}SS?@8avX)(*8Um|FTA!Na=HoO zJ2YYfvFtd+w(;Uc7IY|Vz!95b&TI>1sxbx`^$$l}%iAE`fpU^g1V!RqHZm%F>1* zX!k~Ry`;};S7rfGE744v# zDSr*%@oW$3^3)~o-2wDQJaX%Ss5SG~ZQtTL0)(&G8^xPlef;Gc#_n?9j+f!cuj`i}gX z{oFB*A%>21Y91h)#QouURp6YODY+jITjg-zypu*vJey`&9mX_R)_LtZu+f<3=gS1A z9Siscvw1OTd4cb+)I95EE}KgN;bI=9gb1+?$pa%~_KIdw9YvIngjQxrgqlk_{XTWFNc#J1#S=*`rv zIFk82(Z2tvI>kUx@`YnXn*I{BvcI!7X6gB0OM9AzH3yZ{pjvuNrJTE zD?_D|3kQ@0f59CU@!<+b7+UlAXwj!d_-ClrZ1Bt~yH&Bcl>G7GrWN6^{2%9(LlBlxqSfD1U# z;{EW^oY+@?MU?2ldlpOn)@82Yto5(FSR>Q5A>D*4gL~SQzdMy5gP422gXvhyRI_a0 ztG*xr&|%}=!#zg(#uF~^x!-CjXFLQ(uKDXB@HJi42g>&sv>UN(+Qr+#izn7|!&~v) zb3h7&XbTXz*HkBI0pokkfFc(p7n(=X_Er{{5d*HLUUxMufm#%Kh1^h*$+pn+)mZ96 z7Bt#5*uzyKlZ`*49lnY7{@D6t=b1YO9tzIdr8XpxpUm$(cfTj%t7y)V-8Ye zGb_y<(M79SV~Q7i5}}99a*HXiYNR%2`x*>4WOF$^^$l#aE?ixNXcpoD&C|=TLGE=j zcG3njw@D*trLq)H&|5BtR{60re5;zzkT*M?2HIfG3~M)zpSn^qXAu&BYL<)~FBE0VXwd{8In^)`&Q1P)jOou?JyFuB9;WHY za;WyVHY!MdWYfQM_4Yj9TFEG$im3k3^D)e0@OCMuv{^}nixcV`6hiXP(laDL^WLgm zC9%>}rDTfutD1jVvDA&g$Mb3$9|@R*SJwF2>+c^pK*9V`Hj#G8(! znGTX*p1UHOQ4XVs2k*8346%-L&aVw33n175C#LPUf?sk z`~kCF*Z7Vu-%Tb1r4b-GI}T&@sh4=#o;n=?+R=ipkG%oIwwVc)dtdszLd9F645uf!gjE&#sfm6hqzFmXr z{N~oE_2Z&W7ZmYj^wnnrFv($X+*x&rgRvA*OvU~tNE|Z3+YD$-D#yoPoKxp^Q@VF)%fnbL{wlRVl41J-q7E#9D^jQiW5dO4Xb@+)+_oYa?cU{LKG3GA$`sN783w z$=8hN&cGQu%+D{?y^ZKjhxV!H@wb^V2WivKyfB??1oe?JHy+p}kx4a#%u-C_HXE}a zIt@bXg$nG&!nM6wHstA5OOwMoc1pGBA+FXw1VCzKPo{`+t%i(gBB>E}BXbe$<{6Yu zZt&j|imJTGRpGQ)I~S<+)~_X<^MrES2`{y8je&XBrahfx3c#3!WUjo=MIt$rX}Nv) z(*i`{jedt`GH#YHFCtu*hUGJ3Jq91_!_$uYT{28hv~rPuEz%#D?=x~sf$jZQ6*4B$ zxMPyd`VnB+-AO@kCb8?WE*QqW`=NGN*-IY%4`40Ta45=HKtFftJs<8mHO*aIcXppe zL|QL*w{`-w8%RB4Vk1o+vo0s{fr^?e0v06R9ra~m)&$8IgnyI3qnLDa%`dF~^W-d5 z34rSU_VKlTgD1@Y-RSWjJ}!sfnGVR zmNO4q(NH4W%s!PqB@un~ga!#I4jL7#<3}hLuk=vi6)!n`BY0h)Y*Ja=ko|cx1{~X+_%!%PoP0Qw?@S!ql+f+xkXf#DcGR?4@R%^gj}&;c zg|Hed0fA3!MCPn}RKL}jksF8<$}GO21M6kqaLmocx=3i@Znwfvk zhHWPeJ%I>ElAB&BFS-u+<^hv&?OA_;!_HU=fa^L4ZUL@YtS;XxB~LfY`cU#Y=0j%k zT$TCaJt>(nGma#gUo-rFlKP6G@i)8;6|aPp?;XwwFX&;HlB_)W3{uk{1y-?$%+5F7 zidcEJRSL7ivcU86z~}a#njj2`%shiH6qp=vb$n7&_ahc8RM=Yw`D8xcMixW4XC&x& zdkophHkF!^*jv?{a!jgF-(4SufaIGh!L~k5UFj-s^Jv;BxyotIFs&<>3tbokN{CR! zhgOv~I_x3$8Zgrg^tD;KWNP8r5oBB>uh5mtVy!JU-h34oSP{iOBGL%d;loV`Jd-67 z-;Zj!o3ho&QAL&DDx3g;K0Ig&B`wz<(biQGoxl1Q@7)wNWaBD+9J4 z%Ufh}%K;>doN7ELBBzzMwAlY3O??4ohE< zKVfx>i44@p$YIHBEP|&e8=r*7+MlG|2nZxP^E#wh$D(LY93WDhXVzFY1&!s&aRd{t zI(_tZILQoK=O*0{PmiCBd@vlC`GqE!=bE|@7K}cl7mQ{0L*hJ<&=jX2yshpbdH@Ds zn_?v!G$mGY8>O?yvqhzU<3S1)lZ@voZ%m&C>53M6+9AwEn2RaOlra8HSwuM-~<(J6Ns5Fz`a}ueR%;3v=*^SkzP+D6lEI zIiT-AkZwfuNpT&<^g&*W(b6{0V?7~hZ_qitz#{;alP!6*vy8_fXn&VGWjHqA&WyxK zk3`Q{Yoo(bE8c>+P}M=DpX+T7RTXtPP%X6!t%g59r65!+{7N-#l=~wuUeO5|E3r@W z9?O9PcV|~%P>jurYQ0b{Nqzeq=DF>tfqD0Q(%8PYoh9Niu%10)33MkKKOM?XpL-F? zPuJxd%8#CV5yEc|pAU5B_PYow*Qflll*`9w=;AsvIfZ1@I}N^bL2{8>-&pO^jQ)nw zqo2`OvY_12Gj6!#0@Hfj&^~174kNq5`!Q|3=>&^+<{!u1()Q)B!;SEDJ++|4u_+LT z7jcgNumCtkJquqW%zEJMD%*YHU6XD%y+h}-qeS*?l*xX5t7*W{o7KoO<#;rOM)ptm z)GH`i_bGT66#o@6vulwno*1CNPIcQ3WTknbrdfeg^EV_>&|ZzIXO_F!iF2fOg&be? zM1Q$5o?VlE4=uleTN=R_Kdkq{`m1cOhcUMy%n3p5g3nKxuF?j?F3F*`F>{UdB0oi3 zs1rMh@IvkqQ&U`!_qCdd@VrJQ3=dh43K+Laa3v%)=o=_B$DJQKNvJ64<<(&aTj0HDC@xPw^pLI(xv1DDEd_eX zhl~ApsUHtwTPct>L1H*V*Q>Y}5AOP4Ztxiv&Jop16?DlP0>{vLPdEq)?)s=P`eq5U zM`pJgHt`OcdE0J}I4A;ED^(H>Sc|z$a-9x_c|14l)fLtb(_I^gOURQ9JxfDlgE%YC z2EH8Pt)&IVJLM@EDo6ldJUUg%Jm_~>8qI^GdS%t3n9UN=M}}eAD{FL7;??AI9Ri(j z+jOq)@uq9fU7qXZh2h_idsYxmV7s$fgZRiYmrg?|g0&r5;~xUS!FaCLyry?$d?e$H zi+>Iy2{&jcf=f3}@V@&efz&2qVgm8XS}qQ9EzaD0#K(5tU7X?mw{(%2=+#Bgl48;| zk1Qr6Z#6~bv;5sFd`6EM{#~Vz%3SwsZ4ZR50}cZUBfYHj4>HtE=yN&@pl9Z=Y&yI|7S zUEV7@Qe1^^K9Moz;LZ1UYCiQzpHRvcBk67oK7GSf#gQ>Y*tx_NhHU2A{yXLQZ~ysB zKZ_zK)X*hT3_;oSHMl)Wne3-Q;gs9RL<(7&qy@YC%HfNG_3X|G`gyl)n_~woKdTJK zAi;tsS^Eiq6;+9acWY9pLOxyZTXSGAaQujyx$V|W=Ka&9mo7Ez^?Fyle4o^OxlJqgoD2b&Jb^58-W-pqS@h&0? zClHfB5%(Df5zh-&aODOLT=H5L{BQq4tTVM+uy)&IFDsYLH<)6%>)rhuC=SjzHvNIk za?KKt1AzJXVbE7?a*f+}H+kOV1MY~s`qN^7jE3(YbE~%!yK?AYeRB|Pw4nl_xM`94^bFv>>Yiqs21!Djsm`ZF2E%%OIF%%+UQx* zX7>TkFjj2h;|-EU^0xGwcJR#>*9|$~RDK7m<71(Y;<7ICy(v$}T=EJ-V$92*FPmMB z`>W0{j(0=pt6)tjW?ud_EOzHFhFqZMqg*)88DN(suO8*g;5e-C2Fh~2DEMPCI)q+R zVO}q!?PaI|k5fz)YsD!9y<8YVD39|M31lwe$8|e&Vl-@oJRjlJ9{F?#c|w*KW(8mr zHYKQu%!~y183$!-B&G+;m{g9Uud604o3%vS{XOJ?D-q0Z}|X zp4|w}PfuUrY$ z?EuSPr0)EIzE2!!C&L@kQwhfz-G%Gxit!m3@0z*N|9*7$1^kg=Dy5u#Uo(L`DjDb=^Fcs@Yw&0%%IpWh4WL|;Q4$0`bu4S-SM*i6=eF% zSbxqqcK+pr|8+b?$G$$!Q`4ugDUEYzL$GlKWmiJ?8QWDMULs=*DV`#s8pI*BkuIb= zV_`==Uhl+t3A3KM6V%`=(UDA{J6J=CF*y;|iV!&id5AFf=lal%ll%nonZVhv*W*3$ z--~i!Tl-OUd_=a`fux*(y7AzEo-`xF-=5&1*yMLO*#SumxcFu^oz=fl(>j~T5fuwJ zzT}R%;>qt*ecp6^mXmJ@py4mhl@J~$=ZbV%2p@e6`d4}#1IuMD_#Y*{DMGA(O5Oa;xB2fSfzq_s9@{ReLQwplEzy3T%6gMW>Sc3iH& zIHpE@tFj+NS=-0duDgbE`eC1S642zF+F;f&LM z{EuHEQ(ptdVfzjwfo|L`KI(*Mv_v|Af$d z&1H*VUj#-5##eDsi4^bn~v-n64O~BGzHrP%4k?o6?0yYHSdQckEXc08qHFI)u+gSXFn?tv>F;Uo* zLcqh39sV@y;B_#^&?9nXF;ynD9~_yo+RVyzyRc)+Zz>8InLpwW&y&i^(tuRIiM0kC zH6)EIKeb8O^>f*YsfP1o5;(D@^DpCOp5o;(0Ud0C{nVY=?yUQBVEzo;#b|dKusS-& zbAT)ldYaMVvLe(<#ki)!`c;>@r;-?d%==ofc${jGfB7h4-cc3)y*${3DM; zMoKdpy5}?P0 z+D&x4=3E(&-Fkhl5a^y{ax!-lF7;GsIFdv1U|b*HE`~e&!LyBdN?`qHEH=_bf?%XH z;=4MrOPAruHz{8CXh5364i0$TM{YSxmX>a*4!5JmG+u$Bq~}HP7@2CwDC6zt*&c!7 z5g4>C{7Q;XxQPm0NA0Kus^-q!;3%+e*6wkqyo5mGd3bRw3@ErrY7HIpOz*>C7@j@D z9;^A$e{jMs)2B@F^rXpu&wSw*b_{tQEOl8YvN<@SN}&6#@H)?#r{T3@ZsWOZ_WNEN z!PXVKouw&CeQB<#^QhX4a-kQ{GwZjkQ8=A`jpo4^nmCYCG5ICu**IM@cO~?erKl!C zMA#Qsms=mR*LAB(lo9^+zC0UHa0A`Y2pXJ_#k={CGi z?nv;_YrA%7@UXCHX8g3(@apxNQ#7$|>n%8|^b_bAMz=T1VS1E;#YXmK#PN}xDnDLO zHP()jE=3-4>-DHM3z-)lstxQ*)Z$cOMp-Kuw!>n&k&fni$cO@^JWZeYr9T>0moGx9hszWbjrGLRFz8its|2bam;84?=)*aUaXZ$I2yO6l~e!p2beEF zQthZx4NTe5c8?(d!fNxOb~QGKdy+Bipp=XJDBoDJY;8Vq%&{6xsz!S`W`z6+Lp3({ zyp^Pfx&Q&3hc1r~`Ez+abASDdBc_YHUubza+zDx^L$eu*f}74Jh{w}v{}0hjppE43bJu4M10!Cy)cG0jYMw5@IAE>)F&i! z!Oo)_V&?13_79v7;fnlzh=huc4E!DmTUkfelw=#bu?W5Rs)UA(F9& zER`jcEZLHX>`Phy?|h@tl=}Ve^UO2vJkOlZIq!Y%ymRh(?>)yqzwRR9St97TcZ$69 z2mGNU2aY&@0vohNkKYM2e`qc|JAP0VA@&VKgABTzKO5eHt~@CfurU*s>|>Re%-r)` zGjHMBcI{moWB;(gRz8O858*mD7H5c)7F$W)^%V8_a$o+8%4+J2JL8|GyD9$IjbSu9hnrzRV=^>szL2ld zZjcp4ooz2O;RFj>f5=F+)@k+Lj<>z&8>-*iwAc2u?qkPZLYog|DTQ$#UxMD)O&VFP zmUj5nWdzl&q7{-O7;P*+t4VTLD+xmM?TQDjOW(dPet`zl>TjV6S=rjmC?_G&=b+PD z+l=6;8kX|06u~T+yf@s(CO$KS&k1WoJCUdKV%!gWVJI1Tn>F#*hAQNcGVg0bKkYrMc zj-xWOfRJX{s(~$gI0KPlZQ^c*@&T*$>1`1FI?4WEz-%)GTuEtQaoN$oTuG#j{f|}M z-n;3pPKPiXX=^i09LppkZR>0}Cq;i$@6a6-X~4zMhWHC%;6f`>Dt11Efh3?C6vgMKbC7Q{)n8dcn@qu#`b9P8 z@j6zOrijLmC)8O^X|=8E5`(}~DonX8a^$eUt=#sQC@@d1165lC_XrWk(mivDgKMCB zH;-y7PhPBz)^aUcFrB#9AWuA2ouvGT>(&=%k%-IRP&*dC*bg+;6qI4taEtN$84 z<)rqlhl8%u!^dnU1ceroqek@O-PTX-jubq+Dd0B`433|T3OM>%#@E5r9gg^!6zlgd z1Ic}Gzr0gngdbC3WPdH(e;51{gcPqHFcqE%U$F$LYeJ6vDD;G5>R!RU$4-t80#_aE zTN&+K`^6S2ZW6b3-LoERP|77PNqu~&*&AiFr-ZPGqQNZ_Vaj4{ z3ne5(KWEyno<_oc{H(&0=BrQ1(^ZMU2aTq}1HD=lv@{xsBN#)DarxAewj`*cm4j`m zh2(|FV4esLmD#CJtYDHz*1ORj5Fq<=bcZ9Q8YlzV8ZhOT)cbV1PqLBaWP;VDRy%uS z&v@K(Nog6G`E76SL$%LiDa$&m-S2K&nsNwHHlzv z!snHYF23I>5>grUIOiCX9qOt1%p`ONYV%eoMG2gX$9?b_^P$MJ$^mut`(}#%JnHfI z`lRy_^JGw!cOoMf%$-9rIh9Q6(i&W%P7>Qf+brzl0>cqmr@g&s;XaUhxR6%C5s% z<{t|b(zsx$#oX!}nm8MIy>zRlIgY*N32T?MamBMa?>qc6GecP-UfS0oJVk!Dcq0SJ zd!LEaLtfq7rY9*2#7l5+%ev1olO)%2&90q%dGJz7C-@93Xhu;{Dn9Z=M`v{dgI1U) zq?Sf&Q!};TX>qq$+Py)v#HdeSJlZspW=z_>;e3-BEv>U6hm0+5~D<6D0>W3ouf7 zXxQQ97Qj2DqCF#{O>q6il_D+$I|@mo3xwu&k;2Pg)olq!m`J!72R)_&;)E4q1#LnW z+~cGTnPdtz>K445{AUc_s69Dz`0ixaQKU=B#IrXp5RMmOTt2z%rWK!wU>vRy=H1bb zBP;dQ6zLPkMoaL@%UzDHa4@8MdV{m9ShhIo)2XGn#k*>mfZ6C=OsV5 zR}}L@%NkCkxiv0WtJtzt3WyFAaAj(R>wzbD`n9oYM> zYrNFw#@cen?1xFoSRK;um9tuCo$o`XkITsP7!ob4XNn%p_FEs}ney-XvU;R%TGrO@ z<=tZ>L!0w>z6I+UNvOO@RaRHnY-eCV$o0_m_2T#*ZO3iJq)|VL9QPD~c*IM{C#V=6L3!4heGb8T^axCtCFJ5>-GLB!U(-)mQKARTl> zwMwfpMQkZ#Smk6+S^VfT2`ZSnc?W(C#7IK4nMX>`BP`W=U}dw>Z;pagU3%<_Qeu?T zvCPsgZg=;$pu3Ve(}z7_qFh zj5iG;316Q#*~BIG)(u&WtiUuAN*qfN6G+awMuLfLYbmK2mtwmTXw_Gbo5*GV>hfL$ z?N^V@>h)FmT7m)kPDjt2c1K=&&-|@Q;^d0N=Q{e;jWkT;%0aYm>0e1Qq^mJ?S5lp`HgnOgoIAN z!S+bn%Mawt58qaMZ9m?aWCCBB4QB0j@u;e8se{aY9Gn=g*>(F!|8p*#Pgh+s0^B_t z;DyP=`~UFRoLn58;4VlTxT}sktW}L)6{4bX{#=gkoCZX#^`rJmYdfKE7#+Bk4h+r< zKad{|K15(7PZtgbL(ng^!$MCkF4`Yh4lnBrTTr8r(y@t*VS-%|%=_V=A26Ep{|xvsAJ{dY^uH4p%D6sf z4@@|WfqhTEcG)NZ`PtLzDhf)PI!Xe_t4Qp5{2+u>!MJY#>hpjX_B`?<5eYKU}ynqFb}(TTZS(g{k|&XOXekG+2^e2GiOtt^Qp;{(6v|B3t~E(Y|u)80ChxQcMg2x1j^^Zaj$e!rBMdjoC; zbS#%idSC9}^P%IKj+-AFtKy36zf}A&Xo#x-H;XVGl4>-IIU@mx`O30ZUc9_z&t%q6SMUx53q%EiUwu5H5N z%dYN^$6e`!OT~R)jHRM)?o0jc@i8tHH`tG*>ICge{b%SOR|{?+8momBwZE31VQDPx zcmE6%t^Cn2uE*KXJ^%T;vCCbT<9A_9^b#wK{9SnGKYu5dxjzWw;9)`ee+T^;`se88 zE;hq=;eUtj#5%Fv_GdpF%g%`Xt=sk*x%U{u#(L#iYQ(@A2FyNCPCN;~|I~@YeEL68 CNzF?D diff --git a/examples/src/java/com/github/api/v2/services/example/CommitApiSample.java b/examples/src/java/com/github/api/v2/services/example/CommitApiSample.java index 2305143..eea920b 100644 --- a/examples/src/java/com/github/api/v2/services/example/CommitApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/CommitApiSample.java @@ -3,17 +3,8 @@ */ package com.github.api.v2.services.example; -import java.text.MessageFormat; import java.util.List; -import org.apache.commons.cli.BasicParser; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.OptionBuilder; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; - import com.github.api.v2.schema.Commit; import com.github.api.v2.schema.Repository; import com.github.api.v2.services.CommitService; @@ -24,101 +15,26 @@ */ public class CommitApiSample { - /** The Constant APPLICATION_KEY_OPTION. */ - private static final String APPLICATION_KEY_OPTION = "appid"; - - /** The Constant QUERY_OPTION. */ - private static final String QUERY_OPTION = "query"; - - /** The Constant HELP_OPTION. */ - private static final String HELP_OPTION = "help"; - /** * The main method. * * @param args the arguments */ public static void main(String[] args) { - Options options = buildOptions(); - try { - CommandLine line = new BasicParser().parse(options, args); - processCommandLine(line, options); - } catch(ParseException exp ) { - System.err.println(exp.getMessage()); - printHelp(options); - } + GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); + CommitService service = factory.createCommitService(); + + List commits = service.getCommits("facebook", "tornado", Repository.MASTER, "setup.py"); + System.out.println(commits.size()); + for (Commit commit : commits) { + printResult(commit); + } + Commit commit = service.getCommit("facebook", "tornado", "7b80c2f4db226d6fa3a7"); + printResult(commit); } - /** - * Process command line. - * - * @param line the line - * @param options the options - */ - private static void processCommandLine(CommandLine line, Options options) { - if(line.hasOption(HELP_OPTION)) { - printHelp(options); - } // else if(line.hasOption(APPLICATION_KEY_OPTION) && line.hasOption(QUERY_OPTION)) - { - GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); - CommitService service = factory.createCommitService(); - - List commits = service.getCommits("facebook", "tornado", Repository.MASTER, "setup.py"); - System.out.println(commits.size()); - for (Commit commit : commits) { - printResult(commit); - } - Commit commit = service.getCommit("facebook", "tornado", "7b80c2f4db226d6fa3a7"); - printResult(commit); - -// } else { -// printHelp(options); - } - } private static void printResult(Commit commit) { System.out.println(commit); } - - /** - * Builds the options. - * - * @return the options - */ - private static Options buildOptions() { - - Options opts = new Options(); - - String helpMsg = "Print this message."; - Option help = new Option(HELP_OPTION, helpMsg); - opts.addOption(help); - - String applicationKeyMsg = "You Application ID."; - OptionBuilder.withArgName("appid"); - OptionBuilder.hasArg(); - OptionBuilder.withDescription(applicationKeyMsg); - Option applicationKey = OptionBuilder.create(APPLICATION_KEY_OPTION); - opts.addOption(applicationKey); - - String queryMsg = "Search Query."; - OptionBuilder.withArgName("query"); - OptionBuilder.hasArg(); - OptionBuilder.withDescription(queryMsg); - Option query = OptionBuilder.create(QUERY_OPTION); - opts.addOption(query); - - return opts; - } - - /** - * Prints the help. - * - * @param options the options - */ - private static void printHelp(Options options) { - int width = 80; - String syntax = CommitApiSample.class.getName() + " "; - String header = MessageFormat.format("\nThe -{0} and -{1} options are required. All others are optional.", APPLICATION_KEY_OPTION, QUERY_OPTION); - new HelpFormatter().printHelp(width, syntax, header, options, null, false); - } } diff --git a/examples/src/java/com/github/api/v2/services/example/GistApiSample.java b/examples/src/java/com/github/api/v2/services/example/GistApiSample.java index a8f1ed3..b91cc6d 100644 --- a/examples/src/java/com/github/api/v2/services/example/GistApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/GistApiSample.java @@ -7,15 +7,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.text.MessageFormat; - -import org.apache.commons.cli.BasicParser; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.OptionBuilder; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; import com.github.api.v2.schema.Gist; import com.github.api.v2.services.GistService; @@ -26,98 +17,23 @@ */ public class GistApiSample { - /** The Constant APPLICATION_KEY_OPTION. */ - private static final String APPLICATION_KEY_OPTION = "appid"; - - /** The Constant QUERY_OPTION. */ - private static final String QUERY_OPTION = "query"; - - /** The Constant HELP_OPTION. */ - private static final String HELP_OPTION = "help"; - /** * The main method. * * @param args the arguments */ public static void main(String[] args) { - Options options = buildOptions(); - try { - CommandLine line = new BasicParser().parse(options, args); - processCommandLine(line, options); - } catch(ParseException exp ) { - System.err.println(exp.getMessage()); - printHelp(options); - } + GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); + GistService service = factory.createGistService(); + Gist gist = service.getGist("289179"); + printResult(gist); + System.out.println(convertStreamToString(service.getGistContent("289179", "TimeZoneDSTUtil.java"))); } - /** - * Process command line. - * - * @param line the line - * @param options the options - */ - private static void processCommandLine(CommandLine line, Options options) { - if(line.hasOption(HELP_OPTION)) { - printHelp(options); - } // else if(line.hasOption(APPLICATION_KEY_OPTION) && line.hasOption(QUERY_OPTION)) - { - GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); - GistService service = factory.createGistService(); - Gist gist = service.getGist("289179"); - printResult(gist); - System.out.println(convertStreamToString(service.getGistContent("289179", "TimeZoneDSTUtil.java"))); -// } else { -// printHelp(options); - } - } - private static void printResult(Gist gist) { System.out.println(gist); } - /** - * Builds the options. - * - * @return the options - */ - private static Options buildOptions() { - - Options opts = new Options(); - - String helpMsg = "Print this message."; - Option help = new Option(HELP_OPTION, helpMsg); - opts.addOption(help); - - String applicationKeyMsg = "You Application ID."; - OptionBuilder.withArgName("appid"); - OptionBuilder.hasArg(); - OptionBuilder.withDescription(applicationKeyMsg); - Option applicationKey = OptionBuilder.create(APPLICATION_KEY_OPTION); - opts.addOption(applicationKey); - - String queryMsg = "Search Query."; - OptionBuilder.withArgName("query"); - OptionBuilder.hasArg(); - OptionBuilder.withDescription(queryMsg); - Option query = OptionBuilder.create(QUERY_OPTION); - opts.addOption(query); - - return opts; - } - - /** - * Prints the help. - * - * @param options the options - */ - private static void printHelp(Options options) { - int width = 80; - String syntax = GistApiSample.class.getName() + " "; - String header = MessageFormat.format("\nThe -{0} and -{1} options are required. All others are optional.", APPLICATION_KEY_OPTION, QUERY_OPTION); - new HelpFormatter().printHelp(width, syntax, header, options, null, false); - } - /** * Convert stream to string. * diff --git a/examples/src/java/com/github/api/v2/services/example/IssueApiSample.java b/examples/src/java/com/github/api/v2/services/example/IssueApiSample.java index 0761148..202949a 100644 --- a/examples/src/java/com/github/api/v2/services/example/IssueApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/IssueApiSample.java @@ -3,17 +3,8 @@ */ package com.github.api.v2.services.example; -import java.text.MessageFormat; import java.util.List; -import org.apache.commons.cli.BasicParser; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.OptionBuilder; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; - import com.github.api.v2.schema.Issue; import com.github.api.v2.services.GitHubServiceFactory; import com.github.api.v2.services.IssueService; @@ -23,98 +14,23 @@ */ public class IssueApiSample { - /** The Constant APPLICATION_KEY_OPTION. */ - private static final String APPLICATION_KEY_OPTION = "appid"; - - /** The Constant QUERY_OPTION. */ - private static final String QUERY_OPTION = "query"; - - /** The Constant HELP_OPTION. */ - private static final String HELP_OPTION = "help"; - /** * The main method. * * @param args the arguments */ public static void main(String[] args) { - Options options = buildOptions(); - try { - CommandLine line = new BasicParser().parse(options, args); - processCommandLine(line, options); - } catch(ParseException exp ) { - System.err.println(exp.getMessage()); - printHelp(options); - } + GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); + IssueService service = factory.createIssueService(); + List issues = service.searchIssues("facebook", "tornado", Issue.State.OPEN, "type"); + for (Issue issue : issues) { + printResult(issue); + } + Issue issue = service.getIssue("facebook", "tornado", 1); + printResult(issue); } - /** - * Process command line. - * - * @param line the line - * @param options the options - */ - private static void processCommandLine(CommandLine line, Options options) { - if(line.hasOption(HELP_OPTION)) { - printHelp(options); - } else // if(line.hasOption(APPLICATION_KEY_OPTION) && line.hasOption(QUERY_OPTION)) - { - GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); - IssueService service = factory.createIssueService(); - List issues = service.searchIssues("facebook", "tornado", Issue.State.OPEN, "type"); - for (Issue issue : issues) { - printResult(issue); - } - Issue issue = service.getIssue("facebook", "tornado", 1); - printResult(issue); -// } else { -// printHelp(options); - } - } - private static void printResult(Issue issue) { System.out.println(issue); } - - /** - * Builds the options. - * - * @return the options - */ - private static Options buildOptions() { - - Options opts = new Options(); - - String helpMsg = "Print this message."; - Option help = new Option(HELP_OPTION, helpMsg); - opts.addOption(help); - - String applicationKeyMsg = "You Application ID."; - OptionBuilder.withArgName("appid"); - OptionBuilder.hasArg(); - OptionBuilder.withDescription(applicationKeyMsg); - Option applicationKey = OptionBuilder.create(APPLICATION_KEY_OPTION); - opts.addOption(applicationKey); - - String queryMsg = "Search Query."; - OptionBuilder.withArgName("query"); - OptionBuilder.hasArg(); - OptionBuilder.withDescription(queryMsg); - Option query = OptionBuilder.create(QUERY_OPTION); - opts.addOption(query); - - return opts; - } - - /** - * Prints the help. - * - * @param options the options - */ - private static void printHelp(Options options) { - int width = 80; - String syntax = IssueApiSample.class.getName() + " "; - String header = MessageFormat.format("\nThe -{0} and -{1} options are required. All others are optional.", APPLICATION_KEY_OPTION, QUERY_OPTION); - new HelpFormatter().printHelp(width, syntax, header, options, null, false); - } } diff --git a/examples/src/java/com/github/api/v2/services/example/NetworkApiSample.java b/examples/src/java/com/github/api/v2/services/example/NetworkApiSample.java index 7a2f4ca..0468469 100644 --- a/examples/src/java/com/github/api/v2/services/example/NetworkApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/NetworkApiSample.java @@ -3,17 +3,8 @@ */ package com.github.api.v2.services.example; -import java.text.MessageFormat; import java.util.List; -import org.apache.commons.cli.BasicParser; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.OptionBuilder; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; - import com.github.api.v2.schema.Commit; import com.github.api.v2.services.GitHubServiceFactory; import com.github.api.v2.services.NetworkService; @@ -23,96 +14,21 @@ */ public class NetworkApiSample { - /** The Constant APPLICATION_KEY_OPTION. */ - private static final String APPLICATION_KEY_OPTION = "appid"; - - /** The Constant QUERY_OPTION. */ - private static final String QUERY_OPTION = "query"; - - /** The Constant HELP_OPTION. */ - private static final String HELP_OPTION = "help"; - /** * The main method. * * @param args the arguments */ public static void main(String[] args) { - Options options = buildOptions(); - try { - CommandLine line = new BasicParser().parse(options, args); - processCommandLine(line, options); - } catch(ParseException exp ) { - System.err.println(exp.getMessage()); - printHelp(options); - } + GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); + NetworkService service = factory.createNetworkService(); + List commits = service.getNetworkData("facebook", "tornado", "7b80c2f4db226d6fa3a7f3dfa59277da1d642f91"); + for (Commit commit : commits) { + printResult(commit); + } } - /** - * Process command line. - * - * @param line the line - * @param options the options - */ - private static void processCommandLine(CommandLine line, Options options) { - if(line.hasOption(HELP_OPTION)) { - printHelp(options); - } // else if(line.hasOption(APPLICATION_KEY_OPTION) && line.hasOption(QUERY_OPTION)) - { - GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); - NetworkService service = factory.createNetworkService(); - List commits = service.getNetworkData("facebook", "tornado", "7b80c2f4db226d6fa3a7f3dfa59277da1d642f91"); - for (Commit commit : commits) { - printResult(commit); - } -// } else { -// printHelp(options); - } - } - private static void printResult(Commit commit) { System.out.println(commit); } - - /** - * Builds the options. - * - * @return the options - */ - private static Options buildOptions() { - - Options opts = new Options(); - - String helpMsg = "Print this message."; - Option help = new Option(HELP_OPTION, helpMsg); - opts.addOption(help); - - String applicationKeyMsg = "You Application ID."; - OptionBuilder.withArgName("appid"); - OptionBuilder.hasArg(); - OptionBuilder.withDescription(applicationKeyMsg); - Option applicationKey = OptionBuilder.create(APPLICATION_KEY_OPTION); - opts.addOption(applicationKey); - - String queryMsg = "Search Query."; - OptionBuilder.withArgName("query"); - OptionBuilder.hasArg(); - OptionBuilder.withDescription(queryMsg); - Option query = OptionBuilder.create(QUERY_OPTION); - opts.addOption(query); - - return opts; - } - - /** - * Prints the help. - * - * @param options the options - */ - private static void printHelp(Options options) { - int width = 80; - String syntax = NetworkApiSample.class.getName() + " "; - String header = MessageFormat.format("\nThe -{0} and -{1} options are required. All others are optional.", APPLICATION_KEY_OPTION, QUERY_OPTION); - new HelpFormatter().printHelp(width, syntax, header, options, null, false); - } } diff --git a/examples/src/java/com/github/api/v2/services/example/ObjectApiSample.java b/examples/src/java/com/github/api/v2/services/example/ObjectApiSample.java index 17fffd0..d14601f 100644 --- a/examples/src/java/com/github/api/v2/services/example/ObjectApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/ObjectApiSample.java @@ -7,17 +7,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.text.MessageFormat; import java.util.List; -import org.apache.commons.cli.BasicParser; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.OptionBuilder; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; - import com.github.api.v2.schema.Blob; import com.github.api.v2.schema.Tree; import com.github.api.v2.services.GitHubServiceFactory; @@ -28,58 +19,25 @@ */ public class ObjectApiSample { - /** The Constant APPLICATION_KEY_OPTION. */ - private static final String APPLICATION_KEY_OPTION = "appid"; - - /** The Constant QUERY_OPTION. */ - private static final String QUERY_OPTION = "query"; - - /** The Constant HELP_OPTION. */ - private static final String HELP_OPTION = "help"; - /** * The main method. * * @param args the arguments */ public static void main(String[] args) { - Options options = buildOptions(); - try { - CommandLine line = new BasicParser().parse(options, args); - processCommandLine(line, options); - } catch(ParseException exp ) { - System.err.println(exp.getMessage()); - printHelp(options); - } + GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); + ObjectService service = factory.createObjectService(); + List trees = service.getTree("facebook", "tornado", "7b80c2f4db226d6fa3a7"); + for (Tree tree : trees) { + printResult(tree); + } + List blobs = service.getBlobs("facebook", "tornado", "7b80c2f4db226d6fa3a7"); + for (Blob blob : blobs) { + printResult(blob); + } + System.out.println(convertStreamToString(service.getObjectContent("facebook", "tornado", "7b80c2f4db226d6fa3a7f3dfa59277da1d642f91"))); } - /** - * Process command line. - * - * @param line the line - * @param options the options - */ - private static void processCommandLine(CommandLine line, Options options) { - if(line.hasOption(HELP_OPTION)) { - printHelp(options); - } // else if(line.hasOption(APPLICATION_KEY_OPTION) && line.hasOption(QUERY_OPTION)) - { - GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); - ObjectService service = factory.createObjectService(); - List trees = service.getTree("facebook", "tornado", "7b80c2f4db226d6fa3a7"); - for (Tree tree : trees) { - printResult(tree); - } - List blobs = service.getBlobs("facebook", "tornado", "7b80c2f4db226d6fa3a7"); - for (Blob blob : blobs) { - printResult(blob); - } - System.out.println(convertStreamToString(service.getObjectContent("facebook", "tornado", "7b80c2f4db226d6fa3a7f3dfa59277da1d642f91"))); -// } else { -// printHelp(options); - } - } - private static void printResult(Blob blob) { System.out.println(blob); } @@ -88,48 +46,6 @@ private static void printResult(Tree tree) { System.out.println(tree); } - /** - * Builds the options. - * - * @return the options - */ - private static Options buildOptions() { - - Options opts = new Options(); - - String helpMsg = "Print this message."; - Option help = new Option(HELP_OPTION, helpMsg); - opts.addOption(help); - - String applicationKeyMsg = "You Application ID."; - OptionBuilder.withArgName("appid"); - OptionBuilder.hasArg(); - OptionBuilder.withDescription(applicationKeyMsg); - Option applicationKey = OptionBuilder.create(APPLICATION_KEY_OPTION); - opts.addOption(applicationKey); - - String queryMsg = "Search Query."; - OptionBuilder.withArgName("query"); - OptionBuilder.hasArg(); - OptionBuilder.withDescription(queryMsg); - Option query = OptionBuilder.create(QUERY_OPTION); - opts.addOption(query); - - return opts; - } - - /** - * Prints the help. - * - * @param options the options - */ - private static void printHelp(Options options) { - int width = 80; - String syntax = ObjectApiSample.class.getName() + " "; - String header = MessageFormat.format("\nThe -{0} and -{1} options are required. All others are optional.", APPLICATION_KEY_OPTION, QUERY_OPTION); - new HelpFormatter().printHelp(width, syntax, header, options, null, false); - } - /** * Convert stream to string. * diff --git a/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java b/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java index 06efd19..1241f66 100644 --- a/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java @@ -3,18 +3,9 @@ */ package com.github.api.v2.services.example; -import java.text.MessageFormat; import java.util.List; import java.util.Map; -import org.apache.commons.cli.BasicParser; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.OptionBuilder; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; - import com.github.api.v2.schema.Language; import com.github.api.v2.schema.Repository; import com.github.api.v2.services.GitHubServiceFactory; @@ -27,101 +18,26 @@ */ public class RepositoryApiSample { - /** The Constant APPLICATION_KEY_OPTION. */ - private static final String APPLICATION_KEY_OPTION = "appid"; - - /** The Constant QUERY_OPTION. */ - private static final String QUERY_OPTION = "query"; - - /** The Constant HELP_OPTION. */ - private static final String HELP_OPTION = "help"; - /** * The main method. * * @param args the arguments */ public static void main(String[] args) { - Options options = buildOptions(); - try { - CommandLine line = new BasicParser().parse(options, args); - processCommandLine(line, options); - } catch(ParseException exp ) { - System.err.println(exp.getMessage()); - printHelp(options); - } + GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); + RepositoryService service = factory.createRepositoryService(); + List repositories = service.searchRepositories("hadoop"); + for (Repository repository : repositories) { + printResult(repository); + } + Map breakDown = service.getLanguageBreakdown("facebook", "tornado"); + System.out.println(breakDown); + service.setAuthentication(new OAuthAuthentication(TestConstants.TEST_ACCESS_TOKEN)); + List pushableRepositories = service.getPushableRepositories(); + System.out.println(pushableRepositories.size()); } - /** - * Process command line. - * - * @param line the line - * @param options the options - */ - private static void processCommandLine(CommandLine line, Options options) { - if(line.hasOption(HELP_OPTION)) { - printHelp(options); - } else // if(line.hasOption(APPLICATION_KEY_OPTION) && line.hasOption(QUERY_OPTION)) - { - GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); - RepositoryService service = factory.createRepositoryService(); - List repositories = service.searchRepositories("hadoop"); - for (Repository repository : repositories) { - printResult(repository); - } - Map breakDown = service.getLanguageBreakdown("facebook", "tornado"); - System.out.println(breakDown); - service.setAuthentication(new OAuthAuthentication(TestConstants.TEST_ACCESS_TOKEN)); - List pushableRepositories = service.getPushableRepositories(); - System.out.println(pushableRepositories.size()); -// } else { -// printHelp(options); - } - } - private static void printResult(Repository repository) { System.out.println(repository); } - - /** - * Builds the options. - * - * @return the options - */ - private static Options buildOptions() { - - Options opts = new Options(); - - String helpMsg = "Print this message."; - Option help = new Option(HELP_OPTION, helpMsg); - opts.addOption(help); - - String applicationKeyMsg = "You Application ID."; - OptionBuilder.withArgName("appid"); - OptionBuilder.hasArg(); - OptionBuilder.withDescription(applicationKeyMsg); - Option applicationKey = OptionBuilder.create(APPLICATION_KEY_OPTION); - opts.addOption(applicationKey); - - String queryMsg = "Search Query."; - OptionBuilder.withArgName("query"); - OptionBuilder.hasArg(); - OptionBuilder.withDescription(queryMsg); - Option query = OptionBuilder.create(QUERY_OPTION); - opts.addOption(query); - - return opts; - } - - /** - * Prints the help. - * - * @param options the options - */ - private static void printHelp(Options options) { - int width = 80; - String syntax = RepositoryApiSample.class.getName() + " "; - String header = MessageFormat.format("\nThe -{0} and -{1} options are required. All others are optional.", APPLICATION_KEY_OPTION, QUERY_OPTION); - new HelpFormatter().printHelp(width, syntax, header, options, null, false); - } } diff --git a/examples/src/java/com/github/api/v2/services/example/UserApiSample.java b/examples/src/java/com/github/api/v2/services/example/UserApiSample.java index dd8aa0f..94e199d 100644 --- a/examples/src/java/com/github/api/v2/services/example/UserApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/UserApiSample.java @@ -3,17 +3,8 @@ */ package com.github.api.v2.services.example; -import java.text.MessageFormat; import java.util.List; -import org.apache.commons.cli.BasicParser; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.OptionBuilder; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; - import com.github.api.v2.schema.User; import com.github.api.v2.services.GitHubServiceFactory; import com.github.api.v2.services.UserService; @@ -22,15 +13,6 @@ * The Class WebSample. */ public class UserApiSample { - - /** The Constant APPLICATION_KEY_OPTION. */ - private static final String APPLICATION_KEY_OPTION = "appid"; - - /** The Constant QUERY_OPTION. */ - private static final String QUERY_OPTION = "query"; - - /** The Constant HELP_OPTION. */ - private static final String HELP_OPTION = "help"; /** * The main method. @@ -38,83 +20,17 @@ public class UserApiSample { * @param args the arguments */ public static void main(String[] args) { - Options options = buildOptions(); - try { - CommandLine line = new BasicParser().parse(options, args); - processCommandLine(line, options); - } catch(ParseException exp ) { - System.err.println(exp.getMessage()); - printHelp(options); - } + GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); + UserService service = factory.createUserService(); + List users = service.searchUsersByName("john"); + for (User user : users) { + printResult(user); + } + User user = service.getUserByEmail("nabeelmukhtar@yahoo.com"); + printResult(user); } - /** - * Process command line. - * - * @param line the line - * @param options the options - */ - private static void processCommandLine(CommandLine line, Options options) { - if(line.hasOption(HELP_OPTION)) { - printHelp(options); - } else // if(line.hasOption(APPLICATION_KEY_OPTION) && line.hasOption(QUERY_OPTION)) - { - GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); - UserService service = factory.createUserService(); - List users = service.searchUsersByName("john"); - for (User user : users) { - printResult(user); - } - User user = service.getUserByEmail("nabeelmukhtar@yahoo.com"); - printResult(user); -// } else { -// printHelp(options); - } - } - private static void printResult(User user) { System.out.println(user); } - - /** - * Builds the options. - * - * @return the options - */ - private static Options buildOptions() { - - Options opts = new Options(); - - String helpMsg = "Print this message."; - Option help = new Option(HELP_OPTION, helpMsg); - opts.addOption(help); - - String applicationKeyMsg = "You Application ID."; - OptionBuilder.withArgName("appid"); - OptionBuilder.hasArg(); - OptionBuilder.withDescription(applicationKeyMsg); - Option applicationKey = OptionBuilder.create(APPLICATION_KEY_OPTION); - opts.addOption(applicationKey); - - String queryMsg = "Search Query."; - OptionBuilder.withArgName("query"); - OptionBuilder.hasArg(); - OptionBuilder.withDescription(queryMsg); - Option query = OptionBuilder.create(QUERY_OPTION); - opts.addOption(query); - - return opts; - } - - /** - * Prints the help. - * - * @param options the options - */ - private static void printHelp(Options options) { - int width = 80; - String syntax = UserApiSample.class.getName() + " "; - String header = MessageFormat.format("\nThe -{0} and -{1} options are required. All others are optional.", APPLICATION_KEY_OPTION, QUERY_OPTION); - new HelpFormatter().printHelp(width, syntax, header, options, null, false); - } } diff --git a/github-api.txt b/github-api.txt index 12a3797..8e08093 100644 --- a/github-api.txt +++ b/github-api.txt @@ -10,4 +10,4 @@ githubapitest Commit class is not complete. Network and commit should be separate. -Remove commons cli. \ No newline at end of file +X. Remove commons cli. \ No newline at end of file From 532cb04847955d07cf46b50a064e22bf256b8e1f Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Wed, 14 Jul 2010 18:09:27 +0500 Subject: [PATCH 03/95] JAutoDoc --- .settings/net.sf.jautodoc.prefs | 3 +- .../api/v2/services/AsyncResponseHandler.java | 26 +- .../github/api/v2/services/CommitService.java | 44 +- .../github/api/v2/services/GistService.java | 32 +- .../api/v2/services/GitHubAuthenticator.java | 16 +- .../api/v2/services/GitHubCommunicator.java | 40 +- .../api/v2/services/GitHubException.java | 22 +- .../github/api/v2/services/GitHubService.java | 3 +- .../api/v2/services/GitHubServiceFactory.java | 84 +- .../github/api/v2/services/IssueService.java | 161 ++- .../api/v2/services/NetworkService.java | 44 +- .../github/api/v2/services/OAuthService.java | 72 +- .../github/api/v2/services/ObjectService.java | 57 +- .../api/v2/services/RepositoryService.java | 264 +++- .../github/api/v2/services/UserService.java | 126 +- .../api/v2/services/auth/Authentication.java | 3 +- .../auth/HeaderBasedAuthentication.java | 9 +- .../auth/LoginPasswordAuthentication.java | 39 +- .../auth/LoginTokenAuthentication.java | 32 +- .../v2/services/auth/OAuthAuthentication.java | 23 +- .../auth/ParameterBasedAuthentication.java | 9 +- .../constant/ApplicationConstants.java | 99 +- .../v2/services/constant/GitHubApiUrls.java | 428 +++++-- .../v2/services/constant/ParameterNames.java | 57 +- .../v2/services/impl/BaseGitHubService.java | 44 +- .../v2/services/impl/CommitServiceImpl.java | 15 +- .../api/v2/services/impl/GistServiceImpl.java | 12 +- .../v2/services/impl/GitHubApiGateway.java | 117 +- .../v2/services/impl/IssueServiceImpl.java | 39 +- .../v2/services/impl/NetworkServiceImpl.java | 16 +- .../v2/services/impl/OAuthServiceImpl.java | 16 +- .../v2/services/impl/ObjectServiceImpl.java | 15 +- .../services/impl/RepositoryServiceImpl.java | 84 +- .../api/v2/services/impl/UserServiceImpl.java | 51 +- .../github/api/v2/services/util/Base64.java | 1109 ++++++----------- .../com/github/api/v2/services/AllTests.java | 11 + .../v2/services/BaseGitHubServiceTest.java | 24 +- .../api/v2/services/CommitServiceTest.java | 23 + .../api/v2/services/GistServiceTest.java | 23 + .../api/v2/services/IssueServiceTest.java | 50 + .../api/v2/services/NetworkServiceTest.java | 23 + .../api/v2/services/OAuthServiceTest.java | 2 +- .../api/v2/services/ObjectServiceTest.java | 26 + .../v2/services/RepositoryServiceTest.java | 92 ++ .../api/v2/services/UserServiceTest.java | 59 +- .../v2/services/constant/TestConstants.java | 44 +- .../v2/services/example/CommitApiSample.java | 17 +- .../v2/services/example/GistApiSample.java | 20 +- .../v2/services/example/IssueApiSample.java | 17 +- .../v2/services/example/NetworkApiSample.java | 17 +- .../api/v2/services/example/OAuthExample.java | 16 +- .../v2/services/example/ObjectApiSample.java | 26 +- .../services/example/RepositoryApiSample.java | 17 +- .../v2/services/example/UserApiSample.java | 17 +- .../java/com/github/api/v2/schema/Blob.java | 74 +- .../com/github/api/v2/schema/Comment.java | 79 +- .../java/com/github/api/v2/schema/Commit.java | 197 ++- .../java/com/github/api/v2/schema/Delta.java | 28 +- .../java/com/github/api/v2/schema/Gist.java | 64 +- .../java/com/github/api/v2/schema/Id.java | 17 +- .../java/com/github/api/v2/schema/Issue.java | 158 ++- .../java/com/github/api/v2/schema/Key.java | 39 +- .../com/github/api/v2/schema/Language.java | 128 +- .../com/github/api/v2/schema/Network.java | 39 +- .../java/com/github/api/v2/schema/Plan.java | 52 +- .../com/github/api/v2/schema/Repository.java | 321 ++++- .../java/com/github/api/v2/schema/Tree.java | 75 +- .../java/com/github/api/v2/schema/User.java | 256 +++- .../com/github/api/v2/schema/ValueEnum.java | 3 + 69 files changed, 3896 insertions(+), 1369 deletions(-) diff --git a/.settings/net.sf.jautodoc.prefs b/.settings/net.sf.jautodoc.prefs index 30af8af..e3e5dd3 100644 --- a/.settings/net.sf.jautodoc.prefs +++ b/.settings/net.sf.jautodoc.prefs @@ -1,6 +1,7 @@ -#Thu Jun 17 12:36:56 GMT+05:00 2010 +#Wed Jul 14 18:06:56 GMT+05:00 2010 add_todo=false eclipse.preferences.version=1 mode=mode_replace project_specific_settings=true replacements=\n\n\nGets the\nSets the\nAdds the\nEdits the\nRemoves the\nInits the\nParses the\nCreates the\nBuilds the\nChecks if is\nPrints the\nChecks for\n\n\n +use_internal_formatter=true diff --git a/core/src/main/java/com/github/api/v2/services/AsyncResponseHandler.java b/core/src/main/java/com/github/api/v2/services/AsyncResponseHandler.java index 5bb4bb9..5959c8e 100644 --- a/core/src/main/java/com/github/api/v2/services/AsyncResponseHandler.java +++ b/core/src/main/java/com/github/api/v2/services/AsyncResponseHandler.java @@ -15,27 +15,29 @@ public abstract class AsyncResponseHandler { private Future future; /** - * Sets the future. - * - * @param future the new future - */ + * Sets the future. + * + * @param future + * the new future + */ public void setFuture(Future future) { this.future = future; } /** - * Gets the future. - * - * @return the future - */ + * Gets the future. + * + * @return the future + */ public Future getFuture() { return future; } /** - * Handle response. - * - * @param response the response - */ + * Handle response. + * + * @param response + * the response + */ public abstract void handleResponse(T response); } diff --git a/core/src/main/java/com/github/api/v2/services/CommitService.java b/core/src/main/java/com/github/api/v2/services/CommitService.java index bab34f6..40d6284 100644 --- a/core/src/main/java/com/github/api/v2/services/CommitService.java +++ b/core/src/main/java/com/github/api/v2/services/CommitService.java @@ -8,11 +8,51 @@ import com.github.api.v2.schema.Commit; /** - * @author nmukhtar - * + * The Interface CommitService. */ public interface CommitService extends GitHubService { + + /** + * Gets the commits. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param branch + * the branch + * + * @return the commits + */ public List getCommits(String userName, String repositoryName, String branch); + + /** + * Gets the commits. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param branch + * the branch + * @param filePath + * the file path + * + * @return the commits + */ public List getCommits(String userName, String repositoryName, String branch, String filePath); + + /** + * Gets the commit. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param sha + * the sha + * + * @return the commit + */ public Commit getCommit(String userName, String repositoryName, String sha); } diff --git a/core/src/main/java/com/github/api/v2/services/GistService.java b/core/src/main/java/com/github/api/v2/services/GistService.java index 01c00e9..3dd2083 100644 --- a/core/src/main/java/com/github/api/v2/services/GistService.java +++ b/core/src/main/java/com/github/api/v2/services/GistService.java @@ -9,11 +9,39 @@ import com.github.api.v2.schema.Gist; /** - * @author nmukhtar - * + * The Interface GistService. */ public interface GistService extends GitHubService { + + /** + * Gets the gist. + * + * @param gistId + * the gist id + * + * @return the gist + */ public Gist getGist(String gistId); + + /** + * Gets the gist content. + * + * @param gistId + * the gist id + * @param fileName + * the file name + * + * @return the gist content + */ public InputStream getGistContent(String gistId, String fileName); + + /** + * Gets the user gists. + * + * @param userName + * the user name + * + * @return the user gists + */ public List getUserGists(String userName); } diff --git a/core/src/main/java/com/github/api/v2/services/GitHubAuthenticator.java b/core/src/main/java/com/github/api/v2/services/GitHubAuthenticator.java index e661a2f..1f05683 100644 --- a/core/src/main/java/com/github/api/v2/services/GitHubAuthenticator.java +++ b/core/src/main/java/com/github/api/v2/services/GitHubAuthenticator.java @@ -7,27 +7,31 @@ /** - * The Interface GoogleSearchAuthenticationClient. + * The Interface GitHubAuthenticator. */ public interface GitHubAuthenticator extends GitHubCommunicator { /** - * Sets the application key. - * @param authentication TODO - */ + * Sets the authentication. + * + * @param authentication + * the new authentication + */ public void setAuthentication(Authentication authentication); /** * Sets the user ip address. * - * @param userIpAddress the new user ip address + * @param userIpAddress + * the new user ip address */ public void setUserIpAddress(String userIpAddress); /** * Sets the referrer. * - * @param referrer the new referrer + * @param referrer + * the new referrer */ public void setReferrer(String referrer); } diff --git a/core/src/main/java/com/github/api/v2/services/GitHubCommunicator.java b/core/src/main/java/com/github/api/v2/services/GitHubCommunicator.java index 612cc5f..dc19f2a 100644 --- a/core/src/main/java/com/github/api/v2/services/GitHubCommunicator.java +++ b/core/src/main/java/com/github/api/v2/services/GitHubCommunicator.java @@ -6,36 +6,40 @@ import java.util.Map; /** - * The Interface GoogleSearchCommunicationClient. + * The Interface GitHubCommunicator. */ public interface GitHubCommunicator { /** - * Sets the request headers. - * - * @param requestHeaders the request headers - */ + * Sets the request headers. + * + * @param requestHeaders + * the request headers + */ public void setRequestHeaders(Map requestHeaders); /** - * Gets the request headers. - * - * @return the request headers - */ + * Gets the request headers. + * + * @return the request headers + */ public Map getRequestHeaders(); /** - * Adds the request header. - * - * @param headerName the header name - * @param headerValue the header value - */ + * Adds the request header. + * + * @param headerName + * the header name + * @param headerValue + * the header value + */ public void addRequestHeader(String headerName, String headerValue); /** - * Removes the request header. - * - * @param headerName the header name - */ + * Removes the request header. + * + * @param headerName + * the header name + */ public void removeRequestHeader(String headerName); } diff --git a/core/src/main/java/com/github/api/v2/services/GitHubException.java b/core/src/main/java/com/github/api/v2/services/GitHubException.java index 88f16ae..887a63c 100644 --- a/core/src/main/java/com/github/api/v2/services/GitHubException.java +++ b/core/src/main/java/com/github/api/v2/services/GitHubException.java @@ -4,7 +4,7 @@ package com.github.api.v2.services; /** - * The Class GoogleSearchException. + * The Class GitHubException. */ public class GitHubException extends RuntimeException { @@ -12,33 +12,37 @@ public class GitHubException extends RuntimeException { private static final long serialVersionUID = -2392119987027760999L; /** - * Instantiates a new google search exception. + * Instantiates a new git hub exception. */ public GitHubException() {} /** - * Instantiates a new google search exception. + * Instantiates a new git hub exception. * - * @param message the message + * @param message + * the message */ public GitHubException(String message) { super(message); } /** - * Instantiates a new google search exception. + * Instantiates a new git hub exception. * - * @param cause the cause + * @param cause + * the cause */ public GitHubException(Throwable cause) { super(cause); } /** - * Instantiates a new google search exception. + * Instantiates a new git hub exception. * - * @param message the message - * @param cause the cause + * @param message + * the message + * @param cause + * the cause */ public GitHubException(String message, Throwable cause) { super(message, cause); diff --git a/core/src/main/java/com/github/api/v2/services/GitHubService.java b/core/src/main/java/com/github/api/v2/services/GitHubService.java index 798546b..58cf636 100644 --- a/core/src/main/java/com/github/api/v2/services/GitHubService.java +++ b/core/src/main/java/com/github/api/v2/services/GitHubService.java @@ -4,8 +4,7 @@ package com.github.api.v2.services; /** - * @author nmukhtar - * + * The Interface GitHubService. */ public interface GitHubService extends GitHubAuthenticator { diff --git a/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java b/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java index 4546b7a..f2ca644 100644 --- a/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java +++ b/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java @@ -16,92 +16,98 @@ /** - * A factory for creating GoogleSearchQuery objects. + * A factory for creating GitHubService objects. */ public class GitHubServiceFactory { /** - * Instantiates a new google search query factory. - * - * @param applicationKey the application key - */ + * Instantiates a new git hub service factory. + */ private GitHubServiceFactory() { } /** - * New instance. - * - * @param applicationKey the application key - * - * @return the google search query factory - */ + * New instance. + * + * @return the git hub service factory + */ public static GitHubServiceFactory newInstance() { return new GitHubServiceFactory(); } /** - * New blog search query. - * - * @return the blog search query - */ + * Creates a new GitHubService object. + * + * @return the commit service + */ public CommitService createCommitService() { return new CommitServiceImpl(); } /** - * New book search query. - * - * @return the book search query - */ + * Creates a new GitHubService object. + * + * @return the gist service + */ public GistService createGistService() { return new GistServiceImpl(); } /** - * New image search query. - * - * @return the image search query - */ + * Creates a new GitHubService object. + * + * @return the issue service + */ public IssueService createIssueService() { return new IssueServiceImpl(); } /** - * New local search query. - * - * @return the local search query - */ + * Creates a new GitHubService object. + * + * @return the network service + */ public NetworkService createNetworkService() { return new NetworkServiceImpl(); } /** - * New news search query. - * - * @return the news search query - */ + * Creates a new GitHubService object. + * + * @return the object service + */ public ObjectService createObjectService() { return new ObjectServiceImpl(); } /** - * New patent search query. - * - * @return the patent search query - */ + * Creates a new GitHubService object. + * + * @return the repository service + */ public RepositoryService createRepositoryService() { return new RepositoryServiceImpl(); } /** - * New video search query. - * - * @return the video search query - */ + * Creates a new GitHubService object. + * + * @return the user service + */ public UserService createUserService() { return new UserServiceImpl(); } + /** + * Creates a new GitHubService object. + * + * @param clientId + * the client id + * @param secret + * the secret + * + * @return the o auth service + */ public OAuthService createOAuthService(String clientId, String secret) { return new OAuthServiceImpl(clientId, secret); } diff --git a/core/src/main/java/com/github/api/v2/services/IssueService.java b/core/src/main/java/com/github/api/v2/services/IssueService.java index 4ba488c..33a29f3 100644 --- a/core/src/main/java/com/github/api/v2/services/IssueService.java +++ b/core/src/main/java/com/github/api/v2/services/IssueService.java @@ -10,21 +10,178 @@ import com.github.api.v2.schema.Issue.State; /** - * @author nmukhtar - * + * The Interface IssueService. */ public interface IssueService extends GitHubService { + + /** + * Search issues. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param state + * the state + * @param keyword + * the keyword + * + * @return the list< issue> + */ public List searchIssues(String userName, String repositoryName, State state, String keyword); + + /** + * Gets the issues. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param state + * the state + * + * @return the issues + */ public List getIssues(String userName, String repositoryName, State state); + + /** + * Gets the issue. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param issueNumber + * the issue number + * + * @return the issue + */ public Issue getIssue(String userName, String repositoryName, int issueNumber); + + /** + * Gets the issue comments. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param issueNumber + * the issue number + * + * @return the issue comments + */ public List getIssueComments(String userName, String repositoryName, int issueNumber); + + /** + * Creates the issue. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param title + * the title + * @param body + * the body + */ public void createIssue(String userName, String repositoryName, String title, String body); + + /** + * Close issue. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param issueNumber + * the issue number + */ public void closeIssue(String userName, String repositoryName, int issueNumber); + + /** + * Reopen issue. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param issueNumber + * the issue number + */ public void reopenIssue(String userName, String repositoryName, int issueNumber); + + /** + * Update issue. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param issueNumber + * the issue number + * @param title + * the title + * @param body + * the body + */ public void updateIssue(String userName, String repositoryName, int issueNumber, String title, String body); + + /** + * Gets the issue labels. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the issue labels + */ public List getIssueLabels(String userName, String repositoryName); + + /** + * Adds the label. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param issueNumber + * the issue number + * @param label + * the label + * + * @return the list< string> + */ public List addLabel(String userName, String repositoryName, int issueNumber, String label); + + /** + * Removes the label. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param issueNumber + * the issue number + * @param label + * the label + * + * @return the list< string> + */ public List removeLabel(String userName, String repositoryName, int issueNumber, String label); + + /** + * Adds the comment. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param issueNumber + * the issue number + * @param comment + * the comment + */ public void addComment(String userName, String repositoryName, int issueNumber, String comment); } diff --git a/core/src/main/java/com/github/api/v2/services/NetworkService.java b/core/src/main/java/com/github/api/v2/services/NetworkService.java index 99691b4..f8a0e9b 100644 --- a/core/src/main/java/com/github/api/v2/services/NetworkService.java +++ b/core/src/main/java/com/github/api/v2/services/NetworkService.java @@ -9,11 +9,51 @@ import com.github.api.v2.schema.Network; /** - * @author nmukhtar - * + * The Interface NetworkService. */ public interface NetworkService extends GitHubService { + + /** + * Gets the network meta. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the network meta + */ public Network getNetworkMeta(String userName, String repositoryName); + + /** + * Gets the network data. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param networkHash + * the network hash + * + * @return the network data + */ public List getNetworkData(String userName, String repositoryName, String networkHash); + + /** + * Gets the network data. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param networkHash + * the network hash + * @param startIndex + * the start index + * @param endIndex + * the end index + * + * @return the network data + */ public List getNetworkData(String userName, String repositoryName, String networkHash, int startIndex, int endIndex); } diff --git a/core/src/main/java/com/github/api/v2/services/OAuthService.java b/core/src/main/java/com/github/api/v2/services/OAuthService.java index 407de93..f3dd127 100644 --- a/core/src/main/java/com/github/api/v2/services/OAuthService.java +++ b/core/src/main/java/com/github/api/v2/services/OAuthService.java @@ -13,8 +13,16 @@ * The Interface OAuthService. */ public interface OAuthService extends GitHubService { + + /** + * The Enum Permission. + */ public enum Permission implements ValueEnum { - USER("user"), REPOSITORY("repo"); + + /** The USER. */ + USER("user"), + /** The REPOSITORY. */ + REPOSITORY("repo"); /** The Constant stringToEnum. */ private static final Map stringToEnum = new HashMap(); @@ -29,14 +37,18 @@ public enum Permission implements ValueEnum { private final String value; /** - * Instantiates a new blog sort order. - * - * @param value the value - */ + * Instantiates a new permission. + * + * @param value + * the value + */ Permission(String value) { this.value = value; } + /* (non-Javadoc) + * @see com.github.api.v2.schema.ValueEnum#value() + */ @Override public String value() { return value; @@ -45,9 +57,10 @@ public String value() { /** * From value. * - * @param value the value + * @param value + * the value * - * @return the blog sort order + * @return the permission */ public static Permission fromValue(String value) { return stringToEnum.get(value); @@ -55,31 +68,36 @@ public static Permission fromValue(String value) { } /** - * Gets the authorization url. - * - * @param callBackUrl the call back url - * - * @return the authorization url - */ + * Gets the authorization url. + * + * @param callBackUrl + * the call back url + * + * @return the authorization url + */ public String getAuthorizationUrl(String callBackUrl); /** - * Gets the authorization url. - * - * @param callBackUrl the call back url - * @param permissions the permissions - * - * @return the authorization url - */ + * Gets the authorization url. + * + * @param callBackUrl + * the call back url + * @param permissions + * the permissions + * + * @return the authorization url + */ public String getAuthorizationUrl(String callBackUrl, Set permissions); /** - * Gets the access token. - * - * @param callBackUrl the call back url - * @param code the code - * - * @return the access token - */ + * Gets the access token. + * + * @param callBackUrl + * the call back url + * @param code + * the code + * + * @return the access token + */ public String getAccessToken(String callBackUrl, String code); } diff --git a/core/src/main/java/com/github/api/v2/services/ObjectService.java b/core/src/main/java/com/github/api/v2/services/ObjectService.java index cc8ed45..6d1e4c8 100644 --- a/core/src/main/java/com/github/api/v2/services/ObjectService.java +++ b/core/src/main/java/com/github/api/v2/services/ObjectService.java @@ -10,12 +10,65 @@ import com.github.api.v2.schema.Tree; /** - * @author nmukhtar - * + * The Interface ObjectService. */ public interface ObjectService extends GitHubService { + + /** + * Gets the tree. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param treeSha + * the tree sha + * + * @return the tree + */ public List getTree(String userName, String repositoryName, String treeSha); + + /** + * Gets the blob. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param treeSha + * the tree sha + * @param filePath + * the file path + * + * @return the blob + */ public Blob getBlob(String userName, String repositoryName, String treeSha, String filePath); + + /** + * Gets the blobs. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param treeSha + * the tree sha + * + * @return the blobs + */ public List getBlobs(String userName, String repositoryName, String treeSha); + + /** + * Gets the object content. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param objectSha + * the object sha + * + * @return the object content + */ public InputStream getObjectContent(String userName, String repositoryName, String objectSha); } diff --git a/core/src/main/java/com/github/api/v2/services/RepositoryService.java b/core/src/main/java/com/github/api/v2/services/RepositoryService.java index 1db5ef7..277b098 100644 --- a/core/src/main/java/com/github/api/v2/services/RepositoryService.java +++ b/core/src/main/java/com/github/api/v2/services/RepositoryService.java @@ -13,34 +13,294 @@ import com.github.api.v2.schema.Repository.Visibility; /** - * @author nmukhtar - * + * The Interface RepositoryService. */ public interface RepositoryService extends GitHubService { + + /** + * Search repositories. + * + * @param query + * the query + * + * @return the list< repository> + */ public List searchRepositories(String query); + + /** + * Search repositories. + * + * @param query + * the query + * @param language + * the language + * + * @return the list< repository> + */ public List searchRepositories(String query, Language language); + + /** + * Search repositories. + * + * @param query + * the query + * @param pageNumber + * the page number + * + * @return the list< repository> + */ public List searchRepositories(String query, int pageNumber); + + /** + * Search repositories. + * + * @param query + * the query + * @param language + * the language + * @param pageNumber + * the page number + * + * @return the list< repository> + */ public List searchRepositories(String query, Language language, int pageNumber); + + /** + * Gets the repository. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the repository + */ public Repository getRepository(String userName, String repositoryName); + + /** + * Update repository. + * + * @param repository + * the repository + */ public void updateRepository(Repository repository); + + /** + * Gets the repositories. + * + * @param userName + * the user name + * + * @return the repositories + */ public List getRepositories(String userName); + + /** + * Watch repository. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + */ public void watchRepository(String userName, String repositoryName); + + /** + * Unwatch repository. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + */ public void unwatchRepository(String userName, String repositoryName); + + /** + * Fork repository. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the repository + */ public Repository forkRepository(String userName, String repositoryName); + + /** + * Creates the repository. + * + * @param name + * the name + * @param description + * the description + * @param homePage + * the home page + * @param visibility + * the visibility + */ public void createRepository(String name, String description, String homePage, Visibility visibility); + + /** + * Delete repository. + * + * @param repositoryName + * the repository name + */ public void deleteRepository(String repositoryName); + + /** + * Change visibility. + * + * @param repositoryName + * the repository name + * @param visibility + * the visibility + */ public void changeVisibility(String repositoryName, Visibility visibility); + + /** + * Gets the deploy keys. + * + * @param repositoryName + * the repository name + * + * @return the deploy keys + */ public List getDeployKeys(String repositoryName); + + /** + * Adds the deploy key. + * + * @param repositoryName + * the repository name + * @param title + * the title + * @param key + * the key + * + * @return the string + */ public String addDeployKey(String repositoryName, String title, String key); + + /** + * Removes the deploy key. + * + * @param repository + * the repository + * @param id + * the id + */ public void removeDeployKey(String repository, String id); + + /** + * Gets the collaborators. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the collaborators + */ public List getCollaborators(String userName, String repositoryName); + + /** + * Adds the collaborator. + * + * @param repositoryName + * the repository name + * @param collaboratorName + * the collaborator name + */ public void addCollaborator(String repositoryName, String collaboratorName); + + /** + * Removes the collaborator. + * + * @param repositoryName + * the repository name + * @param collaboratorName + * the collaborator name + */ public void removeCollaborator(String repositoryName, String collaboratorName); + + /** + * Gets the pushable repositories. + * + * @return the pushable repositories + */ public List getPushableRepositories(); + + /** + * Gets the contributors. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the contributors + */ public List getContributors(String userName, String repositoryName); + + /** + * Gets the watchers. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the watchers + */ public List getWatchers(String userName, String repositoryName); + + /** + * Gets the forks. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the forks + */ public List getForks(String userName, String repositoryName); + + /** + * Gets the language breakdown. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the language breakdown + */ public Map getLanguageBreakdown(String userName, String repositoryName); + + /** + * Gets the tags. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the tags + */ public Map getTags(String userName, String repositoryName); + + /** + * Gets the branches. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the branches + */ public Map getBranches(String userName, String repositoryName); } diff --git a/core/src/main/java/com/github/api/v2/services/UserService.java b/core/src/main/java/com/github/api/v2/services/UserService.java index 9432840..5331e38 100644 --- a/core/src/main/java/com/github/api/v2/services/UserService.java +++ b/core/src/main/java/com/github/api/v2/services/UserService.java @@ -10,24 +10,146 @@ import com.github.api.v2.schema.User; /** - * @author nmukhtar - * + * The Interface UserService. */ public interface UserService extends GitHubService { + + /** + * Search users by name. + * + * @param name + * the name + * + * @return the list< user> + */ public List searchUsersByName(String name); + + /** + * Gets the user by email. + * + * @param email + * the email + * + * @return the user by email + */ public User getUserByEmail(String email); + + /** + * Gets the user by username. + * + * @param userName + * the user name + * + * @return the user by username + */ public User getUserByUsername(String userName); + + /** + * Gets the current user. + * + * @return the current user + */ public User getCurrentUser(); + + /** + * Update user. + * + * @param user + * the user + */ public void updateUser(User user); + + /** + * Gets the user followers. + * + * @param userName + * the user name + * + * @return the user followers + */ public List getUserFollowers(String userName); + + /** + * Gets the user following. + * + * @param userName + * the user name + * + * @return the user following + */ public List getUserFollowing(String userName); + + /** + * Follow user. + * + * @param userName + * the user name + */ public void followUser(String userName); + + /** + * Unfollow user. + * + * @param userName + * the user name + */ public void unfollowUser(String userName); + + /** + * Gets the watched repositories. + * + * @param userName + * the user name + * + * @return the watched repositories + */ public List getWatchedRepositories(String userName); + + /** + * Gets the keys. + * + * @return the keys + */ public List getKeys(); + + /** + * Adds the key. + * + * @param title + * the title + * @param key + * the key + */ public void addKey(String title, String key); + + /** + * Removes the key. + * + * @param id + * the id + */ public void removeKey(String id); + + /** + * Gets the emails. + * + * @return the emails + */ public List getEmails(); + + /** + * Adds the email. + * + * @param email + * the email + */ public void addEmail(String email); + + /** + * Removes the email. + * + * @param email + * the email + */ public void removeEmail(String email); } diff --git a/core/src/main/java/com/github/api/v2/services/auth/Authentication.java b/core/src/main/java/com/github/api/v2/services/auth/Authentication.java index 86a926b..7fd6f15 100644 --- a/core/src/main/java/com/github/api/v2/services/auth/Authentication.java +++ b/core/src/main/java/com/github/api/v2/services/auth/Authentication.java @@ -4,8 +4,7 @@ package com.github.api.v2.services.auth; /** - * @author nmukhtar - * + * The Interface Authentication. */ public interface Authentication { diff --git a/core/src/main/java/com/github/api/v2/services/auth/HeaderBasedAuthentication.java b/core/src/main/java/com/github/api/v2/services/auth/HeaderBasedAuthentication.java index cdc277b..9c7ddae 100644 --- a/core/src/main/java/com/github/api/v2/services/auth/HeaderBasedAuthentication.java +++ b/core/src/main/java/com/github/api/v2/services/auth/HeaderBasedAuthentication.java @@ -6,9 +6,14 @@ import java.util.Map; /** - * @author nmukhtar - * + * The Interface HeaderBasedAuthentication. */ public interface HeaderBasedAuthentication extends Authentication { + + /** + * Gets the headers. + * + * @return the headers + */ public Map getHeaders(); } diff --git a/core/src/main/java/com/github/api/v2/services/auth/LoginPasswordAuthentication.java b/core/src/main/java/com/github/api/v2/services/auth/LoginPasswordAuthentication.java index 603c545..e4b5244 100644 --- a/core/src/main/java/com/github/api/v2/services/auth/LoginPasswordAuthentication.java +++ b/core/src/main/java/com/github/api/v2/services/auth/LoginPasswordAuthentication.java @@ -10,49 +10,76 @@ /** - * @author nmukhtar - * + * The Class LoginPasswordAuthentication. */ public class LoginPasswordAuthentication implements HeaderBasedAuthentication { - /** The Constant REFERRER. */ + + /** The Constant AUTHORIZATION. */ private static final String AUTHORIZATION = "Authorization"; - /** The Constant REFERRER. */ + /** The Constant BASIC. */ private static final String BASIC = "Basic "; + /** The login. */ public String login; + + /** The password. */ public String password; + /** + * Instantiates a new login password authentication. + * + * @param login + * the login + * @param password + * the password + */ public LoginPasswordAuthentication(String login, String password) { this.login = login; this.password = password; } /** + * Gets the login. + * * @return the login */ public String getLogin() { return login; } + /** - * @param login the login to set + * Sets the login. + * + * @param login + * the new login */ public void setLogin(String login) { this.login = login; } + /** + * Gets the password. + * * @return the password */ public String getPassword() { return password; } + /** - * @param password the password to set + * Sets the password. + * + * @param password + * the new password */ public void setPassword(String password) { this.password = password; } + /* (non-Javadoc) + * @see com.github.api.v2.services.auth.HeaderBasedAuthentication#getHeaders() + */ @Override public Map getHeaders() { Map headers = new HashMap(); diff --git a/core/src/main/java/com/github/api/v2/services/auth/LoginTokenAuthentication.java b/core/src/main/java/com/github/api/v2/services/auth/LoginTokenAuthentication.java index d424fc2..808fba4 100644 --- a/core/src/main/java/com/github/api/v2/services/auth/LoginTokenAuthentication.java +++ b/core/src/main/java/com/github/api/v2/services/auth/LoginTokenAuthentication.java @@ -10,19 +10,32 @@ /** - * @author nmukhtar - * + * The Class LoginTokenAuthentication. */ public class LoginTokenAuthentication implements ParameterBasedAuthentication { + + /** The login. */ private String login; + + /** The token. */ private String token; + /** + * Instantiates a new login token authentication. + * + * @param login + * the login + * @param token + * the token + */ public LoginTokenAuthentication(String login, String token) { this.login = login; this.token = token; } /** + * Gets the login. + * * @return the login */ public String getLogin() { @@ -30,13 +43,18 @@ public String getLogin() { } /** - * @param login the login to set + * Sets the login. + * + * @param login + * the new login */ public void setLogin(String login) { this.login = login; } /** + * Gets the token. + * * @return the token */ public String getToken() { @@ -44,12 +62,18 @@ public String getToken() { } /** - * @param token the token to set + * Sets the token. + * + * @param token + * the new token */ public void setToken(String token) { this.token = token; } + /* (non-Javadoc) + * @see com.github.api.v2.services.auth.ParameterBasedAuthentication#getParameters() + */ @Override public Map getParameters() { Map parameters = new HashMap(); diff --git a/core/src/main/java/com/github/api/v2/services/auth/OAuthAuthentication.java b/core/src/main/java/com/github/api/v2/services/auth/OAuthAuthentication.java index ed55f73..97b298b 100644 --- a/core/src/main/java/com/github/api/v2/services/auth/OAuthAuthentication.java +++ b/core/src/main/java/com/github/api/v2/services/auth/OAuthAuthentication.java @@ -10,30 +10,45 @@ /** - * @author nmukhtar - * + * The Class OAuthAuthentication. */ public class OAuthAuthentication implements ParameterBasedAuthentication { + + /** The access token. */ private String accessToken; + /** + * Instantiates a new o auth authentication. + * + * @param accessToken + * the access token + */ public OAuthAuthentication(String accessToken) { this.accessToken = accessToken; } /** - * @return the accessToken + * Gets the access token. + * + * @return the access token */ public String getAccessToken() { return accessToken; } /** - * @param accessToken the accessToken to set + * Sets the access token. + * + * @param accessToken + * the new access token */ public void setAccessToken(String accessToken) { this.accessToken = accessToken; } + /* (non-Javadoc) + * @see com.github.api.v2.services.auth.ParameterBasedAuthentication#getParameters() + */ @Override public Map getParameters() { Map parameters = new HashMap(); diff --git a/core/src/main/java/com/github/api/v2/services/auth/ParameterBasedAuthentication.java b/core/src/main/java/com/github/api/v2/services/auth/ParameterBasedAuthentication.java index a5a961e..9038806 100644 --- a/core/src/main/java/com/github/api/v2/services/auth/ParameterBasedAuthentication.java +++ b/core/src/main/java/com/github/api/v2/services/auth/ParameterBasedAuthentication.java @@ -6,9 +6,14 @@ import java.util.Map; /** - * @author nmukhtar - * + * The Interface ParameterBasedAuthentication. */ public interface ParameterBasedAuthentication extends Authentication { + + /** + * Gets the parameters. + * + * @return the parameters + */ public Map getParameters(); } diff --git a/core/src/main/java/com/github/api/v2/services/constant/ApplicationConstants.java b/core/src/main/java/com/github/api/v2/services/constant/ApplicationConstants.java index 7a04168..f22f9d9 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/ApplicationConstants.java +++ b/core/src/main/java/com/github/api/v2/services/constant/ApplicationConstants.java @@ -38,10 +38,10 @@ public final class ApplicationConstants { /** The Constant DEFAULT_API_VERSION. */ public static final String DEFAULT_API_VERSION = getProperty("com.github.api.v2.services.defaultApiVersion"); - /** The Constant DEFAULT_API_VERSION. */ + /** The Constant DEFAULT_FORMAT. */ public static final String DEFAULT_FORMAT = getProperty("com.github.api.v2.services.defaultFormat"); - /** The Constant RFC822DATEFORMAT. */ + /** The Constant DATE_FORMAT. */ public static final String DATE_FORMAT = getProperty("com.github.api.v2.services.dateFormat"); /** The Constant CONNECT_TIMEOUT. */ @@ -57,28 +57,30 @@ public final class ApplicationConstants { public static final Pattern ACCESS_DENIED_PATTERN = getPatternProperty("com.github.api.v2.services.accessDeniedPattern"); /** - * Instantiates a new application constants. - */ + * Instantiates a new application constants. + */ private ApplicationConstants() {} /** - * Gets the property. - * - * @param key the key - * - * @return the property - */ + * Gets the property. + * + * @param key + * the key + * + * @return the property + */ public static String getProperty(String key) { return applicationConstants.getProperty(key); } /** - * Gets the int property. - * - * @param key the key - * - * @return the int property - */ + * Gets the int property. + * + * @param key + * the key + * + * @return the int property + */ public static int getIntProperty(String key) { String property = applicationConstants.getProperty(key); @@ -90,12 +92,13 @@ public static int getIntProperty(String key) { } /** - * Gets the boolean property. - * - * @param key the key - * - * @return the boolean property - */ + * Gets the boolean property. + * + * @param key + * the key + * + * @return the boolean property + */ public static boolean getBooleanProperty(String key) { String property = applicationConstants.getProperty(key); @@ -107,12 +110,13 @@ public static boolean getBooleanProperty(String key) { } /** - * Gets the double property. - * - * @param key the key - * - * @return the double property - */ + * Gets the double property. + * + * @param key + * the key + * + * @return the double property + */ public static double getDoubleProperty(String key) { String property = applicationConstants.getProperty(key); @@ -124,12 +128,13 @@ public static double getDoubleProperty(String key) { } /** - * Gets the long property. - * - * @param key the key - * - * @return the long property - */ + * Gets the long property. + * + * @param key + * the key + * + * @return the long property + */ public static long getLongProperty(String key) { String property = applicationConstants.getProperty(key); @@ -141,12 +146,13 @@ public static long getLongProperty(String key) { } /** - * Gets the pattern property. - * - * @param key the key - * - * @return the pattern property - */ + * Gets the pattern property. + * + * @param key + * the key + * + * @return the pattern property + */ public static Pattern getPatternProperty(String key) { String property = applicationConstants.getProperty(key); @@ -158,12 +164,13 @@ public static Pattern getPatternProperty(String key) { } /** - * Checks if is null or empty. - * - * @param s the s - * - * @return true, if is null or empty - */ + * Checks if is null or empty. + * + * @param s + * the s + * + * @return true, if is null or empty + */ private static boolean isNullOrEmpty(String s) { return ((s == null) || s.length() == 0); } diff --git a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java index be8a272..9e49fd0 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java +++ b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java @@ -17,14 +17,14 @@ import com.github.api.v2.schema.ValueEnum; /** - * The Class GoogleSearchApiUrls. + * The Class GitHubApiUrls. */ public final class GitHubApiUrls { /** The Constant API_URLS_FILE. */ public static final String API_URLS_FILE = "GitHubApiUrls.properties"; - /** The Constant LOG. */ + /** The Constant logger. */ private static final Logger logger = Logger.getLogger(GitHubApiUrls.class.getCanonicalName()); /** The Constant gitHubApiUrls. */ @@ -38,103 +38,257 @@ public final class GitHubApiUrls { } } + /** + * The Interface OAuthUrls. + */ public static interface OAuthUrls { - public static final String AUTHORIZE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.oauthService.authorize"); - public static final String ACCESS_TOKEN_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.oauthService.accessToken"); + + /** The Constant AUTHORIZE_URL. */ + public static final String AUTHORIZE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.oauthService.authorize"); + + /** The Constant ACCESS_TOKEN_URL. */ + public static final String ACCESS_TOKEN_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.oauthService.accessToken"); } + /** + * The Interface UserApiUrls. + */ public static interface UserApiUrls { - public static final String SEARCH_USERS_BY_NAME_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.searchUsersByName"); - public static final String SEARCH_USERS_BY_EMAIL_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.searchUsersByEmail"); - public static final String GET_USER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getUser"); - public static final String GET_CURRENT_USER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getCurrentUser"); - public static final String UPDATE_USER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.updateUser"); - public static final String GET_USER_FOLLOWERS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getUserFollowers"); - public static final String GET_USER_FOLLOWING_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getUserFollowing"); - public static final String FOLLOW_USER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.followUser"); - public static final String UNFOLLOW_USER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.unfollowUser"); - public static final String GET_WATCHED_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getWatchedRepositories"); - public static final String GET_KEYS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getKeys"); - public static final String ADD_KEY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.addKey"); - public static final String REMOVE_KEY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.removeKey"); - public static final String GET_EMAILS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getEmails"); - public static final String ADD_EMAIL_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.addEmail"); - public static final String REMOVE_EMAIL_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.removeEmail"); + + /** The Constant SEARCH_USERS_BY_NAME_URL. */ + public static final String SEARCH_USERS_BY_NAME_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.searchUsersByName"); + + /** The Constant SEARCH_USERS_BY_EMAIL_URL. */ + public static final String SEARCH_USERS_BY_EMAIL_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.searchUsersByEmail"); + + /** The Constant GET_USER_URL. */ + public static final String GET_USER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getUser"); + + /** The Constant GET_CURRENT_USER_URL. */ + public static final String GET_CURRENT_USER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getCurrentUser"); + + /** The Constant UPDATE_USER_URL. */ + public static final String UPDATE_USER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.updateUser"); + + /** The Constant GET_USER_FOLLOWERS_URL. */ + public static final String GET_USER_FOLLOWERS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getUserFollowers"); + + /** The Constant GET_USER_FOLLOWING_URL. */ + public static final String GET_USER_FOLLOWING_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getUserFollowing"); + + /** The Constant FOLLOW_USER_URL. */ + public static final String FOLLOW_USER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.followUser"); + + /** The Constant UNFOLLOW_USER_URL. */ + public static final String UNFOLLOW_USER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.unfollowUser"); + + /** The Constant GET_WATCHED_REPOSITORIES_URL. */ + public static final String GET_WATCHED_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getWatchedRepositories"); + + /** The Constant GET_KEYS_URL. */ + public static final String GET_KEYS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getKeys"); + + /** The Constant ADD_KEY_URL. */ + public static final String ADD_KEY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.addKey"); + + /** The Constant REMOVE_KEY_URL. */ + public static final String REMOVE_KEY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.removeKey"); + + /** The Constant GET_EMAILS_URL. */ + public static final String GET_EMAILS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getEmails"); + + /** The Constant ADD_EMAIL_URL. */ + public static final String ADD_EMAIL_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.addEmail"); + + /** The Constant REMOVE_EMAIL_URL. */ + public static final String REMOVE_EMAIL_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.removeEmail"); } + /** + * The Interface IssueApiUrls. + */ public static interface IssueApiUrls { - public static final String SEARCH_ISSUES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.searchIssues"); - public static final String GET_ISSUES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.getIssues"); - public static final String GET_ISSUE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.getIssue"); - public static final String GET_ISSUE_COMMENTS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.getIssueComments"); - public static final String CREATE_ISSUE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.createIssue"); - public static final String CLOSE_ISSUE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.closeIssue"); - public static final String REOPEN_ISSUE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.reopenIssue"); - public static final String UPDATE_ISSUE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.updateIssue"); - public static final String GET_ISSUE_LABELS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.getIssueLabels"); - public static final String ADD_LABEL_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.addLabel"); - public static final String REMOVE_LABEL_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.removeLabel"); - public static final String ADD_COMMENT_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.addComment"); + + /** The Constant SEARCH_ISSUES_URL. */ + public static final String SEARCH_ISSUES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.searchIssues"); + + /** The Constant GET_ISSUES_URL. */ + public static final String GET_ISSUES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.getIssues"); + + /** The Constant GET_ISSUE_URL. */ + public static final String GET_ISSUE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.getIssue"); + + /** The Constant GET_ISSUE_COMMENTS_URL. */ + public static final String GET_ISSUE_COMMENTS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.getIssueComments"); + + /** The Constant CREATE_ISSUE_URL. */ + public static final String CREATE_ISSUE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.createIssue"); + + /** The Constant CLOSE_ISSUE_URL. */ + public static final String CLOSE_ISSUE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.closeIssue"); + + /** The Constant REOPEN_ISSUE_URL. */ + public static final String REOPEN_ISSUE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.reopenIssue"); + + /** The Constant UPDATE_ISSUE_URL. */ + public static final String UPDATE_ISSUE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.updateIssue"); + + /** The Constant GET_ISSUE_LABELS_URL. */ + public static final String GET_ISSUE_LABELS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.getIssueLabels"); + + /** The Constant ADD_LABEL_URL. */ + public static final String ADD_LABEL_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.addLabel"); + + /** The Constant REMOVE_LABEL_URL. */ + public static final String REMOVE_LABEL_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.removeLabel"); + + /** The Constant ADD_COMMENT_URL. */ + public static final String ADD_COMMENT_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.addComment"); } + /** + * The Interface GistApiUrls. + */ public static interface GistApiUrls { - public static final String GET_GIST_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.gistService.getGist"); - public static final String GET_GIST_CONTENT_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.gistService.getGistContent"); - public static final String GET_USER_GISTS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.gistService.getUserGists"); + + /** The Constant GET_GIST_URL. */ + public static final String GET_GIST_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.gistService.getGist"); + + /** The Constant GET_GIST_CONTENT_URL. */ + public static final String GET_GIST_CONTENT_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.gistService.getGistContent"); + + /** The Constant GET_USER_GISTS_URL. */ + public static final String GET_USER_GISTS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.gistService.getUserGists"); } + /** + * The Interface NetworkApiUrls. + */ public static interface NetworkApiUrls { - public static final String GET_NETWORK_META_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.networkService.getNetworkMeta"); - public static final String GET_NETWORK_DATA_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.networkService.getNetworkData"); + + /** The Constant GET_NETWORK_META_URL. */ + public static final String GET_NETWORK_META_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.networkService.getNetworkMeta"); + + /** The Constant GET_NETWORK_DATA_URL. */ + public static final String GET_NETWORK_DATA_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.networkService.getNetworkData"); } + /** + * The Interface RepositoryApiUrls. + */ public static interface RepositoryApiUrls { - public static final String SEARCH_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.searchRepositories"); - public static final String GET_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getRepository"); - public static final String UPDATE_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.updateRepository"); - public static final String GET_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getRepositories"); - public static final String WATCH_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.watchRepository"); - public static final String UNWATCH_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.unwatchRepository"); - public static final String FORK_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.forkRepository"); - public static final String CREATE_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.createRepository"); - public static final String DELETE_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.deleteRepository"); - public static final String CHANGE_VISIBILITY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.changeVisibility"); - public static final String GET_DEPLOY_KEYS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getKeys"); - public static final String ADD_DEPLOY_KEY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.addKey"); - public static final String REMOVE_DEPLOY_KEY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.removeKey"); - public static final String GET_COLLABORATORS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getCollaborators"); - public static final String ADD_COLLABORATOR_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.addCollaborator"); - public static final String REMOVE_COLLABORATOR_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.removeCollaborator"); - public static final String GET_PUSHABLE_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getPushableRepositories"); - public static final String GET_CONTRIBUTORS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getContributors"); - public static final String GET_WATCHERS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getWatchers"); - public static final String GET_FORKS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getForks"); - public static final String GET_LANGUAGE_BREAKDOWN_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getLanguageBreakdown"); - public static final String GET_TAGS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getTags"); - public static final String GET_BRANCHES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getBranches"); + + /** The Constant SEARCH_REPOSITORIES_URL. */ + public static final String SEARCH_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.searchRepositories"); + + /** The Constant GET_REPOSITORY_URL. */ + public static final String GET_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getRepository"); + + /** The Constant UPDATE_REPOSITORY_URL. */ + public static final String UPDATE_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.updateRepository"); + + /** The Constant GET_REPOSITORIES_URL. */ + public static final String GET_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getRepositories"); + + /** The Constant WATCH_REPOSITORY_URL. */ + public static final String WATCH_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.watchRepository"); + + /** The Constant UNWATCH_REPOSITORY_URL. */ + public static final String UNWATCH_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.unwatchRepository"); + + /** The Constant FORK_REPOSITORY_URL. */ + public static final String FORK_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.forkRepository"); + + /** The Constant CREATE_REPOSITORY_URL. */ + public static final String CREATE_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.createRepository"); + + /** The Constant DELETE_REPOSITORY_URL. */ + public static final String DELETE_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.deleteRepository"); + + /** The Constant CHANGE_VISIBILITY_URL. */ + public static final String CHANGE_VISIBILITY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.changeVisibility"); + + /** The Constant GET_DEPLOY_KEYS_URL. */ + public static final String GET_DEPLOY_KEYS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getKeys"); + + /** The Constant ADD_DEPLOY_KEY_URL. */ + public static final String ADD_DEPLOY_KEY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.addKey"); + + /** The Constant REMOVE_DEPLOY_KEY_URL. */ + public static final String REMOVE_DEPLOY_KEY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.removeKey"); + + /** The Constant GET_COLLABORATORS_URL. */ + public static final String GET_COLLABORATORS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getCollaborators"); + + /** The Constant ADD_COLLABORATOR_URL. */ + public static final String ADD_COLLABORATOR_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.addCollaborator"); + + /** The Constant REMOVE_COLLABORATOR_URL. */ + public static final String REMOVE_COLLABORATOR_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.removeCollaborator"); + + /** The Constant GET_PUSHABLE_REPOSITORIES_URL. */ + public static final String GET_PUSHABLE_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getPushableRepositories"); + + /** The Constant GET_CONTRIBUTORS_URL. */ + public static final String GET_CONTRIBUTORS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getContributors"); + + /** The Constant GET_WATCHERS_URL. */ + public static final String GET_WATCHERS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getWatchers"); + + /** The Constant GET_FORKS_URL. */ + public static final String GET_FORKS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getForks"); + + /** The Constant GET_LANGUAGE_BREAKDOWN_URL. */ + public static final String GET_LANGUAGE_BREAKDOWN_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getLanguageBreakdown"); + + /** The Constant GET_TAGS_URL. */ + public static final String GET_TAGS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getTags"); + + /** The Constant GET_BRANCHES_URL. */ + public static final String GET_BRANCHES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getBranches"); } + /** + * The Interface CommitApiUrls. + */ public static interface CommitApiUrls { - public static final String GET_COMMITS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.commitService.getCommits"); - public static final String GET_COMMITS_FILE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.commitService.getCommitsFile"); - public static final String GET_COMMIT_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.commitService.getCommit"); + + /** The Constant GET_COMMITS_URL. */ + public static final String GET_COMMITS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.commitService.getCommits"); + + /** The Constant GET_COMMITS_FILE_URL. */ + public static final String GET_COMMITS_FILE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.commitService.getCommitsFile"); + + /** The Constant GET_COMMIT_URL. */ + public static final String GET_COMMIT_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.commitService.getCommit"); } + /** + * The Interface ObjectApiUrls. + */ public static interface ObjectApiUrls { - public static final String GET_TREE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.objectService.getTree"); - public static final String GET_BLOB_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.objectService.getBlob"); - public static final String GET_BLOBS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.objectService.getBlobs"); - public static final String GET_OBJECT_CONTENT_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.objectService.getObjectContent"); + + /** The Constant GET_TREE_URL. */ + public static final String GET_TREE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.objectService.getTree"); + + /** The Constant GET_BLOB_URL. */ + public static final String GET_BLOB_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.objectService.getBlob"); + + /** The Constant GET_BLOBS_URL. */ + public static final String GET_BLOBS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.objectService.getBlobs"); + + /** The Constant GET_OBJECT_CONTENT_URL. */ + public static final String GET_OBJECT_CONTENT_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.objectService.getObjectContent"); } /** - * Instantiates a new google search api urls. - */ + * Instantiates a new git hub api urls. + */ private GitHubApiUrls() {} /** - * The Class GoogleSearchApiUrlBuilder. - */ + * The Class GitHubApiUrlBuilder. + */ public static class GitHubApiUrlBuilder { /** The Constant API_URLS_PLACEHOLDER_START. */ @@ -153,20 +307,25 @@ public static class GitHubApiUrlBuilder { private Map fieldsMap = new HashMap(); /** - * Instantiates a new google search api url builder. - * - * @param urlFormat the url format - */ + * Instantiates a new git hub api url builder. + * + * @param urlFormat + * the url format + */ public GitHubApiUrlBuilder(String urlFormat) { this(urlFormat, ApplicationConstants.DEFAULT_API_VERSION, ApplicationConstants.DEFAULT_FORMAT); } /** - * Instantiates a new google search api url builder. - * - * @param urlFormat the url format - * @param apiVersion the api version - */ + * Instantiates a new git hub api url builder. + * + * @param urlFormat + * the url format + * @param apiVersion + * the api version + * @param format + * the format + */ public GitHubApiUrlBuilder(String urlFormat, String apiVersion, String format) { this.urlFormat = urlFormat; fieldsMap.put(ParameterNames.VERSION, apiVersion); @@ -174,13 +333,15 @@ public GitHubApiUrlBuilder(String urlFormat, String apiVersion, String format) { } /** - * With parameter. - * - * @param name the name - * @param value the value - * - * @return the google search api url builder - */ + * With parameter. + * + * @param name + * the name + * @param value + * the value + * + * @return the git hub api url builder + */ public GitHubApiUrlBuilder withParameter(String name, String value) { if (value != null && value.length() > 0) { parametersMap.put(name, encodeUrl(value)); @@ -190,13 +351,15 @@ public GitHubApiUrlBuilder withParameter(String name, String value) { } /** - * With parameter enum. - * - * @param name the name - * @param value the value - * - * @return the google search api url builder - */ + * With parameter enum. + * + * @param name + * the name + * @param value + * the value + * + * @return the git hub api url builder + */ public GitHubApiUrlBuilder withParameterEnum(String name, ValueEnum value) { withParameter(name, value.value()); @@ -204,14 +367,17 @@ public GitHubApiUrlBuilder withParameterEnum(String name, ValueEnum value) { } /** - * With parameter enum set. - * - * @param name the name - * @param enumSet the enum set - * @param separator the separator - * - * @return the facebook graph api url builder - */ + * With parameter enum set. + * + * @param name + * the name + * @param enumSet + * the enum set + * @param separator + * the separator + * + * @return the git hub api url builder + */ public GitHubApiUrlBuilder withParameterEnumSet(String name, Set enumSet, String separator) { StringBuilder builder = new StringBuilder(); @@ -227,18 +393,48 @@ public GitHubApiUrlBuilder withParameterEnumSet(String name, Set>> handlers = new ArrayList>>(); /** - * Instantiates a new base google search api query. - * - * @param applicationId the application id + * Instantiates a new base git hub service. */ public BaseGitHubService() { // by default we compress contents @@ -52,10 +53,10 @@ public BaseGitHubService() { } /** - * Instantiates a new base google search api query. + * Instantiates a new base git hub service. * - * @param applicationId the application id - * @param apiVersion the api version + * @param apiVersion + * the api version */ public BaseGitHubService(String apiVersion) { setApiVersion(apiVersion); @@ -64,7 +65,10 @@ public BaseGitHubService(String apiVersion) { /** * Unmarshall. * - * @param object the object + * @param typeToken + * the type token + * @param response + * the response * * @return the t */ @@ -77,7 +81,8 @@ protected T unmarshall(TypeToken typeToken, JsonElement response) { /** * Notify observers. * - * @param response the response + * @param response + * the response */ protected void notifyObservers(List response) { for(AsyncResponseHandler> handler : handlers) { @@ -88,6 +93,12 @@ protected void notifyObservers(List response) { /* (non-Javadoc) * @see com.google.code.stackexchange.client.query.StackExchangeApiQuery#addResonseHandler(com.google.code.stackexchange.client.AsyncResponseHandler) */ + /** + * Adds the resonse handler. + * + * @param handler + * the handler + */ public void addResonseHandler(AsyncResponseHandler> handler) { handlers.add(handler); } @@ -132,6 +143,14 @@ public Tree.Type deserialize(JsonElement arg0, Type arg1, return builder; } + /** + * Unmarshall. + * + * @param jsonContent + * the json content + * + * @return the json object + */ protected JsonObject unmarshall(InputStream jsonContent) { try { JsonElement element = parser.parse(new InputStreamReader(jsonContent)); @@ -148,11 +167,12 @@ protected JsonObject unmarshall(InputStream jsonContent) { } /** - * Creates the google search api url builder. + * Creates the git hub api url builder. * - * @param urlFormat the url format + * @param urlFormat + * the url format * - * @return the google search api url builder + * @return the git hub api url builder */ protected GitHubApiUrlBuilder createGitHubApiUrlBuilder(String urlFormat) { return new GitHubApiUrlBuilder(urlFormat); diff --git a/core/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java index 26d36d5..6bf9590 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java @@ -15,12 +15,14 @@ import com.google.gson.reflect.TypeToken; /** - * @author nmukhtar - * + * The Class CommitServiceImpl. */ public class CommitServiceImpl extends BaseGitHubService implements CommitService { + /* (non-Javadoc) + * @see com.github.api.v2.services.CommitService#getCommit(java.lang.String, java.lang.String, java.lang.String) + */ @Override public Commit getCommit(String userName, String repositoryName, String sha) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.CommitApiUrls.GET_COMMIT_URL); @@ -30,6 +32,9 @@ public Commit getCommit(String userName, String repositoryName, String sha) { return unmarshall(new TypeToken(){}, json.get("commit")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.CommitService#getCommits(java.lang.String, java.lang.String, java.lang.String) + */ @Override public List getCommits(String userName, String repositoryName, String branch) { @@ -40,6 +45,9 @@ public List getCommits(String userName, String repositoryName, return unmarshall(new TypeToken>(){}, json.get("commits")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.CommitService#getCommits(java.lang.String, java.lang.String, java.lang.String, java.lang.String) + */ @Override public List getCommits(String userName, String repositoryName, String branch, String filePath) { @@ -50,6 +58,9 @@ public List getCommits(String userName, String repositoryName, return unmarshall(new TypeToken>(){}, json.get("commits")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.impl.BaseGitHubService#getGsonBuilder() + */ @Override protected GsonBuilder getGsonBuilder() { GsonBuilder gson = super.getGsonBuilder(); diff --git a/core/src/main/java/com/github/api/v2/services/impl/GistServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/GistServiceImpl.java index 9ce607b..b72b4bb 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/GistServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/GistServiceImpl.java @@ -15,12 +15,14 @@ import com.google.gson.reflect.TypeToken; /** - * @author nmukhtar - * + * The Class GistServiceImpl. */ public class GistServiceImpl extends BaseGitHubService implements GistService { + /* (non-Javadoc) + * @see com.github.api.v2.services.GistService#getGist(java.lang.String) + */ @Override public Gist getGist(String gistId) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.GistApiUrls.GET_GIST_URL); @@ -31,6 +33,9 @@ public Gist getGist(String gistId) { return (gists.isEmpty())? null : gists.get(0); } + /* (non-Javadoc) + * @see com.github.api.v2.services.GistService#getGistContent(java.lang.String, java.lang.String) + */ @Override public InputStream getGistContent(String gistId, String fileName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.GistApiUrls.GET_GIST_CONTENT_URL); @@ -38,6 +43,9 @@ public InputStream getGistContent(String gistId, String fileName) { return callApiGet(apiUrl); } + /* (non-Javadoc) + * @see com.github.api.v2.services.GistService#getUserGists(java.lang.String) + */ @Override public List getUserGists(String userName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.GistApiUrls.GET_USER_GISTS_URL); diff --git a/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java b/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java index 820d2d6..e283168 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java +++ b/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java @@ -28,11 +28,11 @@ import com.github.api.v2.services.constant.ApplicationConstants; /** - * The Class GoogleSearchApiGateway. + * The Class GitHubApiGateway. */ public abstract class GitHubApiGateway { - /** The LOG. */ + /** The logger. */ protected final Logger logger = Logger.getLogger(getClass().getCanonicalName()); /** The Constant GZIP_ENCODING. */ @@ -44,7 +44,7 @@ public abstract class GitHubApiGateway { /** The request headers. */ protected Map requestHeaders = new HashMap(); - /** The request headers. */ + /** The request parameters. */ protected Map requestParameters = new HashMap(); /** The user ip address. */ @@ -65,7 +65,8 @@ public String getApiVersion() { /** * Sets the api version. * - * @param apiVersion the new api version + * @param apiVersion + * the new api version */ public void setApiVersion(String apiVersion) { this.apiVersion = apiVersion; @@ -74,7 +75,8 @@ public void setApiVersion(String apiVersion) { /** * Sets the request headers. * - * @param requestHeaders the request headers + * @param requestHeaders + * the request headers */ public void setRequestHeaders(Map requestHeaders) { this.requestHeaders = requestHeaders; @@ -92,8 +94,10 @@ public Map getRequestHeaders() { /** * Adds the request header. * - * @param headerName the header name - * @param headerValue the header value + * @param headerName + * the header name + * @param headerValue + * the header value */ public void addRequestHeader(String headerName, String headerValue) { requestHeaders.put(headerName, headerValue); @@ -102,7 +106,8 @@ public void addRequestHeader(String headerName, String headerValue) { /** * Removes the request header. * - * @param headerName the header name + * @param headerName + * the header name */ public void removeRequestHeader(String headerName) { requestHeaders.remove(headerName); @@ -111,7 +116,8 @@ public void removeRequestHeader(String headerName) { /** * Sets the referrer. * - * @param referrer the new referrer + * @param referrer + * the new referrer */ public void setReferrer(String referrer) { requestHeaders.put(REFERRER, referrer); @@ -120,16 +126,19 @@ public void setReferrer(String referrer) { /** * Sets the user ip address. * - * @param userIpAddress the new user ip address + * @param userIpAddress + * the new user ip address */ public void setUserIpAddress(String userIpAddress) { this.userIpAddress = userIpAddress; } /** - * Sets the application key. - * @param authentication TODO - */ + * Sets the authentication. + * + * @param authentication + * the new authentication + */ public void setAuthentication(Authentication authentication) { if (authentication != null) { if (authentication instanceof ParameterBasedAuthentication) { @@ -143,7 +152,8 @@ public void setAuthentication(Authentication authentication) { /** * Convert stream to string. * - * @param is the is + * @param is + * the is * * @return the string */ @@ -176,9 +186,10 @@ protected static String convertStreamToString(InputStream is) { } /** - * Call api method. + * Call api get. * - * @param apiUrl the api url + * @param apiUrl + * the api url * * @return the input stream */ @@ -187,10 +198,12 @@ protected InputStream callApiGet(String apiUrl) { } /** - * Call api method. + * Call api get. * - * @param apiUrl the api url - * @param expected the expected + * @param apiUrl + * the api url + * @param expected + * the expected * * @return the input stream */ @@ -236,8 +249,10 @@ protected InputStream callApiGet(String apiUrl, int expected) { /** * Call api post. * - * @param apiUrl the api url - * @param parameters the parameters + * @param apiUrl + * the api url + * @param parameters + * the parameters * * @return the input stream */ @@ -248,9 +263,12 @@ protected InputStream callApiPost(String apiUrl, Map parameters) /** * Call api post. * - * @param apiUrl the api url - * @param parameters the parameters - * @param expected the expected + * @param apiUrl + * the api url + * @param parameters + * the parameters + * @param expected + * the expected * * @return the input stream */ @@ -297,6 +315,14 @@ protected InputStream callApiPost(String apiUrl, Map parameters, } } + /** + * Gets the parameters string. + * + * @param parameters + * the parameters + * + * @return the parameters string + */ protected String getParametersString(Map parameters) { StringBuilder builder = new StringBuilder(); for (Iterator> iterator = parameters.entrySet().iterator(); iterator.hasNext();) { @@ -315,11 +341,16 @@ protected String getParametersString(Map parameters) { /** * Call api method. * - * @param apiUrl the api url - * @param xmlContent the xml content - * @param contentType the content type - * @param method the method - * @param expected the expected + * @param apiUrl + * the api url + * @param xmlContent + * the xml content + * @param contentType + * the content type + * @param method + * the method + * @param expected + * the expected * * @return the input stream */ @@ -373,7 +404,8 @@ protected InputStream callApiMethod(String apiUrl, String xmlContent, String con /** * Close stream. * - * @param is the is + * @param is + * the is */ protected void closeStream(InputStream is) { try { @@ -388,7 +420,8 @@ protected void closeStream(InputStream is) { /** * Close connection. * - * @param connection the connection + * @param connection + * the connection */ protected void closeConnection(HttpURLConnection connection) { try { @@ -403,12 +436,15 @@ protected void closeConnection(HttpURLConnection connection) { /** * Gets the wrapped input stream. * - * @param is the is - * @param gzip the gzip + * @param is + * the is + * @param gzip + * the gzip * * @return the wrapped input stream * - * @throws IOException Signals that an I/O exception has occurred. + * @throws IOException + * Signals that an I/O exception has occurred. */ protected InputStream getWrappedInputStream(InputStream is, boolean gzip) throws IOException { @@ -420,12 +456,13 @@ protected InputStream getWrappedInputStream(InputStream is, boolean gzip) } /** - * Encode url. - * - * @param original the original - * - * @return the string - */ + * Encode url. + * + * @param original + * the original + * + * @return the string + */ private static String encodeUrl(String original) { try { return URLEncoder.encode(original, ApplicationConstants.CONTENT_ENCODING); diff --git a/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java index 12082e4..8418224 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java @@ -18,12 +18,14 @@ import com.google.gson.reflect.TypeToken; /** - * @author nmukhtar - * + * The Class IssueServiceImpl. */ public class IssueServiceImpl extends BaseGitHubService implements IssueService { + /* (non-Javadoc) + * @see com.github.api.v2.services.IssueService#addComment(java.lang.String, java.lang.String, int, java.lang.String) + */ @Override public void addComment(String userName, String repositoryName, int issueNumber, String comment) { @@ -34,6 +36,9 @@ public void addComment(String userName, String repositoryName, callApiPost(apiUrl, parameters); } + /* (non-Javadoc) + * @see com.github.api.v2.services.IssueService#addLabel(java.lang.String, java.lang.String, int, java.lang.String) + */ @Override public List addLabel(String userName, String repositoryName, int issueNumber, String label) { @@ -44,6 +49,9 @@ public List addLabel(String userName, String repositoryName, return unmarshall(new TypeToken>(){}, json.get("labels")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.IssueService#closeIssue(java.lang.String, java.lang.String, int) + */ @Override public void closeIssue(String userName, String repositoryName, int issueNumber) { @@ -52,6 +60,9 @@ public void closeIssue(String userName, String repositoryName, callApiPost(apiUrl, new HashMap()); } + /* (non-Javadoc) + * @see com.github.api.v2.services.IssueService#createIssue(java.lang.String, java.lang.String, java.lang.String, java.lang.String) + */ @Override public void createIssue(String userName, String repositoryName, String title, String body) { @@ -63,6 +74,9 @@ public void createIssue(String userName, String repositoryName, callApiPost(apiUrl, parameters); } + /* (non-Javadoc) + * @see com.github.api.v2.services.IssueService#getIssue(java.lang.String, java.lang.String, int) + */ @Override public Issue getIssue(String userName, String repositoryName, int issueNumber) { @@ -73,6 +87,9 @@ public Issue getIssue(String userName, String repositoryName, return unmarshall(new TypeToken(){}, json.get("issue")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.IssueService#getIssueComments(java.lang.String, java.lang.String, int) + */ @Override public List getIssueComments(String userName, String repositoryName, int issueNumber) { @@ -83,6 +100,9 @@ public List getIssueComments(String userName, return unmarshall(new TypeToken>(){}, json.get("comments")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.IssueService#getIssueLabels(java.lang.String, java.lang.String) + */ @Override public List getIssueLabels(String userName, String repositoryName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.GET_ISSUE_LABELS_URL); @@ -92,6 +112,9 @@ public List getIssueLabels(String userName, String repositoryName) { return unmarshall(new TypeToken>(){}, json.get("labels")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.IssueService#getIssues(java.lang.String, java.lang.String, com.github.api.v2.schema.Issue.State) + */ @Override public List getIssues(String userName, String repositoryName, State state) { @@ -102,6 +125,9 @@ public List getIssues(String userName, String repositoryName, return unmarshall(new TypeToken>(){}, json.get("issues")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.IssueService#removeLabel(java.lang.String, java.lang.String, int, java.lang.String) + */ @Override public List removeLabel(String userName, String repositoryName, int issueNumber, String label) { @@ -112,6 +138,9 @@ public List removeLabel(String userName, String repositoryName, return unmarshall(new TypeToken>(){}, json.get("labels")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.IssueService#reopenIssue(java.lang.String, java.lang.String, int) + */ @Override public void reopenIssue(String userName, String repositoryName, int issueNumber) { @@ -120,6 +149,9 @@ public void reopenIssue(String userName, String repositoryName, callApiPost(apiUrl, new HashMap()); } + /* (non-Javadoc) + * @see com.github.api.v2.services.IssueService#searchIssues(java.lang.String, java.lang.String, com.github.api.v2.schema.Issue.State, java.lang.String) + */ @Override public List searchIssues(String userName, String repositoryName, State state, String keyword) { @@ -130,6 +162,9 @@ public List searchIssues(String userName, String repositoryName, return unmarshall(new TypeToken>(){}, json.get("issues")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.IssueService#updateIssue(java.lang.String, java.lang.String, int, java.lang.String, java.lang.String) + */ @Override public void updateIssue(String userName, String repositoryName, int issueNumber, String title, String body) { diff --git a/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java index 13b3a9f..3e5bfb0 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java @@ -16,12 +16,14 @@ import com.google.gson.reflect.TypeToken; /** - * @author nmukhtar - * + * The Class NetworkServiceImpl. */ public class NetworkServiceImpl extends BaseGitHubService implements NetworkService { + /* (non-Javadoc) + * @see com.github.api.v2.services.NetworkService#getNetworkData(java.lang.String, java.lang.String, java.lang.String) + */ @Override public List getNetworkData(String userName, String repositoryName, String networkHash) { @@ -32,6 +34,9 @@ public List getNetworkData(String userName, String repositoryName, return unmarshall(new TypeToken>(){}, json.get("commits")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.NetworkService#getNetworkData(java.lang.String, java.lang.String, java.lang.String, int, int) + */ @Override public List getNetworkData(String userName, String repositoryName, String networkHash, int startIndex, int endIndex) { @@ -42,6 +47,9 @@ public List getNetworkData(String userName, String repositoryName, return unmarshall(new TypeToken>(){}, json.get("commits")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.NetworkService#getNetworkMeta(java.lang.String, java.lang.String) + */ @Override public Network getNetworkMeta(String userName, String repositoryName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.NetworkApiUrls.GET_NETWORK_META_URL); @@ -50,6 +58,10 @@ public Network getNetworkMeta(String userName, String repositoryName) { return unmarshall(new TypeToken(){}, json); } + + /* (non-Javadoc) + * @see com.github.api.v2.services.impl.BaseGitHubService#getGsonBuilder() + */ protected GsonBuilder getGsonBuilder() { GsonBuilder gson = super.getGsonBuilder(); gson.setDateFormat("yyyy-MM-dd HH:mm:ss"); diff --git a/core/src/main/java/com/github/api/v2/services/impl/OAuthServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/OAuthServiceImpl.java index 2486c1a..909bdd9 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/OAuthServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/OAuthServiceImpl.java @@ -14,18 +14,24 @@ import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; /** - * The Class FacebookOAuthServiceImpl. + * The Class OAuthServiceImpl. */ public class OAuthServiceImpl extends BaseGitHubService implements OAuthService { + /** The client id. */ private final String clientId; + + /** The secret. */ private final String secret; /** - * Instantiates a new facebook o auth service impl. - * - * @param apiConsumer the api consumer - */ + * Instantiates a new o auth service impl. + * + * @param clientId + * the client id + * @param secret + * the secret + */ public OAuthServiceImpl(String clientId, String secret) { this.clientId = clientId; this.secret = secret; diff --git a/core/src/main/java/com/github/api/v2/services/impl/ObjectServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/ObjectServiceImpl.java index 8e6a908..d34a0b9 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/ObjectServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/ObjectServiceImpl.java @@ -16,12 +16,14 @@ import com.google.gson.reflect.TypeToken; /** - * @author nmukhtar - * + * The Class ObjectServiceImpl. */ public class ObjectServiceImpl extends BaseGitHubService implements ObjectService { + /* (non-Javadoc) + * @see com.github.api.v2.services.ObjectService#getBlob(java.lang.String, java.lang.String, java.lang.String, java.lang.String) + */ @Override public Blob getBlob(String userName, String repositoryName, String treeSha, String filePath) { @@ -32,6 +34,9 @@ public Blob getBlob(String userName, String repositoryName, String treeSha, return unmarshall(new TypeToken(){}, json.get("blob")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.ObjectService#getBlobs(java.lang.String, java.lang.String, java.lang.String) + */ @Override public List getBlobs(String userName, String repositoryName, String treeSha) { @@ -42,6 +47,9 @@ public List getBlobs(String userName, String repositoryName, return unmarshall(new TypeToken>(){}, json.get("blobs")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.ObjectService#getObjectContent(java.lang.String, java.lang.String, java.lang.String) + */ @Override public InputStream getObjectContent(String userName, String repositoryName, String objectSha) { @@ -50,6 +58,9 @@ public InputStream getObjectContent(String userName, String repositoryName, return callApiGet(apiUrl); } + /* (non-Javadoc) + * @see com.github.api.v2.services.ObjectService#getTree(java.lang.String, java.lang.String, java.lang.String) + */ @Override public List getTree(String userName, String repositoryName, String treeSha) { diff --git a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java index c4789de..f981a9f 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java @@ -21,12 +21,14 @@ import com.google.gson.reflect.TypeToken; /** - * @author nmukhtar - * + * The Class RepositoryServiceImpl. */ public class RepositoryServiceImpl extends BaseGitHubService implements RepositoryService { + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#addCollaborator(java.lang.String, java.lang.String) + */ @Override public void addCollaborator(String repositoryName, String collaboratorName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.ADD_COLLABORATOR_URL); @@ -34,6 +36,9 @@ public void addCollaborator(String repositoryName, String collaboratorName) { unmarshall(callApiPost(apiUrl, new HashMap())); } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#addDeployKey(java.lang.String, java.lang.String, java.lang.String) + */ @Override public String addDeployKey(String repositoryName, String title, String key) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.ADD_DEPLOY_KEY_URL); @@ -46,6 +51,9 @@ public String addDeployKey(String repositoryName, String title, String key) { return unmarshall(new TypeToken(){}, json); } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#changeVisibility(java.lang.String, com.github.api.v2.schema.Repository.Visibility) + */ @Override public void changeVisibility(String repositoryName, Visibility visibility) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.CHANGE_VISIBILITY_URL); @@ -55,6 +63,9 @@ public void changeVisibility(String repositoryName, Visibility visibility) { unmarshall(new TypeToken(){}, json.get("repository")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#createRepository(java.lang.String, java.lang.String, java.lang.String, com.github.api.v2.schema.Repository.Visibility) + */ @Override public void createRepository(String name, String description, String homePage, Visibility visibility) { @@ -70,6 +81,9 @@ public void createRepository(String name, String description, unmarshall(new TypeToken(){}, json.get("repository")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#deleteRepository(java.lang.String) + */ @Override public void deleteRepository(String repositoryName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.DELETE_REPOSITORY_URL); @@ -82,6 +96,9 @@ public void deleteRepository(String repositoryName) { } } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#forkRepository(java.lang.String, java.lang.String) + */ @Override public Repository forkRepository(String userName, String repositoryName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.FORK_REPOSITORY_URL); @@ -90,6 +107,9 @@ public Repository forkRepository(String userName, String repositoryName) { return unmarshall(new TypeToken(){}, json.get("repository")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getBranches(java.lang.String, java.lang.String) + */ @Override public Map getBranches(String userName, String repositoryName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_BRANCHES_URL); @@ -99,6 +119,9 @@ public Map getBranches(String userName, String repositoryName) { return unmarshall(new TypeToken>(){}, json.get("branches")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getCollaborators(java.lang.String, java.lang.String) + */ @Override public List getCollaborators(String userName, String repositoryName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_COLLABORATORS_URL); @@ -108,6 +131,9 @@ public List getCollaborators(String userName, String repositoryName) { return unmarshall(new TypeToken>(){}, json.get("collaborators")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getContributors(java.lang.String, java.lang.String) + */ @Override public List getContributors(String userName, String repositoryName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_CONTRIBUTORS_URL); @@ -117,6 +143,9 @@ public List getContributors(String userName, String repositoryName) { return unmarshall(new TypeToken>(){}, json.get("contributors")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getForks(java.lang.String, java.lang.String) + */ @Override public List getForks(String userName, String repositoryName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_FORKS_URL); @@ -126,6 +155,9 @@ public List getForks(String userName, String repositoryName) { return unmarshall(new TypeToken>(){}, json.get("network")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getDeployKeys(java.lang.String) + */ @Override public List getDeployKeys(String repositoryName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_DEPLOY_KEYS_URL); @@ -135,6 +167,9 @@ public List getDeployKeys(String repositoryName) { return unmarshall(new TypeToken>(){}, json.get("public_keys")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getLanguageBreakdown(java.lang.String, java.lang.String) + */ @Override public Map getLanguageBreakdown(String userName, String repositoryName) { @@ -145,6 +180,9 @@ public Map getLanguageBreakdown(String userName, return unmarshall(new TypeToken>(){}, json.get("languages")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getPushableRepositories() + */ @Override public List getPushableRepositories() { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_PUSHABLE_REPOSITORIES_URL); @@ -154,6 +192,9 @@ public List getPushableRepositories() { return unmarshall(new TypeToken>(){}, json.get("repositories")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getRepositories(java.lang.String) + */ @Override public List getRepositories(String userName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_REPOSITORIES_URL); @@ -163,6 +204,9 @@ public List getRepositories(String userName) { return unmarshall(new TypeToken>(){}, json.get("repositories")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getRepository(java.lang.String, java.lang.String) + */ @Override public Repository getRepository(String userName, String repositoryName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_REPOSITORY_URL); @@ -172,6 +216,9 @@ public Repository getRepository(String userName, String repositoryName) { return unmarshall(new TypeToken(){}, json.get("repository")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getTags(java.lang.String, java.lang.String) + */ @Override public Map getTags(String userName, String repositoryName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_TAGS_URL); @@ -181,6 +228,9 @@ public Map getTags(String userName, String repositoryName) { return unmarshall(new TypeToken>(){}, json.get("tags")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getWatchers(java.lang.String, java.lang.String) + */ @Override public List getWatchers(String userName, String repositoryName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_WATCHERS_URL); @@ -190,6 +240,9 @@ public List getWatchers(String userName, String repositoryName) { return unmarshall(new TypeToken>(){}, json.get("watchers")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#removeCollaborator(java.lang.String, java.lang.String) + */ @Override public void removeCollaborator(String repositoryName, String collaboratorName) { @@ -198,6 +251,9 @@ public void removeCollaborator(String repositoryName, unmarshall(callApiPost(apiUrl, new HashMap())); } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#removeDeployKey(java.lang.String, java.lang.String) + */ @Override public void removeDeployKey(String repositoryName, String id) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.REMOVE_DEPLOY_KEY_URL); @@ -207,6 +263,9 @@ public void removeDeployKey(String repositoryName, String id) { unmarshall(callApiPost(apiUrl, parameters)); } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#searchRepositories(java.lang.String) + */ @Override public List searchRepositories(String query) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); @@ -216,6 +275,9 @@ public List searchRepositories(String query) { return unmarshall(new TypeToken>(){}, json.get("repositories")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#searchRepositories(java.lang.String, com.github.api.v2.schema.Language) + */ @Override public List searchRepositories(String query, Language language) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); @@ -225,6 +287,9 @@ public List searchRepositories(String query, Language language) { return unmarshall(new TypeToken>(){}, json.get("repositories")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#searchRepositories(java.lang.String, int) + */ @Override public List searchRepositories(String query, int pageNumber) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); @@ -234,6 +299,9 @@ public List searchRepositories(String query, int pageNumber) { return unmarshall(new TypeToken>(){}, json.get("repositories")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#searchRepositories(java.lang.String, com.github.api.v2.schema.Language, int) + */ @Override public List searchRepositories(String query, Language language, int pageNumber) { @@ -244,6 +312,9 @@ public List searchRepositories(String query, Language language, return unmarshall(new TypeToken>(){}, json.get("repositories")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#unwatchRepository(java.lang.String, java.lang.String) + */ @Override public void unwatchRepository(String userName, String repositoryName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.UNWATCH_REPOSITORY_URL); @@ -251,6 +322,9 @@ public void unwatchRepository(String userName, String repositoryName) { unmarshall(callApiPost(apiUrl, new HashMap())); } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#updateRepository(com.github.api.v2.schema.Repository) + */ @Override public void updateRepository(Repository repository) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.UPDATE_REPOSITORY_URL); @@ -266,6 +340,9 @@ public void updateRepository(Repository repository) { unmarshall(new TypeToken(){}, json.get("repository")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#watchRepository(java.lang.String, java.lang.String) + */ @Override public void watchRepository(String userName, String repositoryName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.WATCH_REPOSITORY_URL); @@ -273,6 +350,9 @@ public void watchRepository(String userName, String repositoryName) { unmarshall(callApiPost(apiUrl, new HashMap())); } + /* (non-Javadoc) + * @see com.github.api.v2.services.impl.BaseGitHubService#getGsonBuilder() + */ protected GsonBuilder getGsonBuilder() { GsonBuilder gson = super.getGsonBuilder(); gson.setDateFormat("yyyy-MM-dd'T'HH:mm:ss"); diff --git a/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java index d75de96..3f38427 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java @@ -18,12 +18,14 @@ import com.google.gson.reflect.TypeToken; /** - * @author nmukhtar - * + * The Class UserServiceImpl. */ public class UserServiceImpl extends BaseGitHubService implements UserService { + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#addEmail(java.lang.String) + */ @Override public void addEmail(String email) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.ADD_EMAIL_URL); @@ -33,6 +35,9 @@ public void addEmail(String email) { callApiPost(apiUrl, parameters); } + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#addKey(java.lang.String, java.lang.String) + */ @Override public void addKey(String title, String key) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.ADD_KEY_URL); @@ -43,6 +48,9 @@ public void addKey(String title, String key) { callApiPost(apiUrl, parameters); } + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#followUser(java.lang.String) + */ @Override public void followUser(String userName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.FOLLOW_USER_URL); @@ -50,6 +58,9 @@ public void followUser(String userName) { callApiPost(apiUrl, new HashMap()); } + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#getCurrentUser() + */ @Override public User getCurrentUser() { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_CURRENT_USER_URL); @@ -59,6 +70,9 @@ public User getCurrentUser() { return unmarshall(new TypeToken(){}, json.get("user")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#getEmails() + */ @Override public List getEmails() { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_EMAILS_URL); @@ -68,6 +82,9 @@ public List getEmails() { return unmarshall(new TypeToken>(){}, json.get("emails")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#getKeys() + */ @Override public List getKeys() { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_KEYS_URL); @@ -77,6 +94,9 @@ public List getKeys() { return unmarshall(new TypeToken>(){}, json.get("keys")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#getUserByUsername(java.lang.String) + */ @Override public User getUserByUsername(String userName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_USER_URL); @@ -86,6 +106,9 @@ public User getUserByUsername(String userName) { return unmarshall(new TypeToken(){}, json.get("user")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#getUserFollowers(java.lang.String) + */ @Override public List getUserFollowers(String userName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_USER_FOLLOWERS_URL); @@ -95,6 +118,9 @@ public List getUserFollowers(String userName) { return unmarshall(new TypeToken>(){}, json.get("users")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#getUserFollowing(java.lang.String) + */ @Override public List getUserFollowing(String userName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_USER_FOLLOWING_URL); @@ -104,6 +130,9 @@ public List getUserFollowing(String userName) { return unmarshall(new TypeToken>(){}, json.get("users")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#getWatchedRepositories(java.lang.String) + */ @Override public List getWatchedRepositories(String userName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_WATCHED_REPOSITORIES_URL); @@ -113,6 +142,9 @@ public List getWatchedRepositories(String userName) { return unmarshall(new TypeToken>(){}, json.get("repositories")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#removeEmail(java.lang.String) + */ @Override public void removeEmail(String email) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.REMOVE_EMAIL_URL); @@ -122,6 +154,9 @@ public void removeEmail(String email) { callApiPost(apiUrl, parameters); } + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#removeKey(java.lang.String) + */ @Override public void removeKey(String id) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.REMOVE_KEY_URL); @@ -131,6 +166,9 @@ public void removeKey(String id) { callApiPost(apiUrl, parameters); } + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#getUserByEmail(java.lang.String) + */ @Override public User getUserByEmail(String email) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.SEARCH_USERS_BY_EMAIL_URL); @@ -140,6 +178,9 @@ public User getUserByEmail(String email) { return unmarshall(new TypeToken(){}, json.get("user")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#searchUsersByName(java.lang.String) + */ @Override public List searchUsersByName(String name) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.SEARCH_USERS_BY_NAME_URL); @@ -149,6 +190,9 @@ public List searchUsersByName(String name) { return unmarshall(new TypeToken>(){}, json.get("users")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#unfollowUser(java.lang.String) + */ @Override public void unfollowUser(String userName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.UNFOLLOW_USER_URL); @@ -156,6 +200,9 @@ public void unfollowUser(String userName) { callApiPost(apiUrl, new HashMap()); } + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#updateUser(com.github.api.v2.schema.User) + */ @Override public void updateUser(User user) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.UPDATE_USER_URL); diff --git a/core/src/main/java/com/github/api/v2/services/util/Base64.java b/core/src/main/java/com/github/api/v2/services/util/Base64.java index 4300ee2..d97856b 100644 --- a/core/src/main/java/com/github/api/v2/services/util/Base64.java +++ b/core/src/main/java/com/github/api/v2/services/util/Base64.java @@ -1,151 +1,10 @@ +/* + * + */ package com.github.api.v2.services.util; /** - *

Encodes and decodes to and from Base64 notation.

- *

Homepage: http://iharder.net/base64.

- * - *

Example:

- * - * String encoded = Base64.encode( myByteArray ); - *
- * byte[] myByteArray = Base64.decode( encoded ); - * - *

The options parameter, which appears in a few places, is used to pass - * several pieces of information to the encoder. In the "higher level" methods such as - * encodeBytes( bytes, options ) the options parameter can be used to indicate such - * things as first gzipping the bytes before encoding them, not inserting linefeeds, - * and encoding using the URL-safe and Ordered dialects.

- * - *

Note, according to RFC3548, - * Section 2.1, implementations should not add line feeds unless explicitly told - * to do so. I've got Base64 set to this behavior now, although earlier versions - * broke lines by default.

- * - *

The constants defined in Base64 can be OR-ed together to combine options, so you - * might make a call like this:

- * - * String encoded = Base64.encodeBytes( mybytes, Base64.GZIP | Base64.DO_BREAK_LINES ); - *

to compress the data before encoding it and then making the output have newline characters.

- *

Also...

- * String encoded = Base64.encodeBytes( crazyString.getBytes() ); - * - * - * - *

- * Change Log: - *

- *
    - *
  • v2.3.7 - Fixed subtle bug when base 64 input stream contained the - * value 01111111, which is an invalid base 64 character but should not - * throw an ArrayIndexOutOfBoundsException either. Led to discovery of - * mishandling (or potential for better handling) of other bad input - * characters. You should now get an IOException if you try decoding - * something that has bad characters in it.
  • - *
  • v2.3.6 - Fixed bug when breaking lines and the final byte of the encoded - * string ended in the last column; the buffer was not properly shrunk and - * contained an extra (null) byte that made it into the string.
  • - *
  • v2.3.5 - Fixed bug in {@link #encodeFromFile} where estimated buffer size - * was wrong for files of size 31, 34, and 37 bytes.
  • - *
  • v2.3.4 - Fixed bug when working with gzipped streams whereby flushing - * the Base64.OutputStream closed the Base64 encoding (by padding with equals - * signs) too soon. Also added an option to suppress the automatic decoding - * of gzipped streams. Also added experimental support for specifying a - * class loader when using the - * {@link #decodeToObject(java.lang.String, int, java.lang.ClassLoader)} - * method.
  • - *
  • v2.3.3 - Changed default char encoding to US-ASCII which reduces the internal Java - * footprint with its CharEncoders and so forth. Fixed some javadocs that were - * inconsistent. Removed imports and specified things like java.io.IOException - * explicitly inline.
  • - *
  • v2.3.2 - Reduced memory footprint! Finally refined the "guessing" of how big the - * final encoded data will be so that the code doesn't have to create two output - * arrays: an oversized initial one and then a final, exact-sized one. Big win - * when using the {@link #encodeBytesToBytes(byte[])} family of methods (and not - * using the gzip options which uses a different mechanism with streams and stuff).
  • - *
  • v2.3.1 - Added {@link #encodeBytesToBytes(byte[], int, int, int)} and some - * similar helper methods to be more efficient with memory by not returning a - * String but just a byte array.
  • - *
  • v2.3 - This is not a drop-in replacement! This is two years of comments - * and bug fixes queued up and finally executed. Thanks to everyone who sent - * me stuff, and I'm sorry I wasn't able to distribute your fixes to everyone else. - * Much bad coding was cleaned up including throwing exceptions where necessary - * instead of returning null values or something similar. Here are some changes - * that may affect you: - *
      - *
    • Does not break lines, by default. This is to keep in compliance with - * RFC3548.
    • - *
    • Throws exceptions instead of returning null values. Because some operations - * (especially those that may permit the GZIP option) use IO streams, there - * is a possiblity of an java.io.IOException being thrown. After some discussion and - * thought, I've changed the behavior of the methods to throw java.io.IOExceptions - * rather than return null if ever there's an error. I think this is more - * appropriate, though it will require some changes to your code. Sorry, - * it should have been done this way to begin with.
    • - *
    • Removed all references to System.out, System.err, and the like. - * Shame on me. All I can say is sorry they were ever there.
    • - *
    • Throws NullPointerExceptions and IllegalArgumentExceptions as needed - * such as when passed arrays are null or offsets are invalid.
    • - *
    • Cleaned up as much javadoc as I could to avoid any javadoc warnings. - * This was especially annoying before for people who were thorough in their - * own projects and then had gobs of javadoc warnings on this file.
    • - *
    - *
  • v2.2.1 - Fixed bug using URL_SAFE and ORDERED encodings. Fixed bug - * when using very small files (~< 40 bytes).
  • - *
  • v2.2 - Added some helper methods for encoding/decoding directly from - * one file to the next. Also added a main() method to support command line - * encoding/decoding from one file to the next. Also added these Base64 dialects: - *
      - *
    1. The default is RFC3548 format.
    2. - *
    3. Calling Base64.setFormat(Base64.BASE64_FORMAT.URLSAFE_FORMAT) generates - * URL and file name friendly format as described in Section 4 of RFC3548. - * http://www.faqs.org/rfcs/rfc3548.html
    4. - *
    5. Calling Base64.setFormat(Base64.BASE64_FORMAT.ORDERED_FORMAT) generates - * URL and file name friendly format that preserves lexical ordering as described - * in http://www.faqs.org/qa/rfcc-1940.html
    6. - *
    - * Special thanks to Jim Kellerman at http://www.powerset.com/ - * for contributing the new Base64 dialects. - *
  • - * - *
  • v2.1 - Cleaned up javadoc comments and unused variables and methods. Added - * some convenience methods for reading and writing to and from files.
  • - *
  • v2.0.2 - Now specifies UTF-8 encoding in places where the code fails on systems - * with other encodings (like EBCDIC).
  • - *
  • v2.0.1 - Fixed an error when decoding a single byte, that is, when the - * encoded data was a single byte.
  • - *
  • v2.0 - I got rid of methods that used booleans to set options. - * Now everything is more consolidated and cleaner. The code now detects - * when data that's being decoded is gzip-compressed and will decompress it - * automatically. Generally things are cleaner. You'll probably have to - * change some method calls that you were making to support the new - * options format (ints that you "OR" together).
  • - *
  • v1.5.1 - Fixed bug when decompressing and decoding to a - * byte[] using decode( String s, boolean gzipCompressed ). - * Added the ability to "suspend" encoding in the Output Stream so - * you can turn on and off the encoding if you need to embed base64 - * data in an otherwise "normal" stream (like an XML file).
  • - *
  • v1.5 - Output stream pases on flush() command but doesn't do anything itself. - * This helps when using GZIP streams. - * Added the ability to GZip-compress objects before encoding them.
  • - *
  • v1.4 - Added helper methods to read/write files.
  • - *
  • v1.3.6 - Fixed OutputStream.flush() so that 'position' is reset.
  • - *
  • v1.3.5 - Added flag to turn on and off line breaks. Fixed bug in input stream - * where last buffer being read, if not completely full, was not returned.
  • - *
  • v1.3.4 - Fixed when "improperly padded stream" error was thrown at the wrong time.
  • - *
  • v1.3.3 - Fixed I/O streams which were totally messed up.
  • - *
- * - *

- * I am placing this code in the Public Domain. Do with it as you will. - * This software comes with no guarantees or warranties but with - * plenty of well-wishing instead! - * Please visit http://iharder.net/base64 - * periodically to check for updates or to contribute improvements. - *

- * - * @author Robert Harder - * @author rob@iharder.net - * @version 2.3.7 + * The Class Base64. */ public class Base64 { @@ -153,71 +12,64 @@ public class Base64 /* ******** P U B L I C F I E L D S ******** */ - /** No options specified. Value is zero. */ + /** The Constant NO_OPTIONS. */ public final static int NO_OPTIONS = 0; - /** Specify encoding in first bit. Value is one. */ + /** The Constant ENCODE. */ public final static int ENCODE = 1; - /** Specify decoding in first bit. Value is zero. */ + /** The Constant DECODE. */ public final static int DECODE = 0; - /** Specify that data should be gzip-compressed in second bit. Value is two. */ + /** The Constant GZIP. */ public final static int GZIP = 2; - /** Specify that gzipped data should not be automatically gunzipped. */ + /** The Constant DONT_GUNZIP. */ public final static int DONT_GUNZIP = 4; - /** Do break lines when encoding. Value is 8. */ + /** The Constant DO_BREAK_LINES. */ public final static int DO_BREAK_LINES = 8; - /** - * Encode using Base64-like encoding that is URL- and Filename-safe as described - * in Section 4 of RFC3548: - * http://www.faqs.org/rfcs/rfc3548.html. - * It is important to note that data encoded this way is not officially valid Base64, - * or at the very least should not be called Base64 without also specifying that is - * was encoded using the URL- and Filename-safe dialect. - */ + /** The Constant URL_SAFE. */ public final static int URL_SAFE = 16; - /** - * Encode using the special "ordered" dialect of Base64 described here: - * http://www.faqs.org/qa/rfcc-1940.html. - */ + /** The Constant ORDERED. */ public final static int ORDERED = 32; /* ******** P R I V A T E F I E L D S ******** */ - /** Maximum line length (76) of Base64 output. */ + /** The Constant MAX_LINE_LENGTH. */ private final static int MAX_LINE_LENGTH = 76; - /** The equals sign (=) as a byte. */ + /** The Constant EQUALS_SIGN. */ private final static byte EQUALS_SIGN = (byte)'='; - /** The new line character (\n) as a byte. */ + /** The Constant NEW_LINE. */ private final static byte NEW_LINE = (byte)'\n'; - /** Preferred encoding. */ + /** The Constant PREFERRED_ENCODING. */ private final static String PREFERRED_ENCODING = "US-ASCII"; + /** The Constant WHITE_SPACE_ENC. */ private final static byte WHITE_SPACE_ENC = -5; // Indicates white space in encoding + + /** The Constant EQUALS_SIGN_ENC. */ private final static byte EQUALS_SIGN_ENC = -1; // Indicates equals sign in encoding /* ******** S T A N D A R D B A S E 6 4 A L P H A B E T ******** */ - /** The 64 valid Base64 values. */ + /** The Constant _STANDARD_ALPHABET. */ /* Host platform me be something funny like EBCDIC, so we hardcode these values. */ private final static byte[] _STANDARD_ALPHABET = { (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G', @@ -233,10 +85,7 @@ public class Base64 }; - /** - * Translates a Base64 value to either its 6-bit reconstruction value - * or a negative number indicating some other meaning. - **/ + /** The Constant _STANDARD_DECODABET. */ private final static byte[] _STANDARD_DECODABET = { -9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 0 - 8 -5,-5, // Whitespace: Tab and Linefeed @@ -274,11 +123,7 @@ public class Base64 /* ******** U R L S A F E B A S E 6 4 A L P H A B E T ******** */ - /** - * Used in the URL- and Filename-safe dialect described in Section 4 of RFC3548: - * http://www.faqs.org/rfcs/rfc3548.html. - * Notice that the last two bytes become "hyphen" and "underscore" instead of "plus" and "slash." - */ + /** The Constant _URL_SAFE_ALPHABET. */ private final static byte[] _URL_SAFE_ALPHABET = { (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G', (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N', @@ -292,9 +137,7 @@ public class Base64 (byte)'6', (byte)'7', (byte)'8', (byte)'9', (byte)'-', (byte)'_' }; - /** - * Used in decoding URL- and Filename-safe dialects of Base64. - */ + /** The Constant _URL_SAFE_DECODABET. */ private final static byte[] _URL_SAFE_DECODABET = { -9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 0 - 8 -5,-5, // Whitespace: Tab and Linefeed @@ -337,11 +180,7 @@ public class Base64 /* ******** O R D E R E D B A S E 6 4 A L P H A B E T ******** */ - /** - * I don't get the point of this technique, but someone requested it, - * and it is described here: - * http://www.faqs.org/qa/rfcc-1940.html. - */ + /** The Constant _ORDERED_ALPHABET. */ private final static byte[] _ORDERED_ALPHABET = { (byte)'-', (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', @@ -357,9 +196,7 @@ public class Base64 (byte)'v', (byte)'w', (byte)'x', (byte)'y', (byte)'z' }; - /** - * Used in decoding the "ordered" dialect of Base64. - */ + /** The Constant _ORDERED_DECODABET. */ private final static byte[] _ORDERED_DECODABET = { -9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 0 - 8 -5,-5, // Whitespace: Tab and Linefeed @@ -403,12 +240,13 @@ public class Base64 /** - * Returns one of the _SOMETHING_ALPHABET byte arrays depending on - * the options specified. - * It's possible, though silly, to specify ORDERED and URLSAFE - * in which case one of them will be picked, though there is - * no guarantee as to which one will be picked. - */ + * Gets the alphabet. + * + * @param options + * the options + * + * @return the alphabet + */ private final static byte[] getAlphabet( int options ) { if ((options & URL_SAFE) == URL_SAFE) { return _URL_SAFE_ALPHABET; @@ -421,12 +259,13 @@ private final static byte[] getAlphabet( int options ) { /** - * Returns one of the _SOMETHING_DECODABET byte arrays depending on - * the options specified. - * It's possible, though silly, to specify ORDERED and URL_SAFE - * in which case one of them will be picked, though there is - * no guarantee as to which one will be picked. - */ + * Gets the decodabet. + * + * @param options + * the options + * + * @return the decodabet + */ private final static byte[] getDecodabet( int options ) { if( (options & URL_SAFE) == URL_SAFE) { return _URL_SAFE_DECODABET; @@ -439,7 +278,9 @@ private final static byte[] getDecodabet( int options ) { - /** Defeats instantiation. */ + /** + * Instantiates a new base64. + */ private Base64(){} @@ -449,20 +290,19 @@ private Base64(){} /** - * Encodes up to the first three bytes of array threeBytes - * and returns a four-byte array in Base64 notation. - * The actual number of significant bytes in your array is - * given by numSigBytes. - * The array threeBytes needs only be as big as - * numSigBytes. - * Code can reuse a byte array by passing a four-byte array as b4. - * - * @param b4 A reusable byte array to reduce array instantiation - * @param threeBytes the array to convert - * @param numSigBytes the number of significant bytes in your array - * @return four byte array in Base64 notation. - * @since 1.5.1 - */ + * Encode3to4. + * + * @param b4 + * the b4 + * @param threeBytes + * the three bytes + * @param numSigBytes + * the num sig bytes + * @param options + * the options + * + * @return the byte[] + */ private static byte[] encode3to4( byte[] b4, byte[] threeBytes, int numSigBytes, int options ) { encode3to4( threeBytes, 0, numSigBytes, b4, 0, options ); return b4; @@ -470,28 +310,23 @@ private static byte[] encode3to4( byte[] b4, byte[] threeBytes, int numSigBytes, /** - *

Encodes up to three bytes of the array source - * and writes the resulting four Base64 bytes to destination. - * The source and destination arrays can be manipulated - * anywhere along their length by specifying - * srcOffset and destOffset. - * This method does not check to make sure your arrays - * are large enough to accomodate srcOffset + 3 for - * the source array or destOffset + 4 for - * the destination array. - * The actual number of significant bytes in your array is - * given by numSigBytes.

- *

This is the lowest level of the encoding methods with - * all possible parameters.

- * - * @param source the array to convert - * @param srcOffset the index where conversion begins - * @param numSigBytes the number of significant bytes in your array - * @param destination the array to hold the conversion - * @param destOffset the index where output will be put - * @return the destination array - * @since 1.3 - */ + * Encode3to4. + * + * @param source + * the source + * @param srcOffset + * the src offset + * @param numSigBytes + * the num sig bytes + * @param destination + * the destination + * @param destOffset + * the dest offset + * @param options + * the options + * + * @return the byte[] + */ private static byte[] encode3to4( byte[] source, int srcOffset, int numSigBytes, byte[] destination, int destOffset, int options ) { @@ -544,16 +379,13 @@ private static byte[] encode3to4( /** - * Performs Base64 encoding on the raw ByteBuffer, - * writing it to the encoded ByteBuffer. - * This is an experimental feature. Currently it does not - * pass along any options (such as {@link #DO_BREAK_LINES} - * or {@link #GZIP}. - * - * @param raw input buffer - * @param encoded output buffer - * @since 2.3 - */ + * Encode. + * + * @param raw + * the raw + * @param encoded + * the encoded + */ public static void encode( java.nio.ByteBuffer raw, java.nio.ByteBuffer encoded ){ byte[] raw3 = new byte[3]; byte[] enc4 = new byte[4]; @@ -568,16 +400,13 @@ public static void encode( java.nio.ByteBuffer raw, java.nio.ByteBuffer encoded /** - * Performs Base64 encoding on the raw ByteBuffer, - * writing it to the encoded CharBuffer. - * This is an experimental feature. Currently it does not - * pass along any options (such as {@link #DO_BREAK_LINES} - * or {@link #GZIP}. - * - * @param raw input buffer - * @param encoded output buffer - * @since 2.3 - */ + * Encode. + * + * @param raw + * the raw + * @param encoded + * the encoded + */ public static void encode( java.nio.ByteBuffer raw, java.nio.CharBuffer encoded ){ byte[] raw3 = new byte[3]; byte[] enc4 = new byte[4]; @@ -596,23 +425,16 @@ public static void encode( java.nio.ByteBuffer raw, java.nio.CharBuffer encoded /** - * Serializes an object and returns the Base64-encoded - * version of that serialized object. - * - *

As of v 2.3, if the object - * cannot be serialized or there is another error, - * the method will throw an java.io.IOException. This is new to v2.3! - * In earlier versions, it just returned a null value, but - * in retrospect that's a pretty poor way to handle it.

- * - * The object is not GZip-compressed before being encoded. - * - * @param serializableObject The object to encode - * @return The Base64-encoded object - * @throws java.io.IOException if there is an error - * @throws NullPointerException if serializedObject is null - * @since 1.4 - */ + * Encode object. + * + * @param serializableObject + * the serializable object + * + * @return the string + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ public static String encodeObject( java.io.Serializable serializableObject ) throws java.io.IOException { return encodeObject( serializableObject, NO_OPTIONS ); @@ -621,34 +443,18 @@ public static String encodeObject( java.io.Serializable serializableObject ) /** - * Serializes an object and returns the Base64-encoded - * version of that serialized object. - * - *

As of v 2.3, if the object - * cannot be serialized or there is another error, - * the method will throw an java.io.IOException. This is new to v2.3! - * In earlier versions, it just returned a null value, but - * in retrospect that's a pretty poor way to handle it.

- * - * The object is not GZip-compressed before being encoded. - *

- * Example options:

-     *   GZIP: gzip-compresses object before encoding it.
-     *   DO_BREAK_LINES: break lines at 76 characters
-     * 
- *

- * Example: encodeObject( myObj, Base64.GZIP ) or - *

- * Example: encodeObject( myObj, Base64.GZIP | Base64.DO_BREAK_LINES ) - * - * @param serializableObject The object to encode - * @param options Specified options - * @return The Base64-encoded object - * @see Base64#GZIP - * @see Base64#DO_BREAK_LINES - * @throws java.io.IOException if there is an error - * @since 2.0 - */ + * Encode object. + * + * @param serializableObject + * the serializable object + * @param options + * the options + * + * @return the string + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ public static String encodeObject( java.io.Serializable serializableObject, int options ) throws java.io.IOException { @@ -703,14 +509,13 @@ public static String encodeObject( java.io.Serializable serializableObject, int /** - * Encodes a byte array into Base64 notation. - * Does not GZip-compress data. - * - * @param source The data to convert - * @return The data in Base64-encoded form - * @throws NullPointerException if source array is null - * @since 1.4 - */ + * Encode bytes. + * + * @param source + * the source + * + * @return the string + */ public static String encodeBytes( byte[] source ) { // Since we're not going to have the GZIP encoding turned on, // we're not going to have an java.io.IOException thrown, so @@ -728,57 +533,35 @@ public static String encodeBytes( byte[] source ) { /** - * Encodes a byte array into Base64 notation. - *

- * Example options:

-     *   GZIP: gzip-compresses object before encoding it.
-     *   DO_BREAK_LINES: break lines at 76 characters
-     *     Note: Technically, this makes your encoding non-compliant.
-     * 
- *

- * Example: encodeBytes( myData, Base64.GZIP ) or - *

- * Example: encodeBytes( myData, Base64.GZIP | Base64.DO_BREAK_LINES ) - * - * - *

As of v 2.3, if there is an error with the GZIP stream, - * the method will throw an java.io.IOException. This is new to v2.3! - * In earlier versions, it just returned a null value, but - * in retrospect that's a pretty poor way to handle it.

- * - * - * @param source The data to convert - * @param options Specified options - * @return The Base64-encoded data as a String - * @see Base64#GZIP - * @see Base64#DO_BREAK_LINES - * @throws java.io.IOException if there is an error - * @throws NullPointerException if source array is null - * @since 2.0 - */ + * Encode bytes. + * + * @param source + * the source + * @param options + * the options + * + * @return the string + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ public static String encodeBytes( byte[] source, int options ) throws java.io.IOException { return encodeBytes( source, 0, source.length, options ); } // end encodeBytes /** - * Encodes a byte array into Base64 notation. - * Does not GZip-compress data. - * - *

As of v 2.3, if there is an error, - * the method will throw an java.io.IOException. This is new to v2.3! - * In earlier versions, it just returned a null value, but - * in retrospect that's a pretty poor way to handle it.

- * - * - * @param source The data to convert - * @param off Offset in array where conversion should begin - * @param len Length of data to convert - * @return The Base64-encoded data as a String - * @throws NullPointerException if source array is null - * @throws IllegalArgumentException if source array, offset, or length are invalid - * @since 1.4 - */ + * Encode bytes. + * + * @param source + * the source + * @param off + * the off + * @param len + * the len + * + * @return the string + */ public static String encodeBytes( byte[] source, int off, int len ) { // Since we're not going to have the GZIP encoding turned on, // we're not going to have an java.io.IOException thrown, so @@ -796,37 +579,22 @@ public static String encodeBytes( byte[] source, int off, int len ) { /** - * Encodes a byte array into Base64 notation. - *

- * Example options:

-     *   GZIP: gzip-compresses object before encoding it.
-     *   DO_BREAK_LINES: break lines at 76 characters
-     *     Note: Technically, this makes your encoding non-compliant.
-     * 
- *

- * Example: encodeBytes( myData, Base64.GZIP ) or - *

- * Example: encodeBytes( myData, Base64.GZIP | Base64.DO_BREAK_LINES ) - * - * - *

As of v 2.3, if there is an error with the GZIP stream, - * the method will throw an java.io.IOException. This is new to v2.3! - * In earlier versions, it just returned a null value, but - * in retrospect that's a pretty poor way to handle it.

- * - * - * @param source The data to convert - * @param off Offset in array where conversion should begin - * @param len Length of data to convert - * @param options Specified options - * @return The Base64-encoded data as a String - * @see Base64#GZIP - * @see Base64#DO_BREAK_LINES - * @throws java.io.IOException if there is an error - * @throws NullPointerException if source array is null - * @throws IllegalArgumentException if source array, offset, or length are invalid - * @since 2.0 - */ + * Encode bytes. + * + * @param source + * the source + * @param off + * the off + * @param len + * the len + * @param options + * the options + * + * @return the string + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ public static String encodeBytes( byte[] source, int off, int len, int options ) throws java.io.IOException { byte[] encoded = encodeBytesToBytes( source, off, len, options ); @@ -844,16 +612,13 @@ public static String encodeBytes( byte[] source, int off, int len, int options ) /** - * Similar to {@link #encodeBytes(byte[])} but returns - * a byte array instead of instantiating a String. This is more efficient - * if you're working with I/O streams and have large data sets to encode. - * - * - * @param source The data to convert - * @return The Base64-encoded data as a byte[] (of ASCII characters) - * @throws NullPointerException if source array is null - * @since 2.3.1 - */ + * Encode bytes to bytes. + * + * @param source + * the source + * + * @return the byte[] + */ public static byte[] encodeBytesToBytes( byte[] source ) { byte[] encoded = null; try { @@ -866,23 +631,22 @@ public static byte[] encodeBytesToBytes( byte[] source ) { /** - * Similar to {@link #encodeBytes(byte[], int, int, int)} but returns - * a byte array instead of instantiating a String. This is more efficient - * if you're working with I/O streams and have large data sets to encode. - * - * - * @param source The data to convert - * @param off Offset in array where conversion should begin - * @param len Length of data to convert - * @param options Specified options - * @return The Base64-encoded data as a String - * @see Base64#GZIP - * @see Base64#DO_BREAK_LINES - * @throws java.io.IOException if there is an error - * @throws NullPointerException if source array is null - * @throws IllegalArgumentException if source array, offset, or length are invalid - * @since 2.3.1 - */ + * Encode bytes to bytes. + * + * @param source + * the source + * @param off + * the off + * @param len + * the len + * @param options + * the options + * + * @return the byte[] + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ public static byte[] encodeBytesToBytes( byte[] source, int off, int len, int options ) throws java.io.IOException { if( source == null ){ @@ -1000,33 +764,21 @@ public static byte[] encodeBytesToBytes( byte[] source, int off, int len, int op /** - * Decodes four bytes from array source - * and writes the resulting bytes (up to three of them) - * to destination. - * The source and destination arrays can be manipulated - * anywhere along their length by specifying - * srcOffset and destOffset. - * This method does not check to make sure your arrays - * are large enough to accomodate srcOffset + 4 for - * the source array or destOffset + 3 for - * the destination array. - * This method returns the actual number of bytes that - * were converted from the Base64 encoding. - *

This is the lowest level of the decoding methods with - * all possible parameters.

- * - * - * @param source the array to convert - * @param srcOffset the index where conversion begins - * @param destination the array to hold the conversion - * @param destOffset the index where output will be put - * @param options alphabet type is pulled from this (standard, url-safe, ordered) - * @return the number of decoded bytes converted - * @throws NullPointerException if source or destination arrays are null - * @throws IllegalArgumentException if srcOffset or destOffset are invalid - * or there is not enough room in the array. - * @since 1.3 - */ + * Decode4to3. + * + * @param source + * the source + * @param srcOffset + * the src offset + * @param destination + * the destination + * @param destOffset + * the dest offset + * @param options + * the options + * + * @return the int + */ private static int decode4to3( byte[] source, int srcOffset, byte[] destination, int destOffset, int options ) { @@ -1103,18 +855,16 @@ else if( source[ srcOffset + 3 ] == EQUALS_SIGN ) { /** - * Low-level access to decoding ASCII characters in - * the form of a byte array. Ignores GUNZIP option, if - * it's set. This is not generally a recommended method, - * although it is used internally as part of the decoding process. - * Special case: if len = 0, an empty array is returned. Still, - * if you need more speed and reduced memory footprint (and aren't - * gzipping), consider this method. - * - * @param source The Base64 encoded data - * @return decoded data - * @since 2.3.1 - */ + * Decode. + * + * @param source + * the source + * + * @return the byte[] + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ public static byte[] decode( byte[] source ) throws java.io.IOException { byte[] decoded = null; @@ -1129,22 +879,22 @@ public static byte[] decode( byte[] source ) /** - * Low-level access to decoding ASCII characters in - * the form of a byte array. Ignores GUNZIP option, if - * it's set. This is not generally a recommended method, - * although it is used internally as part of the decoding process. - * Special case: if len = 0, an empty array is returned. Still, - * if you need more speed and reduced memory footprint (and aren't - * gzipping), consider this method. - * - * @param source The Base64 encoded data - * @param off The offset of where to begin decoding - * @param len The length of characters to decode - * @param options Can specify options such as alphabet type to use - * @return decoded data - * @throws java.io.IOException If bogus characters exist in source data - * @since 1.3 - */ + * Decode. + * + * @param source + * the source + * @param off + * the off + * @param len + * the len + * @param options + * the options + * + * @return the byte[] + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ public static byte[] decode( byte[] source, int off, int len, int options ) throws java.io.IOException { @@ -1212,14 +962,16 @@ public static byte[] decode( byte[] source, int off, int len, int options ) /** - * Decodes data from Base64 notation, automatically - * detecting gzip-compressed data and decompressing it. - * - * @param s the string to decode - * @return the decoded data - * @throws java.io.IOException If there is a problem - * @since 1.4 - */ + * Decode. + * + * @param s + * the s + * + * @return the byte[] + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ public static byte[] decode( String s ) throws java.io.IOException { return decode( s, NO_OPTIONS ); } @@ -1227,16 +979,18 @@ public static byte[] decode( String s ) throws java.io.IOException { /** - * Decodes data from Base64 notation, automatically - * detecting gzip-compressed data and decompressing it. - * - * @param s the string to decode - * @param options encode options such as URL_SAFE - * @return the decoded data - * @throws java.io.IOException if there is an error - * @throws NullPointerException if s is null - * @since 1.4 - */ + * Decode. + * + * @param s + * the s + * @param options + * the options + * + * @return the byte[] + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ public static byte[] decode( String s, int options ) throws java.io.IOException { if( s == null ){ @@ -1300,17 +1054,18 @@ public static byte[] decode( String s, int options ) throws java.io.IOException /** - * Attempts to decode Base64 data and deserialize a Java - * Object within. Returns null if there was an error. - * - * @param encodedObject The Base64 data to decode - * @return The decoded and deserialized object - * @throws NullPointerException if encodedObject is null - * @throws java.io.IOException if there is a general error - * @throws ClassNotFoundException if the decoded object is of a - * class that cannot be found by the JVM - * @since 1.5 - */ + * Decode to object. + * + * @param encodedObject + * the encoded object + * + * @return the object + * + * @throws IOException + * Signals that an I/O exception has occurred. + * @throws ClassNotFoundException + * the class not found exception + */ public static Object decodeToObject( String encodedObject ) throws java.io.IOException, java.lang.ClassNotFoundException { return decodeToObject(encodedObject,NO_OPTIONS,null); @@ -1318,21 +1073,22 @@ public static Object decodeToObject( String encodedObject ) /** - * Attempts to decode Base64 data and deserialize a Java - * Object within. Returns null if there was an error. - * If loader is not null, it will be the class loader - * used when deserializing. - * - * @param encodedObject The Base64 data to decode - * @param options Various parameters related to decoding - * @param loader Optional class loader to use in deserializing classes. - * @return The decoded and deserialized object - * @throws NullPointerException if encodedObject is null - * @throws java.io.IOException if there is a general error - * @throws ClassNotFoundException if the decoded object is of a - * class that cannot be found by the JVM - * @since 2.3.4 - */ + * Decode to object. + * + * @param encodedObject + * the encoded object + * @param options + * the options + * @param loader + * the loader + * + * @return the object + * + * @throws IOException + * Signals that an I/O exception has occurred. + * @throws ClassNotFoundException + * the class not found exception + */ public static Object decodeToObject( String encodedObject, int options, final ClassLoader loader ) throws java.io.IOException, java.lang.ClassNotFoundException { @@ -1388,19 +1144,16 @@ public Class resolveClass(java.io.ObjectStreamClass streamClass) /** - * Convenience method for encoding data to a file. - * - *

As of v 2.3, if there is a error, - * the method will throw an java.io.IOException. This is new to v2.3! - * In earlier versions, it just returned false, but - * in retrospect that's a pretty poor way to handle it.

- * - * @param dataToEncode byte array of data to encode in base64 form - * @param filename Filename for saving encoded data - * @throws java.io.IOException if there is an error - * @throws NullPointerException if dataToEncode is null - * @since 2.1 - */ + * Encode to file. + * + * @param dataToEncode + * the data to encode + * @param filename + * the filename + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ public static void encodeToFile( byte[] dataToEncode, String filename ) throws java.io.IOException { @@ -1425,18 +1178,16 @@ public static void encodeToFile( byte[] dataToEncode, String filename ) /** - * Convenience method for decoding data to a file. - * - *

As of v 2.3, if there is a error, - * the method will throw an java.io.IOException. This is new to v2.3! - * In earlier versions, it just returned false, but - * in retrospect that's a pretty poor way to handle it.

- * - * @param dataToDecode Base64-encoded data as a string - * @param filename Filename for saving decoded data - * @throws java.io.IOException if there is an error - * @since 2.1 - */ + * Decode to file. + * + * @param dataToDecode + * the data to decode + * @param filename + * the filename + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ public static void decodeToFile( String dataToDecode, String filename ) throws java.io.IOException { @@ -1459,19 +1210,16 @@ public static void decodeToFile( String dataToDecode, String filename ) /** - * Convenience method for reading a base64-encoded - * file and decoding it. - * - *

As of v 2.3, if there is a error, - * the method will throw an java.io.IOException. This is new to v2.3! - * In earlier versions, it just returned false, but - * in retrospect that's a pretty poor way to handle it.

- * - * @param filename Filename for reading encoded data - * @return decoded byte array - * @throws java.io.IOException if there is an error - * @since 2.1 - */ + * Decode from file. + * + * @param filename + * the filename + * + * @return the byte[] + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ public static byte[] decodeFromFile( String filename ) throws java.io.IOException { @@ -1520,19 +1268,16 @@ public static byte[] decodeFromFile( String filename ) /** - * Convenience method for reading a binary file - * and base64-encoding it. - * - *

As of v 2.3, if there is a error, - * the method will throw an java.io.IOException. This is new to v2.3! - * In earlier versions, it just returned false, but - * in retrospect that's a pretty poor way to handle it.

- * - * @param filename Filename for reading binary data - * @return base64-encoded string - * @throws java.io.IOException if there is an error - * @since 2.1 - */ + * Encode from file. + * + * @param filename + * the filename + * + * @return the string + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ public static String encodeFromFile( String filename ) throws java.io.IOException { @@ -1571,13 +1316,16 @@ public static String encodeFromFile( String filename ) } // end encodeFromFile /** - * Reads infile and encodes it to outfile. - * - * @param infile Input file - * @param outfile Output file - * @throws java.io.IOException if there is an error - * @since 2.2 - */ + * Encode file to file. + * + * @param infile + * the infile + * @param outfile + * the outfile + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ public static void encodeFileToFile( String infile, String outfile ) throws java.io.IOException { @@ -1599,13 +1347,16 @@ public static void encodeFileToFile( String infile, String outfile ) /** - * Reads infile and decodes it to outfile. - * - * @param infile Input file - * @param outfile Output file - * @throws java.io.IOException if there is an error - * @since 2.2 - */ + * Decode file to file. + * + * @param infile + * the infile + * @param outfile + * the outfile + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ public static void decodeFileToFile( String infile, String outfile ) throws java.io.IOException { @@ -1631,57 +1382,57 @@ public static void decodeFileToFile( String infile, String outfile ) /** - * A {@link Base64.InputStream} will read data from another - * java.io.InputStream, given in the constructor, - * and encode/decode to/from Base64 notation on the fly. - * - * @see Base64 - * @since 1.3 - */ + * The Class InputStream. + */ public static class InputStream extends java.io.FilterInputStream { + /** The encode. */ private boolean encode; // Encoding or decoding + + /** The position. */ private int position; // Current position in the buffer + + /** The buffer. */ private byte[] buffer; // Small buffer holding converted data + + /** The buffer length. */ private int bufferLength; // Length of buffer (3 or 4) + + /** The num sig bytes. */ private int numSigBytes; // Number of meaningful bytes in the buffer + + /** The line length. */ private int lineLength; + + /** The break lines. */ private boolean breakLines; // Break lines at less than 80 characters + + /** The options. */ private int options; // Record options used to create the stream. + + /** The decodabet. */ private byte[] decodabet; // Local copies to avoid extra method calls /** - * Constructs a {@link Base64.InputStream} in DECODE mode. - * - * @param in the java.io.InputStream from which to read data. - * @since 1.3 - */ + * Instantiates a new input stream. + * + * @param in + * the in + */ public InputStream( java.io.InputStream in ) { this( in, DECODE ); } // end constructor /** - * Constructs a {@link Base64.InputStream} in - * either ENCODE or DECODE mode. - *

- * Valid options:

-         *   ENCODE or DECODE: Encode or Decode as data is read.
-         *   DO_BREAK_LINES: break lines at 76 characters
-         *     (only meaningful when encoding)
-         * 
- *

- * Example: new Base64.InputStream( in, Base64.DECODE ) - * - * - * @param in the java.io.InputStream from which to read data. - * @param options Specified options - * @see Base64#ENCODE - * @see Base64#DECODE - * @see Base64#DO_BREAK_LINES - * @since 2.0 - */ + * Instantiates a new input stream. + * + * @param in + * the in + * @param options + * the options + */ public InputStream( java.io.InputStream in, int options ) { super( in ); @@ -1695,12 +1446,8 @@ public InputStream( java.io.InputStream in, int options ) { this.decodabet = getDecodabet(options); } // end constructor - /** - * Reads enough of the input stream to convert - * to/from Base64 and returns the next byte. - * - * @return next byte - * @since 1.3 + /* (non-Javadoc) + * @see java.io.FilterInputStream#read() */ @Override public int read() throws java.io.IOException { @@ -1799,17 +1546,8 @@ else if( i == 0 ){ } // end read - /** - * Calls {@link #read()} repeatedly until the end of stream - * is reached or len bytes are read. - * Returns number of bytes read into array or -1 if - * end of stream is encountered. - * - * @param dest array to hold values - * @param off offset for array - * @param len max number of bytes to read into array - * @return bytes read into array or -1 if end of stream is encountered. - * @since 1.3 + /* (non-Javadoc) + * @see java.io.FilterInputStream#read(byte[], int, int) */ @Override public int read( byte[] dest, int off, int len ) @@ -1844,56 +1582,59 @@ else if( i == 0 ) { /** - * A {@link Base64.OutputStream} will write data to another - * java.io.OutputStream, given in the constructor, - * and encode/decode to/from Base64 notation on the fly. - * - * @see Base64 - * @since 1.3 - */ + * The Class OutputStream. + */ public static class OutputStream extends java.io.FilterOutputStream { + /** The encode. */ private boolean encode; + + /** The position. */ private int position; + + /** The buffer. */ private byte[] buffer; + + /** The buffer length. */ private int bufferLength; + + /** The line length. */ private int lineLength; + + /** The break lines. */ private boolean breakLines; + + /** The b4. */ private byte[] b4; // Scratch used in a few places + + /** The suspend encoding. */ private boolean suspendEncoding; + + /** The options. */ private int options; // Record for later + + /** The decodabet. */ private byte[] decodabet; // Local copies to avoid extra method calls /** - * Constructs a {@link Base64.OutputStream} in ENCODE mode. - * - * @param out the java.io.OutputStream to which data will be written. - * @since 1.3 - */ + * Instantiates a new output stream. + * + * @param out + * the out + */ public OutputStream( java.io.OutputStream out ) { this( out, ENCODE ); } // end constructor /** - * Constructs a {@link Base64.OutputStream} in - * either ENCODE or DECODE mode. - *

- * Valid options:

-         *   ENCODE or DECODE: Encode or Decode as data is read.
-         *   DO_BREAK_LINES: don't break lines at 76 characters
-         *     (only meaningful when encoding)
-         * 
- *

- * Example: new Base64.OutputStream( out, Base64.ENCODE ) - * - * @param out the java.io.OutputStream to which data will be written. - * @param options Specified options. - * @see Base64#ENCODE - * @see Base64#DECODE - * @see Base64#DO_BREAK_LINES - * @since 1.3 - */ + * Instantiates a new output stream. + * + * @param out + * the out + * @param options + * the options + */ public OutputStream( java.io.OutputStream out, int options ) { super( out ); this.breakLines = (options & DO_BREAK_LINES) != 0; @@ -1909,17 +1650,8 @@ public OutputStream( java.io.OutputStream out, int options ) { } // end constructor - /** - * Writes the byte to the output stream after - * converting to/from Base64 notation. - * When encoding, bytes are buffered three - * at a time before the output stream actually - * gets a write() call. - * When decoding, bytes are buffered four - * at a time. - * - * @param theByte the byte to write - * @since 1.3 + /* (non-Javadoc) + * @see java.io.FilterOutputStream#write(int) */ @Override public void write(int theByte) @@ -1967,14 +1699,8 @@ else if( decodabet[ theByte & 0x7f ] != WHITE_SPACE_ENC ) { - /** - * Calls {@link #write(int)} repeatedly until len - * bytes are written. - * - * @param theBytes array from which to read bytes - * @param off offset for array - * @param len max number of bytes to read into array - * @since 1.3 + /* (non-Javadoc) + * @see java.io.FilterOutputStream#write(byte[], int, int) */ @Override public void write( byte[] theBytes, int off, int len ) @@ -1994,10 +1720,11 @@ public void write( byte[] theBytes, int off, int len ) /** - * Method added by PHIL. [Thanks, PHIL. -Rob] - * This pads the buffer without closing the stream. - * @throws java.io.IOException if there's an error. - */ + * Flush base64. + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ public void flushBase64() throws java.io.IOException { if( position > 0 ) { if( encode ) { @@ -2012,10 +1739,8 @@ public void flushBase64() throws java.io.IOException { } // end flush - /** - * Flushes and closes (I think, in the superclass) the stream. - * - * @since 1.3 + /* (non-Javadoc) + * @see java.io.FilterOutputStream#close() */ @Override public void close() throws java.io.IOException { @@ -2033,13 +1758,11 @@ public void close() throws java.io.IOException { /** - * Suspends encoding of the stream. - * May be helpful if you need to embed a piece of - * base64-encoded data in a stream. - * - * @throws java.io.IOException if there's an error flushing - * @since 1.5.1 - */ + * Suspend encoding. + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ public void suspendEncoding() throws java.io.IOException { flushBase64(); this.suspendEncoding = true; @@ -2047,12 +1770,8 @@ public void suspendEncoding() throws java.io.IOException { /** - * Resumes encoding of the stream. - * May be helpful if you need to embed a piece of - * base64-encoded data in a stream. - * - * @since 1.5.1 - */ + * Resume encoding. + */ public void resumeEncoding() { this.suspendEncoding = false; } // end resumeEncoding diff --git a/core/src/test/java/com/github/api/v2/services/AllTests.java b/core/src/test/java/com/github/api/v2/services/AllTests.java index 4042268..e05678e 100644 --- a/core/src/test/java/com/github/api/v2/services/AllTests.java +++ b/core/src/test/java/com/github/api/v2/services/AllTests.java @@ -1,10 +1,21 @@ +/* + * + */ package com.github.api.v2.services; import junit.framework.Test; import junit.framework.TestSuite; +/** + * The Class AllTests. + */ public class AllTests { + /** + * Suite. + * + * @return the test + */ public static Test suite() { TestSuite suite = new TestSuite("Test for com.github.api.v2.services"); //$JUnit-BEGIN$ diff --git a/core/src/test/java/com/github/api/v2/services/BaseGitHubServiceTest.java b/core/src/test/java/com/github/api/v2/services/BaseGitHubServiceTest.java index ae70a1b..35777cb 100644 --- a/core/src/test/java/com/github/api/v2/services/BaseGitHubServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/BaseGitHubServiceTest.java @@ -19,7 +19,7 @@ import com.github.api.v2.services.constant.TestConstants; /** - * The Class BaseGoogleSearchClientTest. + * The Class BaseGitHubServiceTest. */ public class BaseGitHubServiceTest extends TestCase { @@ -29,8 +29,12 @@ public class BaseGitHubServiceTest extends TestCase { /** The factory. */ protected GitHubServiceFactory factory; + /** The authentication. */ protected Authentication authentication; + /* (non-Javadoc) + * @see junit.framework.TestCase#setUp() + */ @Before public void setUp() throws Exception { super.setUp(); @@ -41,6 +45,9 @@ public void setUp() throws Exception { } + /* (non-Javadoc) + * @see junit.framework.TestCase#tearDown() + */ @After public void tearDown() throws Exception { super.tearDown(); @@ -50,8 +57,10 @@ public void tearDown() throws Exception { /** * Assert not null or empty. * - * @param message the message - * @param value the value + * @param message + * the message + * @param value + * the value */ protected static void assertNotNullOrEmpty(String message, String value) { assertNotNull(message, value); @@ -61,8 +70,10 @@ protected static void assertNotNullOrEmpty(String message, String value) { /** * Assert not null or empty. * - * @param message the message - * @param value the value + * @param message + * the message + * @param value + * the value */ protected static void assertNotNullOrEmpty(String message, Collection value) { assertNotNull(message, value); @@ -72,7 +83,8 @@ protected static void assertNotNullOrEmpty(String message, Collection value) /** * Convert stream to string. * - * @param is the is + * @param is + * the is * * @return the string */ diff --git a/core/src/test/java/com/github/api/v2/services/CommitServiceTest.java b/core/src/test/java/com/github/api/v2/services/CommitServiceTest.java index 50fc0a2..7cf3bd0 100644 --- a/core/src/test/java/com/github/api/v2/services/CommitServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/CommitServiceTest.java @@ -1,3 +1,6 @@ +/* + * + */ package com.github.api.v2.services; import java.util.List; @@ -10,9 +13,17 @@ import com.github.api.v2.schema.Repository; import com.github.api.v2.services.constant.TestConstants; +/** + * The Class CommitServiceTest. + */ public class CommitServiceTest extends BaseGitHubServiceTest { + + /** The service. */ private CommitService service; + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() + */ @Before public void setUp() throws Exception { super.setUp(); @@ -20,12 +31,18 @@ public void setUp() throws Exception { service.setAuthentication(authentication); } + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() + */ @After public void tearDown() throws Exception { super.tearDown(); service = null; } + /** + * Test get commit. + */ @Test public void testGetCommit() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -35,6 +52,9 @@ public void testGetCommit() { assertNotNull("Commit cannot be null", commit); } + /** + * Test get commits string string string. + */ @Test public void testGetCommitsStringStringString() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -44,6 +64,9 @@ public void testGetCommitsStringStringString() { assertNotNullOrEmpty("Commits cannot be null or empty", commits); } + /** + * Test get commits string string string string. + */ @Test public void testGetCommitsStringStringStringString() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); diff --git a/core/src/test/java/com/github/api/v2/services/GistServiceTest.java b/core/src/test/java/com/github/api/v2/services/GistServiceTest.java index c99267a..2fecb49 100644 --- a/core/src/test/java/com/github/api/v2/services/GistServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/GistServiceTest.java @@ -1,3 +1,6 @@ +/* + * + */ package com.github.api.v2.services; import java.io.InputStream; @@ -10,9 +13,17 @@ import com.github.api.v2.schema.Gist; import com.github.api.v2.services.constant.TestConstants; +/** + * The Class GistServiceTest. + */ public class GistServiceTest extends BaseGitHubServiceTest { + + /** The service. */ private GistService service; + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() + */ @Before public void setUp() throws Exception { super.setUp(); @@ -20,12 +31,18 @@ public void setUp() throws Exception { service.setAuthentication(authentication); } + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() + */ @After public void tearDown() throws Exception { super.tearDown(); service = null; } + /** + * Test get gist. + */ @Test public void testGetGist() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Gist Id."), TestConstants.TEST_GIST_ID); @@ -33,6 +50,9 @@ public void testGetGist() { assertNotNull("Gist cannot be null", gist); } + /** + * Test get gist content. + */ @Test public void testGetGistContent() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Gist Id."), TestConstants.TEST_GIST_ID); @@ -41,6 +61,9 @@ public void testGetGistContent() { assertNotNullOrEmpty("Gist content cannot be null or empty", convertStreamToString(gistContent)); } + /** + * Test get user gists. + */ @Test public void testGetUserGists() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); diff --git a/core/src/test/java/com/github/api/v2/services/IssueServiceTest.java b/core/src/test/java/com/github/api/v2/services/IssueServiceTest.java index 1fbc58f..4cc21cb 100644 --- a/core/src/test/java/com/github/api/v2/services/IssueServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/IssueServiceTest.java @@ -1,3 +1,6 @@ +/* + * + */ package com.github.api.v2.services; import java.util.List; @@ -10,9 +13,17 @@ import com.github.api.v2.schema.Issue; import com.github.api.v2.services.constant.TestConstants; +/** + * The Class IssueServiceTest. + */ public class IssueServiceTest extends BaseGitHubServiceTest { + + /** The service. */ private IssueService service; + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() + */ @Before public void setUp() throws Exception { super.setUp(); @@ -20,12 +31,18 @@ public void setUp() throws Exception { service.setAuthentication(authentication); } + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() + */ @After public void tearDown() throws Exception { super.tearDown(); service = null; } + /** + * Test add comment. + */ @Test public void testAddComment() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -35,6 +52,9 @@ public void testAddComment() { service.addComment(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Integer.parseInt(TestConstants.TEST_ISSUE_NUMBER), TestConstants.TEST_ISSUE_COMMENT); } + /** + * Test add label. + */ @Test public void testAddLabel() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -44,6 +64,9 @@ public void testAddLabel() { service.addLabel(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Integer.parseInt(TestConstants.TEST_ISSUE_NUMBER), TestConstants.TEST_ISSUE_LABEL); } + /** + * Test close issue. + */ @Test public void testCloseIssue() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -52,6 +75,9 @@ public void testCloseIssue() { service.closeIssue(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Integer.parseInt(TestConstants.TEST_ISSUE_NUMBER)); } + /** + * Test create issue. + */ @Test public void testCreateIssue() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -61,6 +87,9 @@ public void testCreateIssue() { service.createIssue(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_ISSUE_TITLE, TestConstants.TEST_ISSUE_BODY); } + /** + * Test get issue. + */ @Test public void testGetIssue() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -70,6 +99,9 @@ public void testGetIssue() { assertNotNull("Issue cannot be null.", issue); } + /** + * Test get issue comments. + */ @Test public void testGetIssueComments() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -79,6 +111,9 @@ public void testGetIssueComments() { assertNotNullOrEmpty("Issue comments cannot be null or empty.", issueComments); } + /** + * Test get issue labels. + */ @Test public void testGetIssueLabels() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -87,6 +122,9 @@ public void testGetIssueLabels() { assertNotNullOrEmpty("Issue labels should not be null or empty.", issueLabels); } + /** + * Test get issues. + */ @Test public void testGetIssues() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -95,6 +133,9 @@ public void testGetIssues() { assertNotNullOrEmpty("Issues cannot be null or empty.", issues); } + /** + * Test remove label. + */ @Test public void testRemoveLabel() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -105,6 +146,9 @@ public void testRemoveLabel() { assertFalse("Label should not be in the list.", labels.contains(TestConstants.TEST_ISSUE_LABEL)); } + /** + * Test reopen issue. + */ @Test public void testReopenIssue() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -113,6 +157,9 @@ public void testReopenIssue() { service.reopenIssue(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Integer.parseInt(TestConstants.TEST_ISSUE_NUMBER)); } + /** + * Test search issues. + */ @Test public void testSearchIssues() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -122,6 +169,9 @@ public void testSearchIssues() { assertNotNullOrEmpty("Issues cannot be null or empty.", issues); } + /** + * Test update issue. + */ @Test public void testUpdateIssue() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); diff --git a/core/src/test/java/com/github/api/v2/services/NetworkServiceTest.java b/core/src/test/java/com/github/api/v2/services/NetworkServiceTest.java index 9eda94c..dc493a7 100644 --- a/core/src/test/java/com/github/api/v2/services/NetworkServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/NetworkServiceTest.java @@ -1,3 +1,6 @@ +/* + * + */ package com.github.api.v2.services; import java.util.List; @@ -10,9 +13,17 @@ import com.github.api.v2.schema.Network; import com.github.api.v2.services.constant.TestConstants; +/** + * The Class NetworkServiceTest. + */ public class NetworkServiceTest extends BaseGitHubServiceTest { + + /** The service. */ private NetworkService service; + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() + */ @Before public void setUp() throws Exception { super.setUp(); @@ -20,12 +31,18 @@ public void setUp() throws Exception { service.setAuthentication(authentication); } + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() + */ @After public void tearDown() throws Exception { super.tearDown(); service = null; } + /** + * Test get network data string string string. + */ @Test public void testGetNetworkDataStringStringString() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -35,6 +52,9 @@ public void testGetNetworkDataStringStringString() { assertNotNullOrEmpty("Commits should not be null or empty.", commits); } + /** + * Test get network data string string string int int. + */ @Test public void testGetNetworkDataStringStringStringIntInt() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -44,6 +64,9 @@ public void testGetNetworkDataStringStringStringIntInt() { assertNotNullOrEmpty("Commits should not be null or empty.", commits); } + /** + * Test get network meta. + */ @Test public void testGetNetworkMeta() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); diff --git a/core/src/test/java/com/github/api/v2/services/OAuthServiceTest.java b/core/src/test/java/com/github/api/v2/services/OAuthServiceTest.java index 4c867f8..d9b2d87 100644 --- a/core/src/test/java/com/github/api/v2/services/OAuthServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/OAuthServiceTest.java @@ -11,7 +11,7 @@ import com.github.api.v2.services.constant.TestConstants; /** - * The Class FacebookOAuthServiceTest. + * The Class OAuthServiceTest. */ public class OAuthServiceTest extends BaseGitHubServiceTest { diff --git a/core/src/test/java/com/github/api/v2/services/ObjectServiceTest.java b/core/src/test/java/com/github/api/v2/services/ObjectServiceTest.java index 7418f87..e628694 100644 --- a/core/src/test/java/com/github/api/v2/services/ObjectServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/ObjectServiceTest.java @@ -1,3 +1,6 @@ +/* + * + */ package com.github.api.v2.services; import java.io.InputStream; @@ -11,9 +14,17 @@ import com.github.api.v2.schema.Tree; import com.github.api.v2.services.constant.TestConstants; +/** + * The Class ObjectServiceTest. + */ public class ObjectServiceTest extends BaseGitHubServiceTest { + + /** The service. */ private ObjectService service; + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() + */ @Before public void setUp() throws Exception { super.setUp(); @@ -21,12 +32,18 @@ public void setUp() throws Exception { service.setAuthentication(authentication); } + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() + */ @After public void tearDown() throws Exception { super.tearDown(); service = null; } + /** + * Test get blob. + */ @Test public void testGetBlob() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -37,6 +54,9 @@ public void testGetBlob() { assertNotNull("Blob cannot be null or empty", blob); } + /** + * Test get blobs. + */ @Test public void testGetBlobs() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -46,6 +66,9 @@ public void testGetBlobs() { assertNotNullOrEmpty("Blobs cannot be null or empty", blobs); } + /** + * Test get object content. + */ @Test public void testGetObjectContent() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -55,6 +78,9 @@ public void testGetObjectContent() { assertNotNullOrEmpty("Object content cannot be null or empty", convertStreamToString(objectContent)); } + /** + * Test get tree. + */ @Test public void testGetTree() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); diff --git a/core/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java b/core/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java index 1285225..733059e 100644 --- a/core/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java @@ -1,3 +1,6 @@ +/* + * + */ package com.github.api.v2.services; import java.util.List; @@ -13,9 +16,17 @@ import com.github.api.v2.schema.User; import com.github.api.v2.services.constant.TestConstants; +/** + * The Class RepositoryServiceTest. + */ public class RepositoryServiceTest extends BaseGitHubServiceTest { + + /** The service. */ private RepositoryService service; + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() + */ @Before public void setUp() throws Exception { super.setUp(); @@ -23,12 +34,18 @@ public void setUp() throws Exception { service.setAuthentication(authentication); } + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() + */ @After public void tearDown() throws Exception { super.tearDown(); service = null; } + /** + * Test create repository. + */ @Test public void testCreateRepository() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); @@ -38,6 +55,9 @@ public void testCreateRepository() { } + /** + * Test add collaborator. + */ @Test public void testAddCollaborator() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -45,6 +65,9 @@ public void testAddCollaborator() { service.addCollaborator(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_USER_NAME); } + /** + * Test add key. + */ @Test public void testAddKey() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); @@ -53,12 +76,18 @@ public void testAddKey() { service.addDeployKey(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_KEY_TITLE, TestConstants.TEST_KEY); } + /** + * Test change visibility. + */ @Test public void testChangeVisibility() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); service.changeVisibility(TestConstants.TEST_REPOSITORY_NAME, Repository.Visibility.PRIVATE); } + /** + * Test fork repository. + */ @Test public void testForkRepository() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -66,6 +95,9 @@ public void testForkRepository() { service.forkRepository(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); } + /** + * Test get branches. + */ @Test public void testGetBranches() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -74,6 +106,9 @@ public void testGetBranches() { assertFalse("Branches cannot be null or empty.", branches == null || branches.isEmpty()); } + /** + * Test get collaborators. + */ @Test public void testGetCollaborators() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -82,6 +117,9 @@ public void testGetCollaborators() { assertNotNullOrEmpty("Collaborators cannot be null or empty.", collaborators); } + /** + * Test get contributors. + */ @Test public void testGetContributors() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -90,6 +128,9 @@ public void testGetContributors() { assertNotNullOrEmpty("Contributors cannot be null or empty.", contributors); } + /** + * Test get forks. + */ @Test public void testGetForks() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -98,6 +139,9 @@ public void testGetForks() { assertNotNullOrEmpty("Forks cannot be null or empty.", forks); } + /** + * Test get keys. + */ @Test public void testGetKeys() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); @@ -105,6 +149,9 @@ public void testGetKeys() { assertNotNullOrEmpty("Keys cannot be null or empty.", keys); } + /** + * Test get language breakdown. + */ @Test public void testGetLanguageBreakdown() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -113,12 +160,18 @@ public void testGetLanguageBreakdown() { assertFalse("Language breakdown vannot be null or empty.", (languageBreakdown == null || languageBreakdown.isEmpty())); } + /** + * Test get pushable repositories. + */ @Test public void testGetPushableRepositories() { List repositories = service.getPushableRepositories(); assertNotNullOrEmpty("Pushable repositories cannot be null or empty.", repositories); } + /** + * Test get repositories. + */ @Test public void testGetRepositories() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -126,6 +179,9 @@ public void testGetRepositories() { assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); } + /** + * Test get repository. + */ @Test public void testGetRepository() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -134,6 +190,9 @@ public void testGetRepository() { assertNotNull("Repository cannot be null.", repository); } + /** + * Test get tags. + */ @Test public void testGetTags() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -142,6 +201,9 @@ public void testGetTags() { assertFalse("Tags cannot be null or empty.", tags == null || tags.isEmpty()); } + /** + * Test get watchers. + */ @Test public void testGetWatchers() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -150,6 +212,9 @@ public void testGetWatchers() { assertNotNullOrEmpty("Watchers cannot be null or empty.", watchers); } + /** + * Test remove collaborator. + */ @Test public void testRemoveCollaborator() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -157,6 +222,9 @@ public void testRemoveCollaborator() { service.removeCollaborator(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_USER_NAME); } + /** + * Test remove key. + */ @Test public void testRemoveKey() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); @@ -164,6 +232,9 @@ public void testRemoveKey() { service.removeDeployKey(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_KEY_ID); } + /** + * Test search repositories string. + */ @Test public void testSearchRepositoriesString() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); @@ -171,6 +242,9 @@ public void testSearchRepositoriesString() { assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); } + /** + * Test search repositories string string. + */ @Test public void testSearchRepositoriesStringString() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); @@ -178,6 +252,9 @@ public void testSearchRepositoriesStringString() { assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); } + /** + * Test search repositories string int. + */ @Test public void testSearchRepositoriesStringInt() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); @@ -185,6 +262,9 @@ public void testSearchRepositoriesStringInt() { assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); } + /** + * Test search repositories string string int. + */ @Test public void testSearchRepositoriesStringStringInt() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); @@ -192,6 +272,9 @@ public void testSearchRepositoriesStringStringInt() { assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); } + /** + * Test unwatch repository. + */ @Test public void testUnwatchRepository() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -199,11 +282,17 @@ public void testUnwatchRepository() { service.unwatchRepository(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); } + /** + * Test update repository. + */ @Test public void testUpdateRepository() { // service.updateRepository(repository); } + /** + * Test watch repository. + */ @Test public void testWatchRepository() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -211,6 +300,9 @@ public void testWatchRepository() { service.watchRepository(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); } + /** + * Test delete repository. + */ @Test public void testDeleteRepository() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); diff --git a/core/src/test/java/com/github/api/v2/services/UserServiceTest.java b/core/src/test/java/com/github/api/v2/services/UserServiceTest.java index 0f3b1e2..c338238 100644 --- a/core/src/test/java/com/github/api/v2/services/UserServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/UserServiceTest.java @@ -15,12 +15,16 @@ import com.github.api.v2.services.constant.TestConstants; /** - * @author nmukhtar - * + * The Class UserServiceTest. */ public class UserServiceTest extends BaseGitHubServiceTest { + + /** The service. */ private UserService service; + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() + */ @Before public void setUp() throws Exception { super.setUp(); @@ -28,18 +32,27 @@ public void setUp() throws Exception { service.setAuthentication(authentication); } + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() + */ @After public void tearDown() throws Exception { super.tearDown(); service = null; } + /** + * Test add email. + */ @Test public void testAddEmail() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Email."), TestConstants.TEST_EMAIL); service.addEmail(TestConstants.TEST_EMAIL); } + /** + * Test add key. + */ @Test public void testAddKey() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Key Title."), TestConstants.TEST_KEY_TITLE); @@ -47,30 +60,45 @@ public void testAddKey() { service.addKey(TestConstants.TEST_KEY_TITLE, TestConstants.TEST_KEY); } + /** + * Test follow user. + */ @Test public void testFollowUser() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); service.followUser(TestConstants.TEST_USER_NAME); } + /** + * Test get current user. + */ @Test public void testGetCurrentUser() { User user = service.getCurrentUser(); assertNotNull("User cannot be null.", user); } + /** + * Test get emails. + */ @Test public void testGetEmails() { List emails = service.getEmails(); assertNotNullOrEmpty("Emails cannot be null or empty.", emails); } + /** + * Test get keys. + */ @Test public void testGetKeys() { List keys = service.getKeys(); assertNotNullOrEmpty("Keys cannot be null or empty.", keys); } + /** + * Test get user by username. + */ @Test public void testGetUserByUsername() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -78,6 +106,9 @@ public void testGetUserByUsername() { assertNotNull("User cannot be null.", user); } + /** + * Test get user followers. + */ @Test public void testGetUserFollowers() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -85,6 +116,9 @@ public void testGetUserFollowers() { assertNotNullOrEmpty("User followers cannot be null or empty.", userFollowers); } + /** + * Test get user following. + */ @Test public void testGetUserFollowing() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -92,6 +126,9 @@ public void testGetUserFollowing() { assertNotNullOrEmpty("User followering cannot be null or empty.", userFollowing); } + /** + * Test get watched repositories. + */ @Test public void testGetWatchedRepositories() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -99,18 +136,27 @@ public void testGetWatchedRepositories() { assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); } + /** + * Test remove email. + */ @Test public void testRemoveEmail() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Email."), TestConstants.TEST_EMAIL); service.removeEmail(TestConstants.TEST_EMAIL); } + /** + * Test remove key. + */ @Test public void testRemoveKey() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Key Id."), TestConstants.TEST_KEY_ID); service.removeKey(TestConstants.TEST_KEY_ID); } + /** + * Test get user by email. + */ @Test public void testGetUserByEmail() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Email."), TestConstants.TEST_EMAIL); @@ -118,6 +164,9 @@ public void testGetUserByEmail() { assertNotNull("User cannot be null or empty.", user); } + /** + * Test search users by name. + */ @Test public void testSearchUsersByName() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -125,12 +174,18 @@ public void testSearchUsersByName() { assertNotNullOrEmpty("Users cannot be null or empty.", users); } + /** + * Test unfollow user. + */ @Test public void testUnfollowUser() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); service.unfollowUser(TestConstants.TEST_USER_NAME); } + /** + * Test update user. + */ @Test public void testUpdateUser() { // service.updateUser(user); diff --git a/core/src/test/java/com/github/api/v2/services/constant/TestConstants.java b/core/src/test/java/com/github/api/v2/services/constant/TestConstants.java index c3f121e..5b2441f 100644 --- a/core/src/test/java/com/github/api/v2/services/constant/TestConstants.java +++ b/core/src/test/java/com/github/api/v2/services/constant/TestConstants.java @@ -24,10 +24,10 @@ public final class TestConstants { } } - /** The Constant TEST_CONSUMER_KEY. */ + /** The Constant TEST_CLIENT_ID. */ public static final String TEST_CLIENT_ID = testConstants.getProperty("com.github.api.v2.services.clientId"); - /** The Constant TEST_CONSUMER_SECRET. */ + /** The Constant TEST_CLIENT_SECRET. */ public static final String TEST_CLIENT_SECRET = testConstants.getProperty("com.github.api.v2.services.clientSecret"); /** The Constant TEST_CODE. */ @@ -59,46 +59,76 @@ public final class TestConstants { public static final String TEST_REPOSITORY_NAME = testConstants.getProperty("com.github.api.v2.services.testRepositoryName"); - /** The Constant TEST_REPOSITORY_NAME. */ + /** The Constant TEST_EMAIL. */ public static final String TEST_EMAIL = testConstants.getProperty("com.github.api.v2.services.testEmail"); - /** The Constant TEST_REPOSITORY_NAME. */ + /** The Constant TEST_ISSUE_NUMBER. */ public static final String TEST_ISSUE_NUMBER = testConstants.getProperty("com.github.api.v2.services.testIssueNo"); - /** The Constant TEST_REPOSITORY_NAME. */ + + /** The Constant TEST_COMMIT_HASH. */ public static final String TEST_COMMIT_HASH = testConstants.getProperty("com.github.api.v2.services.testCommitHash"); + + /** The Constant TEST_GIST_ID. */ public static final String TEST_GIST_ID = testConstants.getProperty("com.github.api.v2.services.testGistId"); + + /** The Constant TEST_GIST_FILE. */ public static final String TEST_GIST_FILE = testConstants.getProperty("com.github.api.v2.services.testGistFile"); + + /** The Constant TEST_ISSUE_COMMENT. */ public static final String TEST_ISSUE_COMMENT = testConstants.getProperty("com.github.api.v2.services.testIssueComment"); + + /** The Constant TEST_ISSUE_LABEL. */ public static final String TEST_ISSUE_LABEL = testConstants.getProperty("com.github.api.v2.services.testIssueLabel"); + + /** The Constant TEST_ISSUE_TITLE. */ public static final String TEST_ISSUE_TITLE = testConstants.getProperty("com.github.api.v2.services.testIssueTitle"); + + /** The Constant TEST_ISSUE_BODY. */ public static final String TEST_ISSUE_BODY = testConstants.getProperty("com.github.api.v2.services.testIssueBody"); + + /** The Constant TEST_NETWORK_HASH. */ public static final String TEST_NETWORK_HASH = testConstants.getProperty("com.github.api.v2.services.testNetworkHash"); + + /** The Constant TEST_TREE_SHA. */ public static final String TEST_TREE_SHA = testConstants.getProperty("com.github.api.v2.services.testTreeHash"); + + /** The Constant TEST_FILE_PATH. */ public static final String TEST_FILE_PATH = testConstants.getProperty("com.github.api.v2.services.testFilePath"); + + /** The Constant TEST_KEY_TITLE. */ public static final String TEST_KEY_TITLE = testConstants.getProperty("com.github.api.v2.services.testKeyTitle"); + + /** The Constant TEST_KEY. */ public static final String TEST_KEY = testConstants.getProperty("com.github.api.v2.services.testKey"); + + /** The Constant TEST_REPOSITORY_DESC. */ public static final String TEST_REPOSITORY_DESC = testConstants.getProperty("com.github.api.v2.services.testRepositoryDesc"); + + /** The Constant TEST_REPOSITORY_PAGE. */ public static final String TEST_REPOSITORY_PAGE = testConstants.getProperty("com.github.api.v2.services.testRepositoryPage"); + + /** The Constant TEST_KEY_ID. */ public static final String TEST_KEY_ID = testConstants.getProperty("com.github.api.v2.services.testKeyId"); + /** - * Instantiates a new test constants. - */ + * Instantiates a new test constants. + */ private TestConstants() {} } diff --git a/examples/src/java/com/github/api/v2/services/example/CommitApiSample.java b/examples/src/java/com/github/api/v2/services/example/CommitApiSample.java index eea920b..0078925 100644 --- a/examples/src/java/com/github/api/v2/services/example/CommitApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/CommitApiSample.java @@ -11,15 +11,16 @@ import com.github.api.v2.services.GitHubServiceFactory; /** - * The Class WebSample. + * The Class CommitApiSample. */ public class CommitApiSample { /** - * The main method. - * - * @param args the arguments - */ + * The main method. + * + * @param args + * the arguments + */ public static void main(String[] args) { GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); CommitService service = factory.createCommitService(); @@ -34,6 +35,12 @@ public static void main(String[] args) { } + /** + * Prints the result. + * + * @param commit + * the commit + */ private static void printResult(Commit commit) { System.out.println(commit); } diff --git a/examples/src/java/com/github/api/v2/services/example/GistApiSample.java b/examples/src/java/com/github/api/v2/services/example/GistApiSample.java index b91cc6d..c79320e 100644 --- a/examples/src/java/com/github/api/v2/services/example/GistApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/GistApiSample.java @@ -13,15 +13,16 @@ import com.github.api.v2.services.GitHubServiceFactory; /** - * The Class WebSample. + * The Class GistApiSample. */ public class GistApiSample { /** - * The main method. - * - * @param args the arguments - */ + * The main method. + * + * @param args + * the arguments + */ public static void main(String[] args) { GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); GistService service = factory.createGistService(); @@ -30,6 +31,12 @@ public static void main(String[] args) { System.out.println(convertStreamToString(service.getGistContent("289179", "TimeZoneDSTUtil.java"))); } + /** + * Prints the result. + * + * @param gist + * the gist + */ private static void printResult(Gist gist) { System.out.println(gist); } @@ -37,7 +44,8 @@ private static void printResult(Gist gist) { /** * Convert stream to string. * - * @param is the is + * @param is + * the is * * @return the string */ diff --git a/examples/src/java/com/github/api/v2/services/example/IssueApiSample.java b/examples/src/java/com/github/api/v2/services/example/IssueApiSample.java index 202949a..2de5441 100644 --- a/examples/src/java/com/github/api/v2/services/example/IssueApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/IssueApiSample.java @@ -10,15 +10,16 @@ import com.github.api.v2.services.IssueService; /** - * The Class WebSample. + * The Class IssueApiSample. */ public class IssueApiSample { /** - * The main method. - * - * @param args the arguments - */ + * The main method. + * + * @param args + * the arguments + */ public static void main(String[] args) { GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); IssueService service = factory.createIssueService(); @@ -30,6 +31,12 @@ public static void main(String[] args) { printResult(issue); } + /** + * Prints the result. + * + * @param issue + * the issue + */ private static void printResult(Issue issue) { System.out.println(issue); } diff --git a/examples/src/java/com/github/api/v2/services/example/NetworkApiSample.java b/examples/src/java/com/github/api/v2/services/example/NetworkApiSample.java index 0468469..13e1a64 100644 --- a/examples/src/java/com/github/api/v2/services/example/NetworkApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/NetworkApiSample.java @@ -10,15 +10,16 @@ import com.github.api.v2.services.NetworkService; /** - * The Class WebSample. + * The Class NetworkApiSample. */ public class NetworkApiSample { /** - * The main method. - * - * @param args the arguments - */ + * The main method. + * + * @param args + * the arguments + */ public static void main(String[] args) { GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); NetworkService service = factory.createNetworkService(); @@ -28,6 +29,12 @@ public static void main(String[] args) { } } + /** + * Prints the result. + * + * @param commit + * the commit + */ private static void printResult(Commit commit) { System.out.println(commit); } diff --git a/examples/src/java/com/github/api/v2/services/example/OAuthExample.java b/examples/src/java/com/github/api/v2/services/example/OAuthExample.java index 8a02ecd..6a4095d 100644 --- a/examples/src/java/com/github/api/v2/services/example/OAuthExample.java +++ b/examples/src/java/com/github/api/v2/services/example/OAuthExample.java @@ -11,17 +11,27 @@ import com.github.api.v2.services.OAuthService; /** - * @author nmukhtar - * + * The Class OAuthExample. */ public class OAuthExample { + + /** The Constant CLIENT_ID. */ private static final String CLIENT_ID = "18790e7033ab0148f05c"; + + /** The Constant CLIENT_SECRET. */ private static final String CLIENT_SECRET = "52695c3febf1721b8bc6f569c5210d38d043696c"; + + /** The Constant CALLBACK_URL. */ private static final String CALLBACK_URL = "http://www.githubapitest.com"; /** + * The main method. + * * @param args - * @throws IOException + * the arguments + * + * @throws IOException + * Signals that an I/O exception has occurred. */ public static void main(String[] args) throws IOException { OAuthService service = GitHubServiceFactory.newInstance().createOAuthService(CLIENT_ID, CLIENT_SECRET); diff --git a/examples/src/java/com/github/api/v2/services/example/ObjectApiSample.java b/examples/src/java/com/github/api/v2/services/example/ObjectApiSample.java index d14601f..6e84487 100644 --- a/examples/src/java/com/github/api/v2/services/example/ObjectApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/ObjectApiSample.java @@ -15,15 +15,16 @@ import com.github.api.v2.services.ObjectService; /** - * The Class WebSample. + * The Class ObjectApiSample. */ public class ObjectApiSample { /** - * The main method. - * - * @param args the arguments - */ + * The main method. + * + * @param args + * the arguments + */ public static void main(String[] args) { GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); ObjectService service = factory.createObjectService(); @@ -38,10 +39,22 @@ public static void main(String[] args) { System.out.println(convertStreamToString(service.getObjectContent("facebook", "tornado", "7b80c2f4db226d6fa3a7f3dfa59277da1d642f91"))); } + /** + * Prints the result. + * + * @param blob + * the blob + */ private static void printResult(Blob blob) { System.out.println(blob); } + /** + * Prints the result. + * + * @param tree + * the tree + */ private static void printResult(Tree tree) { System.out.println(tree); } @@ -49,7 +62,8 @@ private static void printResult(Tree tree) { /** * Convert stream to string. * - * @param is the is + * @param is + * the is * * @return the string */ diff --git a/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java b/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java index 1241f66..00dc36b 100644 --- a/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java @@ -14,15 +14,16 @@ import com.github.api.v2.services.constant.TestConstants; /** - * The Class WebSample. + * The Class RepositoryApiSample. */ public class RepositoryApiSample { /** - * The main method. - * - * @param args the arguments - */ + * The main method. + * + * @param args + * the arguments + */ public static void main(String[] args) { GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); RepositoryService service = factory.createRepositoryService(); @@ -37,6 +38,12 @@ public static void main(String[] args) { System.out.println(pushableRepositories.size()); } + /** + * Prints the result. + * + * @param repository + * the repository + */ private static void printResult(Repository repository) { System.out.println(repository); } diff --git a/examples/src/java/com/github/api/v2/services/example/UserApiSample.java b/examples/src/java/com/github/api/v2/services/example/UserApiSample.java index 94e199d..1c1d830 100644 --- a/examples/src/java/com/github/api/v2/services/example/UserApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/UserApiSample.java @@ -10,15 +10,16 @@ import com.github.api.v2.services.UserService; /** - * The Class WebSample. + * The Class UserApiSample. */ public class UserApiSample { /** - * The main method. - * - * @param args the arguments - */ + * The main method. + * + * @param args + * the arguments + */ public static void main(String[] args) { GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); UserService service = factory.createUserService(); @@ -30,6 +31,12 @@ public static void main(String[] args) { printResult(user); } + /** + * Prints the result. + * + * @param user + * the user + */ private static void printResult(User user) { System.out.println(user); } diff --git a/schema/src/main/java/com/github/api/v2/schema/Blob.java b/schema/src/main/java/com/github/api/v2/schema/Blob.java index 36b3701..4ed9ff9 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Blob.java +++ b/schema/src/main/java/com/github/api/v2/schema/Blob.java @@ -4,90 +4,140 @@ package com.github.api.v2.schema; /** - * @author nmukhtar - * + * The Class Blob. */ public class Blob extends SchemaEntity { - /** - * - */ + /** The Constant serialVersionUID. */ private static final long serialVersionUID = 9155892708485181542L; + /** The name. */ private String name; + + /** The size. */ private int size; + + /** The sha. */ private String sha; + + /** The mode. */ private String mode; + + /** The mime type. */ private String mimeType; + + /** The data. */ private String data; + /** + * Gets the name. + * * @return the name */ public String getName() { return name; } + /** - * @param name the name to set + * Sets the name. + * + * @param name + * the new name */ public void setName(String name) { this.name = name; } + /** + * Gets the size. + * * @return the size */ public int getSize() { return size; } + /** - * @param size the size to set + * Sets the size. + * + * @param size + * the new size */ public void setSize(int size) { this.size = size; } + /** + * Gets the sha. + * * @return the sha */ public String getSha() { return sha; } + /** - * @param sha the sha to set + * Sets the sha. + * + * @param sha + * the new sha */ public void setSha(String sha) { this.sha = sha; } + /** + * Gets the mode. + * * @return the mode */ public String getMode() { return mode; } + /** - * @param mode the mode to set + * Sets the mode. + * + * @param mode + * the new mode */ public void setMode(String mode) { this.mode = mode; } + /** - * @return the mimeType + * Gets the mime type. + * + * @return the mime type */ public String getMimeType() { return mimeType; } + /** - * @param mimeType the mimeType to set + * Sets the mime type. + * + * @param mimeType + * the new mime type */ public void setMimeType(String mimeType) { this.mimeType = mimeType; } + /** + * Gets the data. + * * @return the data */ public String getData() { return data; } + /** - * @param data the data to set + * Sets the data. + * + * @param data + * the new data */ public void setData(String data) { this.data = data; diff --git a/schema/src/main/java/com/github/api/v2/schema/Comment.java b/schema/src/main/java/com/github/api/v2/schema/Comment.java index a0feed3..9e203f0 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Comment.java +++ b/schema/src/main/java/com/github/api/v2/schema/Comment.java @@ -6,89 +6,140 @@ import java.util.Date; /** - * @author nmukhtar - * + * The Class Comment. */ public class Comment extends SchemaEntity { - /** - * - */ + /** The Constant serialVersionUID. */ private static final long serialVersionUID = 9155892708485181542L; + + /** The created at. */ private Date createdAt; + + /** The body. */ private String body; + + /** The updated at. */ private Date updatedAt; + + /** The id. */ private long id; + + /** The user. */ private String user; + + /** The gravatar id. */ private String gravatarId; + /** - * @return the createdAt + * Gets the created at. + * + * @return the created at */ public Date getCreatedAt() { return createdAt; } + /** - * @param createdAt the createdAt to set + * Sets the created at. + * + * @param createdAt + * the new created at */ public void setCreatedAt(Date createdAt) { this.createdAt = createdAt; } + /** + * Gets the body. + * * @return the body */ public String getBody() { return body; } + /** - * @param body the body to set + * Sets the body. + * + * @param body + * the new body */ public void setBody(String body) { this.body = body; } + /** - * @return the updatedAt + * Gets the updated at. + * + * @return the updated at */ public Date getUpdatedAt() { return updatedAt; } + /** - * @param updatedAt the updatedAt to set + * Sets the updated at. + * + * @param updatedAt + * the new updated at */ public void setUpdatedAt(Date updatedAt) { this.updatedAt = updatedAt; } + /** + * Gets the id. + * * @return the id */ public long getId() { return id; } + /** - * @param id the id to set + * Sets the id. + * + * @param id + * the new id */ public void setId(long id) { this.id = id; } + /** + * Gets the user. + * * @return the user */ public String getUser() { return user; } + /** - * @param user the user to set + * Sets the user. + * + * @param user + * the new user */ public void setUser(String user) { this.user = user; } + /** - * @return the gravatarId + * Gets the gravatar id. + * + * @return the gravatar id */ public String getGravatarId() { return gravatarId; } + /** - * @param gravatarId the gravatarId to set + * Sets the gravatar id. + * + * @param gravatarId + * the new gravatar id */ public void setGravatarId(String gravatarId) { this.gravatarId = gravatarId; diff --git a/schema/src/main/java/com/github/api/v2/schema/Commit.java b/schema/src/main/java/com/github/api/v2/schema/Commit.java index bb1bd2d..d792f56 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Commit.java +++ b/schema/src/main/java/com/github/api/v2/schema/Commit.java @@ -7,233 +7,382 @@ import java.util.List; /** - * @author nmukhtar - * + * The Class Commit. */ public class Commit extends SchemaEntity { - /** - * - */ + /** The Constant serialVersionUID. */ private static final long serialVersionUID = 9155892708485181542L; + + /** The message. */ private String message; + + /** The time. */ private long time; + + /** The parents. */ private List parents; + + /** The date. */ private Date date; + + /** The author. */ private User author; + + /** The id. */ private String id; + + /** The space. */ private int space; + + /** The gravatar. */ private String gravatar; + + /** The login. */ private String login; + + /** The url. */ private String url; + + /** The committed date. */ private Date committedDate; + + /** The authored date. */ private Date authoredDate; + + /** The tree. */ private String tree; + + /** The committer. */ private User committer; + + /** The added. */ private List added; + + /** The removed. */ private List removed; + + /** The modified. */ private List modified; /** + * Gets the message. + * * @return the message */ public String getMessage() { return message; } + /** - * @param message the message to set + * Sets the message. + * + * @param message + * the new message */ public void setMessage(String message) { this.message = message; } + /** + * Gets the time. + * * @return the time */ public long getTime() { return time; } + /** - * @param time the time to set + * Sets the time. + * + * @param time + * the new time */ public void setTime(long time) { this.time = time; } + /** + * Gets the parents. + * * @return the parents */ public List getParents() { return parents; } + /** - * @param parents the parents to set + * Sets the parents. + * + * @param parents + * the new parents */ public void setParents(List parents) { this.parents = parents; } + /** + * Gets the date. + * * @return the date */ public Date getDate() { return date; } + /** - * @param date the date to set + * Sets the date. + * + * @param date + * the new date */ public void setDate(Date date) { this.date = date; } + /** + * Gets the author. + * * @return the author */ public User getAuthor() { return author; } + /** - * @param author the author to set + * Sets the author. + * + * @param author + * the new author */ public void setAuthor(User author) { this.author = author; } + /** + * Gets the id. + * * @return the id */ public String getId() { return id; } + /** - * @param id the id to set + * Sets the id. + * + * @param id + * the new id */ public void setId(String id) { this.id = id; } + /** + * Gets the space. + * * @return the space */ public int getSpace() { return space; } + /** - * @param space the space to set + * Sets the space. + * + * @param space + * the new space */ public void setSpace(int space) { this.space = space; } + /** + * Gets the gravatar. + * * @return the gravatar */ public String getGravatar() { return gravatar; } + /** - * @param gravatar the gravatar to set + * Sets the gravatar. + * + * @param gravatar + * the new gravatar */ public void setGravatar(String gravatar) { this.gravatar = gravatar; } + /** + * Gets the login. + * * @return the login */ public String getLogin() { return login; } + /** - * @param login the login to set + * Sets the login. + * + * @param login + * the new login */ public void setLogin(String login) { this.login = login; } + /** + * Gets the url. + * * @return the url */ public String getUrl() { return url; } + /** - * @param url the url to set + * Sets the url. + * + * @param url + * the new url */ public void setUrl(String url) { this.url = url; } + /** - * @return the committedDate + * Gets the committed date. + * + * @return the committed date */ public Date getCommittedDate() { return committedDate; } + /** - * @param committedDate the committedDate to set + * Sets the committed date. + * + * @param committedDate + * the new committed date */ public void setCommittedDate(Date committedDate) { this.committedDate = committedDate; } + /** - * @return the authoredDate + * Gets the authored date. + * + * @return the authored date */ public Date getAuthoredDate() { return authoredDate; } + /** - * @param authoredDate the authoredDate to set + * Sets the authored date. + * + * @param authoredDate + * the new authored date */ public void setAuthoredDate(Date authoredDate) { this.authoredDate = authoredDate; } + /** + * Gets the tree. + * * @return the tree */ public String getTree() { return tree; } + /** - * @param tree the tree to set + * Sets the tree. + * + * @param tree + * the new tree */ public void setTree(String tree) { this.tree = tree; } + /** + * Gets the committer. + * * @return the committer */ public User getCommitter() { return committer; } + /** - * @param committer the committer to set + * Sets the committer. + * + * @param committer + * the new committer */ public void setCommitter(User committer) { this.committer = committer; } + /** + * Gets the added. + * * @return the added */ public List getAdded() { return added; } + /** - * @param added the added to set + * Sets the added. + * + * @param added + * the new added */ public void setAdded(List added) { this.added = added; } + /** + * Gets the removed. + * * @return the removed */ public List getRemoved() { return removed; } + /** - * @param removed the removed to set + * Sets the removed. + * + * @param removed + * the new removed */ public void setRemoved(List removed) { this.removed = removed; } + /** + * Gets the modified. + * * @return the modified */ public List getModified() { return modified; } + /** - * @param modified the modified to set + * Sets the modified. + * + * @param modified + * the new modified */ public void setModified(List modified) { this.modified = modified; diff --git a/schema/src/main/java/com/github/api/v2/schema/Delta.java b/schema/src/main/java/com/github/api/v2/schema/Delta.java index d5da761..1284d23 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Delta.java +++ b/schema/src/main/java/com/github/api/v2/schema/Delta.java @@ -4,38 +4,52 @@ package com.github.api.v2.schema; /** - * @author nmukhtar - * + * The Class Delta. */ public class Delta extends SchemaEntity { - /** - * - */ + /** The Constant serialVersionUID. */ private static final long serialVersionUID = -1779660351774171098L; + /** The diff. */ private String diff; + + /** The filename. */ private String filename; + /** + * Gets the diff. + * * @return the diff */ public String getDiff() { return diff; } + /** - * @param diff the diff to set + * Sets the diff. + * + * @param diff + * the new diff */ public void setDiff(String diff) { this.diff = diff; } + /** + * Gets the filename. + * * @return the filename */ public String getFilename() { return filename; } + /** - * @param filename the filename to set + * Sets the filename. + * + * @param filename + * the new filename */ public void setFilename(String filename) { this.filename = filename; diff --git a/schema/src/main/java/com/github/api/v2/schema/Gist.java b/schema/src/main/java/com/github/api/v2/schema/Gist.java index b6e985d..2d3ecce 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Gist.java +++ b/schema/src/main/java/com/github/api/v2/schema/Gist.java @@ -9,76 +9,118 @@ import com.github.api.v2.schema.Repository.Visibility; /** - * @author nmukhtar - * + * The Class Gist. */ public class Gist extends SchemaEntity { - /** - * - */ + /** The Constant serialVersionUID. */ private static final long serialVersionUID = 9155892708485181542L; + + /** The description. */ private String description; + + /** The repo. */ private String repo; + + /** The visibility. */ private Visibility visibility; + + /** The created at. */ private Date createdAt; + + /** The files. */ private List files; + /** + * Gets the description. + * * @return the description */ public String getDescription() { return description; } + /** - * @param description the description to set + * Sets the description. + * + * @param description + * the new description */ public void setDescription(String description) { this.description = description; } + /** + * Gets the repo. + * * @return the repo */ public String getRepo() { return repo; } + /** - * @param repo the repo to set + * Sets the repo. + * + * @param repo + * the new repo */ public void setRepo(String repo) { this.repo = repo; } + /** + * Gets the visibility. + * * @return the visibility */ public Visibility getVisibility() { return visibility; } + /** - * @param visibility the visibility to set + * Sets the visibility. + * + * @param visibility + * the new visibility */ public void setVisibility(Visibility visibility) { this.visibility = visibility; } + /** - * @return the createdAt + * Gets the created at. + * + * @return the created at */ public Date getCreatedAt() { return createdAt; } + /** - * @param createdAt the createdAt to set + * Sets the created at. + * + * @param createdAt + * the new created at */ public void setCreatedAt(Date createdAt) { this.createdAt = createdAt; } + /** + * Gets the files. + * * @return the files */ public List getFiles() { return files; } + /** - * @param files the files to set + * Sets the files. + * + * @param files + * the new files */ public void setFiles(List files) { this.files = files; diff --git a/schema/src/main/java/com/github/api/v2/schema/Id.java b/schema/src/main/java/com/github/api/v2/schema/Id.java index f55006f..43f5d4e 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Id.java +++ b/schema/src/main/java/com/github/api/v2/schema/Id.java @@ -4,25 +4,30 @@ package com.github.api.v2.schema; /** - * @author nmukhtar - * + * The Class Id. */ public class Id extends SchemaEntity { - /** - * - */ + /** The Constant serialVersionUID. */ private static final long serialVersionUID = 9155892708485181542L; + /** The id. */ private String id; + /** + * Gets the id. + * * @return the id */ public String getId() { return id; } + /** - * @param id the id to set + * Sets the id. + * + * @param id + * the new id */ public void setId(String id) { this.id = id; diff --git a/schema/src/main/java/com/github/api/v2/schema/Issue.java b/schema/src/main/java/com/github/api/v2/schema/Issue.java index 1ea1002..41ef36a 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Issue.java +++ b/schema/src/main/java/com/github/api/v2/schema/Issue.java @@ -8,12 +8,19 @@ import java.util.Map; /** - * @author nmukhtar - * + * The Class Issue. */ public class Issue extends SchemaEntity { + + /** + * The Enum State. + */ public enum State implements ValueEnum { + + /** The OPEN. */ OPEN("open"), + + /** The CLOSED. */ CLOSED("closed"); /** The Constant stringToEnum. */ @@ -29,14 +36,18 @@ public enum State implements ValueEnum { private final String value; /** - * Instantiates a new blog sort order. - * - * @param value the value - */ + * Instantiates a new state. + * + * @param value + * the value + */ State(String value) { this.value = value; } + /* (non-Javadoc) + * @see com.github.api.v2.schema.ValueEnum#value() + */ @Override public String value() { return value; @@ -45,159 +56,256 @@ public String value() { /** * From value. * - * @param value the value + * @param value + * the value * - * @return the blog sort order + * @return the state */ public static State fromValue(String value) { return stringToEnum.get(value); } } - /** - * - */ + /** The Constant serialVersionUID. */ private static final long serialVersionUID = 9155892708485181542L; + /** The user. */ private String user; + + /** The gravatar id. */ private String gravatarId; + + /** The updated at. */ private Date updatedAt; + + /** The votes. */ private int votes; + + /** The number. */ private int number; + + /** The comments. */ private int comments; + + /** The position. */ private double position; + + /** The title. */ private String title; + + /** The body. */ private String body; + + /** The state. */ private State state; + + /** The created at. */ private Date createdAt; + /** + * Gets the user. + * * @return the user */ public String getUser() { return user; } + /** - * @param user the user to set + * Sets the user. + * + * @param user + * the new user */ public void setUser(String user) { this.user = user; } + /** - * @return the gravatarId + * Gets the gravatar id. + * + * @return the gravatar id */ public String getGravatarId() { return gravatarId; } + /** - * @param gravatarId the gravatarId to set + * Sets the gravatar id. + * + * @param gravatarId + * the new gravatar id */ public void setGravatarId(String gravatarId) { this.gravatarId = gravatarId; } + /** - * @return the updatedAt + * Gets the updated at. + * + * @return the updated at */ public Date getUpdatedAt() { return updatedAt; } + /** - * @param updatedAt the updatedAt to set + * Sets the updated at. + * + * @param updatedAt + * the new updated at */ public void setUpdatedAt(Date updatedAt) { this.updatedAt = updatedAt; } + /** + * Gets the votes. + * * @return the votes */ public int getVotes() { return votes; } + /** - * @param votes the votes to set + * Sets the votes. + * + * @param votes + * the new votes */ public void setVotes(int votes) { this.votes = votes; } + /** + * Gets the number. + * * @return the number */ public int getNumber() { return number; } + /** - * @param number the number to set + * Sets the number. + * + * @param number + * the new number */ public void setNumber(int number) { this.number = number; } + /** + * Gets the position. + * * @return the position */ public double getPosition() { return position; } + /** - * @param position the position to set + * Sets the position. + * + * @param position + * the new position */ public void setPosition(double position) { this.position = position; } + /** + * Gets the title. + * * @return the title */ public String getTitle() { return title; } + /** - * @param title the title to set + * Sets the title. + * + * @param title + * the new title */ public void setTitle(String title) { this.title = title; } + /** + * Gets the body. + * * @return the body */ public String getBody() { return body; } + /** - * @param body the body to set + * Sets the body. + * + * @param body + * the new body */ public void setBody(String body) { this.body = body; } + /** + * Gets the state. + * * @return the state */ public State getState() { return state; } + /** - * @param state the state to set + * Sets the state. + * + * @param state + * the new state */ public void setState(State state) { this.state = state; } + /** - * @return the createdAt + * Gets the created at. + * + * @return the created at */ public Date getCreatedAt() { return createdAt; } + /** - * @param createdAt the createdAt to set + * Sets the created at. + * + * @param createdAt + * the new created at */ public void setCreatedAt(Date createdAt) { this.createdAt = createdAt; } + /** + * Gets the comments. + * * @return the comments */ public int getComments() { return comments; } + /** - * @param comments the comments to set + * Sets the comments. + * + * @param comments + * the new comments */ public void setComments(int comments) { this.comments = comments; diff --git a/schema/src/main/java/com/github/api/v2/schema/Key.java b/schema/src/main/java/com/github/api/v2/schema/Key.java index 00fb57a..13bdc7a 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Key.java +++ b/schema/src/main/java/com/github/api/v2/schema/Key.java @@ -4,51 +4,74 @@ package com.github.api.v2.schema; /** - * @author nmukhtar - * + * The Class Key. */ public class Key extends SchemaEntity { - /** - * - */ + /** The Constant serialVersionUID. */ private static final long serialVersionUID = 9155892708485181542L; + /** The id. */ private String id; + + /** The title. */ private String title; + + /** The key. */ private String key; + /** + * Gets the id. + * * @return the id */ public String getId() { return id; } + /** - * @param id the id to set + * Sets the id. + * + * @param id + * the new id */ public void setId(String id) { this.id = id; } + /** + * Gets the title. + * * @return the title */ public String getTitle() { return title; } + /** - * @param title the title to set + * Sets the title. + * + * @param title + * the new title */ public void setTitle(String title) { this.title = title; } + /** + * Gets the key. + * * @return the key */ public String getKey() { return key; } + /** - * @param key the key to set + * Sets the key. + * + * @param key + * the new key */ public void setKey(String key) { this.key = key; diff --git a/schema/src/main/java/com/github/api/v2/schema/Language.java b/schema/src/main/java/com/github/api/v2/schema/Language.java index bae82ba..3a8ca77 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Language.java +++ b/schema/src/main/java/com/github/api/v2/schema/Language.java @@ -7,63 +7,170 @@ import java.util.Map; /** - * @author nmukhtar - * + * The Enum Language. */ public enum Language implements ValueEnum { + + /** The Action script. */ ActionScript("ActionScript"), + + /** The Arc. */ Arc("Arc"), + + /** The ASP. */ ASP("ASP"), + + /** The Assembly. */ Assembly("Assembly"), + + /** The Boo. */ Boo("Boo"), + + /** The C. */ C("C"), + + /** The C_ sharp. */ C_SHARP("C#"), + + /** The CPP. */ CPP("C++"), + + /** The Clojure. */ Clojure("Clojure"), + + /** The Coffee script. */ CoffeeScript("CoffeeScript"), + + /** The Cold fusion. */ ColdFusion("ColdFusion"), + + /** The Common lisp. */ CommonLisp("Common Lisp"), + + /** The D. */ D("D"), + + /** The Delphi. */ Delphi("Delphi"), + + /** The Duby. */ Duby("Duby"), + + /** The Eiffel. */ Eiffel("Eiffel"), + + /** The Emacs lisp. */ EmacsLisp("Emacs Lisp"), + + /** The Erlang. */ Erlang("Erlang"), + + /** The F_ sharp. */ F_SHARP("F#"), + + /** The FORTRAN. */ FORTRAN("FORTRAN"), + + /** The Go. */ Go("Go"), + + /** The Groovy. */ Groovy("Groovy"), + + /** The Haskell. */ Haskell("Haskell"), + + /** The Ha xe. */ HaXe("HaXe"), + + /** The Io. */ Io("Io"), + + /** The Java. */ Java("Java"), + + /** The Java script. */ JavaScript("JavaScript"), + + /** The Lua. */ Lua("Lua"), + + /** The Max_ msp. */ Max_MSP("Max/MSP"), + + /** The Nu. */ Nu("Nu"), + + /** The Objective_ c. */ Objective_C("Objective-C"), + + /** The Objective_ j. */ Objective_J("Objective-J"), + + /** The O caml. */ OCaml("OCaml"), + + /** The ooc. */ ooc("ooc"), + + /** The Perl. */ Perl("Perl"), + + /** The PHP. */ PHP("PHP"), + + /** The Pure_ data. */ Pure_Data("Pure Data"), + + /** The Python. */ Python("Python"), + + /** The R. */ R("R"), + + /** The Racket. */ Racket("Racket"), + + /** The Ruby. */ Ruby("Ruby"), + + /** The Scala. */ Scala("Scala"), + + /** The Scheme. */ Scheme("Scheme"), + + /** The sclang. */ sclang("sclang"), + + /** The Self. */ Self("Self"), + + /** The Shell. */ Shell("Shell"), + + /** The Smalltalk. */ Smalltalk("Smalltalk"), + + /** The Super collider. */ SuperCollider("SuperCollider"), + + /** The Tcl. */ Tcl("Tcl"), + + /** The Vala. */ Vala("Vala"), + + /** The Verilog. */ Verilog("Verilog"), + + /** The VHDL. */ VHDL("VHDL"), + + /** The Vim l. */ VimL("VimL"), + + /** The Visual basic. */ VisualBasic("Visual Basic"); /** The Constant stringToEnum. */ @@ -79,14 +186,18 @@ public enum Language implements ValueEnum { private final String value; /** - * Instantiates a new blog sort order. - * - * @param value the value - */ + * Instantiates a new language. + * + * @param value + * the value + */ Language(String value) { this.value = value; } + /* (non-Javadoc) + * @see com.github.api.v2.schema.ValueEnum#value() + */ @Override public String value() { return value; @@ -95,9 +206,10 @@ public String value() { /** * From value. * - * @param value the value + * @param value + * the value * - * @return the blog sort order + * @return the language */ public static Language fromValue(String value) { return stringToEnum.get(value); diff --git a/schema/src/main/java/com/github/api/v2/schema/Network.java b/schema/src/main/java/com/github/api/v2/schema/Network.java index f5b9087..83e2534 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Network.java +++ b/schema/src/main/java/com/github/api/v2/schema/Network.java @@ -7,51 +7,74 @@ import java.util.List; /** - * @author nmukhtar - * + * The Class Network. */ public class Network extends SchemaEntity { - /** - * - */ + /** The Constant serialVersionUID. */ private static final long serialVersionUID = 9155892708485181542L; + /** The focus. */ private int focus; + + /** The nethash. */ private String nethash; + + /** The dates. */ private List dates; + /** + * Gets the focus. + * * @return the focus */ public int getFocus() { return focus; } + /** - * @param focus the focus to set + * Sets the focus. + * + * @param focus + * the new focus */ public void setFocus(int focus) { this.focus = focus; } + /** + * Gets the nethash. + * * @return the nethash */ public String getNethash() { return nethash; } + /** - * @param nethash the nethash to set + * Sets the nethash. + * + * @param nethash + * the new nethash */ public void setNethash(String nethash) { this.nethash = nethash; } + /** + * Gets the dates. + * * @return the dates */ public List getDates() { return dates; } + /** - * @param dates the dates to set + * Sets the dates. + * + * @param dates + * the new dates */ public void setDates(List dates) { this.dates = dates; diff --git a/schema/src/main/java/com/github/api/v2/schema/Plan.java b/schema/src/main/java/com/github/api/v2/schema/Plan.java index 67bf0af..8a34c69 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Plan.java +++ b/schema/src/main/java/com/github/api/v2/schema/Plan.java @@ -4,64 +4,96 @@ package com.github.api.v2.schema; /** - * @author nmukhtar - * + * The Class Plan. */ public class Plan extends SchemaEntity { - /** - * - */ + /** The Constant serialVersionUID. */ private static final long serialVersionUID = -716103936969784665L; + /** The name. */ private String name; + + /** The collaborators. */ private int collaborators; + + /** The space. */ private long space; + + /** The private repos. */ private int privateRepos; + /** + * Gets the name. + * * @return the name */ public String getName() { return name; } + /** - * @param name the name to set + * Sets the name. + * + * @param name + * the new name */ public void setName(String name) { this.name = name; } + /** + * Gets the collaborators. + * * @return the collaborators */ public int getCollaborators() { return collaborators; } + /** - * @param collaborators the collaborators to set + * Sets the collaborators. + * + * @param collaborators + * the new collaborators */ public void setCollaborators(int collaborators) { this.collaborators = collaborators; } + /** + * Gets the space. + * * @return the space */ public long getSpace() { return space; } + /** - * @param space the space to set + * Sets the space. + * + * @param space + * the new space */ public void setSpace(long space) { this.space = space; } + /** - * @return the privateRepos + * Gets the private repos. + * + * @return the private repos */ public int getPrivateRepos() { return privateRepos; } + /** - * @param privateRepos the privateRepos to set + * Sets the private repos. + * + * @param privateRepos + * the new private repos */ public void setPrivateRepos(int privateRepos) { this.privateRepos = privateRepos; diff --git a/schema/src/main/java/com/github/api/v2/schema/Repository.java b/schema/src/main/java/com/github/api/v2/schema/Repository.java index 3637f1e..ee19f48 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Repository.java +++ b/schema/src/main/java/com/github/api/v2/schema/Repository.java @@ -8,12 +8,19 @@ import java.util.Map; /** - * @author nmukhtar - * + * The Class Repository. */ public class Repository extends SchemaEntity { + + /** + * The Enum Visibility. + */ public enum Visibility implements ValueEnum { - PUBLIC("public"), PRIVATE("private"); + + /** The PUBLIC. */ + PUBLIC("public"), + /** The PRIVATE. */ + PRIVATE("private"); /** The Constant stringToEnum. */ private static final Map stringToEnum = new HashMap(); @@ -28,14 +35,18 @@ public enum Visibility implements ValueEnum { private final String value; /** - * Instantiates a new blog sort order. - * - * @param value the value - */ + * Instantiates a new visibility. + * + * @param value + * the value + */ Visibility(String value) { this.value = value; } + /* (non-Javadoc) + * @see com.github.api.v2.schema.ValueEnum#value() + */ @Override public String value() { return value; @@ -44,343 +55,567 @@ public String value() { /** * From value. * - * @param value the value + * @param value + * the value * - * @return the blog sort order + * @return the visibility */ public static Visibility fromValue(String value) { return stringToEnum.get(value); } } + /** The Constant MASTER. */ public static final String MASTER = "master"; - /** - * - */ + /** The Constant serialVersionUID. */ private static final long serialVersionUID = 9155892708485181542L; + + /** The watchers. */ private int watchers; + + /** The owner. */ private String owner; + + /** The name. */ private String name; + + /** The description. */ private String description; + + /** The visibility. */ private Visibility visibility; + + /** The url. */ private String url; + + /** The open issues. */ private int openIssues; + + /** The fork. */ private boolean fork; + + /** The homepage. */ private String homepage; + + /** The forks. */ private int forks; + + /** The score. */ private double score; + + /** The actions. */ private int actions; + + /** The size. */ private long size; + + /** The language. */ private Language language; + + /** The followers. */ private int followers; + + /** The username. */ private String username; + + /** The type. */ private String type; + + /** The id. */ private String id; + + /** The pushed. */ private Date pushed; + + /** The created. */ private Date created; + + /** The source. */ private String source; + + /** The parent. */ private String parent; + + /** The has wiki. */ private boolean hasWiki; + + /** The has issues. */ private boolean hasIssues; + + /** The has downloads. */ private boolean hasDownloads; /** + * Gets the watchers. + * * @return the watchers */ public int getWatchers() { return watchers; } + /** - * @param watchers the watchers to set + * Sets the watchers. + * + * @param watchers + * the new watchers */ public void setWatchers(int watchers) { this.watchers = watchers; } + /** + * Gets the owner. + * * @return the owner */ public String getOwner() { return owner; } + /** - * @param owner the owner to set + * Sets the owner. + * + * @param owner + * the new owner */ public void setOwner(String owner) { this.owner = owner; } + /** + * Gets the name. + * * @return the name */ public String getName() { return name; } + /** - * @param name the name to set + * Sets the name. + * + * @param name + * the new name */ public void setName(String name) { this.name = name; } + /** + * Gets the description. + * * @return the description */ public String getDescription() { return description; } + /** - * @param description the description to set + * Sets the description. + * + * @param description + * the new description */ public void setDescription(String description) { this.description = description; } + /** - * @return the visibiity + * Gets the visibility. + * + * @return the visibility */ public Visibility getVisibility() { return visibility; } + /** - * @param visibiity the visibiity to set + * Sets the visibility. + * + * @param visibility + * the new visibility */ public void setVisibility(Visibility visibility) { this.visibility = visibility; } + /** + * Gets the url. + * * @return the url */ public String getUrl() { return url; } + /** - * @param url the url to set + * Sets the url. + * + * @param url + * the new url */ public void setUrl(String url) { this.url = url; } + /** - * @return the openIssues + * Gets the open issues. + * + * @return the open issues */ public int getOpenIssues() { return openIssues; } + /** - * @param openIssues the openIssues to set + * Sets the open issues. + * + * @param openIssues + * the new open issues */ public void setOpenIssues(int openIssues) { this.openIssues = openIssues; } + /** - * @return the fork + * Checks if is fork. + * + * @return true, if is fork */ public boolean isFork() { return fork; } + /** - * @param fork the fork to set + * Sets the fork. + * + * @param fork + * the new fork */ public void setFork(boolean fork) { this.fork = fork; } + /** + * Gets the homepage. + * * @return the homepage */ public String getHomepage() { return homepage; } + /** - * @param homepage the homepage to set + * Sets the homepage. + * + * @param homepage + * the new homepage */ public void setHomepage(String homepage) { this.homepage = homepage; } + /** + * Gets the forks. + * * @return the forks */ public int getForks() { return forks; } + /** - * @param forks the forks to set + * Sets the forks. + * + * @param forks + * the new forks */ public void setForks(int forks) { this.forks = forks; } + /** + * Gets the score. + * * @return the score */ public double getScore() { return score; } + /** - * @param score the score to set + * Sets the score. + * + * @param score + * the new score */ public void setScore(double score) { this.score = score; } + /** + * Gets the actions. + * * @return the actions */ public int getActions() { return actions; } + /** - * @param actions the actions to set + * Sets the actions. + * + * @param actions + * the new actions */ public void setActions(int actions) { this.actions = actions; } + /** + * Gets the size. + * * @return the size */ public long getSize() { return size; } + /** - * @param size the size to set + * Sets the size. + * + * @param size + * the new size */ public void setSize(long size) { this.size = size; } + /** + * Gets the language. + * * @return the language */ public Language getLanguage() { return language; } + /** - * @param language the language to set + * Sets the language. + * + * @param language + * the new language */ public void setLanguage(Language language) { this.language = language; } + /** + * Gets the followers. + * * @return the followers */ public int getFollowers() { return followers; } + /** - * @param followers the followers to set + * Sets the followers. + * + * @param followers + * the new followers */ public void setFollowers(int followers) { this.followers = followers; } + /** + * Gets the username. + * * @return the username */ public String getUsername() { return username; } + /** - * @param username the username to set + * Sets the username. + * + * @param username + * the new username */ public void setUsername(String username) { this.username = username; } + /** + * Gets the type. + * * @return the type */ public String getType() { return type; } + /** - * @param type the type to set + * Sets the type. + * + * @param type + * the new type */ public void setType(String type) { this.type = type; } + /** + * Gets the id. + * * @return the id */ public String getId() { return id; } + /** - * @param id the id to set + * Sets the id. + * + * @param id + * the new id */ public void setId(String id) { this.id = id; } + /** + * Gets the pushed. + * * @return the pushed */ public Date getPushed() { return pushed; } + /** - * @param pushed the pushed to set + * Sets the pushed. + * + * @param pushed + * the new pushed */ public void setPushed(Date pushed) { this.pushed = pushed; } + /** + * Gets the created. + * * @return the created */ public Date getCreated() { return created; } + /** - * @param created the created to set + * Sets the created. + * + * @param created + * the new created */ public void setCreated(Date created) { this.created = created; } + /** + * Gets the source. + * * @return the source */ public String getSource() { return source; } + /** - * @param source the source to set + * Sets the source. + * + * @param source + * the new source */ public void setSource(String source) { this.source = source; } + /** + * Gets the parent. + * * @return the parent */ public String getParent() { return parent; } + /** - * @param parent the parent to set + * Sets the parent. + * + * @param parent + * the new parent */ public void setParent(String parent) { this.parent = parent; } + /** - * @return the hasWiki + * Checks if is checks for wiki. + * + * @return true, if is checks for wiki */ public boolean isHasWiki() { return hasWiki; } + /** - * @param hasWiki the hasWiki to set + * Sets the checks for wiki. + * + * @param hasWiki + * the new checks for wiki */ public void setHasWiki(boolean hasWiki) { this.hasWiki = hasWiki; } + /** - * @return the hasIssues + * Checks if is checks for issues. + * + * @return true, if is checks for issues */ public boolean isHasIssues() { return hasIssues; } + /** - * @param hasIssues the hasIssues to set + * Sets the checks for issues. + * + * @param hasIssues + * the new checks for issues */ public void setHasIssues(boolean hasIssues) { this.hasIssues = hasIssues; } + /** - * @return the hasDownloads + * Checks if is checks for downloads. + * + * @return true, if is checks for downloads */ public boolean isHasDownloads() { return hasDownloads; } + /** - * @param hasDownloads the hasDownloads to set + * Sets the checks for downloads. + * + * @param hasDownloads + * the new checks for downloads */ public void setHasDownloads(boolean hasDownloads) { this.hasDownloads = hasDownloads; diff --git a/schema/src/main/java/com/github/api/v2/schema/Tree.java b/schema/src/main/java/com/github/api/v2/schema/Tree.java index 6b36daf..f1a54b2 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Tree.java +++ b/schema/src/main/java/com/github/api/v2/schema/Tree.java @@ -7,12 +7,19 @@ import java.util.Map; /** - * @author nmukhtar - * + * The Class Tree. */ public class Tree extends SchemaEntity { + + /** + * The Enum Type. + */ public enum Type implements ValueEnum { + + /** The TREE. */ TREE("tree"), + + /** The BLOB. */ BLOB("blob"); /** The Constant stringToEnum. */ @@ -28,14 +35,18 @@ public enum Type implements ValueEnum { private final String value; /** - * Instantiates a new blog sort order. - * - * @param value the value - */ + * Instantiates a new type. + * + * @param value + * the value + */ Type(String value) { this.value = value; } + /* (non-Javadoc) + * @see com.github.api.v2.schema.ValueEnum#value() + */ @Override public String value() { return value; @@ -44,68 +55,102 @@ public String value() { /** * From value. * - * @param value the value + * @param value + * the value * - * @return the blog sort order + * @return the type */ public static Type fromValue(String value) { return stringToEnum.get(value); } } - /** - * - */ + /** The Constant serialVersionUID. */ private static final long serialVersionUID = 9155892708485181542L; + /** The name. */ private String name; + + /** The sha. */ private String sha; + + /** The mode. */ private String mode; + + /** The type. */ private Type type; + /** + * Gets the name. + * * @return the name */ public String getName() { return name; } + /** - * @param name the name to set + * Sets the name. + * + * @param name + * the new name */ public void setName(String name) { this.name = name; } + /** + * Gets the sha. + * * @return the sha */ public String getSha() { return sha; } + /** - * @param sha the sha to set + * Sets the sha. + * + * @param sha + * the new sha */ public void setSha(String sha) { this.sha = sha; } + /** + * Gets the mode. + * * @return the mode */ public String getMode() { return mode; } + /** - * @param mode the mode to set + * Sets the mode. + * + * @param mode + * the new mode */ public void setMode(String mode) { this.mode = mode; } + /** + * Gets the type. + * * @return the type */ public Type getType() { return type; } + /** - * @param type the type to set + * Sets the type. + * + * @param type + * the new type */ public void setType(Type type) { this.type = type; diff --git a/schema/src/main/java/com/github/api/v2/schema/User.java b/schema/src/main/java/com/github/api/v2/schema/User.java index 37a83d4..79149e7 100644 --- a/schema/src/main/java/com/github/api/v2/schema/User.java +++ b/schema/src/main/java/com/github/api/v2/schema/User.java @@ -6,286 +6,470 @@ import java.util.Date; /** - * @author nmukhtar - * + * The Class User. */ public class User extends SchemaEntity { - /** - * - */ + /** The Constant serialVersionUID. */ private static final long serialVersionUID = 9155892708485181542L; + /** The id. */ private String id; + + /** The gravatar id. */ private String gravatarId; + + /** The login. */ private String login; + + /** The name. */ private String name; + + /** The email. */ private String email; + + /** The location. */ private String location; + + /** The fullname. */ private String fullname; + + /** The username. */ private String username; + + /** The blog. */ private String blog; + + /** The company. */ private String company; + + /** The following count. */ private int followingCount; + + /** The followers count. */ private int followersCount; + + /** The public gist count. */ private int publicGistCount; + + /** The public repo count. */ private int publicRepoCount; + + /** The total private repo count. */ private int totalPrivateRepoCount; + + /** The collaborators. */ private int collaborators; + + /** The disk usage. */ private int diskUsage; + + /** The owned private repo count. */ private int ownedPrivateRepoCount; + + /** The private gist count. */ private int privateGistCount; + + /** The created at. */ private Date createdAt; + + /** The plan. */ private Plan plan; /** + * Gets the name. + * * @return the name */ public String getName() { return name; } + /** - * @param name the name to set + * Sets the name. + * + * @param name + * the new name */ public void setName(String name) { this.name = name; } + /** + * Gets the location. + * * @return the location */ public String getLocation() { return location; } + /** - * @param location the location to set + * Sets the location. + * + * @param location + * the new location */ public void setLocation(String location) { this.location = location; } + /** + * Gets the fullname. + * * @return the fullname */ public String getFullname() { return fullname; } + /** - * @param fullname the fullname to set + * Sets the fullname. + * + * @param fullname + * the new fullname */ public void setFullname(String fullname) { this.fullname = fullname; } + /** + * Gets the username. + * * @return the username */ public String getUsername() { return username; } + /** - * @param username the username to set + * Sets the username. + * + * @param username + * the new username */ public void setUsername(String username) { this.username = username; } + /** + * Gets the email. + * * @return the email */ public String getEmail() { return email; } + /** - * @param email the email to set + * Sets the email. + * + * @param email + * the new email */ public void setEmail(String email) { this.email = email; } + /** + * Gets the blog. + * * @return the blog */ public String getBlog() { return blog; } + /** - * @param blog the blog to set + * Sets the blog. + * + * @param blog + * the new blog */ public void setBlog(String blog) { this.blog = blog; } + /** + * Gets the company. + * * @return the company */ public String getCompany() { return company; } + /** - * @param company the company to set + * Sets the company. + * + * @param company + * the new company */ public void setCompany(String company) { this.company = company; } + /** + * Gets the id. + * * @return the id */ public String getId() { return id; } + /** - * @param id the id to set + * Sets the id. + * + * @param id + * the new id */ public void setId(String id) { this.id = id; } + /** + * Gets the login. + * * @return the login */ public String getLogin() { return login; } + /** - * @param login the login to set + * Sets the login. + * + * @param login + * the new login */ public void setLogin(String login) { this.login = login; } + /** - * @return the followingCount + * Gets the following count. + * + * @return the following count */ public int getFollowingCount() { return followingCount; } + /** - * @param followingCount the followingCount to set + * Sets the following count. + * + * @param followingCount + * the new following count */ public void setFollowingCount(int followingCount) { this.followingCount = followingCount; } + /** - * @return the followersCount + * Gets the followers count. + * + * @return the followers count */ public int getFollowersCount() { return followersCount; } + /** - * @param followersCount the followersCount to set + * Sets the followers count. + * + * @param followersCount + * the new followers count */ public void setFollowersCount(int followersCount) { this.followersCount = followersCount; } + /** - * @return the publicGistCount + * Gets the public gist count. + * + * @return the public gist count */ public int getPublicGistCount() { return publicGistCount; } + /** - * @param publicGistCount the publicGistCount to set + * Sets the public gist count. + * + * @param publicGistCount + * the new public gist count */ public void setPublicGistCount(int publicGistCount) { this.publicGistCount = publicGistCount; } + /** - * @return the publicRepoCount + * Gets the public repo count. + * + * @return the public repo count */ public int getPublicRepoCount() { return publicRepoCount; } + /** - * @param publicRepoCount the publicRepoCount to set + * Sets the public repo count. + * + * @param publicRepoCount + * the new public repo count */ public void setPublicRepoCount(int publicRepoCount) { this.publicRepoCount = publicRepoCount; } + /** - * @return the totalPrivateRepoCount + * Gets the total private repo count. + * + * @return the total private repo count */ public int getTotalPrivateRepoCount() { return totalPrivateRepoCount; } + /** - * @param totalPrivateRepoCount the totalPrivateRepoCount to set + * Sets the total private repo count. + * + * @param totalPrivateRepoCount + * the new total private repo count */ public void setTotalPrivateRepoCount(int totalPrivateRepoCount) { this.totalPrivateRepoCount = totalPrivateRepoCount; } + /** + * Gets the collaborators. + * * @return the collaborators */ public int getCollaborators() { return collaborators; } + /** - * @param collaborators the collaborators to set + * Sets the collaborators. + * + * @param collaborators + * the new collaborators */ public void setCollaborators(int collaborators) { this.collaborators = collaborators; } + /** - * @return the diskUsage + * Gets the disk usage. + * + * @return the disk usage */ public int getDiskUsage() { return diskUsage; } + /** - * @param diskUsage the diskUsage to set + * Sets the disk usage. + * + * @param diskUsage + * the new disk usage */ public void setDiskUsage(int diskUsage) { this.diskUsage = diskUsage; } + /** - * @return the ownedPrivateRepoCount + * Gets the owned private repo count. + * + * @return the owned private repo count */ public int getOwnedPrivateRepoCount() { return ownedPrivateRepoCount; } + /** - * @param ownedPrivateRepoCount the ownedPrivateRepoCount to set + * Sets the owned private repo count. + * + * @param ownedPrivateRepoCount + * the new owned private repo count */ public void setOwnedPrivateRepoCount(int ownedPrivateRepoCount) { this.ownedPrivateRepoCount = ownedPrivateRepoCount; } + /** - * @return the privateGistCount + * Gets the private gist count. + * + * @return the private gist count */ public int getPrivateGistCount() { return privateGistCount; } + /** - * @param privateGistCount the privateGistCount to set + * Sets the private gist count. + * + * @param privateGistCount + * the new private gist count */ public void setPrivateGistCount(int privateGistCount) { this.privateGistCount = privateGistCount; } + /** + * Gets the plan. + * * @return the plan */ public Plan getPlan() { return plan; } + /** - * @param plan the plan to set + * Sets the plan. + * + * @param plan + * the new plan */ public void setPlan(Plan plan) { this.plan = plan; } + /** - * @return the createdAt + * Gets the created at. + * + * @return the created at */ public Date getCreatedAt() { return createdAt; } + /** - * @param createdAt the createdAt to set + * Sets the created at. + * + * @param createdAt + * the new created at */ public void setCreatedAt(Date createdAt) { this.createdAt = createdAt; } + /** - * @return the gravatarId + * Gets the gravatar id. + * + * @return the gravatar id */ public String getGravatarId() { return gravatarId; } + /** - * @param gravatarId the gravatarId to set + * Sets the gravatar id. + * + * @param gravatarId + * the new gravatar id */ public void setGravatarId(String gravatarId) { this.gravatarId = gravatarId; diff --git a/schema/src/main/java/com/github/api/v2/schema/ValueEnum.java b/schema/src/main/java/com/github/api/v2/schema/ValueEnum.java index cc67513..8a3656a 100644 --- a/schema/src/main/java/com/github/api/v2/schema/ValueEnum.java +++ b/schema/src/main/java/com/github/api/v2/schema/ValueEnum.java @@ -1,3 +1,6 @@ +/* + * + */ package com.github.api.v2.schema; /** From 658e7455219d5a32a948ef8e7841f08baa816c02 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Wed, 14 Jul 2010 18:12:12 +0500 Subject: [PATCH 04/95] Misc. refactorings. --- build.xml | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 1 deletion(-) diff --git a/build.xml b/build.xml index a697467..5d8e6d0 100644 --- a/build.xml +++ b/build.xml @@ -13,7 +13,6 @@ - @@ -86,6 +85,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 95d2c2f4147b690e9fdcf923fd556a76a46032ce Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Wed, 14 Jul 2010 21:51:29 +0500 Subject: [PATCH 05/95] Archiving Method --- .../api/v2/services/RepositoryService.java | 3 +++ .../v2/services/constant/GitHubApiUrls.java | 3 +++ .../services/impl/RepositoryServiceImpl.java | 8 ++++++++ .../constant/GitHubApiUrls.properties | 1 + .../services/example/RepositoryApiSample.java | 9 ++++++++- github-api.txt | 9 +++++++-- .../java/com/github/api/v2/schema/Gist.java | 19 ++++++++++++++++++- 7 files changed, 48 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/RepositoryService.java b/core/src/main/java/com/github/api/v2/services/RepositoryService.java index 277b098..dfe2938 100644 --- a/core/src/main/java/com/github/api/v2/services/RepositoryService.java +++ b/core/src/main/java/com/github/api/v2/services/RepositoryService.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; +import java.util.zip.ZipInputStream; import com.github.api.v2.schema.Key; import com.github.api.v2.schema.Language; @@ -303,4 +304,6 @@ public interface RepositoryService extends GitHubService { * @return the branches */ public Map getBranches(String userName, String repositoryName); + + public ZipInputStream getRepositoryArchive(String userName, String repositoryName); } diff --git a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java index 9e49fd0..79a8328 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java +++ b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java @@ -246,6 +246,9 @@ public static interface RepositoryApiUrls { /** The Constant GET_BRANCHES_URL. */ public static final String GET_BRANCHES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getBranches"); + + /** The Constant GET_REPOSITORY_ARCHIVE_URL. */ + public static final String GET_REPOSITORY_ARCHIVE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getRepositoryArchive"); } /** diff --git a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java index f981a9f..bf33933 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java @@ -6,6 +6,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.zip.ZipInputStream; import com.github.api.v2.schema.Key; import com.github.api.v2.schema.Language; @@ -350,6 +351,13 @@ public void watchRepository(String userName, String repositoryName) { unmarshall(callApiPost(apiUrl, new HashMap())); } + @Override + public ZipInputStream getRepositoryArchive(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_REPOSITORY_ARCHIVE_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + return new ZipInputStream(callApiGet(apiUrl)); + } + /* (non-Javadoc) * @see com.github.api.v2.services.impl.BaseGitHubService#getGsonBuilder() */ diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index 420d705..1cc5a02 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -71,6 +71,7 @@ com.github.api.v2.services.repositoryService.getForks=http://github.com/api/{ver com.github.api.v2.services.repositoryService.getLanguageBreakdown=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/languages com.github.api.v2.services.repositoryService.getTags=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/tags com.github.api.v2.services.repositoryService.getBranches=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/branches +com.github.api.v2.services.repositoryService.getRepositoryArchive=http://github.com/{userName}/{repositoryName}/zipball/master # Commit API com.github.api.v2.services.commitService.getCommits=http://github.com/api/{version}/{format}/commits/list/{userName}/{repositoryName}/{branch} diff --git a/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java b/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java index 00dc36b..3316201 100644 --- a/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java @@ -5,6 +5,8 @@ import java.util.List; import java.util.Map; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; import com.github.api.v2.schema.Language; import com.github.api.v2.schema.Repository; @@ -24,7 +26,7 @@ public class RepositoryApiSample { * @param args * the arguments */ - public static void main(String[] args) { + public static void main(String[] args) throws Exception { GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); RepositoryService service = factory.createRepositoryService(); List repositories = service.searchRepositories("hadoop"); @@ -36,6 +38,11 @@ public static void main(String[] args) { service.setAuthentication(new OAuthAuthentication(TestConstants.TEST_ACCESS_TOKEN)); List pushableRepositories = service.getPushableRepositories(); System.out.println(pushableRepositories.size()); + ZipInputStream zip = service.getRepositoryArchive("nabeelmukhtar", "github-java-sdk"); + ZipEntry entry = null; + while ((entry = zip.getNextEntry()) != null) { + System.out.println(entry.getName()); + } } /** diff --git a/github-api.txt b/github-api.txt index 8e08093..a9a9b98 100644 --- a/github-api.txt +++ b/github-api.txt @@ -9,5 +9,10 @@ http://github.com/account/applications/61 githubapitest Commit class is not complete. -Network and commit should be separate. -X. Remove commons cli. \ No newline at end of file +1. Network and commit should be separate. +X. 2. Remove commons cli. +3. Add Feed methods using atom. +4. Update rrpo and user methods need to be fixed. +5. Gist and repo visibility. +6. Network Meta is not complete. +7. Fix Network API. \ No newline at end of file diff --git a/schema/src/main/java/com/github/api/v2/schema/Gist.java b/schema/src/main/java/com/github/api/v2/schema/Gist.java index 2d3ecce..9baf25e 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Gist.java +++ b/schema/src/main/java/com/github/api/v2/schema/Gist.java @@ -31,6 +31,8 @@ public class Gist extends SchemaEntity { /** The files. */ private List files; + private String owner; + /** * Gets the description. * @@ -125,6 +127,21 @@ public List getFiles() { public void setFiles(List files) { this.files = files; } + + /** + * @return the owner + */ + public String getOwner() { + return owner; + } + + /** + * @param owner the owner to set + */ + public void setOwner(String owner) { + this.owner = owner; + } + /* (non-Javadoc) * @see java.lang.Object#toString() */ @@ -132,6 +149,6 @@ public void setFiles(List files) { public String toString() { return "Gist [createdAt=" + createdAt + ", description=" + description + ", files=" + files + ", repo=" + repo + ", visibility=" - + visibility + "]"; + + visibility + ", owner=" + owner + "]"; } } From 45a0ea95d8c5d8ac8ef0a3f49a52dfd9772a8b24 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Thu, 15 Jul 2010 14:09:43 +0500 Subject: [PATCH 06/95] Feed Methods. --- .classpath | 2 + core/pom.xml | 12 ++ .../github/api/v2/services/FeedService.java | 20 +++ .../api/v2/services/GitHubServiceFactory.java | 6 + .../v2/services/constant/GitHubApiUrls.java | 23 ++++ .../v2/services/impl/BaseGitHubService.java | 3 - .../api/v2/services/impl/FeedServiceImpl.java | 129 ++++++++++++++++++ .../services/impl/RepositoryServiceImpl.java | 2 +- .../constant/GitHubApiUrls.properties | 11 +- .../com/github/api/v2/services/AllTests.java | 1 + .../api/v2/services/FeedServiceTest.java | 75 ++++++++++ .../api/v2/services/ObjectServiceTest.java | 6 - .../api/v2/services/example/FeedSample.java | 39 ++++++ .../services/example/RepositoryApiSample.java | 5 - github-api.txt | 14 +- lib/jdom-1.0.jar | Bin 0 -> 153253 bytes lib/rome-1.0.jar | Bin 0 -> 219671 bytes .../java/com/github/api/v2/schema/Feed.java | 81 +++++++++++ .../com/github/api/v2/schema/FeedEntry.java | 105 ++++++++++++++ 19 files changed, 516 insertions(+), 18 deletions(-) create mode 100644 core/src/main/java/com/github/api/v2/services/FeedService.java create mode 100644 core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java create mode 100644 core/src/test/java/com/github/api/v2/services/FeedServiceTest.java create mode 100644 examples/src/java/com/github/api/v2/services/example/FeedSample.java create mode 100644 lib/jdom-1.0.jar create mode 100644 lib/rome-1.0.jar create mode 100644 schema/src/main/java/com/github/api/v2/schema/Feed.java create mode 100644 schema/src/main/java/com/github/api/v2/schema/FeedEntry.java diff --git a/.classpath b/.classpath index 094e399..6f655b3 100644 --- a/.classpath +++ b/.classpath @@ -10,5 +10,7 @@ + + diff --git a/core/pom.xml b/core/pom.xml index 1fc4280..2a28bb7 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -28,6 +28,18 @@ 1.4 compile + + rome + rome + 0.9 + compile + + + jdom + jdom + 1.1 + compile + com.github.api.v2 github-java-schema diff --git a/core/src/main/java/com/github/api/v2/services/FeedService.java b/core/src/main/java/com/github/api/v2/services/FeedService.java new file mode 100644 index 0000000..18cd4a8 --- /dev/null +++ b/core/src/main/java/com/github/api/v2/services/FeedService.java @@ -0,0 +1,20 @@ +/** + * + */ +package com.github.api.v2.services; + +import com.github.api.v2.schema.Feed; + + +/** + * The Interface FeedService. + */ +public interface FeedService extends GitHubService { + + public Feed getPublicUserFeed(String userName); + public Feed getPrivateUserFeed(String userName); + public Feed getCommitFeed(String userName, String repositoryName); + public Feed getNetworkFeed(String userName, String repositoryName); + public Feed getWikiFeed(String userName, String repositoryName); + public Feed getPublicTimelineFeed(); +} diff --git a/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java b/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java index f2ca644..e94707c 100644 --- a/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java +++ b/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java @@ -4,6 +4,7 @@ package com.github.api.v2.services; import com.github.api.v2.services.impl.CommitServiceImpl; +import com.github.api.v2.services.impl.FeedServiceImpl; import com.github.api.v2.services.impl.GistServiceImpl; import com.github.api.v2.services.impl.IssueServiceImpl; import com.github.api.v2.services.impl.NetworkServiceImpl; @@ -111,4 +112,9 @@ public UserService createUserService() { public OAuthService createOAuthService(String clientId, String secret) { return new OAuthServiceImpl(clientId, secret); } + + public FeedService createFeedService() { + return new FeedServiceImpl(); + } + } diff --git a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java index 79a8328..7d0f7e5 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java +++ b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java @@ -284,6 +284,29 @@ public static interface ObjectApiUrls { public static final String GET_OBJECT_CONTENT_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.objectService.getObjectContent"); } + /** + * The Interface ObjectApiUrls. + */ + public static interface FeedUrls { + /** The Constant GET_PUBLIC_USER_FEED_URL. */ + public static final String GET_PUBLIC_USER_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getPublicUserFeed"); + + /** The Constant GET_PRIVATE_USER_FEED_URL. */ + public static final String GET_PRIVATE_USER_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getPrivateUserFeed"); + + /** The Constant GET_COMMIT_FEED_URL. */ + public static final String GET_COMMIT_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getCommitFeed"); + + /** The Constant GET_NETWORK_FEED_URL. */ + public static final String GET_NETWORK_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getNetworkFeed"); + + /** The Constant GET_WIKI_FEED_URL. */ + public static final String GET_WIKI_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getWikiFeed"); + + /** The Constant GET_PUBLIC_TIMELINE_FEED_URL. */ + public static final String GET_PUBLIC_TIMELINE_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getPublicTimelineFeed"); + } + /** * Instantiates a new git hub api urls. */ diff --git a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java index 6604143..7187669 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java +++ b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java @@ -35,9 +35,6 @@ */ public abstract class BaseGitHubService extends GitHubApiGateway implements GitHubService { - /** The api url builder. */ - protected GitHubApiUrlBuilder apiUrlBuilder; - /** The parser. */ private final JsonParser parser = new JsonParser(); diff --git a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java new file mode 100644 index 0000000..a4baac8 --- /dev/null +++ b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java @@ -0,0 +1,129 @@ +/** + * + */ +package com.github.api.v2.services.impl; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +import org.xml.sax.InputSource; + +import com.github.api.v2.schema.Feed; +import com.github.api.v2.schema.FeedEntry; +import com.github.api.v2.schema.Repository; +import com.github.api.v2.services.FeedService; +import com.github.api.v2.services.GitHubException; +import com.github.api.v2.services.constant.GitHubApiUrls; +import com.github.api.v2.services.constant.ParameterNames; +import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; +import com.sun.syndication.feed.synd.SyndContent; +import com.sun.syndication.feed.synd.SyndEntry; +import com.sun.syndication.feed.synd.SyndFeed; +import com.sun.syndication.io.SyndFeedInput; + +/** + * The Class NetworkServiceImpl. + */ +public class FeedServiceImpl extends GitHubApiGateway implements + FeedService { + + public FeedServiceImpl() { + // by default we compress contents + requestHeaders.put("Accept-Encoding", "gzip, deflate"); + } + + @Override + public Feed getCommitFeed(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_COMMIT_FEED_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, Repository.MASTER).buildUrl(); + return unmarshall(callApiGet(apiUrl)); + } + + @Override + public Feed getNetworkFeed(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_NETWORK_FEED_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + return unmarshall(callApiGet(apiUrl)); + } + + @Override + public Feed getPrivateUserFeed(String userName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_PRIVATE_USER_FEED_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); + return unmarshall(callApiGet(apiUrl)); + } + + @Override + public Feed getPublicTimelineFeed() { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_PUBLIC_TIMELINE_FEED_URL); + String apiUrl = builder.buildUrl(); + return unmarshall(callApiGet(apiUrl)); + } + + @Override + public Feed getPublicUserFeed(String userName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_PUBLIC_USER_FEED_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); + return unmarshall(callApiGet(apiUrl)); + } + + @Override + public Feed getWikiFeed(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_WIKI_FEED_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + return unmarshall(callApiGet(apiUrl)); + } + + protected Feed unmarshall(InputStream is) { + try { + final SyndFeedInput input = new SyndFeedInput(); + final SyndFeed feed = input.build(new InputSource(is)); + return populateFeed(feed); + } catch (Exception e) { + throw new GitHubException("Error while fetching feed.", e); + } + } + + @SuppressWarnings("unchecked") + private Feed populateFeed(SyndFeed feed) { + Feed retVal = new Feed(); + retVal.setAuthor(feed.getAuthor()); + retVal.setDescription(feed.getDescription()); + retVal.setLink(feed.getLink()); + retVal.setTitle(feed.getTitle()); + List entries = new ArrayList(feed.getEntries().size()); + retVal.setEntries(entries); + + for (SyndEntry entry : (List) feed.getEntries()) { + FeedEntry feedEntry = new FeedEntry(); + feedEntry.setAuthor(entry.getAuthor()); +// feedEntry.setCategories(entry.getCategories()); + if (entry.getContents() != null) { + StringBuilder builder = new StringBuilder(); + for (SyndContent content : (List) entry.getContents()) { + builder.append(content.getValue()); + } + feedEntry.setContent(builder.toString()); + } + feedEntry.setLink(entry.getLink()); + feedEntry.setPublishedDate(entry.getPublishedDate()); + feedEntry.setTitle(entry.getTitle()); + + entries.add(feedEntry); + } + return retVal; + } + + /** + * Creates the git hub api url builder. + * + * @param urlFormat + * the url format + * + * @return the git hub api url builder + */ + protected GitHubApiUrlBuilder createGitHubApiUrlBuilder(String urlFormat) { + return new GitHubApiUrlBuilder(urlFormat); + } +} diff --git a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java index bf33933..7f5c230 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java @@ -354,7 +354,7 @@ public void watchRepository(String userName, String repositoryName) { @Override public ZipInputStream getRepositoryArchive(String userName, String repositoryName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_REPOSITORY_ARCHIVE_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, Repository.MASTER).buildUrl(); return new ZipInputStream(callApiGet(apiUrl)); } diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index 1cc5a02..7094778 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -71,7 +71,7 @@ com.github.api.v2.services.repositoryService.getForks=http://github.com/api/{ver com.github.api.v2.services.repositoryService.getLanguageBreakdown=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/languages com.github.api.v2.services.repositoryService.getTags=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/tags com.github.api.v2.services.repositoryService.getBranches=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/branches -com.github.api.v2.services.repositoryService.getRepositoryArchive=http://github.com/{userName}/{repositoryName}/zipball/master +com.github.api.v2.services.repositoryService.getRepositoryArchive=http://github.com/{userName}/{repositoryName}/zipball/{branch} # Commit API com.github.api.v2.services.commitService.getCommits=http://github.com/api/{version}/{format}/commits/list/{userName}/{repositoryName}/{branch} @@ -83,3 +83,12 @@ com.github.api.v2.services.objectService.getTree=http://github.com/api/{version} com.github.api.v2.services.objectService.getBlob=http://github.com/api/{version}/{format}/blob/show/{userName}/{repositoryName}/{sha}/{filePath} com.github.api.v2.services.objectService.getBlobs=http://github.com/api/{version}/{format}/blob/full/{userName}/{repositoryName}/{sha} com.github.api.v2.services.objectService.getObjectContent=http://github.com/api/{version}/{format}/blob/show/{userName}/{repositoryName}/{sha} + +# Feed +com.github.api.v2.services.feedService.getPublicUserFeed=http://github.com/{userName}.atom +com.github.api.v2.services.feedService.getPrivateUserFeed=https://github.com/{userName}.private.atom +com.github.api.v2.services.feedService.getCommitFeed=http://github.com/{userName}/{repositoryName}/commits/{branch}.atom +com.github.api.v2.services.feedService.getNetworkFeed=http://github.com/{userName}/{repositoryName}/network/feed +com.github.api.v2.services.feedService.getWikiFeed=http://wiki.github.com/{userName}/{repositoryName}/wikis.atom +com.github.api.v2.services.feedService.getPublicTimelineFeed=http://github.com/timeline.atom + diff --git a/core/src/test/java/com/github/api/v2/services/AllTests.java b/core/src/test/java/com/github/api/v2/services/AllTests.java index e05678e..ec9803d 100644 --- a/core/src/test/java/com/github/api/v2/services/AllTests.java +++ b/core/src/test/java/com/github/api/v2/services/AllTests.java @@ -27,6 +27,7 @@ public static Test suite() { suite.addTestSuite(NetworkServiceTest.class); suite.addTestSuite(UserServiceTest.class); suite.addTestSuite(GistServiceTest.class); + suite.addTestSuite(FeedServiceTest.class); //$JUnit-END$ return suite; } diff --git a/core/src/test/java/com/github/api/v2/services/FeedServiceTest.java b/core/src/test/java/com/github/api/v2/services/FeedServiceTest.java new file mode 100644 index 0000000..1dee5ff --- /dev/null +++ b/core/src/test/java/com/github/api/v2/services/FeedServiceTest.java @@ -0,0 +1,75 @@ +package com.github.api.v2.services; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.api.v2.schema.Feed; +import com.github.api.v2.services.constant.TestConstants; + +public class FeedServiceTest extends BaseGitHubServiceTest { + private FeedService service; + + @Before + public void setUp() throws Exception { + super.setUp(); + service = factory.createFeedService(); + service.setAuthentication(authentication); + } + + @After + public void tearDown() throws Exception { + super.tearDown(); + service = null; + } + + @Test + public void testGetCommitFeed() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + Feed feed = service.getCommitFeed(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertNotNull("Feed cannot be null.", feed); + assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); + } + + @Test + public void testGetNetworkFeed() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + Feed feed = service.getNetworkFeed(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertNotNull("Feed cannot be null.", feed); + assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); + } + + @Test + public void testGetPrivateUserFeed() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + Feed feed = service.getPrivateUserFeed(TestConstants.TEST_USER_NAME); + assertNotNull("Feed cannot be null.", feed); + assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); + } + + @Test + public void testGetPublicTimelineFeed() { + Feed feed = service.getPublicTimelineFeed(); + assertNotNull("Feed cannot be null.", feed); + assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); + } + + @Test + public void testGetPublicUserFeed() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + Feed feed = service.getPublicUserFeed(TestConstants.TEST_USER_NAME); + assertNotNull("Feed cannot be null.", feed); + assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); + } + + @Test + public void testGetWikiFeed() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + Feed feed = service.getWikiFeed(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertNotNull("Feed cannot be null.", feed); + assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); + } +} diff --git a/core/src/test/java/com/github/api/v2/services/ObjectServiceTest.java b/core/src/test/java/com/github/api/v2/services/ObjectServiceTest.java index e628694..0a98ec1 100644 --- a/core/src/test/java/com/github/api/v2/services/ObjectServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/ObjectServiceTest.java @@ -22,9 +22,6 @@ public class ObjectServiceTest extends BaseGitHubServiceTest { /** The service. */ private ObjectService service; - /* (non-Javadoc) - * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() - */ @Before public void setUp() throws Exception { super.setUp(); @@ -32,9 +29,6 @@ public void setUp() throws Exception { service.setAuthentication(authentication); } - /* (non-Javadoc) - * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() - */ @After public void tearDown() throws Exception { super.tearDown(); diff --git a/examples/src/java/com/github/api/v2/services/example/FeedSample.java b/examples/src/java/com/github/api/v2/services/example/FeedSample.java new file mode 100644 index 0000000..84db31f --- /dev/null +++ b/examples/src/java/com/github/api/v2/services/example/FeedSample.java @@ -0,0 +1,39 @@ +/** + * + */ +package com.github.api.v2.services.example; + +import com.github.api.v2.schema.Feed; +import com.github.api.v2.schema.FeedEntry; +import com.github.api.v2.services.FeedService; +import com.github.api.v2.services.GitHubServiceFactory; + +/** + * The Class ObjectApiSample. + */ +public class FeedSample { + + /** + * The main method. + * + * @param args + * the arguments + */ + public static void main(String[] args) { + GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); + FeedService service = factory.createFeedService(); + Feed feed = service.getPublicUserFeed("apache"); + printResult(feed); + } + + private static void printResult(Feed feed) { + if (feed != null) { + System.out.println(feed.getAuthor()); + System.out.println(feed.getLink()); + System.out.println(feed.getDescription()); + for (FeedEntry entry : feed.getEntries()) { + System.out.println(entry); + } + } + } +} diff --git a/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java b/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java index 3316201..54ef472 100644 --- a/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java @@ -12,8 +12,6 @@ import com.github.api.v2.schema.Repository; import com.github.api.v2.services.GitHubServiceFactory; import com.github.api.v2.services.RepositoryService; -import com.github.api.v2.services.auth.OAuthAuthentication; -import com.github.api.v2.services.constant.TestConstants; /** * The Class RepositoryApiSample. @@ -35,9 +33,6 @@ public static void main(String[] args) throws Exception { } Map breakDown = service.getLanguageBreakdown("facebook", "tornado"); System.out.println(breakDown); - service.setAuthentication(new OAuthAuthentication(TestConstants.TEST_ACCESS_TOKEN)); - List pushableRepositories = service.getPushableRepositories(); - System.out.println(pushableRepositories.size()); ZipInputStream zip = service.getRepositoryArchive("nabeelmukhtar", "github-java-sdk"); ZipEntry entry = null; while ((entry = zip.getNextEntry()) != null) { diff --git a/github-api.txt b/github-api.txt index a9a9b98..a2f588a 100644 --- a/github-api.txt +++ b/github-api.txt @@ -7,12 +7,22 @@ http://support.github.com/discussions/api/28-oauth2-busy-developers-guide http://github.com/account/applications/59 http://github.com/account/applications/61 githubapitest +http://ajax.googleapis.com/ajax/services/feed/load?&q=http://github.com/apache.atom&v=1.0 Commit class is not complete. 1. Network and commit should be separate. X. 2. Remove commons cli. -3. Add Feed methods using atom. +X. 3. Add Feed methods using atom. 4. Update rrpo and user methods need to be fixed. 5. Gist and repo visibility. 6. Network Meta is not complete. -7. Fix Network API. \ No newline at end of file +7. Fix Network API. + +Feeds +https://github.com/nabeelmukhtar.private.atom?token=5c74e74601432623f1ee9c26b3d31d81 +http://github.com/apache.atom +http://github.com/nabeelmukhtar/github-java-sdk/commits/master.atom +http://github.com/apache/cassandra/network/feed +http://wiki.github.com/apache/cassandra/wikis.atom +http://feeds.feedburner.com/thechangelog +http://github.com/timeline. \ No newline at end of file diff --git a/lib/jdom-1.0.jar b/lib/jdom-1.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..288e64cb5c435f34499a58b234c2106f9d9f0783 GIT binary patch literal 153253 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

_4s+#N=7*_ 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�s*dMq>JLX-P3 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 z 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 Y`CYb)y=1%oI@n19M~1g#Z8m literal 0 HcmV?d00001 diff --git a/lib/rome-1.0.jar b/lib/rome-1.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..7138baaca14c7f239dd32aa2a92847863dd3f065 GIT binary patch literal 219671 zcma&N19W8Fx-J~swr$(CZKGq`wmP=$bZpz`xRZ))ck=h%`<(lq{oQfCeQQ*$nrn;~ zb5^bSyqrq1pkOdS|9CY^*z){y@Lw0`Ki~4=YQpr=3KEP;|3wA`)bxj}pK7#L2@D9x z2>}QQ?SGQV3oA%Vh^wkG$V=2}$UAIuA@NTIehm?oyBkl%H$&?{a+BG?ltgY4O+4w$ zFLGIkBtb}X-p{+gDu;ub#c5}fC;en3J1_;pSdH`A*>1AZ*ksVuX#g_%#0FrF8l_HYVKJKE#n=X&j}`8JiwRRoH*NToq?XMQqZ+ z7EBev^s#=nd24~NYGW|87=62nlgb+gMIdI@zHr9x3R5sA;loB%L|WovwXVBi^Ee5& zghX$2hh0r($*xqupB*^uF7R|0nnt8?4!xH#@2_6aP1P?%oplGt<@7Wqq}!uQI(Ooz zsX;f%$ptYs?K_4l-|-T5E%%XS8k9CY*As2KI#>z)60itu-nF-WDg)WG&9b`?{m4kp znfOijeEws(d#f(AEpttS;GkIthx|h)*s%&~Fx%DxS#4|77ur%Y0|&r7OSAAPdlB&H z60%&!O`e0Vpbyc#v-g#rFRO_(>!2}MU-vU;2t@uOIlRW?i!Dl-eWCg;wE1*i2LI;n zl`4wc?e&XXwGow3cY5E$%|VHirZE1519^ke(ve|Y zSwA;duYjGNx2MwbgAAW)1$1{o>bcj3yQzoN^zqdk4QW7G(hkQy0ICk%QJA}EHI4L}NW}8NF=*%*apB3=E#WFNH9}PWq zs5sh)o&CZQhuHzsae4`MCF(DPWDRnO_Dz^j!OHj7Q4AW+mV`-W% zbSCnm{YGsz`szmG_-g&6O3@v&w^L#w3`CR+W|_y9Vvb6FG|IE8SXF$YFZlWM8pscE z$V14`9+WU)@NN!)mod~7>3P>9c)`^Xt#vSXj@v^DP&+Yhl3T$ijw#N!S~ETy>UPlX zcnQp|GwGuXwxWo9G$zwIds_gXEtJ7Pe9&t%3kTxrmhp@p?TI`Z}wkbk)AG%*4|BXOEK$U+1sy{#kWa?n|e=zF* zrhxh{3Kuu~|3Ov#7dihxvVX|=2bGJLy_vPCv8%Pi-*I67FB}%;=4OARh~V$oj9ve2 zDSw^h-||}9IokdYy)}PXAkp9HwR13Yvo-%8+<(VD0cXTJipOrhiih1@w=f>0QBLS`ZWnXao`n zi0*&k{O4o!&*wwb*wx(9!P$$!)YjO=B~De^VMz$>vrK-UtexI2tLa*45sm46M+90a ztwkIReV~+UBC*~1!h|95vcUYIME zlH-fB5B54;xDn?Wdu#j6#jSLW?TXVpW8Dqa+4HOg9i|_dXMFWu`&Z=Q2RUQ87(+r{ z1_5<8W%leX(Z^UCAqc75ZL0_Lv-6ai&mA_|b6&Z`?3QQh_KW*X#@IVtq8`R(X~fD+ z=O9WPbOPJ<>K*q&^;vq|Mr*Dv8Xjwr_Y>63NoEzxUKgpP<5HD;^PB@ zQV|D4lsvOLp2`4NkSiLh6rRtT+Uy6h-iD{Qant?g9tsZ)Od>N`PPaB}GO_jTvOr77 zl_(e}n>2gJdOS6X%kU}n`l+rW9ck@hxI&tyRcsIQTpfF%04zOgVTTsV-*G?E(W3cp zbZgqDs>SB-ZAa{R+5MN0a!<7DZkdVIMmTKCdu?5l)#QwI0xi_wh{{bEpDMW`MQLEL zl$D1oqHD*iu}~~xm_o)`;Tπj)V_jmK+4WlX4olW-o2!)w*K;d)64DZ z7Y(!;@DtXCGNCs#S=`boDB7w9{1e}J^|Vl9v1_z1iUV2_KDTF1B$N5n!~EYFl73uA zlZOAqAS&(my1e1vRgmPa{ zfDil`$A6G{0=bP*LTODoyEt+!#X$VXejxpN+l>FxGJIXmD4YcPpsZTj%{=IqGzV3- zKu%>yqJ}E4qU0#861BpF@J?dIMy4*N#xu!=P8uCm89ioMB+VZ?LI{1EHB1Se9~YeO z8kj=-LKQE4(_SN5#nl;kA!FF&zf3gkD@m+kOsw)?yA$x@S(7NQOsr6ohv^PMpC*mAQAnF^?N(ou184*tSTR_Zhjus zi>R&N?8xyl>dYyru|RFgl2_&uIHAj};D1||e{ICyv7T4=e@u$kAFr79KW{__dslON z*Z~Q4W6hqL9QF44Twe?HUSEItzoYh3`w|Ev z9*OH&K1hH8cdtiUI;A+Z{d5TWy<;L6hTU|L9z%qf>J%eSWh5O+VZt4(F)izvt*kGS zq)Z-+fpt+b;ZKg-MtWi~HaWeNY$RI|sfFw$Ib0RV4!jtgsZXGZF4`}|Vu@j@F%qe5 zBVjN_-D-i;D6T#;)?y-^Fk_Lvk~1@FfP|#euqIO#*m}^^R5a{5LN%=7uFVQ#2FF-K z$_oNRD@3JHf!y=F-lfz3Z zBv-O;s)>q9XT313`g8u_LX3pGU_{!Wk)1zH#V*ZDi4lX|u7qZ4I zRoUrHlv{!zRR>M9TozXe4}$AHgPlj(PM@(dy3?b+;EcIJ5!XLYO zP$YfVraoSl#j$CA_|iBnn!wv;Vrt`so<1VoW%Y0@U!^nN(Y zNYB7>-Kw2a7OZrUfo#}Rap}ri*7LS&u%5=x_nvQT*ScwHPEfX+VY+1jszeifM5Z&` zt5j$*&2?wi*u&{X^)%@=j-KqM#!_2+dKU0y@=NDzX-#c%vu#6CSGbJp6jxql>%PR_f=j%@1UelUx{>c-k?hQpAl8UK51`#*BF>xE8oUeuh0iJ3L^RzrQJ}|2C})i2NWmIQDUyEv&k)Zr|rg==6g^ zgcA@c;Yf#C^A{E{TxBQGvlGLT?u7#>^9y403i3UKH7kQT5P**=jYJd>4uv53iY!PZ zD?GGhLlhXz1L_@Zly8}KD01@$_1WB5T~L7B+~hfFi=Tye{XJ4;Ri(ZlUK!{xAM0Qp z)K^>?pon`TsxN-~P26d^6J7tY)+)cP2(lNw=V*7sZ)f#WK_K8_abr!Nh}w|oy+&?1#cVYyUh&r!@?uzcA}e`Qd7F zG1crbuSq_+XP;1lW@YaThU7;aN%rTzVCQ4SD`V83yumvT5D@i$#7=R0*Z=llO4EIO z(KOM=0-D#i*KH}Fp~=uhKth2gAbz$Meb=N364sVEv`?01X-IIjYzuGIv9q&N zuW^v|OK;VZwHZK>SqQEtc}aV#QrVU9)BU|vbv(V5d$F_in=C&e;KFZ)``CXj*JXB_ z`zzlv58RR40KpVH{`3XpSut#H=+-%uX|x#C7>B<29(s(%tgqjlKTW#rH^q^l5wX8sQ2wv-t?mMVCGiJeEEGfdEs4VEOIW<&*-L7?p$*i?qMy%N z_U-p@DUSdi>>nsd&<2Z4a01@6B{wS&tGaQIAfW%SxL) zoc=C+S&`-8MVn37wCo3b3CB%Cr?IuhS?_%5KTsCzr)C$ICba^1#EbkoYDiU(i?^o> zT}N50HLm#BRkd-_M{0oK_kK#%F&eKA9SJq|z?VooJ!p;M;8=L^Ta>$G`VW4izEt3o zRpeM42mawQVaC^NIJ7U##-mT80yEmA!C~CwZf_Qd1y#+1p=dTE7j3bv@hu;q&ckbK zFT-7a>1krgXL_qg_trdwk*UiSMXK-m^ga zi+#f(zM-xbz!_?>^F4-g++Y7(?6#HPZ0@#=i-gancYusLmAM&*Eg2qu?9zCR`_7e> z-fYSKVVn=Z%x-4U7UR;^V~iY|c$fkksfjjg;}-YLigZfVZ^F1shNYJ9`aaawqN*|GtO$Ue`ojC9%>E}s#)*MM zx(^G^Y6VG)D^~|cQ5{FFhBkxg!a~Y`%~(u=~&;kNS5}fw~W_jQS+H26?p! z@f3>CiWFPw`WDY7Ge_4KdWid#j5%A$UbVYSFVyYo0=&gs@MoY1*F8QxPw9pM{a4yZ zcyHA0uFSHe>Cycn-kH3Hk{XL)1L_rZy z&_drWWWJ${J9bE8U?Gx;?RQG{E;!R<-aBI3;CkX4)EBx{akd8S?t9cc_<(Bet3%Wc zX@DXcSBHbEw$sA##Y)0m^eccm^v6N$L}mmj)NtNF4xbEWs@SnPLi<5P3dsZ+|ZI2ULN%y`t09YPorX>!-ZpeZu2z(7)q~cFEps#QN5gVnhHU zLUx=p9K=GT1q{w0ItOUJU8JT|#Zg~eAd>h$2)h6-BQ~X`@)C~0$c=dvw%C6#+dEj6abmsK$eXAe`LRjk|vFvGs}W+r;MS!DTG}n6eKRPyM840{Sm@Pfwpl z#V}1;fHI144VXdjV)AXWOn0YAHxFjL!YFU;ux#b+nOV0>s7EiDfzGcus@t=e+cW)c zZ|v(}lxqrhgPvHAq#Faepmb!8Nydz|8mCPifCDnxJ%4Pfj0e z-3+kw38H$clwUIjSr|cj6hT%zAUYLb;}zqhzuU!uS!6*L%BY3yN9<@4wOPjLKr;0~ z4(MIqZ$=%|gQwGkvr>uLs)a44h%UjJO2Ec9|GZO);916<$;a`(B|>1E(FeJH2kKA_ z>=xCgIvyv={!Zjk344f#eZT{>*-YE zD;g&Ct4x}5+7i&waN+$fw$ol++g=llEhjJ!-zKZ2PMo~8gG(peSN$~l~60;!K2j+*|{1x#z z;4I^P&Kd}8_JsB@L2FF86}F5i-Fd^_)Q2u4W<4|o`tPK(Wm*OQ?9*r8s( z$(p?zAG?SSS>9GKJ!4IPRTyfwh6}i1JkoJTjo^5v=ZRHIFn0$+*x}3)HBB0B3QP$? zyj^H}BN2aP4M7onUcyjE{P$Q`3$xte z4FU*g90Lf5>OcB(5`VIu{|bal(`+2k#E}AhQe>a(o28{hOo&LrkI8}K(+g1gkwA(d zse*2hxHvmz%=ZY4JrJWvdVvY4f))EYgB?s$`CzI(3e(iIOFu{Q&jcUKOTXr?wmW*d zj9Z=6KTq>A&re@FEjyok``k}yfiht8X_%nn6FmjMI0s?L;%Sti87CcMACOVTtY68o z4K##;NZGu?hO5a8NN;(fP{|aMxy1M3Q5=#zV}>_jxyHrW=V$WhcrAlP&j&E!Pe$gqyH%sK0so35QF|!z$NWg z=Mp&?y?IPO&aqB_D{ig|wU^|tyWQj1Q`ZfX81Tgt-s(vzoxKZ3r^}YPTFdkEoZ4%= z;tn8;R&QwJ*V`9}u0lw-*k`B|z*O4<)HK&|+CtsCA2fycJ$&Oc^&9x1sXO9QdLyrd z(CKV0`JZpc7-L+yPRw{4I)104uF-ORUwU7^X#ARNbVbGgd}oWMt)a z;~eW=1EyN>M>NMA&bh^%4|P&uaF%9nVuWN)ryD+|oG9pPqnt7qIGJvTa(^wAcb5&T zlj(dxFnzCuM$?1yJ%u>tg%*+~(;>E!j*m0Dob@9`ljcUWPnGUgv^rB#PZpvV2a0Pn z%)FpeT|#6RE-BSqR`~l-C+r4&Psd<~%FmeG@7#8a(wVFta;=yQ41HHJjFx-#ZiIIFou3;uo_gvOwQx zLUO_@vS$kUsvKeINERvwMKWpz=}wgPM70GIsAl9%vRN!Fux4z_l?}Q2*WqPfi&RR4<()93|uyVv2&l8A*2@O9Cto7?pYa&7rHCl;k77!GxGi_Aa9TT}?nCTqe#$){Y;pyoisuqg5f2%;WBTd-- zLkl>xO(C)z15nA3Hwnna*ssL|RPyauMm~2S?(oB18xR|~F&q4d(VPM3qwU)v0o3n3 z4M}%61w4D;9Ey?Z%dqN4N2>R3{gL+VPyj18o|?$lmW15`;cePlU_bcA83##zk}w48 z5FB`H-A5pfYiNLNhQ`_AA>O4U9SAs);*N#r4e@`y1=?EL8AD#61ui=gsVG6AguIIr zx#2~sA)>2@sSDGUG!GHq@WEuFf77gm-n6(OQlh5#K(+a3f7v zqoq4*X|KTb>duYCydRiqC?devXGaIHcX-P44gzZgi zj+zzC5$5N04AHz!O4g*!-E%-U!Z zNtBee{U%5?b^Ir;I8LWf~H7f4*3EnDgl6f4zS`b^ucKBqI*N zC9!u7kQISzdv^r$@MN2s!Q=Gk$UMeG)Eg;|Y>td5Mh7ibpZ)kmq6!Z@A~Uq5 zc2QUO(;=>GRSAEF?R$DGJGxzSF>S)R-KwMKWli9)_u3*jochLDTGdHaW1$+pEGvhF z*BrgYIv7Tx&aTQML$Q$pE1RW(5T9WMaqVMLJ!_(odV4x3g4zz%szETQMBiYGT| z>Y9;}uiU?E$z*j07IJ%$e#PF4v*^55WssSleGm*JP6c<`YZ6^<-M``3tS?>`-6Jfm zqW8&Aed0KLn1yK*$i9`&)E|MVh9BmYezoy)u_iK$*no7QVqKY zQ{U&fbWCK#rcCwHou}-u!Gg&{v976ZgY9vTU(`8;t@!q%*K8P2Vf@{{8t%6>D3(|- zAGL^}bu8?!x14K9yrOPh2$9`g;t@< znB|gC)s|#_A_V}PSI}HwmDiHB&TWtDEpIZflpp+C$<~J)qQE6!ZYjNBn#zw&Dt||R zaAf@XR-qI>(om!pV@re7AZa&R(zN{`x#0L$8%&Z+1g|=Y6!ZtVIN*ISy-IvP2H4>C zR(ep@_$G$Hkp(E-aUF8*ou?$a)K03)C27kxo2lMAR0>?A#4+q>1Tim`Y>|*+UkpXL zDC!|1s+)2;0yI+YRjf_|C22@ZKmsK*o`NJI%9mvN7&KDvK1$Dnne_|k-?tAX#rPP^ zpHd9*pHj?!c0c8;?QQ|DY0JebKAJoVes`s#LXZCBex+BzHGQsbjMu}){l_KyeJIQoT$ zmn&}YQ}1$04s^6?-BEebHn^_ZweCFYwo}I~K|Rzu(`__*@Jeq*t=L<8x3J)xfN3P~ z%uY*h4Dgjs@{86rfkhR9E$ z*M)P|waB?!o}#uk7Gm92)An2ZT{R)CX*pd_8@=9GT1+2Ap#t zZNumDnodN`%7PnT*9iw)Lhx#}`LSR)xU90vOXEWPp2Wk5;3M;G$IP_fcqz{z90?sm zT^9vk+?^V!aploU=Pp-7$ux{ECYce%N%h>n4OI2mUc>M>9ph;W_oQs;#Ua1|FUipf2#v_F;gT#%q0+rE2k;~ zN8<`BpP=316k+;}y>YAE>Wq2D&?Fe9hb`#u4waw!0`pr1Ewhx6-4G_1QZLvyKGVV@ z>77{Q$AKz79D_8C!Az18hA=5vB}vhpa@h)&GK``jpFdsJ@}t%VEU`iQ3)^0basw7f zx#&%dr*tr;89qy@_Ss4SrNh}ocs*$qn^u;7PG4H7-gfqPA&CLqj8nK&Qy zCi!Xm_+DjPgm0~vY7Kw?%>r!ACi(o4snRP` zEh>5AnfLCZHv}hrzfF`nZ4hlYvR088=2M_m0CV4kM$DyCHX|3An|?B9Cl;Lr8Qqyt zV_c;>F{&a_5bFLIiWsvrvCWYhEg358;)|K&z`rJON(&*3>@*<^Z+GCcA`vq5)h9Hu z?G$xVq)Ol@HvstG@dOypHecWmp5Vd)0nz+NbF5_U?BZbmUjeO}yvwE-mjCyk$;A~4 zjVX6Y7*@~&P6aS_uX0c=1N78&y8AqdH^yc@xU{6Q!pXe!L+BPp;VyHId-DWF;U#d> zOgTmn?ROqnJNgqhga>93yRBTzfoqQEx3 z8plU8obdLmucKXC-D5KloY`C5^}j&TQ7bB6kO--*XkN5}3JXdL=!w@{bvBPPjAf}b zHx(40-&(J>TX-!tZ{){T>zP*@8UIjA`&{1AsqS=&BUj+F-_l}r*)gh?0gK&|VH%T8 zmM&!-dby}SMOE3%x8DXa9hz}zN!Z~BO}tC{!prB*7bID`#qI;raG^Ce%0-BvK3V3^FiI!lUadbq*Io9rlr>Hdiyw88$IVw-k5?mJ^Q}8f@SF(B9MDF9< zPn)LkA`fN1P@?q*W@b;^wU5dNoL_~ttG8}4x1kZ{$TDo=4X>{+xa#J37HVPM%tu)G zlvg}`qDDrS+~^H9=A30?8yWuVU>1 zkapLY5)C|8VhN&Y#N8X)G5c=wE)K)0H1`l1(^U(6^Pxd8iQlO9gcj&EYRARB%xMx!I9Dd(-8Z$oX zgJv~i#&TF}MVQwdCPO&nI~l5j6;}rOiAQoLKlV@?<^!D~2<(SOG6i&Ms!NXw-xmZK zok+tmsTgGIqyw;$`f`girQ{=xZ)H1D30F!ioeog99R1{M+|quo%hmSeIp0*l6MThYT3MAOS=1{ zc6LP%Y8QP*5A}yPsprJ~KPmaXqutLX9-AOptLOAR{3WU8GVab<@&|nu|9mL_4uwP= z9K9r*9qj%ELHe-+Fu_7tp~sA>&A~+8f%e|kT|Q``L?=kDyQ}JG+whv8hP9%I^P=J~ z$P0Q976QG;=bu0gL(>DxL6RAkP3zSXtJIju4R;};0}eT}`kv-52yRCqoX9X${DoCS~f=t~3+i4$ie&H0Fav^`5WwKcGXA z!(-_Nu`uSJ!QA_ha*QM1A^sh1OKnko$N#jmDIfv?vHjgb|Je>FVs30N{ih=A;Noa* z`hS9;R81R4Tut=PI(ln!>&u@`XJXPhqqW&GX?Emxg#*y`cw_QgZ^$O5rd^43B|mzi zYS6o?ml?>rRW`yUz1r*xLq$+z3QM40ltrn`%cfmlMnbW}`##LWu|ID@GQ+Ry$Yfhn z(JYeRxt_PKb9{PT;#aSGzE<6Ud~PFvbdc*s(4vTv=h5+C99gM3Re|M(5;s+yx$wnc zSYZ~OInd2ODkS&<6^D{TE+bHdSeu+(%3u_YH0q8@E+&8kLdrp)_M8249sw@uFMJm0 zzQlpKk+d%+KwU`b9DQiR+9?_XdFnSg-*eJE`bZ+`WzLUFKi3Wh*3kLtf8m0x zP{y^GX1Yr#a(Sy5sqRu=#$rtINYJd-nrM5lGC9I$v$T zP&{3X&74;u%`zYNGdOW7gV!~3FdWQ@T3>ga&Xc8#3q8WJ;Nhq|pU7ZNksd)f*Xi_l z&$)$}ldwu^r5p$J`Y6I?87 z6RoeMZgJ4FfkN;Ox0zIDlU6zd-4f;y!cDNA2(&XD$RUaloLO`a;^F`6Japiz=R;5- z7JEC3WOV0-=f!PvT%wI1JJ?00OX0|f_de8|>&=LVJ-yF>*!qc3uH?=d7mKA?LnPp5;;ZM_o19I00S!Tagj!3X z{y>{r&PbcOE1)3yPw5|~w|pPGn~FT4iYtg1{GP^Oa0(=@4Zbw`8UQ)nUbH#J=99Ic zauXd*xNnY*c|(da7g^znE~s&fs;A~CJ!0-!^+Ii+ddu2f_v@I(KZvs=y|09abV3tH zu7?)nQT%}+lY-?1*A_t<)M39W*oMYG%#c<~sWFlqeabV2yRBESLTkW5?E_;?{X+o( z@s}NX-xx2*<(DCGJuqQxevwi^C7G?bIY@09`ukGW2g*-Xok#8hk;T+#Gi-BflK||; zFJz;oPKW_Gli_#Rux+gPt=1NsRSXc=evZ85?W>6_6})Cz&6z#+6+Op_SUIE3+G*&D zMRrzeIh+prLA$z>wouZ;4gWy?UFQqsp-cS&t|O4blw9bsX(pgGh*10G`zTN`dy2eJ52-*^x1SQ&C4Zu^DN=T zrCUJP)X!PYkv-;U4l^gUiU;+^`nL}a)@3K;yj#|O_EM`>`dm$gsp|E}4a(TB8l#5Y z>}TZk_V*Ihm3gZdz<#SvtTuX2+8)hm&nD_t69+tlu+(ib?P+voE3@oGxT-m4#ZBiJ z52B@g2-_AkskD}yBI;=Zrg;lpDwUfjam7)FdbJ;7_eNb8Lwa_Sv4plD@9lL$_|MO& z7ouCchE2N&glo0{JV80>*ydjscG{tyOX^;U#dGL8VZZTKazF%v5oVF``h~wuOqDB5 zpf?=T(CDNoYX`OM?e+DZ5GwCBfjQ*!MKTO&MlGDAsy{#!0Y4XE7~2w?K+%8T*t*rS zA0XW-yE@k$eiGvqLF!)>gCmd<1-RT1=p9@Dy6eq>Wei)Kp+7$>A^<`*nt(1Q@e2onI9I{E&QPbMUH#Ua{}0oyFEiHhS7u2)e`87%KDm`8xP;A zUlLAkA`u*90e-MQ54d>~aCwgw&h2eD*XWJz`F5N<9yJ>eQ82b1@z?kIzZ>sP^iT0rYg&k8F1BpAVKQ|ln!QBl* zkQdqEnf-u_HO0u?Z~JvHUf+e}I24r~aoz0iTSLBX#mDeT$^69Tz|WIdZ@QwN=AmBR z*xzi%(+zihl{XSPTQQN1D|+mvtejE=j$;(hI(tJ8X|7{X;Hj&RWE&iIsEiL)e@@;y zH5DbLa^WNyVN+@|^KfUG@s(p`TFdndgaaIc%`md?JW=Nqkj_l^zXaeC7RQmS`RC|erg?PD zKtmnTKH<=q&7qO=H)jF>_WdpY|LKi?_1IR`n5L8dIXi~>r>md&KY9kDwhs2@#wNDr z|8Noh@~0j@Q;LUrB#{ zN{`)@o9^(h<(nSo56sU$4P*dF7?@xx=7geo>oy{;nHRL8t{oE9gY6?0-s0S~W$cG)v{O3T zMNPwIl_{kLX>KhN#Sn3;s7J0>SJxY>J+;NYK=$jTlwEM^!qE zS<@q%6IBK;(^A>u(2V!!#2+!rhNLN~7{D*2bR=d)y>)3U z5umHJ7dLB{6CsQ9jA>Ku6Sq>P$U=$Q$&+LbT2Xv|*gQMOX4L|#;$=u><`$Di%*fRj zvekTR+m~>zPm&&A?|3*4N5!jndunH2OvIOGHycv{jcQMl)v62^Uc$4IiY-aG(4;ko z8F6>VdvEJ>cZZ2|%%4n9Czwx`LptzkMx{W)6u!vb_+h|}Vb4#%xm1J;NF%h+&$9dI zXC~#I^bzmeWP{+D-fCbM(mLBuVunnaE*S`CX5{Z-Oc~Gg(v!I{#MMnCFxp{Pc#Da& z4JqE!iph+#L^;h#wMJ1_U0(%+u85zGZMf=mng;*eCR|Fk#K!WL-I zKP=@i;&!inx@%6iq(SrB$@s;r4&~Ll$%1VfyPhTOGA!rB01o#q;bD(=VYDa*e;5v3 z_}wd8RIQSWO;`Gs;9MqhwbO(f^k$V7&qJBvj>2q!G#&y676ZyM5VkE&cCMj^py`rr zF?7mC);qKu1ek+y$Q?}QQr|(gbUGG=5?WJ#+B9|0gk@JbCCQJJglb%dIx6c%#Y-n? z+@7;3%JW)F$NanoqvZ)`X&qg*eGtBFs#R*;ca4VEpWN7-I`G~)f<237wiIw4v)M3| zir+$>=lUkxK87rr zC5VlRArYPU>-iI!+&YLM1IDQ?r+S68d5T;PfI(c{N@Y?O+eXonTZ?-6xp_xWt96Th zxy84I3iWdQ*m%?SINq>vL(03g^`I3egk!hPB=<8cVVUE}9_g{&Jz&VST(GT#&kUHu z%wy#&oXf?^TpqTwWoyozGF8m&=}f(|*URFNki})%>^QZ_$(0JWTIO%AXJrK1-rRoQ z=ybg{L^pp*w`i98wHS_3FZdK{+MReJA>O_)$f)3d1xvcg0isB9VS!hj(4=$UP68Dm zPZK5TmrgOxj+uC1meT0FUY{WL%<{HHG%5|+%Byun#q7bvKg(y=X+;EDFbKe2T zaq(y0&El-Z1~ZE=a_MA_e^4=y_LSj}y1&n2H_70eJ1A(GY8LKI-x%fd)#NP|WM_E@5{2XiU zaumr2E9nxZJ=L*3a(4I=yo`DA`!&JH+C@i8PIAs-s`dL$B;n;@r^RF1vUgLmr1`v5 z`OLDAw7n0UzQ?XTjqo#5JsAJ@<~w!$OY%te1r+UL_z^@G1YPbiV#0D2B)S?-=63r?0$~B zXN_rR36^r?GxsCIR(h1sEWC<;TwHGuZ8pp1#V&q5Z4i?7wwV1s()_^ko{`BCbkTgV zc$|W4VvWX2e6w;B1hWv()c=w3rQ{}Wbd0(}UUuVjw(k&-);YfXeaKwO2z$~I?3@`< z_HYLHW_FHwXX=2s!rlL~^1Y_{z8}C(hRBN)4|>L?;mV`z+SzmBD!FhvTePGvUe1Y@ zd&R)hv*5P4mkvpnf4#Sav6|_LC`pMND?u3Xl+gtEa}EubupSpHfOOIceW#`Zont4s z?M`9()DEHi9J?#lgC3_?I@IE4=!zR<@XuN;x~2s@jJxy83qFobp_V^28~ud@>)V>rAkuy{ps1R%Qbk5_nH;R~a`TuxcR4a%lQalZ z1A!HxR(Q7b^Hne`F)V>1486b1&2dh>UT=GGu#KSMh~_2ugKdC4Ku=qH_$wIOLvA|O zJDf*%mMiSdxY2UR6*Mi>KY7IkMSg+AOMqZ9je{Ax@dn_in|lg+lYTiIWaU(;bQu9R;9Fz4;~?A&Ne4 z1BzK0^SMIG;ycTEN1dd%!5C@*ejx0}4c*sx4CmRylT}lc4OK=H=<3z4TtVz96@ENV z718_F{*8>9??YO9FEzNZUOl+zIqorBWwPAs8ciNWaNGTP(@sQWiw=8CTVuqYfqUia zlaNk=1cQbw<$a^1o{Y2mex4wdw|D{t9|4g=?-Xfw1o4uI9dY}N8H00tk{M_I@zc%< zqkSgd2&Z}yxVsbBy(7OASe{vqywF|Va7&->70?d*Y`-*0N96dX4yGofEMa%0y>k=v z`(0zV=Lhn1d{DgEIHIiHv3;qYn1>aLSa9B{UaI2jcZM_{XVrg`t=_KaFLX+?<%r$D zHNoizpxC*oYsQC|b~iTrgJ{a{eJiU-SRXKrUMV$>)(~_xVODFm3*!*bberXAuh^8tWgHY_F7WiYQ+%KIS4( zth5r#oD$ZX%DJ)(NM{{^?3jpjn8TF0>W*HCbs!g2IP{C5%vAVRI>BM*B54b=W?!qz z95yP^cbz5VW;8;rhZ3g_SvGHG+1ST}1g&5^#Sg5odrbO?y`)!AedNO@P_$q35%ptD@?CepuP>FzH!MNJt*LFS{!FtL_{h&7~BOK1} z#=Dv6`PGa+PMd4CkF`SPigD)lReXa)AI0_J7#rmcH8||dquk=$(`-o`Bad7MtdvXjy}_*9;IKosrTk(f_t-SY!DaZO>ePM~EL zUdCBVTLfaduVm8r1Y>c`EAfQX1PEevg%}LuaMjLLeTb95tQBGz!T4aU0^yck@ zo_@~TgI~G}`+#?jg+I|))x&mb7QEY@7=Uk|2VY@Y<->2+7rg7wgM#o|i6T;+0AoHR z3K?38B2u3a<9Z{sH5k6l?XNn$9`9iiWbwZH0+_rnTGTxW2qppe?f|bBngmP_fR`tI z0_U&M`x`@oIoCgTED4+^f9|Xa9LD30_qO?V8gS=^=Dhe26GdM$yd`8NcLy)A^p%*+_m^W2$w_rCdY=liN!Dpjkh)pbrE?X&h? zYi*c`f2R_hl#wH%B7uR05rBcQ{b$7augtr&xt){wzvwvsfSl@w&YzHTw^|bgTom09 zQ8Ey$UKDm6Hv|y;1tJJlbcbdb*}sa|YRYEI8wI(;(}3S&p~?Mpctz24VJ&)LfNKS! zYAvz2uOfFqX6;UTjmN`#%X5Rv`Te%5b^hXWzku=-pZSA*Yx1?{+2Y4N40AW4amgCV zklkxuPKp#)gEIRIS(G5xm*sFBTAF?>eq`sGO!Q|me!(I^FkQs{+M3->68=F2<& zOfULugS6viFlv;1zHI)21Q|dB5%7IG8~S~vHy`(Df#zVx)!q;Bdg653+2B^&tDYxeymzCPE$*uj8on@` z5q?hXm{z1Pd^dVZF|08<5l4+g0j!@IJcWp8uibWJXc~;J9ECRDxyWs@CY#YX4G!?o zIMoi?BeN)7{lqy(fw(G-=G|0S68UtJS|Rmrokul zX!t=g5%O%ODnzqHUT?i=8ifP8A9G{tQ2~Xg(H@sa`V4uj`iB{(vwxQxO}6f+WpNpt zzG!aBckfc{mpyN7kXiK^H1_8i>#RLe;2}S66KxmtAc}~U^=ls2R*6Ek3&N6oJr|7f1<*{d1008 zjZuQ=S9bB9>`nqI*0JVCpYYa|HgT@ZF@E$~x))4vRa2AGiqPC7nq<6by;U==B=l+C zuquFN_UPK6s1jd#>%6G8AQt?@rl94Jn~JA>1DVVm+ypQ*B8MqAEPIO|K_W&d$nY*G z9!&_8S?kQ`Fm1t@#d($@Xj*pcJ?cVRDs??LK+EsPAY6qivrgTWU;&_O&q>*f{Db+Y zIRzLhGYsQKnnk0sbW|H+5*(l1m{z)9A+9w3IuQ z=e9O|f^r7@5*RI;-Ha)WK-fx4h>JF1Laav8hiV}6Tt$_6+T=1exVeBQTCoWu+j_;{ zic8Djkm;?J_S}h}QC6d+tvz<+db6QODySZPS*b>!*?S+AqO}ac=#pC$f`7IlQz6zk zPCp4hXH#i=E#SEPqN5CO_~eqziRzsd)hKhFepkpDq*R;IxRpoj<8sCvkw@IkD5zmy z@?H8~4ppjKj-6Sl!^pLS-n^nLr?6C*mdS%m>==%#O$x0EXk&9Gp2?=G(N$>HZ_eZi z4z18E_fV@=kDa)S7R!F(A%3_^ImpR-S^R=sBy%D{nyVDQLOD4+{_2JuPn;TYoW)d@ zh;Jjy|6EF1HfAI1_067b3F$-TguCO>>2VrY$CR=jA=;k}kBUd$~ImF&6X5 zn?qz2wNsizJ7NKqFe(&PBnY=Y_BX)KCRL3PY!Eh z3iwG1Qn_{u^M%xM*?VUsY)cl+lghcJC#rgbN!93&4r=yl>l4!~H0JIHd;T4%1b>=z zk~s`Cy_4HI$9{GXDDx{U$r&v%@fzjZWEYAMs&!}tWTr*ESXBz%fC3RiY-*z@E?Aa? zz{etutq&;DI{k;mb#a?15nI@)2n(jOiWS}1so1c}-Lmm8JmLNRQW!k4Q8i$NcWDlb z*Ywx9u~FS%>AI1d6)Kx7LghzcB+F7@(gV3Ho)hL(>-1S?F7yl-%?l^!_QYkZS=ab; z+!bZFR5cT*D$dL{*DcD{o4)7jhyQXfrr+z}zwfh{>YOW+?fzgFz7&KyqL^w^{L{*C zYb#T#@~eq9Q;&+Pgt4N;OUKM*ssoPwEoH;>Rxyh9@<;B{j@GI~L%uRWeH7;>#QNJA z;VW*7uE^&|xzLt-1Ht*^hW6K9rc{Y%3q`RoFv4h(p!h$EIxEuonq>0fMwe$U!;5W;&CYX zgxYL>VenTVJFnZKet`hYLZSod7)tVE)Y45jD?+b~El>arkAIB{1vKl;4#_=}#_ zjwspKHvFX>E|#tJ&-x8kAsmwL&iK0w^*|?Zd3R<25NTz!t|5S>O=Jh#(&dYt(9HS8 z5m!t>YSbWu$i$PidLS~ac1L^?5Y2A}VqMG|xYJ_kau}AF6!0QmkV2!{mpQ|-*qBH# zrbZGsEs)F52xDJCMPL?=_{+-SCT^Pa+lt!)Ih#Jy$E2Qqwl|B&$ zHtA=`$1h7q{81_#_i?*xA-fqqR}cqF2HfG#_GVW21Hml_+FsAR=P&F$QVf8((_#5| z`^f?L3@b|xEmNTyOGL+QFY?;}_WeIBy0+JHN86;!AnS3#5GI?|$@o?bqakdfb3_{& zb{OFiT&>&R9>9?NvV&(Yu*V&tgNiWLci0O{w_3|IlI`(cH-UJgUa8CqSb_ng!I6xZ z+YC8{o=Gg%PgTY8HT`1Q-O0C_%BKheGO2G9CS5SttX50ad=|A|i}P}UY@ue_ZctM* zih*UC*(>4JE7Kuoiw+#^HdK>L{bKkWJ=5-qjiK>z9k!a3(g?}yo8DMBdLwm!1aKo4 z=!Ko?31(yKOPc8xe{4oe7V=GRD8^z&@^iD|Awk`oCe8VaXm+WInO{MjE$lps*c#Pe z4?R?~@P4Rf@dsaPU!kvIF&Udn(O`Q+u@6?AuF^=ORgUT#g=t6TGvkirz)7Q)-WvS) zHUtIqYIA2JgzQ8T5jI#GKt!%9MV#Mwt73(TOwe<}KxW+{8Ab*w!XdP>vA}6&QaH|j zz9+ccquNdmRIwy9)aaYWB_=w2kNi0}5HhHg_!A*>jD1jyGjE7|kyHjZANC0_95+wj zr>dcIM8X(OTzlOCd#F$&{QIvi^G@l~x6Pp#?F}^eDrD|Zf?!Kl;mtMF?#S%)i78go zf^etUbnhua6T?hy(*l`C92<8igA^N`NPM_?sw^9FPtN7jAA=q48Dzy8yR5_u#@7bL z;0!b?9H2oe-+ouqfgiRo(s%HT;`62K59rCiMfd0FEC_@oKtv4&)Gj(A9U3 zjIo#F$oS&#_3e+yo1RbG$Z6mX9ZT3V%C4_TxfpjG$`wvV4(JGR{SNu31VeJrqS zOZSnpdsH0YxZU+vQ`8>uDwj9G8^!yuemCd!Jk`@a{iWvq#IyPl{cj}u)CMEaKfOcG z)id4c5!SPJ|6&d(ND2G~x^Qm`$>P`U-=GG*F?r@6T+oAvQ7;nOfRI@}ze0VK0j&UF zNS04ssE;(DwH+vyjT$cqzg!yz#2v)U47}VU+%37LmlHj36LC>)! zgE?Aide&zVQIB6(*5jHxKS50N>v`$Z3KSgdR;~5=Xolf%$_`)a8AdElbsw;UPDuW* zAKO1GdYun^ZXBOBYfGP8AEy6^uOyt^P3&C%yPOxNb?%9&h4-QGVD7;UX)TJQEh{^2 z+o01x0h<~+3=MnULaH2W6^%{Zk^KG0!Xh&l2~OA6Ru6ua(lpv^Za6gQ%?wPk9P)ucSLlk%*|%3)=fk6u| zLZVr9Gf&N_L(0W8YaRx=r-UrX5sF0(-A)0?JO*ArD~xA^<@s3 zhhSas*6glY6rRSYQM4@-8_%uTtYMMMW| z{8t#;YU`sMFiE`tgNWvnt8QExqirr&{m7`JR*Xf*la720tWo%Yp|b`CcYW~Ju^-xgEhPkEL<(4mdYr@ewm9(K3O=`-krQ8TiI-_7C>XFQi zhjmPea_xSpjI%xtuI2=Y*w~?y8frSBCX4|Jx50?joUoQL?{*V|XQD=9;Hg+kwp#%g z61wq*aB&}wQnX39GKNRcBr*4ewO>d{w1Y?#XMGNBAD5{}5MI*gCBe;I;U7?n|0ODE9I zed`TJf+cxv6Jg5slTR7wa@g!9CJ%AztiuTfwyP^q=dR;{sa^Thf=y}Z5C?H z$T_Mc8$LU;Z5B2)Ntv~xx6N!;k>M?oQQ2)e?(#BTVqQs?-~&jz}pG z4pO~pQ{uzsf7d94<70pMdYEV>xcH1XXcU^YUYEP|cxx-%T*cv_B}b-f^+L6zomjqH-vF)(7?7SsFvAKae6hMh#q`bl;U5I{Yj&Eb+@y3t*a{28Et|orSnTJmY6vlv>bLwJW-PIauw0BQ7pCSYVMOp z=mY1YL*BQQ)(zpH>?k}2G$a4(d&3>By`N`{bQ9URrhwQ5b@WbJ;0AFdl*7Q4J&NR; zB?~UnFhuM0Zj|;{d^>uwHKvihb?Ko!vNWUNXuQS6>KxIk4|q-auhP@&(y*XPJku z9m85CNbNCaOz@n*Sm*9Vr9x~a(&5Kve1Q-Jue24Pymsa~S!S1eT7ls7$eMKL6ci_- z+HKCxXjfm?9=Q{`=j9(pTZ4G=w^&!;j=Czh%W$70u`z>{sqq>nm231RmBMM#XhC2S zDx>7A0-d~Yf+;hxX)FwDY(&ydjbJcgKmyx?^`}z$McR2p_QiW-eHrXM&=7`}%>wra zfuK99;&L_xlRS!`3=EXWSHr=zuhab&%x_6*)#(K?miB0g1O|z(LaK>EURo5u#t~y_VpwIdUKE~ zfI8vZ8y<(m58P=pdshyguu>0R&~$;9e0*5so+8XBiQ?C7dZn^3rXXR~72(FTfIc=~ z=|SJYz>o2~XYSH_&xgna+->2=i~zn0B+=Jo?U<2I$2pEpa^!wZ^dP3JLir_ykZ@2x6N$tTu~qw z;w6Ode;QZ;mxFjO$#9a;+p>Xqb>)i@$_0e_t~^PGnQFEQR)aIDGmQ)f7eX4i=Dd4a}@xoG*Tw^||DIp7!i+{Qmd! zF(DtUw4Snvq>&B!O1j?+&wny(jGY-26`N>VOvx|`Yo>xLw{x!!mLIj-Cc-GEopdEC zD%npb_9zr!q%rY_P0Kx8yTzEWAao*8{cA0&pls9GP~KW9)rD@Mw-nF&!JgbQ zJIj9?nwsy+B}V~mr)Q5cms`!j1Tap?Bhtt^9OIkSw*^k0C=<4yg6hKM6%CansItvf zZpphE?}<2PZf@zMb*7lSVn&(^&mQ+QGgCx;BP8ZabG3hm5ceQ6HFe+Gyr*()v0Q{7uZX+L`UIcM%j{K*)7A2D%(9Q;lCDa z!$Hzb1`fQg`rBA48I&N(=067T;Yrfjirth#15D1z1;2}RDO-QPOS|O~26z^7rk`T9 zxkxTCTxlrW0WPb2)F6Iu(@_o952LmnF~PrbLJi;+SR44lV8!mBi@gfBD1O(~a>CQX zwEJ3Vj3EQ1BTo-V$c+Cv6J1i@{E&)&0N@C*kc`p(Bh==@v)GB9hZ}y4ec57iSeY7a zvevnhQOb_BmUPW!X4fdY`M{S=7UMar2PuJTyIIaEnV$y!#1cvRxAIAR_xNQGB*ngNk8u`7 z*n~@XWDg!hq%d`VGA+Bh9Kvw_qKHaCzK1&xXD%q=#hg?nCiLx5=RzeK`cITe2;Exo ztIlBk{!wIGClXOqczkG?SSOWp!rlBH8fAhqhgez>*8|Z8Cyf!os%ZR2+(3;NR@)it zU#L-xG9w6?+7^ju44wW#%-H4G+mbN4OXaxsU*WSXrP6t*Nrl2l9*XL9;hUONU2!y2 z9_9S zR21X}L{RM>n709-^BJA5yuh4HX_ zb!;*-&Dt!ZvdegNkI4bl@hvHvL-l*8-5V&TR{mKe%q~@SIkHG`#iQSd*g5vOF{4PM z7@jue=PO&Obt_!`Pw1Qc|5t-CQx_Y_`YCto!~z3j`H#5lf6nDUXR=w_$5(A1&%c|B zms(IznFbRU=Uarf>;jp5%BTd5xkpRbTzqh3VrdyiB9+ch)6)ZUj6;J6F{1V#eR5qf zf%a(MoFE_^3=g<2`Es+<6}S(9z?{FG)Yj7Lk?)Np!rixiTR$9Ud<2jCW{5YTj2p(e zuP~~XotxwH@turA7?yD}5|G-SuxnEH`E>j(jLB=3okM~IUiH(Aj_N|MB+;Cc3AhP( z;95r;#=Z_z^Et39N3J6QgODLTcc^qO*qpd8(4rpOo%2yQnYmF$rz}=$4r9GGxF?15NcRntb?&)m(7h)Yd- z2$V)|1LH$XKS){qe-kK;gR~r8*W$|D1ac!*SID#SSg#oT$tPU-{B4bixsIN?;t$&lPfLyqQhLVrz&bRa2psx z?7j`y&?kNkt1s-kiI@<3_tH0Uf)4YOfH;hn9O?E7AZ4u0| zYC-P{4CW%oMW(W#MPxjo_TMq3qeQXhc|{_XQ-_Zpde>H-u8^}V z%9HU%sr<6CAY7N`Zs=9N*?k-G%0$!gLDzJ(UB0~cVdur^a2WgMyAiC!q) z$p*wc#wcrwHPkF~Xw==+Jw<7rN7v%8Rxxx#!zf&n<&eV1lC-FsEk~_Squff;fO_uv z*;^EMw*W{X+G+P%?boKT8A3n5t@8Sc9ZN;V%C@KdMI(c>p^(v7f)ewFZSxmPVSbdW zUUn9P2{GzE>m0e3iAO*v?b8a>va#x155XWvQo5|3tjMPz3Q;J9eW@$HCWa!|K8*B_^NV9;S z(gDOenyV>mz>A3^;MJwHGZD)$)e5`MqneiR1uJt_4Zv$ZLQlBxD4{^XDm;(xaE4XU zGB$aO7o=RNOeC?RP{cKlkDz@UqUsUCj!>!o{lsf-P!5n0b)!Lt8P6xLicueRprasD zsLg=Rt`b8p-x;eVuU<4f2*JRi66JX6wKQn!m0NJ6#!B@b$SvO)wXE=p=9u|}Fv4;Mqobv~X0QWzpeKKzAyp|wcu8OOD-Z|SaU z@|~;}Z>dY7D({ewSObOdSX$;dW$luSnso!-;<64EW!tK|L~DhM{Z6L9jDAZF7t&PP z+?PT`gZ<2Lbx2%6&cyS-r=F+Rle%{e#g^rm0e+-{rBLMN&De)hG+rJqzI%^j8fgw{ z6lrHEZ9m`l-~aGDQc84L+UzlaE;TG899In*kc~Cx>FDP?9g54!h-0;y#7kCmoXQp| zR3>(uoRX={*Aolv!m5+MF0KDaE=T0nwMWP}4qL^CT>s(F*-V;;ZxSYvs#6x8{8;ro zPu`)euQvva8Y~J$jjC_AlKYqwStzr>doU7I9wtl*#8Yz5+_iIKhPfxOBJVyUBEYAd zYFtqp0vF5|h8QL(vRz$0T`OYa#_cfIG5rNKU`uX`8+n41BCehR5+OwBQn0%;nD5}%@E>QJ|ttrDYYVE z&oe=sB`2$u#~)taGzF^j`X1nTexuL3L%rMCiP-j^wJ@4&4&3WysA)`!QDZ@MRi4Q< zk>O(KQ`NH*Qfy77fj3G+?@r-}-|UxbfHfMvM}#+01X-^2k5I1ug-hSS8%!Axv^0{P z0$1&Ls@e<&D&lq|X>nFy97rBjLh`jjdYBozkNFcCbRu0S?s=Lf&K!e!g8Oo5oNCSn z6SI)_Qh7=jQ+T?Xhc=lIH*&aKAQT{jS?ci3Pzz7>wk2@cQ45s1BU}b?V?*tq7_5BL z6R@;pl-aE^^7+Blav{tTyTQS;grJk>U}JR0e`FU=B+W!nFt`&_0-!dLF`0;BZ#!73 zvcT>f5Noe526*GGr$x&=m#GH3!lr3+aY3$>+{F0@a}Orru`^(9%urAglIsT;~~9Vw`kE-+>}elUKg7lc(1k zWcljj0{V>JW$PYdE#<+YRt$`=E}pTm=I+p$sV`{}_ba_d4KmArah76bA}oj)`7d2VSw}6Bnv%ojYgR<8ELZl zhAU7ZJ{uKr!tcUS8`t@r92!%J&g8_4e=%ZHkY*#&va3UdF0+Nm9DcnI#V~(jcMaL! z-focS*dXGpl;%A=|71bczgfdq?X}i^1P*>@-C8E#uUi{`Qa`XJmuD>fbj;oBZtc_k z6)^z>^7rl<=|cHI96r1ZuGKfzEs!u5g?FE)f0*)yD>zmZ^E0!MqL$k5o`{8Nb>wgS zj22bWbc2!&hsxAuWS2N6f7D5eVW5MX{K9+${mTx`;vefu3|BT~3YCv7l~8^b77SP$ z`!Mlsnz31_uf%0XW+HwJr0Lazw6clfhQ_aoEgC7VTcT@+9)swC38HcUAvcR#)?wCc-TQ`)8fv(BEmyG?#T~y+2<~T+# zl=Um2_A9uBBek<_tq1Z~mdy(II=Q&vA{z#e-%%??iUVeq$UaNQD`lFdJ-Q*(>VzccaTXW6RJuab7qh)|xY&+SJfe`)~)IA@;Nh%tX7G0&n>Q3Gp2hTte;PRC1dVZ z;(NAT6nX_aoRxB&ojMV~VOrZ56cV9r^5>n#p&d;8DT+x;JDBuSba1)OHuTpV%K9ol zQ(*GuO3qKuNDLLPT=Ct;9|nVJrnfe#BZBTTx#}Gap7Y=?XSr^e)+49hd|)2)hPg8? zj@$=|u6(6!@CISi3Os#!M<Uf}B`nL&RmJ10@01)EA+I!wcDUYOQ*M7$6~)4DBDAwv6m%2 z``xw~kuvxRqr^UC(En>%;$PiY#Kjc;s}0M)U{uPwD#ka|a3AoEP*f3QI^sS^=u|{6 z?5hl1i4bFvi}dfXa`ql-{2l7oHil1NLMi)`(>-O{*yj6%hnKZJ7C!CNJ^mk0GUD`2 zmh&w#{8WDI73Q;7kAF(PsZE)k4w}aAd#pNauRC~d{BoIcl`wAW>)sFT6#3**bqK69 zLPj8Ds_D$@m>Ba{S;vSRU`pV#7~t*6y+C8_Fd}9}d5-4mp~?)}?O%d5%g8vW-nLvVwnSRG+TWtXhR5p~l@{yccghcaQ5IgB{y1)aB@CEg;R{>YsL zRT+vswF^bn#p*fodK7cnN)(flv#lvqwCrKb~hQz zU`}JGR;d2Q_^Ho_y$^PO(=m_-)UX*QoVXCQcn|M;+tX*gR-V*;OKl{HjOVsu^ZQu$ zGLEq{A8AAQK&<-lwh(@KkC-J4AN-DQ_BQKTnYU&BDKkO7979HE(KRqXL}Ig&eh;@6 zuQ@m(%uWB35>P6p{woemhdT~kMz64bG|gI|0fPf?6=7R#dtsY>yKx(*k9lr?bb2mz z)DWr%+Mno|J23#mm)IBl75mBlihtX)52x=kNUJyf$p1UZ?7%2fh*lrojaFh0{5$L` z>l4OR+4f9ten<~k09-e8H*z=l`)69_iQuYr`?7cI(;n}1o1~Xuo1{-T$T2to`U7H9 zUH`$G{^WjH_`lb~Kbq=L1dVlydWc_KsI1JEIT!(qwa5x$Sr$JQf7xwPx)SSossUcpG_C@&E+u3OaepFf*5lw^DrJnO`C{z7zuJBDAQJGbG z$OT^;Em)ADw80BDjXl+S8ooZ&E*07lwy|-Q4QaEm&mP}bB!r*isTewflc%%~hr>%b z#L@aH5gNtz3IMHCewKr3_q`IDJ27(!pPzej+RT;%pcA53aq1gq@T<><^QjKn(}qRK z&z7@AF{B9JS2JW6-`61I(&maBiFjcpjHBDoj6l65sS{Y-5Tl-^yow5GPbb`UNk*P& z#=?>|J~Jejs^8fpoIYLrb6;KvC!aOeO@Li%beOvI5wC*nxW;^zMPoXp5jteZ?B%Bx z^=_&Q6#>aa%DC;AMWq$R#4}k`Ni=U2ete)YBhv>NLwNZid<@bm5fD=Ot@$GRI~G+$&RRG1bb^a>l7#edx!! zO7%G!WV+>18I9~Qr~KV3GgkTaBwyqtxf7J^Nb=TN{7l!c9*Bwtk`b|2x!9~{g~+0! zu5$-=iw1V#%1(9$2U|AO$k(Y`6z%bd2OOa5lY8a%5MHFBpW7HETZ}R1yckjy(qvU~ zu!eM0)~jfyqNn#4QmfF2WbHVi?lNDb)?=xynDF5gFJ@9L<6Nl1HeEuBF)2%qC?KZJ z%~6GyQmKARxo1sbUPmHlmN`E(a&SZwjAS=3B~PR*vn&7o>&aFwx3>U2H@z2oJq~PA z0Vd^?zH!FytBsvae`gi5pVQIGn@aILzLD6~P;8{y))awS4~crOTxs`}YxGH#+p!zt&Zoi5 zgN0sL#xyKbzs%)I+ zBUsC`YA9qs|IP=G(LCKr98)SBkV$nxTBT}T>40F>IMPy;xaW8Iy%O{u@)ipg+cA@D zs(@Baxkgn2JRsB0Y!)k9=$JIZ7HgM~&yzPr4u%|gq+#Fm*fSdT>J-$zROrez{$%*J z=}@W@T};@}wV^!K*Ox^Wp_O{7w(5Hks?D#0AT+RCjQHNG!4>-u`wqJYu z;+wf77C1^2)mR5Fuce1y&+07y;OZ!^Mox1L^x(SXP4YsYr;U4Us^ha+095NUm`|?A zyy~Z0>Qsno!g1J+22xNzkH(Tv+|NS^uD+6=?{&e=q(z@eA2k7oZpeX&e-$BGj>f>*@|O!?D9D)P6ooC`M=t3QZXJ{1`y&j`8KS`mmy=S4fRbPej0DoI6T zN)kcQMgxv+UeP(vi(%Oajbf^ih(^ z=C1b$DXF62qrR7f-njUjt+MJ(_9O~55`jie%$+2+;GAXN-8gJF?#R3lM4o55YqY2iRbh?;v{dAv1K! z#B;HmNl)-pF0t;b%GnDysZZ!7a`XFk*_;Ih1}tuSDU1;xEepB+hG-eQwGLC-p)D^VslnL2DQAPau5bWpIIXkhtKw^ zz+R>y?^3+6FaTh%H_iWks50OL2k$dkg>BSqahC$oHAd!y;ULMq8;N4Gt+WgA?+q(N_k^PGb%vbGkz z*vCKoA@n2aG{nsx>`F#ZSW+nJ`0jQEn?oEp0hBg^Ga1D0%hlcFUg~rV=I$j>xZI)$ zBXI7Ia{{2X&Tz|sHYp+qoCo}H`n#qeFQyDz5=D@PDcc`H=!@Nx_S)YTUX&)GY9NFUS0`kfsdmg zt`5*U7U=!+c6^|Kk1~!9>=EmBA?s&8uK8*Gemz@L_EbeKfLQ-H;&9jn!EJvLAP_|s z)WQR5aRM+hoanT|08tPCFvU)KJV0y$Ahs~TP8t4@+}}xWv>XO_ zi+X_{>eCGani;DiBG&?o@wP}{FSJQP4arqe&}ffv-`46t{|M^FWLj)7X*K!y=cwU2@P%-h7l z9h6S%JU}i2U<)1aaCEy{7XFbKuuR}UfOjA0gVEoG2in{Le`En#dIyNZw{F0-<__3< zzW8QiUX<-Qt#3G?d<7c!*dkZJb5Htb-69RcL`T zFMXUiSAj2jp)VBue&diAIA4IwvLFvWkcSH(*CGFdDeQ%k7pRB>1Pl2q(hGUv4E{Kw z3dkjNC_{26BLRwN!#~pdJMoW|6FU5Y>kl$Vh2!w)^;7PBtHg9j$8f-jSl@qWlY)P= zbpaSS09Zo_9s^(8!5;}!0S1H)=|~Rg%s@_6z}8*Jx`d?QHZm#DB$WSiJoF$gT1%Wd za-BMOfex)R>%~qz0I`8IXr7V1o;=(d~pp3%q>kJEtllc0z!C zqzl!%3w%ioe1W6|5>o?-ky}U3Z|_wB!YKpipN~9Je^(#mMZy;#i5%#`2_VP?5bSnx zOzVG(A^{S!oq#`Xz&?6}z7V4TKA)fjX^>>DQxT!V;`uF+Dj;DTB)Q>qDG7M=>h+WF zeXGE9NEwJ*+m`eL5hwS*Ws(4C{xKn6``_sL-?CtUBT&Hn&tKsKJ-7h69P&wi_P>P@ zI@A(e%%EQE5%txtd+*0vx1_WP;AKWh0qO}Ptfze9rFF+lGVkQW$KK+3xa zLc$^_&CCw)+1ZnR9}r@CNVKV|GDezz%*Scnp-j^q=BpyWyTBNqLN4U7Khv{ap0SA+ ztBMyZbZdY_zU&<~0KHUS@xG0*Svp5oG~lzIeCg>(N0>+`BZbqMg2z17UBz4stvZ6x5{z z(OPxSmRkYxi9%dfNZoIX4)Bdv?$?ns`_PXa`@pr@p%1M$PQZ=O0>l?$UigW*hiEa> z?1&XVRN*gt@Nt$zL8)HP()#96mU=t9X@E8KndZS;2In}+JjW;;?Hye?eak2u-5qZ^ zVDC^-9opNb+nC6%#BJg)48k4i3>GC8=P%({0J~q#gPv};0(J#+Dnji;gd3_vT`Qg! zl-)&U-9>tbCOMMSPe%Y=K0~671OCUh?xJ-+DQZ6{&!>396aG&}#5=Zp73ZI3A@hwH z5eAEG*`60{{GJ-r7uQepQ`;thS5!ppge!a8AK;q1X8I^{*Uc>h60<09JTT$LkQVtd zCSRDsrmi4XAhh~v^y37XL*!T_6Z)#_ur?EvZgw-EFVr;qAjem)%3Y9OwREO*Q(RZ^ z_XS$ibOy%9pU<%OAv~0ICb|o%%#>(xphd_3isUztvJ~1O7N;r%rPD|C#*Hg)m$RXJ zX|L-0G@*Q1+qU+C-snPW*`4qUFC-|UCNvKEfc$Sf`j4)wg@1$1p+8IAEuSyu|E)aw zfAOfA`+spq{s~6imFpD;STF_Bo0y{iSp9VYr)Q{Squ`%jG4gl8UOm1EUkoa(6`7S448@(pwKR_ zb*4lH-S}I?c7Nju9rrhR$~k!eGB0lu0fBAlW#IRwUq zhkgbUCkg!>?{o=`GqDMp5zvxU(9^IqLVFG9znPKNsP+yaRluwLo@v1=(6dRY z`J@o#NL+0f+65~Vv-v!;tSfm-)}Xgw`cv2)IU+CqzCX*SCLXgq%Pp>PBXrg|G>?XE$cR3Qhs)jqHY%)IIB*F4w8R%C*|xn*Hflr%SG0UcbKWfx98?|Zp)XD zL8vq%x;&oNq_c(pnQsctpIlD)wUyxlr;gm8WjN>CfiAlVyug&7_+Fg_bo0DmHP;XJI41TyK48D74zXzxQrJw~0q zf_dx@S?YToqp_Au#)a%Aqv0|D-LFfPY{OyBoP)Idv6UzTHp9Meco9z8!>2q{yF7}c zD{(@2KZMTu48eauFr$01LKyCCOZ31+7v!@Ivyv7C`s3yA^0{B?0>jHSX(ib(<5!1J zqJgc2`O;`cqfh8YQ2^3iDw<~>;zN57lOLn;rP;l$2)V9@dez*ZGV=?HXe%{mhU%Z= z0+u-XZk~_PN4U|UK-yjNRzu5{BB{nrJbFa%9frn{MSO$h>4~P|b|l@)D6WCM&M78W zS%tScs(S*i-u0zNkr|3sqiE0azzw*KOuM@J3Wf53Qzl;jtGTmeLqHy9FFLyd`b}9f z1S<<4t4>8cahW1tT^_$l$8gIt?O!d&vRW+uD*+ejqA+gAw|zaYb062u?A9CIQk|V# zu)iSiO~t4)uK8%bq+!S={xB|GaKSK*VuZ)9n(*|ARtx?xnMQ&~I96xBCcgcmg*c)5 zg=0wLPYCLENe`Zv|Eb(*ssOTN}h={ZU zJ8PX+^#gv-$W)mUrE*yd{@2q9Y`izcQ7Y^&(_*gSq+yIt)A}Hpmdi+f4Vfn9um@S= zEy;&mXER1qAU1yfpop!G5llpE|Us~xF?5NEr zk(u#)ep`kl+*Zf!aS{clHsVvORL@g zWR#`)4L4=Es?~?qE<~jKSGi4`vILS-WBjnKw^e)GOVlY=)4%biqzh;fNk93d$Dfgm z>;FR(`!5UIf7Wg^+^p?f|COv(m-{bX>BVFdq1Ot4&w9iBo@j3x z{$#Fq)=SZXE_v>Oha3+Bo(fIl3N-=uZ;g~>A0{z<#&GgNIgahrtVg`igdQ)uc?#ZX z>G5!smuE$3&Q@%&&g7U^rEy*a(wif7(#6DEud+}5`(nAyZMDfG&qjr`r^Loi?xVqy zEOG}kURI}8mIPzcb_BhBHx8n|<3499DZO6i9l^UB*=sd#)CgVAdQ8Q%!?GV<5&7`% z&a}xw827t}XQeN@%kpOA=jvH_Q^+4^D^j|!R)urcA@)|KDztpRpt!ATh8dgEkUxUO zdFlpD-!T{n#k7TkaWSaZ-=L%sNl+hJakf#fkfw)>!Py1?m{zIq<>*(hVE4Q8too-& zoYnJaDYY*U{7#=GkZQ}s$G9aF*X=V(#VDn?MdMC&=ta--wOY%{I;i4%O%TuPq!CL}@qZ}FX8VxU z-9V<8G{`ed^4Ff=^;iebR1;zn`k;}oQu55K~%uyXT3^ISD z8dzd=C=QN#@XWfm=>lrZukkE8M_m}^)1P@gmn>TE8SO6CLrWuf=;1IiJvnj{^5kJI zO&S^O{q~7sB=D423pnzXs^?-?P+Qx~Z_IxuUO$VrWm$J=aY}$%*8Fy$u50v(dLCAul$bJC*p*+ai z(mGcnL2xoVp5`^1?s7Xmsj=h#_T8}SYo1rZp(+R#J(997(Nxm5M!Mnq6r6=^xrU;H z^pFjjo64pMrL|YpR_LZ9R#f|y%M_vG)Na=XdNUgI46DA=Hk)Y6Nvgbd$0oeVC3Rpu z-fKXf&Q8;|Rr91d zSDuvX($l59R8kjcYF=qTz(Mz1wr?{fB<|=TEvtzpB}~0J(Ti zwHn)alE?V+LNMG#*U-?JqFJSZNbd}O^m<|=h%`DWK!~J5t?y#U_zNqX5#|bme|^Y9 zYpx-B3X4u(XGq2DnGbH)ChWnPGZuNMm7J(tx@LG+KQm5d`ehhGxYr-^6voLSjh4<@ zq+g!d1ouz5nhri0pI(5U>&q&pM4u|?*f9s7zcZq~!}&BvRl-ksP^#2Hm)oud!u5i!WFAC6jFRdnA;b7&%nPl9=w+imQdTK^B zcI9D*gk$Gn%nY+yRRL_;HOFG(frW2fwf7#rYh6_lo(n$Qy6d-dHQAJnJ-M&qYl)5S zIP5%q2aEJP%NJVP?X;KtR9EN9pMU;5Jew}S$ZytZSLV@`p0`{_%R+x{SHVJof;9SIhn?Z>K-l;p)2kjQv+B?HC}ZQ zhTI;XAvktw`?Q@`Vl@yqySnV)uOGbZ+t0fo-jw?!V*E7wMo2kfFDibkC}+{GEl*IT z*O(~?<9n55#V%=)s2G z+)x+z?ornKIQ2)l0}v~x0Q!9cfd5$r2*w8E1Dd}_$j_>xyzH0_=*a(V3z%B#F{nRV zg|&z#16wW1*CX}njq9;BbCVW_`sN`N?Km~P?V`fzV_@N<;1HBphqpWxMATmsv(yb* z)}>g*UeTZ#7bQgsShv<7lA1Se|9pZ&M-?Sr5swIjptStrO8Z4wOGSkFjpm{ zuj|P>9+JI0ErOAFgf`kUw731>)tk!0?fJG9nVojl(Z{`$qvjz6bzNr=Y?1SIvQKAi zj~u8%ioV^sL3YM6d~~lh{&-X?{vvE^*_|ne2PX7PkvAlpj;Bmn4g-S}&$-; zIk!cA2HT-Xwn=F-o0don(Lt`?3=>(wi{23!KOO08o;FX-gp|SfYcNt{~eq54O zF{Amu%e5xR?w0mfl@D_FfL!xB(H^69{4EEY^lCsAa`ym#VQe1K)@i)5^T}Smd0d0earD#t z1p)J;@Fr(ux!ti!Z+dTKy|b;Gs%Vb0TFI=8<`R?JDXLc~-so9lKA98;XCsJLxdRH* zud^8d^tCwfGM9$^wOsYnwf}YuW)l^sVDd>Lo4Cgbc9e+gozUgw^|@V3%#S!z>H6|g z6M!j~^v#CzPx7qwU2p9oMK|oDx3bgNUm~Nb%*|TP<^3GunL4N8&QFgcAzT?=pp`w! z641I;#@anNG-ou@C=wX9Z_pwx@;g1_txy`wNky#6Ci9(%kqM^kZY1*_$hEE;k*-tC zx@1+Qp>wNJ9a)cLa=9KJ_Q=&eidQIh{dgU~D`2gsgC}i3HzpH$L1Oe%gnScWvN%Tps|GJfK9gTFn~=I(K!Z};YJ^o3ZJX6BuLDel#a6k{BB;5snO5svDb#_d$TRtO4<>FS&USX-;e3%4gO>}PVsQb z#=_UG$OsD+!i*!kpg6XK-eA(E-knIQEY;sWoy+?yv41}nl*R;fhkQ6jeR$wXX7(Cp z4r*rR?{h~}Wm3IV!cdXs&R*mGDo4_CsE^WmG5YsjPDvA5ZSPkOh4dBOX#P_j<>=%@ zFKp;+VrJ*)@%J(+TKPhLK>?Q+PrD=f9suXfuYkX$5V4DsI{qbu@nUEk?hA0}cIYo_fad*S_gr-uI?>!{DWU@*LjUWj9zA6=D@Oa|tQC1`JR`N(jo)o=EKNh_ z42Ei9Ye)?Qs8qm6CtS12NpM1j*tn~(othid$2cOZtV~s%VEGUtC2K5NflcMnk6Wv? zmU)(Ivv|4KiZYr-dpng*711C|jxHNwxvZQTY4)JPjR?5XB`Kn4Mp`hok#nwC)0`e- zkhI&&+NO5-oZC`VZZCWNTKz_oWdc1e^6apl?Y$2_?AcqSc^Eildo6d(*P}zqW)H20 zt~t28Z0#39;6GAN68~xr3vk*rGG+gW4jg9^a}XOQ(@A!KOJFKypfv(-U>XJ_#EHxG zK9fFbxAs=}yv z#<5Vrmk;{q;&H@mKV|(qQk}RHdtW(dX1MRhv$qUVM}QGDMTlT{~2GG}vSW*Mf{v8ZE9PCX#nSv5D87ibg&~QuezbW2d@E%Yi+g0<| z@=#2?|FZD!Z-!uQXlrZo51MIFiibDqFSOnr`Zex^Kmkg`2tptsAq`s~5HREz36Au@ z47!19V`gJ!99L8SSv9Y(kA}9Fc@>1z5Os4tE-JD-o)PjdX8knU>;{LcgQ zLJCkmKrduXJ;Zkx-#$Xt)rAcY2rXJvTVeWBxvfMNsmYca7mFfV!dI$RxHdnv-{;jjFm!qv9awK5 z*3}wYICOXFlgZ7hT^zK%BDa3!TAL`GUnVv`inOXW*yHFA&R2o1s}nO$MHN5dOUq-! zcE$zSI`8#Ma1|w_Z&wW~R+V$6U&3ctkXS!qGxCyON0pd~%;Nql_jPEu!#N+eCPRh~CIw>_U~OQvk>($egMW@+`*dpYl= zM!G1CDikVkd2U`?eID{4CnHX^N|`KkUP>{~!J=y&2+v-|Q<=UCvi zAeekD82Pr`w5#{G2LSv6U`k})2`;dj6fW<0{SV93FGBf6z}fuhU0#)d_^lbr7N3Be zUP>BBaYXQ9iGWpOLJsiMnMbB211Lci@_8Sk)2>dq2FobeMT1G8&Mr2%E?O{)b^~iL zi>|OdMKdZn&E*%1ZY3SIl0XaEXVBRbX-!mgvrsuLLgu-Yq4-Hj$CR8h2q$x%)qMI9 zgC5$d+q5>*A$c`#8pfE>=Cs^r$n=`yknU^O(b3wx#J0oNKP{JJ&5J%KUmhVZVOkZI zcR{(*Ghb1OXi@!*mLx>Od}{`6!%#4gtEUF>K(Jbe`4QZA)4gK4_|OU?yV-X0K!zJQ>KyOIV3|9Gn1K?aV7d+Sr<|kr`3a z!8)MTPEmd*#jEo;7w;?%G2|+lP$w;WT33fUWW-K0Ir2dYjM<=#h7PL3!=gSSL4mA| zwkjk}i*iN%9W(@Z!k{e&jmkaX2W-xtUzn?nqEIwLO7YBNHnzdfl!*SU(AFgMB4aQn z&^*&2kKDaa=g>=+gD^#%;}qLZ?Up96 z?46akV?Y^+)Hzt=(7VK*>AOQ-d7;K-Zyk1W*gVCa8Msqgap(I}ZXmbn^Bv!HV{pUD zy(7LwL*f$MDtzn5UhM|@pU$Kfo6aHPA1xOi9sV@@rbhNu{hdou(TRupF_&qSuP7K7GAs%;vVPlF;A53kK--Tg>^wPf{6<<8U4+52PffcZ22S{x?JHK+r_N7A4Ft+APxUE6ZCwLiws@>hN@*mMea9 ztyvyO4#lcdZ33@dPWkZDt`tX*zZm}Is5?W_odGodA^ykL+)6xxvPftb=~QUwZtZu1 z;;`3S=;MK4p4VH3?I()^@xtfW_RV+kET_*>lsmnIZT^_i8v+;NZJaPSDuivt>k^~+ zc1G22RJT&Uoptosi=hd@igsx!CqV8gYj7xb3qcEa0pFOEpdF#R8NU@Wogj<=VZ{=v ze!Ye8IT4(kt$?fRg@8VwRGlSF}k_wvzP%udXBC4@SocUVYkrSD?IBS(MUOz*mKOt0AMQQx6Sy zabaOWe}-MZE*&$C==E6>TlW?Os!@$Uh#G+F;`V<{uA${ z8e#3Wlnm@2NP?JJvhu&UCui;wk(gg?cAiQ_Xx!qh&^JcLVl8Qp4|v!MXoxsP>p!}?>XbF zr3+Bd7Qf4j#*T1ek6z~kD3Jpyv2M#tgG9Dq8&m?TRUG3HMyY0h;BdVG3*3S%ERgVN zC@nDdkovY$?#6=##{+s)H-$ImD&_e*7?2mofS(DzU=f-51TO4(ZfW);jcTp){qRxz zOhwhFO3V&QN)cTi#1o|EV)05?N=Md38=QrpvFd!?@ji>cbvl#wt3dThy;)(JA$o^U zz2WUBc85elm5dB=mbSW8Tpn@y-9dyBm58K7yu|dq`Otm!qC~gd|C_cd{`-aR%~v}| z=#(zo4ThS8OG4_9Pfn(c|ggN9g^`F0amWYkCk;BFdc)-yNbAI zrCnUB(iN9<2AUV$+Vzy9t3t}UE3MB}Q*N?M!>T$u;Ia&JYs+k`%F8ryEaz;nm%(X= zS6WybL@VZw<}Lm6DD1RjDl~1=QcS+jN?Gi=NDdR*WHWvr$TB(|H=bw&v{(gQ(qJZc zFRz!MPQ|M+4oSMIGEZnN>^k*ex?F?|FnIF(Dn2N6?yS(JE74`OiL^hHX^w7nW7d+R zyHxoF4#AC_9G3AXuPDvA*Wmc{=~DaLtiz?tLn9-#ZmYq!VmfLVC3U z77gyBjv&7rRck;6bhVL+AUY?Q5vDqWUt$1@5-bUYLr@-nC64fUZsLiphg^y1QteW{ z9DOef-y1^iwQZUXj8AAT3DIf#6}onG$d>ajErTiw&Fw{8CN`H*2t`sHF=p`yybt;W zP-q`dq{n;&#_>WJpEM-8z)_31P)3O~Ly1MXg%6nxZ%ioc1Ps&}Ws`6&#__;50)saF zu+Fiof=Kc?-ob9DQLu=v)BIH7#2|SiTnvk1cLAM#lkq5Skq(aq$@Du`&S$(jpTQn* zpZ$EkrH~Y#57sx)GA1GZ`n3{v=~l?2FHO2;gfr>VrA~9!Lz{c;yE!;xP$d6 zoSPO+AXLLUnr7a_-eu}|ckCdY=LbeX@*#a%I2`DH6rf>&C*FAbZFOI3ySybM&b|6m zZG;9vi1r^xvXCKmt|bb&WeS(#Mvcvgw+xAMARk^aiQT-3-N25w|G!z|znVYQ9!@45 zUuJ{+Wj6m2N&d@hL`v~_qrXD2kAT>p9d{hPv% zv+|hX3q?JCZ3PHJv%lxNjy>V!R7E4<$lJ%Au4oN{LQ7~Z{{g)~ zEf%M)DDa14Tfk!1#iV{sy)iFqApS@NrJUb~Z!$ZXmLbaM)L3(=dX<;uk7b zI*`$k9blXv;Hi0?AB%qGW84k7N);h20x3fhO+1%qpRQ*4Z4fK7NO8YgnUx}|1Z_uo zTtDuN_?>fqEaF25K@aK<<5XJtnAm5rQ(>EFPf3TxEd5OA4{AX4%ajHfvDzb8e>YX9 zwX4qk1qe_#Ql!Y(s&-O?Xd6qUbY5|p0mxw|Zi_MFU;DX`Cf73(uPCw6^=++f?9Ehn z7}|0hC)(SpxkEHU#}d_9bwWPoknvWQjw|aeI^aSR!dPT!g`N&!WU&LeXI*WtWz$x` zHk0mx7Vp&IwhBo+A3`T!=)-27$~QUP55j1bm$oeJiQ4hzOnA6!N$3cfB+KpXWHl(; z_6~c;472R1&$zRS-hP_?xB<_;yo}a*ZXCYvel(YeJX4_WXoZ~X9uaj zK{6pWv<5A=OS<;agCN*PoD5o8y35gy3cK4G5Q(W|kL3XdRtnudSCEV01N}BP!0_>t z*7!6EXKJ=9Cmrny4qrSrht=99c%gtXx<$~FQmxb4izfO@wUVbB%OyukRBbA~UApUr zZhhPl&=jHQ?jX}S4M2UHmAIp@V z-Y?MmFB=D;Vi6f8zLCK%pU!y6OAsT^Kar6S+E5*~|9lsanEweK&s7`P+zN0D^7t79 z$VfyH8rI^zz$l6BZbxpqMRnc0xBz(JPIM%g16RJon<4wc*=ht zNFESQ{x{88UK?dGtT_bUl$M)^>=U2tg+G5D4lw+1G^X}IZHpYVr`;SSc5TtAug8{r zIC%gAow(?Sk)oWa3+}1I1uXa_b%TJl`U-C8&00)oE7p#(4jXB=9c>pyW*$TBH>>H3 zcJpSL-ySZZD?Dl3Gk^_ChZ2iQs0%od4PyzLD{RvYX4vX0%#ILS?B!;?CtO1tWlu{% zjeZ)YNAp)`;d@2;&%N3(&_biUPUEYl(Tpv};}!WBfifx){E+?6HujeI!@ zD%OQ&NS4YY?l90zvYR6}*6nzSF98#z1G|k7$tCf|f-{eE>AEg(H~1Db)d?2Z7Nkd^ zXx<_}GYH-hC=sbg=;tAS$Dn*>l@u?$zQSfI(Q#MG%(Y`ZvRU>6u?gYK0TfatsH)MV zt7hc`8lm#kB;cu0Z?poAq1@j!Th!SGngMDmu)Bp3Up%}YxGAbSeTfkjvnsGZB!(Eo zFo!=aPzD5aWJ2-+6(qGV-T5!YgR4?Fx1f~0A^Q{R4qY~ATC{05?%a7DIRI70*mSSl z&ZF@B61HC|y#cz_g2CykXE@Ti2)|GB(u{NE8HhTb%q%mHzo#Z94=*%o2Mf^{6yD-h z-lBx31p7SBlD9z|RUmK+8xf#^TBHVvncQ zi>y51{=fTX5-B0@$Q*sd_dF2cLq1+$6tSIGjf0qZOKtl% zHg9v_HfZNp;NgV&KeQhtZ4Ax+8FUgS+%{Ccn7kLE#vSDgEEenW$@9n&2eajg;{M43 z3C%19O1&2AxA$>2hBTu}fWv!@zGPPGju0me1$d~FTdjHnuusHLtTQzS+anN|nJ(-p z_GdRUu|E$vIX@xn;cwI#!qvw){4T83oIA&}SEwm-`?6O&TE>sTGuT%<$LP0zEEqQo z9~Z~C;I%k!F4qw$SiW9Ok!{?Ao=3;DN~qw>^6z=gkPeqEZ=mf2Csw0Oy-)ajIci6DxV zXXv=mCT4hVf@gh1w<3AE|5TUY8i3f6@*IE|v&m~lK1tH0QJ!^KYjAAsSh;4emjY53 z)7FGT8|miFs%H6ZI9pf4DWe;n;h1b^x@(xpaEoXPhdWRyaP=uy=RD5*Z?k*$;=Qq03K7zIeyFm50m+J#AyCxzaS*kSMd~eCgudV6oub zK5Z86B?qPVtKit)Y65|{BO^v@KFVYT+G4i&X;SpEu#Q95t2d1?_JTul=atlvBaG^_ zQAzYvo^%8(Y=y*;ms*|Ly%Rs-;%=26s_!@9J0!17t_1h4$Zv`;Pg@*Lw%0d$O6x^8 z1=5ygxZir2U!fNZ`5Vk5yEC*2PXu*#uCv)G6hpkqVOD{veT&4qz^>V z&4RbqWe-C>z2xtMM;bth7{6s3sBfGzr`ANKg(1YzO`?jlLwOphMDhL>us;(hT#QVS zfa;=51(rg98J%{IeAnWY%VntC0X!LS_4;71nJoHIKy8GA*%P2;<%IgC0X#WyN~(h0 z#8WFq0(t;KjDT0?nEW@4o&_9i#u;d;|K1K2SwC8Kg{|S^O%4D772??PX6^s|#&#X@j~`_@Sfm0Uz#W z!9KZgdd@yO1i}0T5E5(tk{Tkf^1=eyWFLXgSFi^Rhhg!O8A2a$OXe+FAB*a{_N9ctu8hQ;5VIP(07ZiD1j~$fHupcN7m_|GM{E>!OJI2pnq6uPee!wPkQ6`kRqA2ZnEm1)A z9K|FP%_KG?^;4jj>kM7eJDVDJWWN^lDqbkjeziE%q&bt^i~EjeRFhlTLvQ-r zCO+Wgx*KBDPDOF=9)5bWlyzmB|7K&C1~FiAw(ZSRqPlo)3{|N#p??11uMfvJsImN2wik?dQtcU(7{yzBV_+)qfr<%#Kq zWcOt}WCK%jW&JfpGaA6@2WYUZgWg$Jfwfsz!4WJO5RR=7 z^Yh|D7+5T7zoA>!LK0*9=6&zu#&6q0pNPOK7MeAn`aZX7+bSMtQrMaql2j`ajDw9E zn1Q_s^K4NY5Mo-dl%y}|p0z(^!dq9R<{903lcUval^REfw<9fi5Y~Z5m#lmhxcWs^ zyv6OiM_)J_hlNc|E}-aCkALSfmmRiNdvBwMZC;x!SJ+H6>)rq1{Jqh3{iau1FgB~8 zed@E6G&MNKi8&ATq{Dzs5Tp)LL)c43;Y+ z#i8rSd)TkR11v|~@zs=V1}L~5?`sutBa(M3a4Kduywr;q|yD2Y5G)j16s! zs{6NIRjkSZ`89N0AQp9`oaKW`1-M)mEZqqC#|(aNH17cgzQZ*tvv-8U)Au%C?mtO; z)8HQi^Skc!xq4XB59zjnHIK;kWf=pq`~d_Q1Bit0vIB@ZD0+VK3v?d7#eoqAa*JER ze9r=4m%&`C5X=VrdIE{B2p!37Keb$X$se_W;3Qh1Xr}~dvTCtrsuhYH$@iSmQi2xn z0GV=m#3>h6`&Y(=ZwMZ5NYyvOzoisk&133kl&=G>bUfgsQUK1aXV@w+pd6#F^10KJ zrg_sz_jDz=t_H4g2U$u0YNW#`RO1xfLMc$rP_7dgKb}cJS82iFa6*j2zrf)G5x_(# zv&uJPdWbcMSP6l0Q9yufRR66yRkm|+H2P;2u52N{sDR3wRYWVSX$-!JVSE8Ag|z9fh?Qav z>5G{u!Y{#f6c8`wW`Y!O@TO+>qyP>F%YCj0jeeuGko=H1xZoMf7 zcRI#u`tzJ^TF7-qOjVarWl3z)hrCHsCn*)PsyNqnV zvIEtx_UBSoFDs^QI{Wt#at%q^XY&Y_1&6&ch(H&P<%C;6VcoO8Ez)PHCrj5y$O~@I z)aC%1>)K)SbyI<5Y2yj%ZC2?=p&y8HbLwY=Ho52B{_K27mcznNxkAz`-JzU zHBtF{*;v+jESpoNY#-$?XeotFQGmF{QEqyGVWyHj5C)n~Uu%G*4AmDt7l4F{mZ*Tr z;1FO6i7BT=p6iZSekUf%OBbxTFn1p1X_uChe``$av2}MLSaQ(HXXWyasj1T79NVtJ zW9*4ZI#aSl@-=zK&LDU5!%uIFFa%JP7L^N;yyp_?M3wnYXzygfBims%x&Vz?^%11- z8a;V2&R5?!c185b8bPn@A@l@>r(f9nei)T28d2k%+2%x1=f)L|ppLs4A40 zY3vzCEVauo$JI@*xhO`hceUSynM2`C1m(K{GVRu9qVmI@^+~XD@;c9cHbn^224(n? zQRotz=tpw;G<|n6bs<01pe&jrudc*TrBSnfZ%(mMo$n$rj1T|LgMN(!w9tN4poL#K z=znc}s+hPtOWNAI{1ZA$_zOBi9r^TcrXoWPLcgVpSdBy$xf>QO)DfZKP%dVEQxfhF zA|!2+#CsIf_xUT`9D>L~%ACXE_ahj;vql!ina9F+oW5TBo%8#OGlT!<&p+S{AtQ{= zMoNRI&kKx=hQ%Nbn@0tjw$~2KBeF5{lTHo2Q^f4j#MhA;=yw8x!a#HJb=|BZsJa5= z`fRSo4b>CJG+p`0Xwt0Cubf6`np~Xr&D%R^k|yOk8o`U zODaBrYDG%HX-DZ=M^vCe((UyFtt%=%8H38@)mqHJ>&j>OehSm2vzBgpOKVa-W?4(i zi7pf^ifWDdO3JUBa3PhlOQ--#S#4%nkLW9{3C|{5B-z$VEG{aPGG~xVCp@hf+RNlL zS<8q~6g)3Qbrvq-G_FqG---8F%j6ZT`dbs|TPl;XCqm90CeRuo${759>Q$%U4a=F9 zVzPFt&g~s3>NJ<=d~)Tl!_*_P`ne5dP{ddIbsL1~pW;L%^xjl9$RQ4jLeLgaSjJ?efW+CEsc-Co z6402OS`}cAFF3@xH-w1?Grb-nP~7F%j{b88^NTBT?yD^xL$%PqESE|(EBCvQOAI+> z8PB30S(_H&mBhuBLIZ&0%f8kD5p|r2U-dBtjVY_164)Jx*822ZK-W$u$ zTZbnCzZxGy1WnR6@{U~=WRd6b2KB7fD;pn}Q)GyRjb{p=mspT<3T5_b-UHu2Tpde} zSPZY^r`(qJP4dfYIUZ8 z7lo_qk28(DQsF!)@snJJu}CR(#|&R|OHj?W%32l&ZZwCnX;sqWI(D6*USyFg57f|U z8!3ed?!4}bKBCrm-Q&jq(-dd_I1P+qY*)|iGhKJ zz(R~6K@x^!gn(#&=sJ|W17B+lwdXa%M`=h`flFU>ue2|9RcSRn^TLEF9AK|%)$noG>s#$OjV44lB$m~haK3=n(7{UNWshDbbb2}pfLo$H za|hR8IPCuDhC!i)lBim))0{C4GN*!IN2E2eCCQK# znG$hB-V#OK19YtE94~nR*T->NFM3&|T!dMMHzRI|vt*U7S3G|a8O=`7F1u4sx$?F0 zX+@rqWGVVzAX;bSEi^G7@adSbj)B`_PCfH+!fZ*~!($&_UeeSF4ktl(wuVQpF1ODY zY^+JwG~}JJ=AiS%@962cal~kt#5X&4k5>8{P#M*X#lQi=KKr z(GNM~E0&H%1l*LbS3z7>1fjNfBeIr@aAOwvX!uO$(fdy+w5pj3` zKWUE_01`j4)uqxcdONMOM>#N^cundU`u>_czXy2Zc(SsK9455yv_WQtWgoPkrG{{8 zz=yA)ogd`vwpT@|Bt%L(FLue7@y5T|N)hKe) zwE{J_73(w<)jguwR^Hugbt2@g(>Pc7VH!dKJrjsyQpE|vt5BUJi0E208rhM{U}a!p zW#!&PBUm#X@UvsXB(tFP1o(abtm)m9O&Z7N1>aSx6+_qp^`}`WD3y?>?N0Kt1kZf? z7egcHE&6mJ7!z$~JJ0PzSG@vvB`d}h7wk+=+Kh6M)P=+Hn6*PpoCSxSB&vh1L}@)x zmHE$^yzC(HcCv(3XPZT%lqAA(stx$U1aZtd#4ib}7dQ2WcK;Ktn$8lnG@$hVN7_3@ zSN28Wp8u-Y#))m)Hco8YwkoWoV%xUuik+O;HYzqdxBK>Jy!Gvu{kGN~d#r~&=Um_S z`-&pDUCxcCZXVSM{$Pj?`kX62o}~H-Tv8>g@$(jbB{!CM0KZk+-W4|H6}UhblHD{> z+eUA>&}|Yk%&DUm@%6Ow+r2wH5G|hQ2B(qA^6Ag1otGuo_Yu4}++3XSWu;cRd#(l+ z5AGTfq)1+5RvlfY0$jAx%}J~oy7>eVE#h1+T%g?^+{`6Q9Sd)dkH=;3)zoD;H~!2s zrjPsWi|7J3b5!#k6Dn?>8_uMzT zk79wdMT6DXG~d(35xak&Y<<7}C4+MY>?W7~x(Ciz9i7~TQd>Xmt(FIXZP^SezvMmN zESwnQSz$|05u*n!xLflB2GCb+D1%a3z#QxLb+`Yns=XC^v+?Up~@UbQ~# zDnU4gI&UCsQg8P^Ed=>(Uw`Zn*ka;=$SoK_;opF|mDo)9{yFWR4vmm1?;of7`vo_9BNINp3r=({5?0Ab3(OaT|^=@6jx@sdf;aJ}Z_L^$RGbPZ%S!`190haxb zSj_>eX)x+LVZ~(}VOOSqY`b5s$D++i?Zfz;rd~xg)jCsil>xj?#952F+XN<|R8(uS zhrF-2%hqgnczs#y*33xfD@;NvWZkw%8^h&lKX2%aUjKRd_u)HRwz9**|I9Ybm1@ej zQg3q;_mN#*uQ8$6GTWPFM{!Y+wA!ZZ8EFExT6tg=LmNZkxw!B%OvyE_R_k_UD$Ok5 zTUFW(HTRA1wyMy+>{+c~btmi5l;Yhx%>#TeS~$0W4$*YkXyKeA>dH!tDK501j(&b- z@B;YbEo(_fn(!`01=2%p$p0_){xM#Ym_efMzL!3wcOPL=amMmU`FdkLpBp^bA0xDF+z_T%nd zDy%1MUanS2neLA+Pmojlxtl#?n9+=p3kvK{7eEHf(3@*NrKg-qmb`fpt*7lEejg{@ ziT<06QJSs&%t-};q71ZfH&~-%S@S%sJc0RDq^D2{%1fbQ-4pmX`{9 zCMAT_x<9%qZXOD0(lK&m9l>AGS;eDdpYbTFEQXD}iJtY6V?I6i>;`@6;E@j&t-9Tb z(ig0}tXli`#it!geJZaDQ4V{1QD>xS3&0oQH0}N`n&aI+-0egv&xFxXW!< zSyw3&J6dmitbxY!_d_|$3=2N;HAa| zQfyNLDQ%M#e~+ZIli8^E#+8Olg(5=1q%27Ka%g7Qu6{To}aTj{l3( zH_P7$ftMctQQ~1Ku1{4f3OgYq;$b(q)_)U0NqlL?6jnp(t-X2p}qtfo1-40mRUc#KHnB3^h7xk)NJ#gRLSkxrox zxA9^JXo0x0a(6{a!E;3)2dW6tm6+0a4`(v`ay_+)X34`gldBs|0%y@+l%?Zjw93cb5kiqB`lsT1HFOC-Nc0C&6gIV@qjz6_{!|DAa zs&UF96#*q?ROK4&>%dXwka;u~FhN${qCbM>Nyp}^vC(v|)SUN;aaYA-P+%3jrVRcY z#j(T`!PtysR&Bqy5=Py`9Qsy}i*UdsH;5p13Y0l4xR2Jm-l!Xu27B&$We$k)vTLUjMeFYG=SWf_JC_hrKg+Y%dy0OhKW7|>-;k7m-bso>i_GK(k< zXyHxWrRWLZAsR7}%rQN#rKPz6D}=Beh}Z#OTY3byln3axU8DJHv!>dOZ_r&oF(^%$ z7Z6L?w3Sh)DDRfy*Up(4MFh5}KYpb0fRI*p>Y4~m&>HCW5214l0~|tAw|@F>kog^Q zglwB5Kj4o}cm&d1CUZOIh6rCw2v0cKy42VvN1A4CkV!{*LR)rTfEWKukURjqkiWkv zfeuZG5)l8n{Lq6P89Ncog(!dA!tg4xYYaH_x@b zL>c2aAFRD(Yg0X36T2!sCVXD=x@u#`pkA|l%WB6YUjyHjdgBC7?Oz%XQ=h80Zo}26 za<$&Zj@83`jiM8KwIwIEtF&&D*)=|m@EO0FfbsrXZnw=C$(xumtd;UEa$>zizd^HC z6rr7_aYtZYhcts6)XYdY3QPKb_H{>jp}pgemd8KWB;S5^hyEpoJ>$?a^d$bz3(Mxm z@Hcl^@y*Jg?1z|d1Z`Eab{W_xhR_?A?vHdxlIR1ejqzDO`Ef5b2c|Jf4cP~u4#EVP zoN16VehAyaZ##WQ)4(OljD!8Knt{!v!uOP;xjh~hBwD2D!J%F)51HAC{o=`I^m7x8D9~~Jo&L?@}ImyVN}$*Ze@rrMPub6 zxJw|5R@qA!au};E8hR;w=>uoxgXM9FEd5Q11z;2E&f8=HzH+mkb^Z{|wT`mla}Yp; zL2eW$V4lUVwEoH!%wMQ&N!8S%=!HpCOIqs~WDq7c=1V5ZI6*2JdKV54$kE!RB^G^; z6NZ(!hy#P2W}zas$Q0Ww-N9=`Xt+STWr{*jkoiT$xw+!UOUo7VBmoGXnkk;-$`$$J zLcqzuMM-=d)-_!jQZ>S(Z&AT}C2@mm#z5p&x@I^D$9za4`HTotY?`WHer6nkmevO`ARO$H zzU46<`KJ-r&pf3GXNp$A!Bw*;&M5@&FOdf_^eG71 zBp$(hEmr9lAZO%0%NN~|@ns%;_j6+Hys)!h-f4*QupvWa_i{@n_fmR!$sJO$OWxT9 z(L8GFO)|?TuKYR{XX5XK0ZrQeRU>EJ-dXnZ?H!`Wr~BHK3go_909zq-QngBY^MfdD8~M|^8Btfs+SUx``PyS#lyyu64jMGClwX#x_$(2B4|>m zj->zsz!{csKMK6ti61!K-!td%C5x>eCnY;HJp2XZ2BS?Hx?UpFNX6?7=$gqy^&FPi_ zgET28g!my+qr{afBFzdyod#u#a5j2`&ij6&Tr{!i2_k@f2S|`R$JtO=0uWOmPWVg| zw|>d?u?Dpr99Rjhol9M`} zaNjx1QbkuW6geQxaPw`^lI%ho=oKGTsn%i5_7z*I6B|tOjAd3oeW-X_A{z*P`FJGj z#m*M3GMBH5Ods@>d%J%%B+T{MGdn7XT)IVu0A0t@=il>uOnIWphd|YCvimtJvRu>4#CdFTK6X%Z`{gY93jVt2^?WV(U&TFx+ z(E<8=WN7+g;&}Fo7#k^yLa=MEGckqY#YA|4BM6M1Xq#tbatjkZ(VN&5njSPX0{ydS zKWBvRAmHrnPhA^AT-EAa(dxv$Ag~}Z?Igf4ZPyw0zE53wRkF2{Sx}^M+dhp>rTBWc zZo~^Ej-8z@R9X0awss2URt#PYZO^WU*}xnx@XQtFS~NQ?r$|I8KjeZRv?oWs&}jN6 zC%FGecY|go(aF09ujc#^`})$hTNAh-YgVpL!Q2fyG`iTJUMsBJqt38^;9O{*#QVV0 z_Vz$!;ULoP9qC)pI&R_Jxu;$J;vM$5oSO&Vp%VE(z|_~xqtu!g)rs_S^ow7M5Cr*A z&ae#5vY_5AL^wC$)~R2JbUyX!(yc=%9Qq3JxgH4rKT%Zl07I+b zZ-;ThVB`N0tya+6JZuxDmam{AdFry{>bIqx$EfM{T7WU1TIKGys$E*EdH$ew4*QYa zENswfzsOnTb5Ab{Z6FJ+v8j60$(sE_AZ5`*JD<)dnEhg{ga;JMKb9ncPU{IEfa%%i z%H4twG8#K;z1?{bYw6if85h3j)I|Ex2VUjQ4I&H9YbJO}eTi8HCi&6{e+{Yg&50OfIA9d!7g^^0Z zsZ?S?V?Mt&nRe}{E@570U&MMT*2M2|(N4vB$-NuSml6E1I=i9Zx?^u&z&uyOpzmWJ zKivj2*L^n~Wi1bT^~{rR@B~@tQ3MeHRyi`VcdptQ7JqU!MRC+oa-|qQ(6ufYM~!o( z(|_fVPmMOQkxr#6XP{VF(X?j}d>H&cN64RdJSV>Z|NR%n^}jqqW@h?7M#$CLP`;{a zj{?WQT(9&HA~RJUWePAD8hWA#bYZKXkisZoOrd?!kQS)m!b*c3ntxjgGz~G9Tb2Tu zF>UMf4INI-Ixg3idTKgozOFW&O2~v+F0Q`zM>4OrJTAW(Kt7i*mtNQJ4oLhmVi?xN znKs?`fMu^!ml&S_%+6;vMsBX%L$c+!w!l=+7gznWJu`vZTfkhSF1R{0j|%8ppbN{h zK6LC^p0ux@@wd|V9z2)UvN`Wg?94a5LkRRchygVjtMeI2|E%Ap=nWOi;H>zvV3)N= zPTznb$mVd9M_2>8LwQS|{KWdSb9lo4z^1reKVuoDLmvbw%n9A01d=bfGADF6kiUIS zv}_kQ?_3KdNcZ2wCY?sKjMaU?yf2_ z_f9!$Utn!)CNe`UXd2@_DDPj;-mRxnMkRPQ?FqRsFL*bRWoM*^_bHuHlad%`#Dc^Y z@s&R2eFR@qiv~nDMeN8yy$nI^#J-tV<)MDuNadWbJZ6*3V*~J!h1fDY4+e)AE+oh8W`zi-I4(dU6{Vn&#Xr)g-RUDMk z`7C?-IX+}CamCr7mgbU4=Y^dD|3BYGc%-#fdy=C$VBwQxt zNrG?EJA9E&`4o9Y=RE}da=lT|Un9rui6l(OIX~EZ2ok`$Z_N9GeH8&I3r|3NkkG!U zW%Ratw#vrKGAEkoe|+mBvvU!q>cnrh6!6J1Q37_+GCneRo+5_&5I^|rY3%CP<*o=}eg&#+mS2OPH`b6Z`c)$F z_Hf=ydA_-LGc-Z5v^bJpa{uN>Yc7r!fAb&d8j~v|fi}=~$GW89C#0d#Lwtv~=6;0% zcHlnH?Cj%hzhBd*UCJmx&pXWCsM9 zpw(KzQ)1xV+a*ad#LVeW1ggsb&RHRI6(@DU<#ij6tsc08-frmY?;G$qCH&Os7len7 zQ#mmk%q6fDtdMiksl_O9qy=;hN)jPfXP1YIW#@*^YKzv9`z@}7BLa-Q!ASvelve0| zzHGEvFiEne89Lf5X*kzWG`wu7kW?+qrU^if+n|z9J!vZ|y#}iV()m8sC(!hEtgh0;@l?_4b+pcV{x8#`3a~j=W$$mFZ>O-Ns}MNRXr4v@Ga{Fgq07|x z&n%R0+Eugb0BBA@fvB!v%IZ4_jyOxw zYjn4qJxRW?K@dGw)R1mRK@tgsTP??X=tx`ztQ|_4xyTmP63J>$ftEOq=&0@3)mRdh zU8WoxTZg9TC4Oe8uK*IVKq+SFRi|uT!Q~3LU=2yTuof&$tX8YdjQ5A|I>GSxis2{5 zC=%G>x2Tqq;RUDhnvbTjIu9B%&{B_4zUusm&{IMo|%?^bXNq|NW{yv3GL4p5D*%8xTvCx}y27XA z*pOG3_YzcbSpS#L6@{Cr6uUwKBqBW9eI?l#4o@&6$sC`LIjf*NVYV`(SQ-IlvUl<` zYT7nE-+HKu=erWHtjEip|4zy=S1u?aP#S1#M^`fsoVCB^699y_?OYh=4RZG>BJ3rR z?Uxsle2UFab2Kl8xDD8MN z?T ziEMrJZ#r|5wZ!i{p*x~nGP9M33*08ipJXM^BFlIHFJJaou&kfmO<>i7#i)Rz3hgF?|~o7jSDeUDg-P6YHnjpyvKhUc!gKbE#ofwS}sogDY!Iuw_)*+ZVZ#3XZ5c1eB^56`LEdn zw#K#J6E3*1epx0Rb$dvWHR?sw>vQ(6rXX1gXCe#JDvmWvx9^Nxqp zagYNR<9u#|9BHf$U2Y?06JN*@7X50D6~dj#>_Pu%Q2lGCM&n)nkg3L|(s?HuL;Mu_ zpkMWQ_msJ`f?WgcHT&pKz zEIZ^W6;Z|6_S?3v0ctE~evcA2XMos1ngA!C-Hol7UOwm(YyjI|v0j^J!Yy+Y#W&#M z$#jw1?YN9D7%v5d&8YN#;#%jzs|bP#`j0jBV044d1M z$xo7G&S8KfB;G1Bj>Rz7d{ZxhixApFD&a&6Ly(;nkK!!Hneu6fX+%d!d1isc8Dcd* zP4-cly;tEHRF<$+Nts24H+9Bu2?v!T5105YEfl)};k8hK;9wiNq5DIXBA|MUnqaX3i^TOD|Evz?Z$V z;#r)9*A7~O%@98Z-MBJOl~h_G+7+RlxMxVlDyFrF-pWUSpj=@^EQ!}GQ9O#UpYnMK zq#|Dwd7{Hqf+%N|bAS_Eau$wJ(+A+$L&qQ)ebGu!{OpNkkabTy!;a30NKZDy-kW7K z;+UW^Gu;WW7gSsKW(>#8TpRnVa8n3+TyEp;1KJ7yPzbh#%K3WJ)&gpJ5?mlT`=Y;H zt50+l;UM6f`x4fD5Ry&13Uv^aY{U_;QRl>l^~1~12FaE$N39PtvLO86s1f+rnxv>Xs-CJ~7N{ej~@#FUBO^XuWvEKMbUt zdcbTe`iBCyl_uH~!w%H%G3dVprL+nx3>P1|?U+`Etyo?|=Anf!UT4Z|f>3jnKE=x@ z@&Ns^EU+%YqxuO8(ur#wCLlav4)=fV>&TK&l2VfE5@&!qs0k5#yrp!&61n)mylObK z!M~lU&TYg4@`M;gam~uGB^An!7@BL|5Drs$4ysYTw#pQo9Cin;mWllNX~)Z9^H99$ z&Gv5@YCh~`xB#!*nr?Sb%g>;bBsD|oa*#|xcK1_K_PNFdo(6U=5zZt(OI1UjE#p*Pm)$m%->*;DU~`( zi^!j!ECNwyqDP1cA$|XoN;A3pB7u|qVEn9^4|riYG_2BDSz3RH$3!rd(Wx3RozsZA zWpCB7}D=H99#?|G>nBt&SSnIEr<0s8gi4Xn$6VQ&$LYi!fJ>MKu1Vj<8=^56adJ zfqVsG9J4EhNkmK`qC4cTjiYukN-ODYQSar9_KR_nK5{Cf*cCi-6>M6v-rn2oyz!nu zcO(wa>W$7l5ixE>%J~wqTm_?x+R~NMH)XWUu_q0WhF!PB6Xb>6_(lz( zH-xT8Jg)X+PijZk39r3h;~Yw2Uw*t&3QFf*N8Us93V-b>oXUPi^e9L4sQ-GEz!%!C zV0qO?C?Z@ie3gza$X%?zkA$6ffW=a5&PaX*TVK?6FRNTF=V*}J9Q)-)h*e3iTadHk ze#X6}zyjMKj8!!|14SI`bBYS8C=x(g5=?rNdK{)f_>KUI>o$=}=ymj$;#5>XbOt0? zU_>vHM$|Q=wfL}?V%N36b=BcI3(g_aACJf&9tXzJDk~5jrUdKBkinU;q_5?S znF?X>NwEMxedZJ@3b({N*u41pOV@@|{A$)PNI#sF<+9-=em;Tr$1R+ZE;g;4W`6kA zn&UANPN!Zo-M{Q?5_-0+z!U0M0IH;_i&1o8VuE@t{R#R+py>!xt5y907jYZBdGUK( zKO+wjIfSn>ycSwu-FMyx9~*ne5_SoIt1MQVkpYDIGWH*V)U*dMbg`4skj z+*3NuM&|}y>&kgo4*OKIHHG6e=xH6Z0+;!wH8ICcFOKMGg?WgR39VJMI}|7*GeENQ zA4IXZhd%c5po#JXTI7V_+baCrX7{cZr7HZPeMjA)wHsem8youVK2fZQu%<7D@z<-p zs;^HX%ji5=Ifb8kG$#$}ONgP(qK5wzHF@Ee5W||2>)gSs@LzbBBBD#00o%Zx@RH`o zu{ef)^jQh#NyL(qTlyw-ovs*Zv?q+YHsz>x8PH--&5!58jZz`XXtp1fUFu;D8A}uA z=WJd2JE3t!8@NRNq-`RpfWAp+J#*7A%Pc@J?O%C-wWDd|56gCdHrtydtLhcz@Y1^q zxzydvu#5uJj`S=Av37_Inj7Osq6BpZL{d|ZjEqC`+D<8|++}kb4BhS|hx;}S1X7tf zKSKXOX8L{5L(BMJajUTknEf5bBdYhtk)q88!ohd4gFI}U94=?NpvmYzV_$PSf_7iI z#MuUlT1~_Ho@MQM{Nx^q42WIczWLW*j;WJgt>IrJ&p827H1MK zXrsD=@JTc}r=RHj0Z&MK-93L?(X-Q^1U>}FJA1`TR%xi{Ply8~q5_5GRncK#iv_a^ zBtai#D_QA9RHlzbC-q$cpQwv0Hz=d`h17pd%CKTZwRvFSa)kzv^9o-qGX_UMbgHy2 zUNqvKI2Gw8)ZrP1YlAK)hysC^yJ)AkW=!TXHYpgy`w3Y*c$e)+i=%&2bGC4q1xyJ+N_&Xd5Xk@yVDo?5HQ z?%OPobw%nFJ3Py;tsx+NHa=qcxEi=mJF*abW>+LoqQ8N2WL@JD{DHLKXTK$8#s_mc zKH@==4}^@w+3`!{?RJi8e8*bEzzR-0I*X8<&9AeCtzgF$Ps0Cv$H1&Q#^*!uJq&=# zeAX=Q-Wief>Zs{X0eSF=F6+~tvgVY(T&eKrxD;r3otRFA3%FsUzB%>#m%&$frX)jS z83U!o^{O4fdF(O?p~1Csp`33NVSS)mu{aIFz&-evx`-L`-KHp-YF<-_VX8^pzclnj zrlyyEVM+T1Z40Nb&2Uu6rmG3MAwW!YXfAKsQG0JxWZRZyZy_}wEM*#vN;sZVoW*WC zCuJDRA&+;v#xZ0MRtal0LZ0qPO`bU<1KnRN2A8Hms|v@OtPd~^s0OkY?*NVsM2n3d z78@_T)5ut9)5xu(Rg{;FtT|G%i9T+_{7eV>T>Aoam*3Aoj%;Sm^Qc5Ri^+lL#VUYG zoWztRZ(Dq5UsY)nYfcMvsWi^aAHf_5PkTbkBd^ikx>&YGzgV`r0ucN!g9JP~+&z@x zcA^2U_6yzIscBqVzrFwkY{}AnxZmHQX^^*C3rHzWYxyG}+XXaR(}Q{?>J=&l<>%4S z<3d~I-Z}u`Kg(fBrila6+L!SI(#Y`;eF^vLs?z*w?h+4o4Bl$Bt|+yGsaJJ44xeI( z%JYq{^X5D;fL+r<_@h?kghzK_S?#A>`(F463EpgI+{To+f8|DTPTQeyIfd!LY z#N`y*frAE9A{u{Yb4ew7)!zdL&%+A#9R4E=|4fJrSH6FmqIfxd@`rln%EfBVT1_nQ z|L+U!?xcYYnJQ&MGeaPL|Fnz_M%wDt>QeWXDkI`pJxkV9)n4q!HFQmIYyq?}-2uTS?2>4Gld9nmNF#S8WGx5dIG>w@ubwL!38@9y1;j{eB@ zjrV8H*WlOD)H~tU&l=xQf5_$c)a^ZkXZ}x&x!xcD)DguivXyTMn^g_WG=vXTlgF!L zR0-InUl!!d%BdDvaG?Xq0T2_Gr{9>{b6Q(pMCA$hs*bRZgE-xdp7{cT~2j zB0bcf756Cn*%rO7MW}+7gp*evHHdW-5$e>+ob{R!#Yp(cCWcYS=7}?+TjzbJh6TK% zk1UVa54h6lB4HOzO&DuMtyA{Kpq6ekoV$L)+l_x1JGsR>YwG?x_Se+4D|1ow{Ou+1 zVkhkE%#Ph5#$rqnyoNYjO-=$>z#QBZk7yC#7}&egI@7C}eeagow7z*#vko5G#$8aO z@SmqYL)9-kUtV7rTFEEaxx!DA<@)Zw(+asaOJfERXBHpM<-83Ved0SJr{^y&Tit{n zx}iN_$_*5fpZ8b(-)5zX8BPN8Z&b$Xw>#i}!5N^eqQb=ee_rcoc=@VoV0>OqlCh?D zk=f=CiA<=Qvy3qbLqjhJ;pP>QOUp`;xaJQWpb*HJ?@fYBH!l^#Hp5xZYFE3RqUtm^ zB>`E)Xw}2Do87i6-1>?yJKgL)rhOP$6GO;?1;5gsdVG#@TzXwDxsSJ=79uHg{!^@^ z;cMHD1oG|tj`>6_i1oZ7BDmcveAc8EhzT?ET!@yGQ3{e2ca|fIh2gmz-q%ker4Rlg z92~?F1cb&xy@#p)k_HG64=BL!P&X*RdCx`9crs&s=r{ezpNYuF%tB?Ovs6?Zj-K(V z$NuQwyR-KdzRykQ!`ggK!1^(Zv@@aq9O5Hn`R1q!Vix{hF9FKSi^^-t`@wvV;pM9~ z%1@L;fO=n-Hv*22m4wMg^u3t`XnEt=n;PdD0g#1!6PM=@(d;mGz0UF;1K&$Ka5Z*a zmS0l)c76gRB!DOTQ1N1jY@+Y$8ZWc{@3DF9pdJ!uZEqM)52upk1P0K5V z;NKs1v400e6H=r9lY4kLfn{yEK)6B*E7;Z4C}U4%GS;)fh+t$fmZ;G0JFT_WaAY6k zGU`ax7*cIQsE|mkz5~u5gl#;C9j!~VW``M4|a-?Wba z{&qk2E~SPBZ1T@4it@D>C=}ffmUtT5*x39#)2`7!C7c;6GGcc3I4!rM$T+O!LGw`{ z+nQg-mL0;#_&{qsVM2YS2x?YAwmTfivT#Oj?=Sc{nIJW%u9g-uaw2|WV5-1{IbR4X zOQ9}9mY5G|L!cHBb?Jx&*5K*IsBpTuQDCKh@2w)i)-)tl@~k0FmLI0l0kUec zZIKh*wQ}AY1_@aaa3?A8((c7Ulr0nngfOwe%=Sw zTUp^^+3egleJx)xW0KQ=*?X+#CyA&^zmavTTrk;jLUcM?XM=mYkBQa#Zqq6RoL+1E zZz-3<6n~uu#|4?yk{}m%RIIxSqhrAM>sP19jg+=m!m1svQ)P2=fG*V_bq-VXJ=lU_$l2ij5k$2IIsLesUpS2kff8*%A}mHkHy5wD7If zrvcU*IW=cD%WBv#fkUvr{jh#6qxJ?D;lF$h*`+ifc&&i&)o+FH zHSEvU1>vxGO_HNg#=t~gq`u)Pt&-6OBJg1vqPQ7opuO$r0abn3dpPnoVP4;AutcVxR2EvXRZvUvn=Cc2e2xBaOrZ> z9y;E(hurzS!+w9exlW^>XZao3jgK$BhQB(owq7veIhmdj8{9Z#%cyqyH`Z+%&< zsYBakUV4)@Q5TFg8=rK!78d87gmj=a`7Ymh}P+W>IpfpR&%SE0kIs(4r2C3i_ zFj)thgg56FQfwb)A7PJ*$oPw=fz!y!HG-boSz-yCWul>Gs2DSh5y4@c*x`e6-Yt{- zeX0wveqrv83e*BN1$8QhxoL(=REf~4oA55}XjdIFEV53XpR9W04U(5^KcqOUUgP)w z>Kcw3BE}OU)Tk(oKEKfp{l&ZNjc;$r=k3U#ABziMOvUSTPkVA{v5oVGc4mw=H08W;W8|MB^Y$rH&-_nU zcQi%hb&Jy5AcT8T_hk}6u%8+-I8XqR)bxAOg)>Li-~zdOjtvnV0_!cA^h8!Kq&n#w z7HKd$QRp~Rx4Vtb9T*lS_FHI{kvUBn^l>xI@^>_uLiMeQInVa4)Y5v9EjO#G$ru+P z9l1P%2 zJM8ixwKy~3Mk3DAS*aT{^h^lqy#h7{1rxX-c~~!bB1`Ex%jxxyi8K%qP5xWs>Amk` z>3=@+&hDiTbm`_P>-M2}VdCxqX6|6J7euT_OmOGWvgZUP&q@@Yp>w)@h-P41rcb=W z>U}9YX?k@~ZQUNq+u}Ctp0Rp$U63)1E12KugLEtKHRwn!u+|t&@`{;xk4_LiaEZI> zuO7JbXYQC6yD+foT$&KH|3sa0JrptrrtqZ4=^No%#lEOmGP%D`y_7u>NH|5zj}OH!9;VP??=PragGowom(g{ohze z|07M(X`5S`@7wUo_YGSR{r_(4{NKwrW}um?i;0or|3okpEAcD*6h`)&SndliAVSZO zxw z7s84rso-!fTOBPl-vx@MB(17a~VBx(QADh$#ryi3anLbPQ}feAoAC}(J97+GHGw)(g+CpaC1 zw_h+X=uAgy!V*C9AKKd{3{r?o@^ZRDaQQu1GL%Kq0nnt4Ql`tDNSK3BT+Q?AFH=jbq{PC6(P}~C5 zi4sUfrL4)^ho?Kj{kvmt*v0^s*|Dlw+G^_j9$Xjw&4&FrpApRXe@UkP$KixDyxAIj z*VX{c{~w2==3?e-Yh?dF`HjVzR)+th#@;ezVVvv&A?NWx3@E42u>#!JLPSJ~kZ}{F zEG_fV!_t?>Kx1+|4xy;J6@S#}m$YSUDu-y6tT)H!2CbU*Fq_@_{3OqNu5|P&w%Z-d zSzyQjY=W0r9^3rKzQy--&uN+NyVtlTFd~^eyrmrXf0?hL( z_kDiPh2W<>zuV_uoB{zzXP%SMG5JftULmh`_z4ox_`4#Pn)D*m!-9yn_^~QyfG%N0Kl{7t{6s3$LjFm z!t!PunF^Z@cCJh`Bb5PiyV{+JjGN8qL-i!l}#C&tp<>L~onEsAP<?pfzBB~ag#s>)?z-2DMOn0gNcZsR68ZvEuNv2(22+Z5f$~N>`<7xSjZA# zqzCYQC)N_9*=HH)30SuEbFpH^ZVOQ+vzSmiR^LA>7HS^U(F4;-D1k+WNp)82#`fN~pKm=Ue%cEXnM65V?Lbzma!=>yj*f^G z2op=rA6X*6PG_GyHtVmH*k@JttP?t1m8LP>HNG2kN4a;4b|v$}<8QMKQA8X-q zc3VbBwHi?34$c&@hXzSDd^){SyW&xlzw82>l9Yq?N_SDt9VE}+LT_PasQke5`hmY# zPU<76@VBV5} zMLT^uS-OE@ewPIE@6TnIBNSdvl7oCZj9|USdSCoI;glKJE1mPn0Pw*)hJOe9V!LL1 z_bG6VTD61BL0kSpL9QJX2CE&m!A6J`+Xx&OEU*ea`pZpVEDps<4Y)81RWIPC4B`nb z!l`-feZ@tf{lfYn-{?SLT^ufCt_DT`7TK}Rf-x~X^v8u2EvNGSnY$~FSr$odiWL%U z`mU#+fHL*OV*q>$ED4(&Jl;_NVL7`p*L11%03HfQtdNyU-S(4wf-Z;|1&av zu4MxK-5!u$V4HVV2mK@J$yD8^qtC?PH>{{FRgXd09hy8_%D4lVQr7UV(7v}$ANTqf z5HWznUMa1t;36rMyhwh>f3JLBlry#_yGa{ym~kK7Mz?e}a`HvVRqq#u0ol+t3v&S# zT@7g^IsN;tjIpdi;$wBGMz}SHwJMj_RpHIL)HZs}ZoyOlo4zpR=j7kA|J1bLNbE-3 zn)1i+9oFYMl!91#c-1{1rysR@9gvF!zW&n%oFM*DP3c32qH4p<(m!S@dF`5p=R@QR z0%Wm=DltsJvrFc8sKz7PiYo}g6FE~Yr-cRV&B}<<-mpj1@-M^2s4X+? z%Le{{eV3-%0d~-eC|hw`uFb&Yw#fa!pnR1QuAO+=zVf)OM8iWzOr`9z4)w#W{mml6 zP6NC-b9e0Feny45u4t`Y8Ic?KvaSwoY(A=w6RTavXf(EW`DxN6h0a*0EjiNS(iFkq zH*>Vxgza?TN%67oQl60m5q ziB(;MT)u#(@#1;v34b{ zMl<#LP5%2~{zP;~)7}=iZi&e{7p9Z8iFigq-Ttf#6ZzU9mNTTRB;9as!k)JJ&~pgL>pR1_Vq-ZA43I=9BrPp;o2ligk(_ z)%w`AJBy<9U)Z2CvO`i&h+R~Dffc<~JNg89c}{j)Yo21WE@XsSG6YsjWVYzzSw})N zA6mFpe>|L?2y8nX0ut+dVxPIHREu`)2ow}Xn-xS1IC<~cbrACBpg#w zmV7s+8~2*|p!CD!J^4jDf^~T(@qJ2R9awj3$O#=ZCf5dkLQ|SPN!}7mmTlLHAkvs~ zpBO>?+w3Vwtq^d!Y9s;Qc^eAII*eC2lANnxi zO2Q==Bugq6cQttJoHEd*OdKGLk7xhCi|c&isJMY|zIG7O|N3l{<^PbpXKPsbd}p@v zJG4-rq9emfvOv{m?8vRMnY5U1xT`%>1?&MFu z=P6VLHRLTd%~!RHf)E>8FE>p$WYVk|JTk;XzJzAXPran_^TKNEHtK+vx_qN(X8hkK zPEO+A81P^ERak@GN>!*JaHqV1$5-OF4FhvPw)B5R|MfEMzn!yzFjkTW`mYbjiN5o?kH59!M< zT08V=5dm()jE~FzjkLE4i@bTVgmEdLad&rjZQKiY?ZVyNq4B11cXxMh+})*dcc;;2 zd1q(7{m<6ROwD1yEVgtR>A(p*fA|z$Mey)yCJg`~PiB^z3fYL}JOLLtM3V?x2j>i*LxO!#ZI*8&7Ph zwp(r0km9eNuR~hr>@41M?abQ&658+BwrkRp`A?kx>UDrA^SNo0lwwxF+nl{&+MK@@ zic=uCsnI&(uRG?d&Ap3b5o@B zDqC4I_yV&Iu8!+hWcdYN{>JWw(3!5?T60{j@ZpA`DS_vOSd1am$z8(DpbLF0$F$UZ^8#pOPx zXLeOW@oW0-erX0r`ZEsh`#a%krKs3L?iqtggP9IVqZF@KhS}4x0SUkm=sIO`k1$PC zG0(Av ze^_Tfl?Fr{VV}F58GwM7T|p$@%fl*@O}cX1J&kKb5h)Q7$AJ5$8dFFo082M_Xqz86 zA2!(;`V3zw3I|*fmHQLDqvLYTPU2ieV8pICwyMM+1oN=~#|rhVEyucRwJ7YJt`s9Q^lV+|K&qyP^he&mKi zr(B@(aF1Z0LFRxOR?_U#BgQe#=1DZ3kQ=}YDo8c#lMtfluIjNBsq$Wo6({`F%CzI& zB3XGbre3+k_dEPy-*L zOsKat*=*ye7}84IZ*WdNMboqp_C7#x_!r0{EIFV9+WhhTzVH!e&rCctv0-FEHz3H zz|p*n>Oi}YNpvmc9!4wB;*6xS6UQhwF<3s2Ydp-O<2UU`v<&Xp*?~+Z2;H%6yTBP z0^pGt)6BvJWIcjRnuB<jAD@%>YDvj3d$`9G~2{`*9+EH$7ax(JS6 zv3|R$wh#kEzC;+&uBL72C&aU&$mQDi zWb4;qJ9V{8VUOzfxI3#>&=1K5J9}@tjPZbRLd9;{lppxx8HmOjCkgXz=k0q-=T0Oc zy6cFxP{Wf-jYo{071Ebbo$?dRzlDj|JL~`23cqxB;a?9OiaY{R^hM`pppsZ7^uDKn z3TfM>O*4L>$6tkpoCoA>eRY5Oy5`m3`jiQQ=7{kNGrYaZ?fBpuMm8P}{DnT+JH#C& z(O*EqHGlHY`sH}cZt?{Y#rtdn5l>@jm5VSVknw78gfjYG>dei`09vwZWvbR-dW5Bk zeC2l*#oD1-uYxnD{&vdHiKJdyyPvQ%9~?rarrx?={U;^o+nz}^^`E3V@mQmEu;CXu ziOU|qkba#(;+Do}ymPQvU6K40Yt)g5G7HF-t5Y55p5q7w;URfJs7h}ONm`gmviugM zqsT))RkA@<0in0O(e7g7vK{yL$ASbzU2zu9xrV~URAD!EUZQw*0$rGLghHBAzKU$A z+N!(;1`f(xAV%O|{c^z^5<6#TOD_<<8?fGCdS|3ldKIfNy&s7FMU)9ezh}!@k3)Ow-%s90`u~IXar_7Gdv-@(#{8Sz%sPh?q>Y9tEe1v| zmkdiyvA_kCB|ud8c|l?XuoWGiBSDU$FgM#DqP5Iuw{EAfoTmf={}g*CFu7q)os25p zXJ-Ee3cg=PG1!0W2z1`;JYd>-zx4g1{qgt8`vb}Wv1RRAFMf+&=6*LaRB?P+o-A|} zBa+6lHr}FNJ&v}71)4v^I(5N8Fv5+ezBF8xGXk%8{n`h>B!J`x=upN+XU~7YP3t20 z&KT4nV{(%p?x&H=ZSow?@Rhn*h*)N!tQ?XNLlR(?5H)TUOW9>XnaMcum5Ag%E?!eL>5R&<=s ztP7R=aXmd_Di+ADy@uc!s-{!klBe1LBmFU z>+pm?U=Jn_l+&)JCz|(m-7PZO~~V2$|}j zZ_74E40Q^MlnVBq2DFklQ+v2$=#Sqsvii55b~FHt@r6+<`n%O}TYon}cLw&7AnX<# zqKQltKZf2n>Y-dVT6-q*8^fFS2j;g|)=uieynggZr@H!=AEJr3+1Y23gFA+bF02uu zxoom!v8ZZZDuwA*XD}v7c+Z>Wp}=%0pHxRULBi69PulfvwjOvjl`ljaYt|$P*2s7^ zUakQ~MXN5csz`M&AG^+&ZDJe-7Us{Aj0Js%T?K-LLi%-SwFs$ilnJ+nD)0>EZ}_?k zYMtAhrqeeum@~9|w1(YpLPM`ko`n2zcftT2$m+aZ~d25TOi0GVM^Uhp%34^kv(`ZuxUJs_! z<0oE&#T$e-l~3*Jsj0^Y|JUq|?(c;g{`-@su8F?^Ur(PB7?`(l3H^ug`KTO}hxv`R z_1{d%Ypl_V_G*l7?Ts$3(AIi^KXiv7uw387)bKnMcjAy2(!b_z_E+B3A0XGyjB_qG zuMqID>7U^*JTCHAN=^IC0yc9&Asgct)13rL^=*W*bURM)adzfsFRQ-zEPJ)0XPC0sAgxR9l$q(ScZqMEa$g@~c}rO^RDwbh z+`VkCHo4N>NfwId6APOcAD$64ednvatPO7JMy*XKw>f2RF?S_~*>EEzAJ|0_gyL5V zi#XR^@HwgEOYCGy>fg)@r6Q8zay^S|VwMYyLg|yg2wH8a4mLJLSK9_ve%dyE8Ye#esl=RFjlM$31;u0OJ@hTKB=DTmgsAdix28L{t9X@Te*VG-inwSj0%M* zwdLxt#g~Nmu<#w@L_G2#sqZ6bzo&0rc@84VLwqxxN+2YMZlGW+`J-d@WHKcav51FJ zrdZ-rJBdIhrv!=|W7Fo&uh@>$7IxtLl;xkUr|vEswe&%M>N)}i0cdH#9o&7?rS7!9 z#rfi*xy67ZH(eq#NWX^E<(PN^f# zF$omF&lMtCvmu?}7*{s~jU}}HO1u4{qa({}xNkPrK|?+$K#jdO)20U*hMAh`FbCyE zq9=jRLxwrSyOw3YUAn8ApWI@O7Pl{ydHp)_JHpsNBTNqLAFy9K$8#63OQ`%Yz%5Ev3y5XNM;O zJ#Ed}V#Fqnfw3QSse{pFB!Go|VX~|xRlw4g?nq_bj8(5SjTx;_lWc911PX+Db(s_+{e{-&@ij@hB}=Wo zGfs=ON>rv5#b;9078hr&lu~z|pfPypyGkR9!`%W+A2pP0LT}OtAw z8z%>9GIa<~E41=TQCCKWAnc{x4{`_AgufnC)>IE}VodGrxGkCqCP~9-q9r=%>6|vb zZqU}_ymNSNJ0PT*z0gQ*j?Rb+yv;r&q?m1GOnYk&*ekm5`{~tWR9w5@!U23APdZdL|;hNB#8-$uMr#l0-RP>XrH^cOpAVz0w>rF{s!(Vp9 zNzS!A3l1%R8@oIE8Hed=q>CgU*BbyDNdnQGpb zkVe3MC|eEcnhCI>%u+!rK5JPK0f38?bZar^%iq+09W8tR0QA;!`I9}H5DYql(}Ko% zERo1NL6Vh^mW!=>p#NIa>sR2al5fKpY+aL%Of^q6qMD^eC%ODf&9v@-*D81BvS(mnC!q=G{ zs?ogs)ft(!k6~cg>PUb&&l#*Vid|+=>fCmV7rZ8-{pis~eAixG5Y!&%uxIPh(KkE7 zLswvYy&(b=@8&Hf`YqlhU!Ez0YER1vfx0X4tY9z7xYb2p7k8XN_*Prd7C<~?ckb8; zFlK&KmZS9Dh;bW+F_@|b%F-XH@8cnHGZ7DWRu8d0>2`@+5sKT9&ai)}YGTvEy^qf0 z3wtJNy$>R=5(tN(ch))vH?;~m`{D*1c?#KF9Ev6HijJg2YodBd*BdYaUx=NBA&Q^Qdx1 zA}NQ&y7fs9qJGEIJ6Z41BR7tmb?MePOC;GKa$W}Yo_$GuE5z|sy)*`Qs)V2aGQn>}6?0Wxrv+a30nMU6maZTEwv+ z*c{-Twl&KJW?a7Ha)&Jfyv_9~2<|oZYlptCYw?G=8fz&|A?>@w3ow(NAWB3Ya@SD= z8uUG|D)C|Mav-<`nBiLN5cm4xn6%C#T82iaMeFkG?*Z%{ShO9}FZXCHua#7(#T*0d zs*1(pnV5&I1SGWKg)%%h7r~u0uRC_J@U--I#8B7PX+)yoFfq$5$oZQ*Mw!W%r04`@yLRK6jlnsWKFpXIe= zm&W_|e=#=sNA}R^5AS9F?6<-Gls^7v7{>PR-O^dH(+YjUpMHY}hIRQgaM-{Fe9=BG zD0#$C1o)Dn@0@x-TKa0*4ijBz4+cdFA|Ei~F&@Uu{X*~5thDz-?uNUE_Z#>gk*@H_ zp9JMxx1~Bf4NAr|zvU?Rz{Q#!+090f9@JP8^~(nOorF*iM{|M`%Ub!a`|IpY(5~X! zp424~TkLX=1a#<#sutB?{1}>cnMLL2p;GQ7M#6Nef+Iq3E$@y!2}`DxtXu8>jveLI znEn3oQ?0>|PomSHQ1Fidu8krykVKLVH@92LmYNbVIU@f^VVyQFfIRflAI9YPy=$WF zY&X3*Q_6`g7pb32x3Dy2C}6R&7K!buY&)P5$nBsohj1G>rx7Z4E6noJ|Am#rG@p?} z7vIDmovG|XUAEL-onLg9u;6n~5*iQh|1XDO!dz!tjL$GIK!Jg=|2OG`^Z&k`C&kOz zf4XgiOmiq?w%Un_^;dL`6}ZN$xP#MMa4WZ4T2xR)4gi3er1JYK$~Kx~zk-0M3@Fxq z7`xH7X((ji_2>M~zK0oYM^k@@4Z9(DdJItiAYt6}1Vo4NHEZVW#H9-?-G~pXhCUpw zTGqJE+UmP(W;brKsI8IvjoPMoi*=wY6mk2E)-K(5k?b3+?AcM^0BQ=U`^iHy)z4Th zfd0a(PP$&Z9C&{Q8^>R(l~}fR>|zv)(o19*eV8F(Ixe1!`NIYHQ#~P1u9aT0-xb0| zGHVY!cGnuOic&+3@MdTy^57bv`tu%+l&$>(&Boz1)lM#L@=r-`BT`wDAfQ;Flt(&~qMf2}-<`dNJuKCGuP@nh_IMj-O^1P={4`RsX7AcB`=2 zn56j*ABd1Zpi{ZYpZ6K9ybl`z7nHbXd$9T&KAf`hn&p|_#XT-1#ZI~oiHOUi)lyu8 zFQp;~WC{_!nCt5r6)60OzqHYj)6Jy@BGdx0+oiFycerF(XsYLILh>bRA~;{FRSzXH zA@99HeEY_RwbY7hL{Mv$NOG!YN90Xbgeiv%hRq^*D2nEiPk++ycZP|Nm{|{&V$IboGfrp9n^LvN+JZN11wL_+^BBNmMWDByf^!g8Xi6kYU93(47 z=6#2?^?KFArNkPb*rUn=70R^io9)$!T_tUY_Ua|zrQ)8#cYEQ??2{?(d`jKY>Xpw)iGi4{k#?d&Z9Ig7G8Ce&%n77o>i(>u z8`Ui+EkR+T)6YD>#B5~mUzC6}$}yAYy|V5{1ghc@++pqAadgx9kJN7aHEWvO5tb)= zm(asM_jjwJFSKs41z$PoVaP5I4~` zF`vO;`F{pN_0!@*4CG>JZtvvzzdvIR%iNrVrneM@QN7Bj^zNyF^YEz*Q5Be+b$i%m+`go zAOj32dNF;(j3}maL&3eYQt#=;i`p$VP+n`syzAJsM5i>cZCBue z>0~W19PD6ZU2^Yh5Nn>vL8U*E%YK%AwlwKbWJBv?8(gAYZDNgCqf??Q`sU6O)gFPE z@YQP8fJ)PL&NNJaEp|cORDb5=D#RBilxPv$*OY)&JRJPg_uBUB@0|idqV3cL>cZ&K z92KOKjsDgD%LL>x^sq_cGg*EGfPr!Rx3*Bm*1_iAGp4$(JGwf?-(n#9s7WpgtqyZI z4oeD`DuzTLS*%Lc5C*WU*}x%PK7n>LlaD=aiQD%<`y+^1hy)H=TaH+NocO@$ihbTC zwRoIMyWuF)_wnzP`{TjH*N?w9)B&_`NW|M>nCh6smN=3>2RlQLlvN$ce>(bP_EF7HfL@v%qSVK&@Z8+Hj3;U;wUKgcnd@_w6P%%oy58IKSI@MD zO?J^;C_Uo?c2&7xneBp%@o%2J&VsZ;s$#j(XQH{KE-q!*pWiNzAPV1rmj^nrT@ zb~3!85{4d?02t#USC^Z^z>W_n8l$`PwfdrQ7Yc$A-9p>XH{+aQm4Kq95guBdGCX~? z>1k!XpyW6#V-$+ViI+co4AiI1!W~TBp24l3fngvYcT><{qNEK_Kwh&EMnba9RCl23 zRzm+)?TmJDN+&Ar_D4*cqla}Ldo;63OIEW69^OPAwB=G42 z&0RD5Gx#?9Jj+9UQy_-FlPXr^x?>-?@}w>~hDd3$0<*kou~Zx=3^vtzRZI~I?36Ry z&aZ-)7%z!+M3~a4tmI`?yIQ)L^tK|4tvHf_bQkJ7FhyC1<0VFq0(gqz^!9ldk^B=U zWxMOMbUX=L>Pe98nQMi$S2L9 z_>j`HzlFZP#|$Ai3G@(qWPHJY!q5AFdnS(L=O&*bf1fr>Fgp2G6tFadkcG(I?#Dt4MT7`zDP?siDKGrnLT*sa0Oeoa!+mPHw-zzP;F|#u{Q2BQbDLGE;gog>i{yn zfLFE@^R;ObGxKc`(_VcPJz`r+kb(7hb6)_cvCY&jLz3BrPjVi<&lKh)e~)hm@I5!F znl;?D#+E&bgK*j4%2l`7f6>PEc+_LQVPcAN-u;Q!lP2_v2dZPGv9lWWUXQ$WruUz)%H~oW{HF@@UEM%EcZLgb)&P+p2Jd{aM1GFE?SHSCCotP&KoNQSNoM4jjDnP zOX3G_+gX!0;d-my)^U-^gj)vaR{C~7dVgKtKBF+ZNx*&mv7er>!@2{+BE3`Ia-(^} z9wsOx06js<&FGga818P`fA*Z*b$G3S{RNPDgtO2qv`~JPq3o?L5CmaZtR7_?1p4c- zIjW_4!=u2O__x8n^S2zG!d_Hl%B<22)Koc5L4JOus(@DrXy+q}w#i7?m>$k|9$*}H z>;ES%*lPHg!@gMbF3YXFJSm!!2Kpi#-VMSqfc%@0|mH7QVql2S>L#5zHiZ;i?mn!2cF+E?IT`(vw&?=RP~@Gb9D!6 zj_t!@k;8J(!V86RBjs~0hiXFz*-3!Z+CmCfSE=I=hwqc3ppko3Irviea4M8|s)^GL zAGbIVew5gXpuR0{y_?t?gIfJfmSXKqCFg~Q7RryLmRROpQEl5#&5JZt(UgIb&4VM1 znwI|u0uSuZaCs#Scs^2ApJ7UGBNrZJ)0-zj6Hy1R9+SujU2;i9YxinJ3{7`Gg2oqC}| zRz#92mu}+lr47a1F-a!X8GS{#f~SweGY@Gd@rACp-+zxfx?35gb+Eh43X=heg=;Q~XlZV*^4NZ;9oSnsKA0^4%jqD|FFy8C1 z$>Urjsq^V77G|FiJoxyS1)%*szLZ9gHxZsPggTAV|!a>XIDFB=TGWqX$*3) zw6|k6Gc`5&w?CNwEnC>zxtQAhyV0WSfAB%2lv}z+=xS+#bcDkx)_iKBu-r}kVev8* zepv!>zn_rAJyN7xK$=p_`pT@;jn$i%yR&!59wa87Py+I3)?r-8m?rOPwn>)sr#}eK zbP{wx2GJC1s_vrD-4c+%YV~V_*}(UoF7xZTLIxPsR&~{@2_A~qt z`?u7Te#uQ)=ZyP@!EjX+x9PL#+0uL(RgE(=w9U_Yg)u>jg-v}Cc=5cP{d)|7!RuAg zx_s+5{zunu=2nbgHp*DV8w1uw5zgJ=UyI-W+<3Tq7{k3kn>x-B|0~z(f7#c6A&DC6 z?&zi{AGR50EucCSSxhx?#Mr`EuuWkmh`gqxd$O{@T}r!o+YZ+RqzojbYbK9nbKh$b z!|53+>rp*M+|%q2|Gb-Zr>(x-U46>)DNf9Jon#HbYSmf+BY|5NwB9Y}54L!=Q;aw|n=$(;;&bF%X@?+w@uDx6-LWx^c&HBPvTY{kCRUw<6trt3#4>7BT6ND>9^n6I z!Y#<>4OJhXK7EnjEM1y>Te%N1aMW`D6p+rE;LrUr%whqwnb)0D~7i-sEwuP9~l&_kVj#H1U zQ~|HR(1jN%7Z>X-=k=P5tL5sc>KO{21L93}UgBWF`!bQy7irNR@Cm;m<8b!#Qsl8` zr6r=!!%=%hN&<;(HA-B)MKicU?ldIWsX5oTyQrgh?Nd-KL1?uvX!L z-xsrk@7gV#@US{m=P%3#GHwa31Ra8W{zl z@hsK9RzbaKCLOt$iwd;=)-q`NePJ0H+qT+EMZSy1<*3QZO^Lym?$RJ``83YN?5M^^ zSiHT`pcB%3rh~)yt4QU>sSt=5E=6t19Wv%?0k2zdEJ@;?xy}fZd-}HE1XE>ZJLC_S z*Y+cvpfuHB=w87Z$@h2jsn9EG)l?gKZF)55P^R{4E=?{kbg)sr3Fk$mkc9)?Lufq3 zFbUhH`VEmR8rN1tPB4(3t{_>7uXws$w%K--&b4@hZgUtGZO&cyozCrBNigEck@Q#W znd!Q2lzoT=^-ST2n)Xt%kSeO&6QA;3c6pfFyL6nU!0y`89u z)^ofM;58`@(7wrZ%a|Lu)VI;(pmDwaqpiC_#!aOwMx?%EA{s34AuHvPW;AA zRQb0E&vm}>L>(u82|AGOOLKmBbq!8RZtw-_0k&;zd(oFt;WOZ^+ttRZ6leVdeE{@0 zhs+3Jd?zsuZcZv)3;}LRZAlitpI~Tnn#>D}eX${I^ET_txtqi8Tv+G#JGBW*`>AkG za%zT2z%tD78BDmoQ0-YBW)l8SZ;L-@?H15B$g%TlT?s`AQ4rDlh!dCQF1-^JO=dM5O3aBt-fl zIBtksTIM%p{>5@|79Xai;q}E`wlDT-4HEt|OjL)@o-xjK6tbsdxcO@h=whscB6xu+ zLy`o=@hgfWqDt}g;IssqOlX8&I0YL9kOG&=Db9weiInXe)l(>bq@5*>nLL6ZhN_-P zexJVnxg9AkU&;ikfM^Lcx8wan_JefdJOivjC}$OiGWLgCu$4sN9-3D}V#8Vges|H^ zQ#Ek2o8(qw$38_k7%*ckv>p6dqSW$Oz>u7%5?AY-8{2>h$kK+BNpyR1=Asb(HyAI$s~K4sq#J!SP6@ za#;q5bN%IDwQBuUcon~&(Eq?Bm9la$O8q{+^Rxhizh9R>SnFWaUcB)H>rN`$KpRs| zCn%Nb#EO2akY(0^3KeeyXTm{+;pCXxqJaLF5} z{1g$IR?#{4qfd!#%BrKSWvo@n(|6v+s8z#`TGUj6M2kinYbp}Eio1%`ujx}UITEaF z(Mdu~m`cYtZ_?xLsQydH@BZqwv%zHc?RfU{$)Ms7@=)>tFxp|q3P?mb6CGk zhtuxdjq zXj2IQLE03;fy99kDf_!P!|aR-p9|mO=1U~Npf&sj`7QtG-{3HN4}1DX$}@A-h8r6# z5ZROYZffGSlYM&PFvs8j1G0yt`_32!7qx**?dw|H0ca}5b|iA-xfU}$*z@b;)f1_x zxlFbuG!Y_Eq(J5lWI`AkG8VGwSFXLvaA!Xka(Yly2m%_G=C;6Ql7pIPU)Z1PZsboH z29>z(?=Trtcq`2=I%*Cec5Z0mO+=j*4sMWLQb>gko2+QCuQFMgVUk9?zMKz#_EtiW zjg`H|jA3bmyeEMvqdh>_$AGs&+@**GJFQW^ibcwt(9*iD6o4|{u9Mo}1QFa1p&>;b zKYtQujJ|g=t0jQTPet+;j$a_@=s3V}TTpJG2E6U0FQ6|{iLDGW!K|zU)F&~*Da@hJ zo46FHalsF!dafK>jUGN{kY7`w_49$MS=E!j=8`*Iy#ioie+-zw%VSI8u784B#s}POliE z$VT`RlVNd!4tK4(>U&G34((oSv4k)VmU6aT<-WeKJ^MXSpoQ@qt+wfg1f)eSnO5JL ziK*)x8-Qr;5+9w0y=24y1}&}_B8ZbX_}O(wmQTWmaSvY)(-Ao2iWu2Sx~H3oReL9cheF;(OL7}b zc>z{lL~6Q*WhrT*Qq-MieME0-ybbSz0Jmh8?geA&Rj&Cmy4=K!%r#TT5FLTdj7GEyU)} z-YWN*Q$=}wYj4$LLb}3GshApbBwoA1*l!J5y1E+^D?UL#654O2i|iZiwkwZ{AOzp= zmOLbp`?;2mpQFGJn6=dLM*=6ae9pid&)gV{ejo2wjaj=0y|CZ7#kk9%96Qx5y3`VqyS7ZGFDe|KkIZJIqdR)ln~ zJ1v3H{N7w~85zG9srl;I10!6vOjKX!5Ig zmPgz8_YU5#Xysv#9CTQFi|sEVMr{Y2Ha08p$7kXhpg>XBspU<@E| zC38Ydh^~285O2@G5+kpd;~Z(%H=!kP?YEb{Zk(|qW5UP<#JxZc&vBie*zKCB$1II11dIB*x(Li=Xw z4K^ht%>C?lDot~JkLJaLc19m}Tt_~8htJixCr)!c@sTam5&Sdh0gVfFbCS_(qDRoC z?Ps->3zy0`WHnl|^@2vV>cvKG@K)iBUksa{gCQkpOp8Oh8?9BUrH&)tR`WZ}zjnX> z1FXA^*R`IXB_XuWcBcQg*Z4n|Bndm0|0qQyscEa?iJ)9^9+Q=##QaW)kenGwf9)B- z38t1;k&w?$F%2rHZQyLk2>O*A_7?C~s^(>eAIzCtTw3&cR#Q@Qva#jw_ZK37@#$NC zGm^cnhk1WA(iLN>Rl~Kg69N{(;7i+NR?C!g)x@1-!q_+yVuO@!syzEx{4rSNG=B^@K z#nsLqIGmg_b0(@-6UZ-7qMMGVdM8nqocq`S86DWHelTx&&v;lqK|Hm-SP5i0$O4l^ znskZkQ*XjNvQZ9=J)W4iqtex#)7YlR-?5bA3tSBBH44u^ldONk91uY<2JaV-6S5y8 zto`g0BUKl;CQT(`E3H5mltPl-j1t{TQKONv<>;QqjOBovNgMO*oO=09^)B4g3)}_tnvZ$1vGI4gI47&#I-2+9#7STk zXT~H<*w7g$J+%I}n?9z1q?9GXBYdxIp|#pq;g6jT z;|U2?W!6`^ba|mP%#^bMwb{{);;A|xvyn)+7f#xCkG7+q6>I&U!wg{cWD1{Y`Xn)+ zM0cCNWMtL%1i`lk|H6>pUAEy2F{G{qS1JarjUetY?BJ$yI(>1HJdF4y|0ckI(*`Fe zX+Zi>vG4!$>1<$$jJvDJ2;u+@5Bux~v0D&Yh2)-dm_BJqRt#(Dr74jaCvKQu1p z+x!R`kEC6%F?mkxhw81rF>X^GW>IfJ8*APm_J+b zFlqnm zgFb@(#)NgVEl)LlG!5~WVSk!TLron5B=FSMV8PNjOGbq3Ob3cx zK_D|-tN>D*Z3A-u z&01ctvr+L@aNX2;<&a^yYtc&89ZzU(=v>SnYAe&KRdn5DP|ST?m|se-V*!R{RvnRq zbUwfk``c30K_<-Z=?(6Rl}X!}$c(m)d?V%->Cf zfFuTi5=&(6BQLvy`8DR3onkz zPI^?pE4w5j=}NPplPLv33`J<4pe1=SPJUbdUk`>lNRhMYs4tRpFWWFLBxR*ZDe^%tI^Zn#o`XWZ(3Jh{kN`8k52AUUXIil4(DhuDxiF0Je1)4OoAqfOQyG zt`xkf5oZgGC(G!w9&AahF081dg<%OWu5!@7Q1M3!2enQVDcL0xNi>eYKg)g=v!Cx| zWW-{SDA&k`q92Z-y=ELG8qi*D_yJ`y>I*NW(bTm{Hc{^Ln zA&a)z+6(fHPuN_ZAKRW-d@i?o4Gwp=hX?!fOPi~$g*i!+;Fp9TGvp2ZTRqLkdxaOYXe*Cf8zzF~+o#Ur6k37LK?*7Nn-=Hf8l;ml6&p{<&0 zc*W2h1*BFyX%3>*-QxvIEK+*}kAJuJqK)F9hIMtj)DpcKi9$RcIvfFGCbE%}B){1V zN8PKVz$y+ib`eZIbVLu)WutiP2anW-fapVP-_$&fz|r^b8kdf5C>czmFE!(laAAVi zvG8*Jxy*>vcpiC5c3g--P&j$2X+q|>q~lBGJ*hF5Lh-?k;J(h zpdpZSj4!s&4Enw4D_fjWChw6d1Y!F2v;Zs+s8&<=?yK$YH0|4 z>IrBS+i24p3_uow^+xaqu63r9eb)^^O`gkqK7hYAAp_V(1r67rE%!KC{U%iY{=tNU zxMU~9cQZ6mp7D7@MHl?7YM9`V%ZO---Vr685g3QwwkQQFbq*%>rTai>*?p*S&UNyF zslFd@^tMr=oYc6zI4qMbtW>utuyZJlm1i~N1WMh4G-8pwD?NuQLhXWK{W;cX$OTvh2AyiUL$%WFJ=s^0f&86={BX{&4Al@bw%c!1rq z11y>*U=9#%ks9EumwlMwGJuvE%xuL1kU?S-9$JOw=UnN}A?`uuBna8VGXRgVtj(z6 z^5@AS(ntLgV;1G%JBI^6mhAV^BiP_=BZnJdCCGZF0tYD@z$z*F&UxK-(@*s8cDv#>*TKC%v22c?cTRn zHX3+@b%OEurl715Yb4`EKSNGJv~JuDp1hB%gHnF3oIK_gSudD2J6kBywuxmquHT!A zCTLn3Jp#w5F;SMs8!r=qH=L}-g^WL%g*X!TovQ2}XX4>+9X2ZwbH1tSm13%coV&Hu z91f`9`YfL(jxg3dhXSaB9GTupUaAcmjSr@0SUr&4tW0Z-=k{)!9S^6v&e*K~e2%_k z$Dc>@@e42?G(yrf0ci7}Fu$Q8=#m@lOJp(ZMfo*rrq<&1DPs*68#^Se*c``kXnJGX zb*eQFJPas#tyGdQ4&f%?+bRt06(;7y?+2wp*^)N{J6*kTdf%*CtTV6wD3*QS#`)n? z_>Dts;qJB}VA&48#HZJpb{}u)z7L`_80YC5|9ODtf{F;ZFr%r{Z1h<2ZHfhL*$*yq zU0J*Q4a)V6`VI2+3KQ=p8(P(fM?T)-dx|yuK@YBF%7v-jN{XRG$ujk}A@E>#i11n4 z=-G?t*$#pN{?A2N;Lb03&670YPAx) ziAl$wN);ap^&ZG}58K-ESZM^m9Q4-rD{Z=i$^Hq-p)po+gewLz;pJj&qwzq#3>c-; zGGL1_!9{$>YdN1WmM7bj6-Lz_bUJ&o!|G$?f=Fsp`NoVB!C*_Nufz^jj7w1t3gW%CJbez=4eYwc1#y=fP)aYmDXt%_T~-mT zOECF#9VohIoG~drPwU=-Xbr`08-DlwSr7ifu*2MgU3AU2d+5ygWsxX!6&95I+CyB( zIUF3HMpa;%W3-~EanMBESX-H(MF&5gX{lD8z0;bXltS z5gwaTa5yiDX+W)YqU};w{ zw``-G@sJ~8b7WEijP*T8`&Ze*M32oQ5ZEXT0b~pl;QQlqWQKuKh1FQNg-@N>L}A~! z`0NDX5dH-9sbLE+H1uW|_woY_AA(wDknFK~GqNBzmuZ|>I%~Z9boYZ>Mm`r(%^3P7 zcjpeHQ$GTFrz!8YuWBE^xcRK0OP;o=7<%oD03b#NX%Y?zrlwZj~RJr4SQa}R&z9k9>V+1XfYIY7UTq! zA$prvi~7eK!7E<|$E!W7wP8-)#~a_a80u}AGV3PH-eC|e^bKB%vV9tx*XvUa>bSno zoPN;ao{~RCpPjzDSNpi?HF+7RYJp|Gq0qs)W4+k6xaeZ|x-khjacw97GcKCAh5tLb z9aim4IQrsUoWedh$IDU(xVyW%J6wKe=G<>);+_-Vjo52N?LT(x$f{VG zwKCs&vJ4UFW3m`{A^vkaqG?s~z1{+@2O|$zF96#cD|xTnp1up5=GvvaNEgt3G-#8j zLe_M!Z#Xs9@e+^}_%s~gLd3A5OM!l&?g-y{!71zTv!9zDh&HW!!GNxj>NQWeX`f_WUVZyk*rRsCyh3Xir=G|sR^cGV|EnLdwSg~N|DVS&kE;C(bt(c8Z2S)~IJ zZk_FhIk2KEdi#E@bBp37Yr(OylGr}Y**&pkpt5Qv@#)ukSj}Ixh^sPPsy&xz)3iyBS;g(}_vaM%#wn z29%gRG0z`q&;?l{^j-t2|2%2hxJQTJ2wiuB?U6GC_JzjS)~)EB+E(=jvg@DP?SJO1R-h;^05AFT$43a*?w}SoOsw{|oiy8h?gsFU@i1M94I#@-76oJ2j z0fRl-4aep|L>B#_h&E6CW#c+zLbxI`ajtl6`FRcOO*xjmBKuPVA-81u!{yf&Ku&Jz z^Znri0;r-V2I>m1%)HYHMF1$lWIU;@!Dh?whfLEl9pB)#V7BN{H>h&dCsjEA|N3 zYa$>{)RAYiEjRE|pYKbvRrnq0kRjRPo{SUaa+=Dif|$M1kCCfuEbF>gfj<@JcMfD} zPs1@Dzo`mm8=xH7^n+cozty!%ZDpF7MipZZ#83dN!N2X+kr4Cg-9`&nY~o(}U7cHB zRw5rsTI_9(GACgU$n1nHq?z=nJ8$^1`l!COIF0+$}3AD+1wU$40Y z-3O`!zFs|`0vY~-bs9FIkO;!EYe<+2KM^n*@JM)M-2<*kcOrurkh);i8aknu8aicP za1y&EUDgBER%I1F;Sa77eADk)7|SnsDb2aXUp;0S;(X)pr4#jvIz(U4Mz=yCR{4U& zSNX_4QFg15eWjkUPI7*CL0YYL5pGKFc7BV^s`_zk*b#AR!Z)sjwfgk1KJeY&aQ?g4 z=O`@o9uFA^sQJ5!`R}Q}|9M*eOR7r4!yD%z>6e}NxH>j>%x_E~dg07%iI~KGZ3jpP z+zd?Xp;|nMP(PY6Bdu^+PA*3wD!A#u_VtE!aSjktS(_oIH~|>j6R059m5bVfvCF=? zcAaHgx8~r-&a@eGR&37E;$QB*OI}w`ADw$on{vKqk@?jiJ;*#e0u1y>4y9pZxN(7F zFG?yvcQ-r`)_r$)_9XO2J7Djv@&l2$+XHAkC9czEWWVSScc`Hlc6u$p&x6@T|FCkP zLpW1c?F>taXqg0NacB*KTh}GuIavS6wGFU#G-RnVyP+HJ6dX{sU2`wW;>UTJ8+O7& zwlzGZQFo{K^^^NrYQ3+sJky=cHT;U!JB7ef`Fgpi6ajR?eqS&IF|pT0~^tS z2BC>F7d!ABYug}fsgD?*D>npmcHH$-#GQ-UVBFtfooH7UqGIm=etoe0{BQ~%>4|xT z4SqRv$?M| z`CUOMj!|zQ18N*}YN8;K{w@bK>n{0gNvYE6) zx)0=XlWvE1eUoO#XMK}l=f^r9U_P;B@!2f+~(QV!}36;cj4 ztIp14r4_0kWbeW;0)l(~O&oh0_dLq=H<;Cac&(h0ceAHQf4aTPt9&<>$%aixFa`NG z)C(k!FDT(}WfvZw-89DOUDF^jt2k(@&W!{RQ8x{G7#JF;o9PM9j!nLt4F{@{5YujQ zyJunvKQg8<^=35Gnj1nwZby|qVM8>T6OJh5VpHr8h@hPj;pq8`jz6#-0TRQg;SxA` zrK!sFX1pKr!KFY81^#?nmwN?2Zl0|{3ja9j#!V_0{pl&3c%pz_$q2>@IsxfwmVcO{ zTp!Y**{1t%SrILC1hK>ts{#wq zDJt#!pFAz?e8~9f#h?&LkWkh45I!^JoDNASYOUernXU8Tj;dX*$ED;5WhSzZjG8eI zG_`&?HI}=nC7I!)Z0y47nHPL;>HNkrdg39QKBrFRwu+ktKOv>%q`iNXUb4E+lbG{l zpX*mv$^dD(dcqbrO0Qkct&{cUUNGm&g*OgDKzwT~%DC-Qm7J55X{8X(*H`Uh`!;bQ zsU~jxZOLXY&kif4vHN}XYWgvtuGMqKqaPq76iv`mfb7QIpKsN%Ai)gFDMM&x*JqJM zBe{m<+E2uk)lO)AWBTR&F2xGTkc-sAN}nWU!IbDLhIbY9`_^^Ys3#{veCs26bHcuq z^gRBm2#QbKLG%+T&ff=BE#zBb@X~Rgy1t-2K*vP1A6|krPWr(U1D-HR!RBl@|Gv8}5im6dN+#O2+g5c{VJHbQByUrC{5r#ZWGY z9E(wsBG1~jC!NNCdEoMhmFw#;W$qmtS#?CD zttMJKC@s_Miwa(Ml|4h0aAk6c%aYyQ7!fbjJQox6)URN&%NNz@oad-3jJ*T;dX>v| zoi&&*M#5uw@^ZY@V~Sv@K%@EAB;`21COd=RT98} z)g{x>^Fh(XHgrp5S3XO*ItW)`PJk7f)OBCX@v^0jirdkV6fBxP(o#xUk#-a_Ow3AErNJX~DGmA~IGNajFn``#$uH3e6xQH_T-Lvrb4m_#Op}b&a zt3bYLj+8=vMsZ3-MM}De#)u~q_#XuubWGOySn{_QzD^d=2XQAsE;7rkcqJND_>9;2 z^dyo2W)*WPt73>hbedUGj}p3m&Q5blIn@W=U9lI|DOExSONv2G6)+P9LP*7Zl<^MA zqhtl0NuRmdvBhq0e=IfG#^?8O0CYAMe^y0GA`Tm>khxa-Zo>3R5o+83Y-Tc;RQd5;wIcMCSZ3V*bQ?aZ01s!JqD*mnQ*9te5dM6o~hme zA#U5CeQ6JWvwig_QDc%^XiW0l7Tw7$suwYEQ!F(C^%CAeKhK>u|GbJxWyb#Ok5UX_B+h2&Qo?d)- zBciHni*bXyho8B8<^EnNAzTKxOH4_!SBHyuQ~!=??XbYN^CUn?dKfYcr0Lk~btgTB z5`XRB^{qx$UQSlHQk+t(4lD46==$cR&@zZ$oTC(YphDp~a8umr!!*On^(irb0*%;j z1+*Kt8=s4orkx}n)^>PP75xTTRPdKXYYXE~zM*(l!pim=5`EXe zhSPy%<{8^j9*4nyw2M95BL39=+kAtEmA&`iB!_2f$(6kGLOZe`o(l^>j$kU2l^w*a zr*G+&+@~_u8>vx;i2%UTHB63BGLTAtCY)0^Q z0=iJ?k*rz7h_!4qNT}=NN8TK9SFE#fMBnKET&X*q7~a+Kz9q&Mh$vX|@GrzqVCEq$||ysaR1JQ zVw@z<(ho#e!cFW919?&9G!rIbmhcN0=P9q6DJ*&@lsj{K_qKdeF0{WB&+96F-#oQv znr>mJ%2XP{yOch_BwU2Clg_$L=1(-nGAY*jx$qWfPY}}Xb0VJ&5)v~tygWx0ABuGd za3rB?S&J@i*?Hw1y?OW1TF(Pcr?|2HOurUv9|_U5qo;hlYcqngBph4zE4RHY5Lg|P zhliS92~@vYspEX@E2fVjX{Z0_V*xrnUP+vBqRKx~5`$0_Ve1GIOOeb0sokGe?(|ipL_p!q1sgHA+-+fWCYudzE83gtok0+J1>Tp1dj^N?WgMeD(0HfS{>rhK`6iK%P zJsN4w986*bQ>h|xhg+mj|4}Ak@e8-l)CN{Ds6OfA%OyEbY~Nr59YkR)G(JV5JmG;I zd?U&+4bfkv1mt`Gp|-785BO+k+11$zvkx9b?mC;yOK#~=J@!K5`o!KGk=Fj<) zA3~fTWB4bB*f7pJJ@$}znr%CHX~(PVu^A_Hy^0{g>-?s|#3dfv~JB+W$8liR4GQK(cq7pCUHZt9UvZ4gp7zQ{-LXE@1Ey5I|l zg7e?3Pu%Lj1nGTl(Rt@=*Z7?H$U23my50qPnBw=R)T8+*=<2agX(#R;e{Xy(j+e%@ zElobxlV7g3eX=~z6ktvV1>@B%!#zD05A%#8UcL8tUS2&AKR40C)<8guS3zDNya;V+ z;xs^wUBL;vXZ_z-(IpDehQXQye2sugXZ%rH*2VR27?m|^t%0DlWYnQyX~Fhkv6FwX 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

aW3ZanAOx|j!kSgE%!*DK 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 literal 0 HcmV?d00001 diff --git a/schema/src/main/java/com/github/api/v2/schema/Feed.java b/schema/src/main/java/com/github/api/v2/schema/Feed.java new file mode 100644 index 0000000..8ea0bce --- /dev/null +++ b/schema/src/main/java/com/github/api/v2/schema/Feed.java @@ -0,0 +1,81 @@ +/** + * + */ +package com.github.api.v2.schema; + +import java.util.List; + +/** + * The Class Feed. + */ +public class Feed extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + private String title; + private String link; + private String author; + private String description; + private List entries; + /** + * @return the title + */ + public String getTitle() { + return title; + } + /** + * @param title the title to set + */ + public void setTitle(String title) { + this.title = title; + } + /** + * @return the link + */ + public String getLink() { + return link; + } + /** + * @param link the link to set + */ + public void setLink(String link) { + this.link = link; + } + /** + * @return the author + */ + public String getAuthor() { + return author; + } + /** + * @param author the author to set + */ + public void setAuthor(String author) { + this.author = author; + } + /** + * @return the description + */ + public String getDescription() { + return description; + } + /** + * @param description the description to set + */ + public void setDescription(String description) { + this.description = description; + } + /** + * @return the entries + */ + public List getEntries() { + return entries; + } + /** + * @param entries the entries to set + */ + public void setEntries(List entries) { + this.entries = entries; + } +} diff --git a/schema/src/main/java/com/github/api/v2/schema/FeedEntry.java b/schema/src/main/java/com/github/api/v2/schema/FeedEntry.java new file mode 100644 index 0000000..c04a140 --- /dev/null +++ b/schema/src/main/java/com/github/api/v2/schema/FeedEntry.java @@ -0,0 +1,105 @@ +/** + * + */ +package com.github.api.v2.schema; + +import java.util.Date; +import java.util.List; + +/** + * The Class FeedEntry. + */ +public class FeedEntry extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + private String title; + private String link; + private String author; + private Date publishedDate; + private String content; + private List categories; + /** + * @return the title + */ + public String getTitle() { + return title; + } + /** + * @param title the title to set + */ + public void setTitle(String title) { + this.title = title; + } + /** + * @return the link + */ + public String getLink() { + return link; + } + /** + * @param link the link to set + */ + public void setLink(String link) { + this.link = link; + } + /** + * @return the author + */ + public String getAuthor() { + return author; + } + /** + * @param author the author to set + */ + public void setAuthor(String author) { + this.author = author; + } + /** + * @return the publishedDate + */ + public Date getPublishedDate() { + return publishedDate; + } + /** + * @param publishedDate the publishedDate to set + */ + public void setPublishedDate(Date publishedDate) { + this.publishedDate = publishedDate; + } + /** + * @return the content + */ + public String getContent() { + return content; + } + /** + * @param content the content to set + */ + public void setContent(String content) { + this.content = content; + } + /** + * @return the categories + */ + public List getCategories() { + return categories; + } + /** + * @param categories the categories to set + */ + public void setCategories(List categories) { + this.categories = categories; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "FeedEntry [author=" + author + ", categories=" + categories + + ", content=" + content + + ", link=" + link + ", publishedDate=" + publishedDate + + ", title=" + title + "]"; + } +} From ca6fcfc71faf7a411cb943fb8c91a0f7a918c216 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Thu, 15 Jul 2010 15:34:13 +0500 Subject: [PATCH 07/95] Misc refactorings. --- .../java/com/github/api/v2/services/impl/FeedServiceImpl.java | 2 ++ github-api.txt | 1 + 2 files changed, 3 insertions(+) diff --git a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java index a4baac8..0e698a0 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java @@ -82,6 +82,8 @@ protected Feed unmarshall(InputStream is) { return populateFeed(feed); } catch (Exception e) { throw new GitHubException("Error while fetching feed.", e); + } finally { + closeStream(is); } } diff --git a/github-api.txt b/github-api.txt index a2f588a..c661222 100644 --- a/github-api.txt +++ b/github-api.txt @@ -17,6 +17,7 @@ X. 3. Add Feed methods using atom. 5. Gist and repo visibility. 6. Network Meta is not complete. 7. Fix Network API. +8. Add a Readme. Feeds https://github.com/nabeelmukhtar.private.atom?token=5c74e74601432623f1ee9c26b3d31d81 From d72feb5cae7a1cb5e104619d5489efe9e2190fe1 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Thu, 15 Jul 2010 15:38:25 +0500 Subject: [PATCH 08/95] Misc. --- build.xml | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/build.xml b/build.xml index 5d8e6d0..6877d65 100644 --- a/build.xml +++ b/build.xml @@ -14,6 +14,8 @@ + + @@ -129,6 +131,14 @@ + + + + + + + + @@ -139,6 +149,14 @@ + + + + + + + + @@ -149,19 +167,16 @@ - - - - - + + - + - + - + From 2c28e9cae4ec3eb36cf713d56716de2454286024 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Wed, 21 Jul 2010 15:16:39 +0500 Subject: [PATCH 09/95] Adding Readme --- ReadMe.htm | 84 +++++++++++++++++++ .../github/api/v2/services/FeedService.java | 2 +- .../api/v2/services/RepositoryService.java | 2 +- .../v2/services/impl/BaseGitHubService.java | 5 +- .../api/v2/services/impl/FeedServiceImpl.java | 5 +- .../services/impl/RepositoryServiceImpl.java | 4 +- .../api/v2/services/FeedServiceTest.java | 3 +- .../services/example/RepositoryApiSample.java | 2 +- github-api.txt | 25 +++++- 9 files changed, 121 insertions(+), 11 deletions(-) create mode 100644 ReadMe.htm diff --git a/ReadMe.htm b/ReadMe.htm new file mode 100644 index 0000000..e0a6810 --- /dev/null +++ b/ReadMe.htm @@ -0,0 +1,84 @@ + + + + + +Description + + + + + + +
+ +

Description

+ +

This project provides a Java wrapper for the GitHub API +v.2.0 (http://develop.github.com/).

+ +

 

+ +

License

+ +

This project is open source with Apache 2.0 license.

+ +

 

+ +

Requirements

+ +

This project has only one dependency on Gson which can be +downloaded here. http://code.google.com/p/google-gson/

+ +

 

+ +

Key Features

+ +

 

+ +

Usage

+ +

Typical

+ +

Authenticated

+ +

 

+ +

More Information

+ +
+ + + + diff --git a/core/src/main/java/com/github/api/v2/services/FeedService.java b/core/src/main/java/com/github/api/v2/services/FeedService.java index 18cd4a8..f37d1bd 100644 --- a/core/src/main/java/com/github/api/v2/services/FeedService.java +++ b/core/src/main/java/com/github/api/v2/services/FeedService.java @@ -13,7 +13,7 @@ public interface FeedService extends GitHubService { public Feed getPublicUserFeed(String userName); public Feed getPrivateUserFeed(String userName); - public Feed getCommitFeed(String userName, String repositoryName); + public Feed getCommitFeed(String userName, String repositoryName, String branchName); public Feed getNetworkFeed(String userName, String repositoryName); public Feed getWikiFeed(String userName, String repositoryName); public Feed getPublicTimelineFeed(); diff --git a/core/src/main/java/com/github/api/v2/services/RepositoryService.java b/core/src/main/java/com/github/api/v2/services/RepositoryService.java index dfe2938..4d2091e 100644 --- a/core/src/main/java/com/github/api/v2/services/RepositoryService.java +++ b/core/src/main/java/com/github/api/v2/services/RepositoryService.java @@ -305,5 +305,5 @@ public interface RepositoryService extends GitHubService { */ public Map getBranches(String userName, String repositoryName); - public ZipInputStream getRepositoryArchive(String userName, String repositoryName); + public ZipInputStream getRepositoryArchive(String userName, String repositoryName, String branchName); } diff --git a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java index 7187669..c5b1365 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java +++ b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java @@ -6,6 +6,7 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.lang.reflect.Type; +import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; @@ -35,6 +36,8 @@ */ public abstract class BaseGitHubService extends GitHubApiGateway implements GitHubService { + protected static final Charset UTF_8_CHAR_SET = Charset.forName(ApplicationConstants.CONTENT_ENCODING); + /** The parser. */ private final JsonParser parser = new JsonParser(); @@ -150,7 +153,7 @@ public Tree.Type deserialize(JsonElement arg0, Type arg1, */ protected JsonObject unmarshall(InputStream jsonContent) { try { - JsonElement element = parser.parse(new InputStreamReader(jsonContent)); + JsonElement element = parser.parse(new InputStreamReader(jsonContent, UTF_8_CHAR_SET)); if (element.isJsonObject()) { return element.getAsJsonObject(); } else { diff --git a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java index 0e698a0..55e4767 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java @@ -11,7 +11,6 @@ import com.github.api.v2.schema.Feed; import com.github.api.v2.schema.FeedEntry; -import com.github.api.v2.schema.Repository; import com.github.api.v2.services.FeedService; import com.github.api.v2.services.GitHubException; import com.github.api.v2.services.constant.GitHubApiUrls; @@ -34,9 +33,9 @@ public FeedServiceImpl() { } @Override - public Feed getCommitFeed(String userName, String repositoryName) { + public Feed getCommitFeed(String userName, String repositoryName, String branchName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_COMMIT_FEED_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, Repository.MASTER).buildUrl(); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, branchName).buildUrl(); return unmarshall(callApiGet(apiUrl)); } diff --git a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java index 7f5c230..1d5ca02 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java @@ -352,9 +352,9 @@ public void watchRepository(String userName, String repositoryName) { } @Override - public ZipInputStream getRepositoryArchive(String userName, String repositoryName) { + public ZipInputStream getRepositoryArchive(String userName, String repositoryName, String branchName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_REPOSITORY_ARCHIVE_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, Repository.MASTER).buildUrl(); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, branchName).buildUrl(); return new ZipInputStream(callApiGet(apiUrl)); } diff --git a/core/src/test/java/com/github/api/v2/services/FeedServiceTest.java b/core/src/test/java/com/github/api/v2/services/FeedServiceTest.java index 1dee5ff..050543f 100644 --- a/core/src/test/java/com/github/api/v2/services/FeedServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/FeedServiceTest.java @@ -5,6 +5,7 @@ import org.junit.Test; import com.github.api.v2.schema.Feed; +import com.github.api.v2.schema.Repository; import com.github.api.v2.services.constant.TestConstants; public class FeedServiceTest extends BaseGitHubServiceTest { @@ -27,7 +28,7 @@ public void tearDown() throws Exception { public void testGetCommitFeed() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - Feed feed = service.getCommitFeed(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + Feed feed = service.getCommitFeed(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Repository.MASTER); assertNotNull("Feed cannot be null.", feed); assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); } diff --git a/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java b/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java index 54ef472..e1eb8fd 100644 --- a/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java @@ -33,7 +33,7 @@ public static void main(String[] args) throws Exception { } Map breakDown = service.getLanguageBreakdown("facebook", "tornado"); System.out.println(breakDown); - ZipInputStream zip = service.getRepositoryArchive("nabeelmukhtar", "github-java-sdk"); + ZipInputStream zip = service.getRepositoryArchive("nabeelmukhtar", "github-java-sdk", Repository.MASTER); ZipEntry entry = null; while ((entry = zip.getNextEntry()) != null) { System.out.println(entry.getName()); diff --git a/github-api.txt b/github-api.txt index c661222..b9d3656 100644 --- a/github-api.txt +++ b/github-api.txt @@ -26,4 +26,27 @@ http://github.com/nabeelmukhtar/github-java-sdk/commits/master.atom http://github.com/apache/cassandra/network/feed http://wiki.github.com/apache/cassandra/wikis.atom http://feeds.feedburner.com/thechangelog -http://github.com/timeline. \ No newline at end of file +http://github.com/timeline. + +This library provides a wrapper for GitHub APi v2. Its + +Description +License +Requirements +Key Features +Usage + Typical + Authenticated +More Info (Links to Wiki Pages) + +Wiki +Getting Started +Maven Support +Spring Configuration +OAuth Flow. +Asynchronous API +API Design +Android Configuration + + + From ceae54d59edfba4e6aa8048c3c934a3499cc35c0 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Wed, 21 Jul 2010 15:19:43 +0500 Subject: [PATCH 10/95] Adding ReadMe.md --- ReadMe.htm => ReadMe.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename ReadMe.htm => ReadMe.md (100%) diff --git a/ReadMe.htm b/ReadMe.md similarity index 100% rename from ReadMe.htm rename to ReadMe.md From d1453064042d51cb93d356326670a6b2af8ac37d Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Wed, 21 Jul 2010 15:30:36 +0500 Subject: [PATCH 11/95] Adding ReadMe.md --- ReadMe.md | 108 ++++++++++++------------------------------------------ 1 file changed, 24 insertions(+), 84 deletions(-) diff --git a/ReadMe.md b/ReadMe.md index e0a6810..f24a8b4 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,84 +1,24 @@ - - - - - -Description - - - - - - -
- -

Description

- -

This project provides a Java wrapper for the GitHub API -v.2.0 (http://develop.github.com/).

- -

 

- -

License

- -

This project is open source with Apache 2.0 license.

- -

 

- -

Requirements

- -

This project has only one dependency on Gson which can be -downloaded here. http://code.google.com/p/google-gson/

- -

 

- -

Key Features

- -

 

- -

Usage

- -

Typical

- -

Authenticated

- -

 

- -

More Information

- -
- - - - +## Description +This project provides a Java wrapper for the GitHub API v.2.0 (http://develop.github.com/). + +## License +This project is open source with Apache 2.0 license. + +## Requirements +This project has only one dependency on Gson which can be downloaded here. http://code.google.com/p/google-gson/ + +## Key Features + +## Usage +### Typical +### Authenticated + +## More Information +For more information see the following wiki pages. +* [Getting Started](http://wiki.github.com/nabeelmukhtar/github-java-sdk/getting-started) +* [Authentication] (http://wiki.github.com/nabeelmukhtar/github-java-sdk/authentication) +* [Asynchronous API] (http://wiki.github.com/nabeelmukhtar/github-java-sdk/asynchronous-api) +* [Maven Support] (http://wiki.github.com/nabeelmukhtar/github-java-sdk/maven-support) +* [Spring Configuration] (http://wiki.github.com/nabeelmukhtar/github-java-sdk/spring-configuration) +* [Android Configuration] (http://wiki.github.com/nabeelmukhtar/github-java-sdk/android-configuration) +* [API Design] (http://wiki.github.com/nabeelmukhtar/github-java-sdk/api-design) \ No newline at end of file From f4fc9491ff0d3d66c086206538585405d90abd2a Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Wed, 21 Jul 2010 15:42:31 +0500 Subject: [PATCH 12/95] Adding ReadMe.md --- ReadMe.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/ReadMe.md b/ReadMe.md index f24a8b4..5427110 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,11 +1,11 @@ ## Description -This project provides a Java wrapper for the GitHub API v.2.0 (http://develop.github.com/). +This project provides a Java wrapper for the [GitHub API v.2.0](http://develop.github.com/). ## License This project is open source with Apache 2.0 license. ## Requirements -This project has only one dependency on Gson which can be downloaded here. http://code.google.com/p/google-gson/ +This project has only one dependency on Gson which can be downloaded [here](http://code.google.com/p/google-gson/). If you plan to use the Feed Service than additional jars [ROME](http://rome.dev.java.net/) and [JDOM](http://www.jdom.org/) are required. ## Key Features @@ -15,10 +15,11 @@ This project has only one dependency on Gson which can be downloaded here. http: ## More Information For more information see the following wiki pages. + * [Getting Started](http://wiki.github.com/nabeelmukhtar/github-java-sdk/getting-started) -* [Authentication] (http://wiki.github.com/nabeelmukhtar/github-java-sdk/authentication) -* [Asynchronous API] (http://wiki.github.com/nabeelmukhtar/github-java-sdk/asynchronous-api) -* [Maven Support] (http://wiki.github.com/nabeelmukhtar/github-java-sdk/maven-support) -* [Spring Configuration] (http://wiki.github.com/nabeelmukhtar/github-java-sdk/spring-configuration) -* [Android Configuration] (http://wiki.github.com/nabeelmukhtar/github-java-sdk/android-configuration) -* [API Design] (http://wiki.github.com/nabeelmukhtar/github-java-sdk/api-design) \ No newline at end of file +* [Authentication](http://wiki.github.com/nabeelmukhtar/github-java-sdk/authentication) +* [Asynchronous API](http://wiki.github.com/nabeelmukhtar/github-java-sdk/asynchronous-api) +* [Maven Support](http://wiki.github.com/nabeelmukhtar/github-java-sdk/maven-support) +* [Spring Configuration](http://wiki.github.com/nabeelmukhtar/github-java-sdk/spring-configuration) +* [Android Configuration](http://wiki.github.com/nabeelmukhtar/github-java-sdk/android-configuration) +* [API Design](http://wiki.github.com/nabeelmukhtar/github-java-sdk/api-design) From 502f95c62d2d1d31ab981a6586b94230c279522b Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Wed, 21 Jul 2010 16:44:57 +0500 Subject: [PATCH 13/95] Added License Header. --- .settings/net.sf.jautodoc.prefs | 5 ++++- .../api/v2/services/AsyncResponseHandler.java | 17 +++++++++++++++-- .../github/api/v2/services/CommitService.java | 15 ++++++++++++++- .../com/github/api/v2/services/FeedService.java | 15 ++++++++++++++- .../com/github/api/v2/services/GistService.java | 15 ++++++++++++++- .../api/v2/services/GitHubAuthenticator.java | 17 +++++++++++++++-- .../api/v2/services/GitHubCommunicator.java | 17 +++++++++++++++-- .../github/api/v2/services/GitHubException.java | 15 ++++++++++++++- .../github/api/v2/services/GitHubService.java | 15 ++++++++++++++- .../api/v2/services/GitHubServiceFactory.java | 17 +++++++++++++++-- .../github/api/v2/services/IssueService.java | 15 ++++++++++++++- .../github/api/v2/services/NetworkService.java | 15 ++++++++++++++- .../github/api/v2/services/OAuthService.java | 13 +++++++++++++ .../github/api/v2/services/ObjectService.java | 15 ++++++++++++++- .../api/v2/services/RepositoryService.java | 15 ++++++++++++++- .../com/github/api/v2/services/UserService.java | 15 ++++++++++++++- .../api/v2/services/auth/Authentication.java | 15 ++++++++++++++- .../auth/HeaderBasedAuthentication.java | 15 ++++++++++++++- .../auth/LoginPasswordAuthentication.java | 15 ++++++++++++++- .../services/auth/LoginTokenAuthentication.java | 15 ++++++++++++++- .../v2/services/auth/OAuthAuthentication.java | 15 ++++++++++++++- .../auth/ParameterBasedAuthentication.java | 15 ++++++++++++++- .../services/constant/ApplicationConstants.java | 17 +++++++++++++++-- .../api/v2/services/constant/GitHubApiUrls.java | 17 +++++++++++++++-- .../v2/services/constant/ParameterNames.java | 15 ++++++++++++++- .../api/v2/services/impl/BaseGitHubService.java | 13 +++++++++++++ .../api/v2/services/impl/CommitServiceImpl.java | 15 ++++++++++++++- .../api/v2/services/impl/FeedServiceImpl.java | 15 ++++++++++++++- .../api/v2/services/impl/GistServiceImpl.java | 15 ++++++++++++++- .../api/v2/services/impl/GitHubApiGateway.java | 15 ++++++++++++++- .../api/v2/services/impl/IssueServiceImpl.java | 15 ++++++++++++++- .../v2/services/impl/NetworkServiceImpl.java | 15 ++++++++++++++- .../api/v2/services/impl/OAuthServiceImpl.java | 13 +++++++++++++ .../api/v2/services/impl/ObjectServiceImpl.java | 15 ++++++++++++++- .../v2/services/impl/RepositoryServiceImpl.java | 15 ++++++++++++++- .../api/v2/services/impl/UserServiceImpl.java | 15 ++++++++++++++- .../com/github/api/v2/services/util/Base64.java | 13 +++++++++++++ .../com/github/api/v2/services/AllTests.java | 13 +++++++++++++ .../api/v2/services/BaseGitHubServiceTest.java | 15 ++++++++++++++- .../api/v2/services/CommitServiceTest.java | 13 +++++++++++++ .../github/api/v2/services/FeedServiceTest.java | 16 ++++++++++++++++ .../github/api/v2/services/GistServiceTest.java | 13 +++++++++++++ .../api/v2/services/IssueServiceTest.java | 13 +++++++++++++ .../api/v2/services/NetworkServiceTest.java | 13 +++++++++++++ .../api/v2/services/OAuthServiceTest.java | 13 +++++++++++++ .../api/v2/services/ObjectServiceTest.java | 13 +++++++++++++ .../api/v2/services/RepositoryServiceTest.java | 13 +++++++++++++ .../github/api/v2/services/UserServiceTest.java | 15 ++++++++++++++- .../api/v2/services/constant/TestConstants.java | 17 +++++++++++++++-- .../v2/services/example/CommitApiSample.java | 15 ++++++++++++++- .../api/v2/services/example/FeedSample.java | 15 ++++++++++++++- .../api/v2/services/example/GistApiSample.java | 15 ++++++++++++++- .../api/v2/services/example/IssueApiSample.java | 15 ++++++++++++++- .../v2/services/example/NetworkApiSample.java | 15 ++++++++++++++- .../api/v2/services/example/OAuthExample.java | 15 ++++++++++++++- .../v2/services/example/ObjectApiSample.java | 15 ++++++++++++++- .../services/example/RepositoryApiSample.java | 15 ++++++++++++++- .../api/v2/services/example/UserApiSample.java | 15 ++++++++++++++- .../java/com/github/api/v2/schema/Blob.java | 15 ++++++++++++++- .../java/com/github/api/v2/schema/Comment.java | 15 ++++++++++++++- .../java/com/github/api/v2/schema/Commit.java | 15 ++++++++++++++- .../java/com/github/api/v2/schema/Delta.java | 15 ++++++++++++++- .../java/com/github/api/v2/schema/Feed.java | 15 ++++++++++++++- .../com/github/api/v2/schema/FeedEntry.java | 15 ++++++++++++++- .../java/com/github/api/v2/schema/Gist.java | 15 ++++++++++++++- .../main/java/com/github/api/v2/schema/Id.java | 15 ++++++++++++++- .../java/com/github/api/v2/schema/Issue.java | 15 ++++++++++++++- .../main/java/com/github/api/v2/schema/Key.java | 15 ++++++++++++++- .../java/com/github/api/v2/schema/Language.java | 15 ++++++++++++++- .../java/com/github/api/v2/schema/Network.java | 15 ++++++++++++++- .../java/com/github/api/v2/schema/Plan.java | 15 ++++++++++++++- .../com/github/api/v2/schema/Repository.java | 15 ++++++++++++++- .../com/github/api/v2/schema/SchemaEntity.java | 15 ++++++++++++++- .../java/com/github/api/v2/schema/Tree.java | 15 ++++++++++++++- .../java/com/github/api/v2/schema/User.java | 15 ++++++++++++++- .../com/github/api/v2/schema/ValueEnum.java | 13 +++++++++++++ 76 files changed, 1050 insertions(+), 69 deletions(-) diff --git a/.settings/net.sf.jautodoc.prefs b/.settings/net.sf.jautodoc.prefs index e3e5dd3..b859c84 100644 --- a/.settings/net.sf.jautodoc.prefs +++ b/.settings/net.sf.jautodoc.prefs @@ -1,7 +1,10 @@ -#Wed Jul 14 18:06:56 GMT+05:00 2010 +#Wed Jul 21 16:42:29 GMT+05:00 2010 +add_header=true add_todo=false eclipse.preferences.version=1 +header_text=/*\r\n * Copyright 2010 Nabeel Mukhtar \r\n * \r\n * Licensed under the Apache License, Version 2.0 (the "License"); \r\n * you may not use this file except in compliance with the License. \r\n * You may obtain a copy of the License at \r\n * \r\n * http\://www.apache.org/licenses/LICENSE-2.0\r\n * \r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an "AS IS" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. \r\n * See the License for the specific language governing permissions and\r\n * limitations under the License. \r\n * \r\n */ mode=mode_replace project_specific_settings=true +replace_header=true replacements=\n\n\nGets the\nSets the\nAdds the\nEdits the\nRemoves the\nInits the\nParses the\nCreates the\nBuilds the\nChecks if is\nPrints the\nChecks for\n\n\n use_internal_formatter=true diff --git a/core/src/main/java/com/github/api/v2/services/AsyncResponseHandler.java b/core/src/main/java/com/github/api/v2/services/AsyncResponseHandler.java index 5959c8e..d3bc72b 100644 --- a/core/src/main/java/com/github/api/v2/services/AsyncResponseHandler.java +++ b/core/src/main/java/com/github/api/v2/services/AsyncResponseHandler.java @@ -1,5 +1,18 @@ -/** - * +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * */ package com.github.api.v2.services; diff --git a/core/src/main/java/com/github/api/v2/services/CommitService.java b/core/src/main/java/com/github/api/v2/services/CommitService.java index 40d6284..d3d88c4 100644 --- a/core/src/main/java/com/github/api/v2/services/CommitService.java +++ b/core/src/main/java/com/github/api/v2/services/CommitService.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services; diff --git a/core/src/main/java/com/github/api/v2/services/FeedService.java b/core/src/main/java/com/github/api/v2/services/FeedService.java index f37d1bd..3384052 100644 --- a/core/src/main/java/com/github/api/v2/services/FeedService.java +++ b/core/src/main/java/com/github/api/v2/services/FeedService.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services; diff --git a/core/src/main/java/com/github/api/v2/services/GistService.java b/core/src/main/java/com/github/api/v2/services/GistService.java index 3dd2083..36dfa76 100644 --- a/core/src/main/java/com/github/api/v2/services/GistService.java +++ b/core/src/main/java/com/github/api/v2/services/GistService.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services; diff --git a/core/src/main/java/com/github/api/v2/services/GitHubAuthenticator.java b/core/src/main/java/com/github/api/v2/services/GitHubAuthenticator.java index 1f05683..c576026 100644 --- a/core/src/main/java/com/github/api/v2/services/GitHubAuthenticator.java +++ b/core/src/main/java/com/github/api/v2/services/GitHubAuthenticator.java @@ -1,5 +1,18 @@ -/** - * +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * */ package com.github.api.v2.services; diff --git a/core/src/main/java/com/github/api/v2/services/GitHubCommunicator.java b/core/src/main/java/com/github/api/v2/services/GitHubCommunicator.java index dc19f2a..f9b6ec4 100644 --- a/core/src/main/java/com/github/api/v2/services/GitHubCommunicator.java +++ b/core/src/main/java/com/github/api/v2/services/GitHubCommunicator.java @@ -1,5 +1,18 @@ -/** - * +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * */ package com.github.api.v2.services; diff --git a/core/src/main/java/com/github/api/v2/services/GitHubException.java b/core/src/main/java/com/github/api/v2/services/GitHubException.java index 887a63c..39332dd 100644 --- a/core/src/main/java/com/github/api/v2/services/GitHubException.java +++ b/core/src/main/java/com/github/api/v2/services/GitHubException.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services; diff --git a/core/src/main/java/com/github/api/v2/services/GitHubService.java b/core/src/main/java/com/github/api/v2/services/GitHubService.java index 58cf636..36a84d2 100644 --- a/core/src/main/java/com/github/api/v2/services/GitHubService.java +++ b/core/src/main/java/com/github/api/v2/services/GitHubService.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services; diff --git a/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java b/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java index e94707c..886fe51 100644 --- a/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java +++ b/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java @@ -1,5 +1,18 @@ -/** - * +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * */ package com.github.api.v2.services; diff --git a/core/src/main/java/com/github/api/v2/services/IssueService.java b/core/src/main/java/com/github/api/v2/services/IssueService.java index 33a29f3..88bd95f 100644 --- a/core/src/main/java/com/github/api/v2/services/IssueService.java +++ b/core/src/main/java/com/github/api/v2/services/IssueService.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services; diff --git a/core/src/main/java/com/github/api/v2/services/NetworkService.java b/core/src/main/java/com/github/api/v2/services/NetworkService.java index f8a0e9b..9695e54 100644 --- a/core/src/main/java/com/github/api/v2/services/NetworkService.java +++ b/core/src/main/java/com/github/api/v2/services/NetworkService.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services; diff --git a/core/src/main/java/com/github/api/v2/services/OAuthService.java b/core/src/main/java/com/github/api/v2/services/OAuthService.java index f3dd127..5b055ff 100644 --- a/core/src/main/java/com/github/api/v2/services/OAuthService.java +++ b/core/src/main/java/com/github/api/v2/services/OAuthService.java @@ -1,4 +1,17 @@ /* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services; diff --git a/core/src/main/java/com/github/api/v2/services/ObjectService.java b/core/src/main/java/com/github/api/v2/services/ObjectService.java index 6d1e4c8..941919a 100644 --- a/core/src/main/java/com/github/api/v2/services/ObjectService.java +++ b/core/src/main/java/com/github/api/v2/services/ObjectService.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services; diff --git a/core/src/main/java/com/github/api/v2/services/RepositoryService.java b/core/src/main/java/com/github/api/v2/services/RepositoryService.java index 4d2091e..16a7c28 100644 --- a/core/src/main/java/com/github/api/v2/services/RepositoryService.java +++ b/core/src/main/java/com/github/api/v2/services/RepositoryService.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services; diff --git a/core/src/main/java/com/github/api/v2/services/UserService.java b/core/src/main/java/com/github/api/v2/services/UserService.java index 5331e38..9f36830 100644 --- a/core/src/main/java/com/github/api/v2/services/UserService.java +++ b/core/src/main/java/com/github/api/v2/services/UserService.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services; diff --git a/core/src/main/java/com/github/api/v2/services/auth/Authentication.java b/core/src/main/java/com/github/api/v2/services/auth/Authentication.java index 7fd6f15..05afe8a 100644 --- a/core/src/main/java/com/github/api/v2/services/auth/Authentication.java +++ b/core/src/main/java/com/github/api/v2/services/auth/Authentication.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.auth; diff --git a/core/src/main/java/com/github/api/v2/services/auth/HeaderBasedAuthentication.java b/core/src/main/java/com/github/api/v2/services/auth/HeaderBasedAuthentication.java index 9c7ddae..6f321f6 100644 --- a/core/src/main/java/com/github/api/v2/services/auth/HeaderBasedAuthentication.java +++ b/core/src/main/java/com/github/api/v2/services/auth/HeaderBasedAuthentication.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.auth; diff --git a/core/src/main/java/com/github/api/v2/services/auth/LoginPasswordAuthentication.java b/core/src/main/java/com/github/api/v2/services/auth/LoginPasswordAuthentication.java index e4b5244..1217479 100644 --- a/core/src/main/java/com/github/api/v2/services/auth/LoginPasswordAuthentication.java +++ b/core/src/main/java/com/github/api/v2/services/auth/LoginPasswordAuthentication.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.auth; diff --git a/core/src/main/java/com/github/api/v2/services/auth/LoginTokenAuthentication.java b/core/src/main/java/com/github/api/v2/services/auth/LoginTokenAuthentication.java index 808fba4..3b1fd25 100644 --- a/core/src/main/java/com/github/api/v2/services/auth/LoginTokenAuthentication.java +++ b/core/src/main/java/com/github/api/v2/services/auth/LoginTokenAuthentication.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.auth; diff --git a/core/src/main/java/com/github/api/v2/services/auth/OAuthAuthentication.java b/core/src/main/java/com/github/api/v2/services/auth/OAuthAuthentication.java index 97b298b..7aaa723 100644 --- a/core/src/main/java/com/github/api/v2/services/auth/OAuthAuthentication.java +++ b/core/src/main/java/com/github/api/v2/services/auth/OAuthAuthentication.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.auth; diff --git a/core/src/main/java/com/github/api/v2/services/auth/ParameterBasedAuthentication.java b/core/src/main/java/com/github/api/v2/services/auth/ParameterBasedAuthentication.java index 9038806..ce8d497 100644 --- a/core/src/main/java/com/github/api/v2/services/auth/ParameterBasedAuthentication.java +++ b/core/src/main/java/com/github/api/v2/services/auth/ParameterBasedAuthentication.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.auth; diff --git a/core/src/main/java/com/github/api/v2/services/constant/ApplicationConstants.java b/core/src/main/java/com/github/api/v2/services/constant/ApplicationConstants.java index f22f9d9..f867b00 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/ApplicationConstants.java +++ b/core/src/main/java/com/github/api/v2/services/constant/ApplicationConstants.java @@ -1,5 +1,18 @@ -/** - * +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * */ package com.github.api.v2.services.constant; diff --git a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java index 7d0f7e5..86de4c3 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java +++ b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java @@ -1,5 +1,18 @@ -/** - * +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * */ package com.github.api.v2.services.constant; diff --git a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java index 7871391..bf2a1b0 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java +++ b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.constant; diff --git a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java index c5b1365..0bd708f 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java +++ b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java @@ -1,4 +1,17 @@ /* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.impl; diff --git a/core/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java index 6bf9590..dfedeb5 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.impl; diff --git a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java index 55e4767..b285a3b 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.impl; diff --git a/core/src/main/java/com/github/api/v2/services/impl/GistServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/GistServiceImpl.java index b72b4bb..d8bb3b1 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/GistServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/GistServiceImpl.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.impl; diff --git a/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java b/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java index e283168..36b1ab9 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java +++ b/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.impl; diff --git a/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java index 8418224..66e030c 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.impl; diff --git a/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java index 3e5bfb0..91dc8ae 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.impl; diff --git a/core/src/main/java/com/github/api/v2/services/impl/OAuthServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/OAuthServiceImpl.java index 909bdd9..1ce6c78 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/OAuthServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/OAuthServiceImpl.java @@ -1,4 +1,17 @@ /* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.impl; diff --git a/core/src/main/java/com/github/api/v2/services/impl/ObjectServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/ObjectServiceImpl.java index d34a0b9..e3fd543 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/ObjectServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/ObjectServiceImpl.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.impl; diff --git a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java index 1d5ca02..895dc0a 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.impl; diff --git a/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java index 3f38427..c2dd6ba 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.impl; diff --git a/core/src/main/java/com/github/api/v2/services/util/Base64.java b/core/src/main/java/com/github/api/v2/services/util/Base64.java index d97856b..2aaaf31 100644 --- a/core/src/main/java/com/github/api/v2/services/util/Base64.java +++ b/core/src/main/java/com/github/api/v2/services/util/Base64.java @@ -1,4 +1,17 @@ /* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.util; diff --git a/core/src/test/java/com/github/api/v2/services/AllTests.java b/core/src/test/java/com/github/api/v2/services/AllTests.java index ec9803d..0a08302 100644 --- a/core/src/test/java/com/github/api/v2/services/AllTests.java +++ b/core/src/test/java/com/github/api/v2/services/AllTests.java @@ -1,4 +1,17 @@ /* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services; diff --git a/core/src/test/java/com/github/api/v2/services/BaseGitHubServiceTest.java b/core/src/test/java/com/github/api/v2/services/BaseGitHubServiceTest.java index 35777cb..9dc0e7a 100644 --- a/core/src/test/java/com/github/api/v2/services/BaseGitHubServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/BaseGitHubServiceTest.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services; diff --git a/core/src/test/java/com/github/api/v2/services/CommitServiceTest.java b/core/src/test/java/com/github/api/v2/services/CommitServiceTest.java index 7cf3bd0..65a14ec 100644 --- a/core/src/test/java/com/github/api/v2/services/CommitServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/CommitServiceTest.java @@ -1,4 +1,17 @@ /* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services; diff --git a/core/src/test/java/com/github/api/v2/services/FeedServiceTest.java b/core/src/test/java/com/github/api/v2/services/FeedServiceTest.java index 050543f..3240d21 100644 --- a/core/src/test/java/com/github/api/v2/services/FeedServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/FeedServiceTest.java @@ -1,3 +1,19 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package com.github.api.v2.services; import org.junit.After; diff --git a/core/src/test/java/com/github/api/v2/services/GistServiceTest.java b/core/src/test/java/com/github/api/v2/services/GistServiceTest.java index 2fecb49..ae70488 100644 --- a/core/src/test/java/com/github/api/v2/services/GistServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/GistServiceTest.java @@ -1,4 +1,17 @@ /* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services; diff --git a/core/src/test/java/com/github/api/v2/services/IssueServiceTest.java b/core/src/test/java/com/github/api/v2/services/IssueServiceTest.java index 4cc21cb..5617ebc 100644 --- a/core/src/test/java/com/github/api/v2/services/IssueServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/IssueServiceTest.java @@ -1,4 +1,17 @@ /* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services; diff --git a/core/src/test/java/com/github/api/v2/services/NetworkServiceTest.java b/core/src/test/java/com/github/api/v2/services/NetworkServiceTest.java index dc493a7..f35784e 100644 --- a/core/src/test/java/com/github/api/v2/services/NetworkServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/NetworkServiceTest.java @@ -1,4 +1,17 @@ /* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services; diff --git a/core/src/test/java/com/github/api/v2/services/OAuthServiceTest.java b/core/src/test/java/com/github/api/v2/services/OAuthServiceTest.java index d9b2d87..d53d6b6 100644 --- a/core/src/test/java/com/github/api/v2/services/OAuthServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/OAuthServiceTest.java @@ -1,4 +1,17 @@ /* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services; diff --git a/core/src/test/java/com/github/api/v2/services/ObjectServiceTest.java b/core/src/test/java/com/github/api/v2/services/ObjectServiceTest.java index 0a98ec1..519984a 100644 --- a/core/src/test/java/com/github/api/v2/services/ObjectServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/ObjectServiceTest.java @@ -1,4 +1,17 @@ /* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services; diff --git a/core/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java b/core/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java index 733059e..04b5323 100644 --- a/core/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java @@ -1,4 +1,17 @@ /* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services; diff --git a/core/src/test/java/com/github/api/v2/services/UserServiceTest.java b/core/src/test/java/com/github/api/v2/services/UserServiceTest.java index c338238..dd8fb64 100644 --- a/core/src/test/java/com/github/api/v2/services/UserServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/UserServiceTest.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services; diff --git a/core/src/test/java/com/github/api/v2/services/constant/TestConstants.java b/core/src/test/java/com/github/api/v2/services/constant/TestConstants.java index 5b2441f..eb28517 100644 --- a/core/src/test/java/com/github/api/v2/services/constant/TestConstants.java +++ b/core/src/test/java/com/github/api/v2/services/constant/TestConstants.java @@ -1,5 +1,18 @@ -/** - * +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * */ package com.github.api.v2.services.constant; import java.io.IOException; diff --git a/examples/src/java/com/github/api/v2/services/example/CommitApiSample.java b/examples/src/java/com/github/api/v2/services/example/CommitApiSample.java index 0078925..5281345 100644 --- a/examples/src/java/com/github/api/v2/services/example/CommitApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/CommitApiSample.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.example; diff --git a/examples/src/java/com/github/api/v2/services/example/FeedSample.java b/examples/src/java/com/github/api/v2/services/example/FeedSample.java index 84db31f..5b904cd 100644 --- a/examples/src/java/com/github/api/v2/services/example/FeedSample.java +++ b/examples/src/java/com/github/api/v2/services/example/FeedSample.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.example; diff --git a/examples/src/java/com/github/api/v2/services/example/GistApiSample.java b/examples/src/java/com/github/api/v2/services/example/GistApiSample.java index c79320e..6077282 100644 --- a/examples/src/java/com/github/api/v2/services/example/GistApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/GistApiSample.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.example; diff --git a/examples/src/java/com/github/api/v2/services/example/IssueApiSample.java b/examples/src/java/com/github/api/v2/services/example/IssueApiSample.java index 2de5441..289733c 100644 --- a/examples/src/java/com/github/api/v2/services/example/IssueApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/IssueApiSample.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.example; diff --git a/examples/src/java/com/github/api/v2/services/example/NetworkApiSample.java b/examples/src/java/com/github/api/v2/services/example/NetworkApiSample.java index 13e1a64..ba36cc5 100644 --- a/examples/src/java/com/github/api/v2/services/example/NetworkApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/NetworkApiSample.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.example; diff --git a/examples/src/java/com/github/api/v2/services/example/OAuthExample.java b/examples/src/java/com/github/api/v2/services/example/OAuthExample.java index 6a4095d..24ac7c8 100644 --- a/examples/src/java/com/github/api/v2/services/example/OAuthExample.java +++ b/examples/src/java/com/github/api/v2/services/example/OAuthExample.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.example; diff --git a/examples/src/java/com/github/api/v2/services/example/ObjectApiSample.java b/examples/src/java/com/github/api/v2/services/example/ObjectApiSample.java index 6e84487..dac7b98 100644 --- a/examples/src/java/com/github/api/v2/services/example/ObjectApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/ObjectApiSample.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.example; diff --git a/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java b/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java index e1eb8fd..54255e7 100644 --- a/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.example; diff --git a/examples/src/java/com/github/api/v2/services/example/UserApiSample.java b/examples/src/java/com/github/api/v2/services/example/UserApiSample.java index 1c1d830..740a09d 100644 --- a/examples/src/java/com/github/api/v2/services/example/UserApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/UserApiSample.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.services.example; diff --git a/schema/src/main/java/com/github/api/v2/schema/Blob.java b/schema/src/main/java/com/github/api/v2/schema/Blob.java index 4ed9ff9..7908fc2 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Blob.java +++ b/schema/src/main/java/com/github/api/v2/schema/Blob.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.schema; diff --git a/schema/src/main/java/com/github/api/v2/schema/Comment.java b/schema/src/main/java/com/github/api/v2/schema/Comment.java index 9e203f0..465dff0 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Comment.java +++ b/schema/src/main/java/com/github/api/v2/schema/Comment.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.schema; diff --git a/schema/src/main/java/com/github/api/v2/schema/Commit.java b/schema/src/main/java/com/github/api/v2/schema/Commit.java index d792f56..1b58854 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Commit.java +++ b/schema/src/main/java/com/github/api/v2/schema/Commit.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.schema; diff --git a/schema/src/main/java/com/github/api/v2/schema/Delta.java b/schema/src/main/java/com/github/api/v2/schema/Delta.java index 1284d23..1fb83d2 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Delta.java +++ b/schema/src/main/java/com/github/api/v2/schema/Delta.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.schema; diff --git a/schema/src/main/java/com/github/api/v2/schema/Feed.java b/schema/src/main/java/com/github/api/v2/schema/Feed.java index 8ea0bce..728f7cc 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Feed.java +++ b/schema/src/main/java/com/github/api/v2/schema/Feed.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.schema; diff --git a/schema/src/main/java/com/github/api/v2/schema/FeedEntry.java b/schema/src/main/java/com/github/api/v2/schema/FeedEntry.java index c04a140..4a81900 100644 --- a/schema/src/main/java/com/github/api/v2/schema/FeedEntry.java +++ b/schema/src/main/java/com/github/api/v2/schema/FeedEntry.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.schema; diff --git a/schema/src/main/java/com/github/api/v2/schema/Gist.java b/schema/src/main/java/com/github/api/v2/schema/Gist.java index 9baf25e..a076f01 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Gist.java +++ b/schema/src/main/java/com/github/api/v2/schema/Gist.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.schema; diff --git a/schema/src/main/java/com/github/api/v2/schema/Id.java b/schema/src/main/java/com/github/api/v2/schema/Id.java index 43f5d4e..93730d0 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Id.java +++ b/schema/src/main/java/com/github/api/v2/schema/Id.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.schema; diff --git a/schema/src/main/java/com/github/api/v2/schema/Issue.java b/schema/src/main/java/com/github/api/v2/schema/Issue.java index 41ef36a..3635538 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Issue.java +++ b/schema/src/main/java/com/github/api/v2/schema/Issue.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.schema; diff --git a/schema/src/main/java/com/github/api/v2/schema/Key.java b/schema/src/main/java/com/github/api/v2/schema/Key.java index 13bdc7a..e0b731a 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Key.java +++ b/schema/src/main/java/com/github/api/v2/schema/Key.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.schema; diff --git a/schema/src/main/java/com/github/api/v2/schema/Language.java b/schema/src/main/java/com/github/api/v2/schema/Language.java index 3a8ca77..aa089e8 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Language.java +++ b/schema/src/main/java/com/github/api/v2/schema/Language.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.schema; diff --git a/schema/src/main/java/com/github/api/v2/schema/Network.java b/schema/src/main/java/com/github/api/v2/schema/Network.java index 83e2534..22a1d8f 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Network.java +++ b/schema/src/main/java/com/github/api/v2/schema/Network.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.schema; diff --git a/schema/src/main/java/com/github/api/v2/schema/Plan.java b/schema/src/main/java/com/github/api/v2/schema/Plan.java index 8a34c69..76bce67 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Plan.java +++ b/schema/src/main/java/com/github/api/v2/schema/Plan.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.schema; diff --git a/schema/src/main/java/com/github/api/v2/schema/Repository.java b/schema/src/main/java/com/github/api/v2/schema/Repository.java index ee19f48..ac0f3d8 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Repository.java +++ b/schema/src/main/java/com/github/api/v2/schema/Repository.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.schema; diff --git a/schema/src/main/java/com/github/api/v2/schema/SchemaEntity.java b/schema/src/main/java/com/github/api/v2/schema/SchemaEntity.java index 5d28f2d..4a8a58c 100644 --- a/schema/src/main/java/com/github/api/v2/schema/SchemaEntity.java +++ b/schema/src/main/java/com/github/api/v2/schema/SchemaEntity.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.schema; diff --git a/schema/src/main/java/com/github/api/v2/schema/Tree.java b/schema/src/main/java/com/github/api/v2/schema/Tree.java index f1a54b2..f38f770 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Tree.java +++ b/schema/src/main/java/com/github/api/v2/schema/Tree.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.schema; diff --git a/schema/src/main/java/com/github/api/v2/schema/User.java b/schema/src/main/java/com/github/api/v2/schema/User.java index 79149e7..6fb3261 100644 --- a/schema/src/main/java/com/github/api/v2/schema/User.java +++ b/schema/src/main/java/com/github/api/v2/schema/User.java @@ -1,4 +1,17 @@ -/** +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.schema; diff --git a/schema/src/main/java/com/github/api/v2/schema/ValueEnum.java b/schema/src/main/java/com/github/api/v2/schema/ValueEnum.java index 8a3656a..6e6d28b 100644 --- a/schema/src/main/java/com/github/api/v2/schema/ValueEnum.java +++ b/schema/src/main/java/com/github/api/v2/schema/ValueEnum.java @@ -1,4 +1,17 @@ /* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ package com.github.api.v2.schema; From 1df2cae38b20156852afefb5e5acdc706d97a03c Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Wed, 21 Jul 2010 18:27:32 +0500 Subject: [PATCH 14/95] Adding ReadMe.md --- ReadMe.md | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/ReadMe.md b/ReadMe.md index 5427110..8b496ab 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -2,17 +2,42 @@ This project provides a Java wrapper for the [GitHub API v.2.0](http://develop.github.com/). ## License -This project is open source with Apache 2.0 license. +This project is open source with [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html). ## Requirements This project has only one dependency on Gson which can be downloaded [here](http://code.google.com/p/google-gson/). If you plan to use the Feed Service than additional jars [ROME](http://rome.dev.java.net/) and [JDOM](http://www.jdom.org/) are required. ## Key Features +The library implements all the methods of GitHub API v.2.0. Additionally it has methods for reading various atom feeds from the GitHub site. It also has a method for downloading the source as a zip archive. +The library is divided into various services each implementing a specific portion of the API. +* UserService: Provides methods of the [User API](http://develop.github.com/p/users.html). +* IssueService: Provides methods of the [Issues API](http://develop.github.com/p/issues.html). +* GistService: Provides methods of the [Gist API](http://develop.github.com/p/gist.html). +* NetworkService: Provides methods of the [Network API](http://develop.github.com/p/network.html). +* RepositoryService: Provides methods of the [Repository API](http://develop.github.com/p/repo.html). +* CommitService: Provides methods of the [Commit API](http://develop.github.com/p/commits.html). +* ObjectService: Provides methods of the [Object API](http://develop.github.com/p/object.html). +* FeedService: Provides methods for reading the ATOM/RSS feeds. + ## Usage +Most of the methods of the API can be invoked without using any authentication. However some need the user to be authenticated. ### Typical +The typical usage includes the creation of the appropriate servive using a factory and invoking the methods of that service. + GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); + RepositoryService service = factory.createRepositoryService(); + List repositories = service.searchRepositories("hadoop"); + for (Repository repository : repositories) { + printResult(repository); + } + Repository repository = service.getRepository("nabeelmukhtar", "github-java-sdk"); + printResult(repository); ### Authenticated - +Authenticated usage is not very different from typical usage. Before calling any service method that requires authentication, you have to set the credentials on the service instance. Subsequent method calls from the same instance will not need further authentication. + GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); + RepositoryService service = factory.createRepositoryService(); + service.setAuthentication(new LoginTokenAuthentication("nabeelmukhtar", "xxx-xxx-xxx")); + service.createRepository("new-repo", "Creating new repository.", "http://www.example.com", Repository.Visibility.PUBLIC); ## More Information For more information see the following wiki pages. From 73d4a65ab1f5a7af78ecf46e71d74cd532adea10 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Wed, 21 Jul 2010 18:29:03 +0500 Subject: [PATCH 15/95] Adding ReadMe.md --- ReadMe.md | 1 + github-api.txt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ReadMe.md b/ReadMe.md index 8b496ab..1b6773b 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -10,6 +10,7 @@ This project has only one dependency on Gson which can be downloaded [here](http ## Key Features The library implements all the methods of GitHub API v.2.0. Additionally it has methods for reading various atom feeds from the GitHub site. It also has a method for downloading the source as a zip archive. The library is divided into various services each implementing a specific portion of the API. + * UserService: Provides methods of the [User API](http://develop.github.com/p/users.html). * IssueService: Provides methods of the [Issues API](http://develop.github.com/p/issues.html). * GistService: Provides methods of the [Gist API](http://develop.github.com/p/gist.html). diff --git a/github-api.txt b/github-api.txt index b9d3656..bd86bee 100644 --- a/github-api.txt +++ b/github-api.txt @@ -17,7 +17,7 @@ X. 3. Add Feed methods using atom. 5. Gist and repo visibility. 6. Network Meta is not complete. 7. Fix Network API. -8. Add a Readme. +X. 8. Add a Readme. Feeds https://github.com/nabeelmukhtar.private.atom?token=5c74e74601432623f1ee9c26b3d31d81 From ea108ecbc57f3c93827cc08f7fa960ec1a08da7d Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Thu, 22 Jul 2010 10:20:18 +0500 Subject: [PATCH 16/95] Added ReadMe.md --- ReadMe.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ReadMe.md b/ReadMe.md index 1b6773b..6584f46 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,3 +1,4 @@ +# GitHub Java SDK ## Description This project provides a Java wrapper for the [GitHub API v.2.0](http://develop.github.com/). @@ -6,6 +7,8 @@ This project is open source with [Apache License, Version 2.0](http://www.apache ## Requirements This project has only one dependency on Gson which can be downloaded [here](http://code.google.com/p/google-gson/). If you plan to use the Feed Service than additional jars [ROME](http://rome.dev.java.net/) and [JDOM](http://www.jdom.org/) are required. + +If the Feed Service is not used, the library can be employed on AppEngine and Android platforms as well. ## Key Features The library implements all the methods of GitHub API v.2.0. Additionally it has methods for reading various atom feeds from the GitHub site. It also has a method for downloading the source as a zip archive. From 1ffe25facf58329a45d775eb1dbb4e738a5ee98f Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Thu, 22 Jul 2010 12:21:10 +0500 Subject: [PATCH 17/95] Added ReadMe.md --- ReadMe.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReadMe.md b/ReadMe.md index 6584f46..f8b0e96 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -21,7 +21,7 @@ The library is divided into various services each implementing a specific portio * RepositoryService: Provides methods of the [Repository API](http://develop.github.com/p/repo.html). * CommitService: Provides methods of the [Commit API](http://develop.github.com/p/commits.html). * ObjectService: Provides methods of the [Object API](http://develop.github.com/p/object.html). -* FeedService: Provides methods for reading the ATOM/RSS feeds. +* FeedService: Provides methods for reading the Atom/RSS feeds. ## Usage From 613c3532fb46e6d1f0ad620fe56d0bccfbf9ab5d Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Thu, 22 Jul 2010 12:29:17 +0500 Subject: [PATCH 18/95] Added README.txt --- ReadMe.md => README.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename ReadMe.md => README.txt (100%) diff --git a/ReadMe.md b/README.txt similarity index 100% rename from ReadMe.md rename to README.txt From ed9786dae59ce751aa9fa54b5b02c0419017a4d5 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Thu, 22 Jul 2010 12:30:14 +0500 Subject: [PATCH 19/95] Added README.md --- README.txt => README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename README.txt => README.md (100%) diff --git a/README.txt b/README.md similarity index 100% rename from README.txt rename to README.md From 9bf2dc21c495d71ed5e619c5b91427ddc78d9c01 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Fri, 23 Jul 2010 21:07:41 +0500 Subject: [PATCH 20/95] Fixed Deploy Key Bugs. --- .../java/com/github/api/v2/services/RepositoryService.java | 2 +- .../github/api/v2/services/impl/RepositoryServiceImpl.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/RepositoryService.java b/core/src/main/java/com/github/api/v2/services/RepositoryService.java index 16a7c28..a085f54 100644 --- a/core/src/main/java/com/github/api/v2/services/RepositoryService.java +++ b/core/src/main/java/com/github/api/v2/services/RepositoryService.java @@ -195,7 +195,7 @@ public interface RepositoryService extends GitHubService { * * @return the string */ - public String addDeployKey(String repositoryName, String title, String key); + public List addDeployKey(String repositoryName, String title, String key); /** * Removes the deploy key. diff --git a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java index 895dc0a..a1d260b 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java @@ -54,7 +54,7 @@ public void addCollaborator(String repositoryName, String collaboratorName) { * @see com.github.api.v2.services.RepositoryService#addDeployKey(java.lang.String, java.lang.String, java.lang.String) */ @Override - public String addDeployKey(String repositoryName, String title, String key) { + public List addDeployKey(String repositoryName, String title, String key) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.ADD_DEPLOY_KEY_URL); String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); Map parameters = new HashMap(); @@ -62,7 +62,7 @@ public String addDeployKey(String repositoryName, String title, String key) { parameters.put(ParameterNames.KEY, key); JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); - return unmarshall(new TypeToken(){}, json); + return unmarshall(new TypeToken>(){}, json.get("public_keys")); } /* (non-Javadoc) From 2cc0b74350ec7844e043c172f6ba35c374b05258 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Fri, 23 Jul 2010 21:45:46 +0500 Subject: [PATCH 21/95] Gist and Repo Visibility. --- .../v2/services/impl/BaseGitHubService.java | 25 +++++++- .../v2/services/impl/NetworkServiceImpl.java | 4 +- github-api.txt | 2 +- .../java/com/github/api/v2/schema/Gist.java | 57 ++++++++++++++++++- 4 files changed, 83 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java index 0bd708f..b716c29 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java +++ b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java @@ -18,11 +18,13 @@ import java.io.InputStream; import java.io.InputStreamReader; +import java.lang.reflect.Field; import java.lang.reflect.Type; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; +import com.github.api.v2.schema.Gist; import com.github.api.v2.schema.Issue; import com.github.api.v2.schema.Language; import com.github.api.v2.schema.Repository; @@ -34,6 +36,7 @@ import com.github.api.v2.services.constant.ApplicationConstants; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; import com.google.gson.FieldNamingPolicy; +import com.google.gson.FieldNamingStrategy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonDeserializationContext; @@ -125,6 +128,19 @@ protected GsonBuilder getGsonBuilder() { GsonBuilder builder = new GsonBuilder(); builder.setDateFormat(ApplicationConstants.DATE_FORMAT); builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); + builder.setFieldNamingStrategy(new FieldNamingStrategy() { + @Override + public String translateName(Field field) { + if (field.getType().equals(Repository.Visibility.class)) { + return "private"; + } else if (field.getType().equals(Gist.Visibility.class)) { + return "public"; + } else { + return field.getName(); + } + } + + }); builder.registerTypeAdapter(Issue.State.class, new JsonDeserializer() { @Override public Issue.State deserialize(JsonElement arg0, Type arg1, @@ -136,7 +152,14 @@ public Issue.State deserialize(JsonElement arg0, Type arg1, @Override public Repository.Visibility deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2) throws JsonParseException { - return Repository.Visibility.fromValue(arg0.getAsString()); + return (arg0.getAsBoolean())? Repository.Visibility.PRIVATE : Repository.Visibility.PUBLIC; + } + }); + builder.registerTypeAdapter(Gist.Visibility.class, new JsonDeserializer() { + @Override + public Gist.Visibility deserialize(JsonElement arg0, Type arg1, + JsonDeserializationContext arg2) throws JsonParseException { + return (arg0.getAsBoolean())? Gist.Visibility.PUBLIC : Gist.Visibility.PRIVATE; } }); builder.registerTypeAdapter(Language.class, new JsonDeserializer() { diff --git a/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java index 91dc8ae..23ae353 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java @@ -24,6 +24,7 @@ import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; +import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; @@ -69,7 +70,8 @@ public Network getNetworkMeta(String userName, String repositoryName) { String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken(){}, json); + Gson gson = getGsonBuilder().setDateFormat("yyyy-MM-dd").create(); + return gson.fromJson(json, Network.class); } /* (non-Javadoc) diff --git a/github-api.txt b/github-api.txt index bd86bee..0f1e785 100644 --- a/github-api.txt +++ b/github-api.txt @@ -14,7 +14,7 @@ Commit class is not complete. X. 2. Remove commons cli. X. 3. Add Feed methods using atom. 4. Update rrpo and user methods need to be fixed. -5. Gist and repo visibility. +X. 5. Gist and repo visibility. 6. Network Meta is not complete. 7. Fix Network API. X. 8. Add a Readme. diff --git a/schema/src/main/java/com/github/api/v2/schema/Gist.java b/schema/src/main/java/com/github/api/v2/schema/Gist.java index a076f01..a4bba5c 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Gist.java +++ b/schema/src/main/java/com/github/api/v2/schema/Gist.java @@ -17,15 +17,68 @@ package com.github.api.v2.schema; import java.util.Date; +import java.util.HashMap; import java.util.List; - -import com.github.api.v2.schema.Repository.Visibility; +import java.util.Map; /** * The Class Gist. */ public class Gist extends SchemaEntity { + + /** + * The Enum Visibility. + */ + public enum Visibility implements ValueEnum { + + /** The PUBLIC. */ + PUBLIC("public"), + /** The PRIVATE. */ + PRIVATE("private"); + + /** The Constant stringToEnum. */ + private static final Map stringToEnum = new HashMap(); + static { // Initialize map from constant name to enum constant + for (Visibility op : values()) { + stringToEnum.put(op.value(), op); + } + } + + /** The value. */ + private final String value; + + /** + * Instantiates a new visibility. + * + * @param value + * the value + */ + Visibility(String value) { + this.value = value; + } + + /* (non-Javadoc) + * @see com.github.api.v2.schema.ValueEnum#value() + */ + @Override + public String value() { + return value; + } + + /** + * From value. + * + * @param value + * the value + * + * @return the visibility + */ + public static Visibility fromValue(String value) { + return stringToEnum.get(value); + } + } + /** The Constant serialVersionUID. */ private static final long serialVersionUID = 9155892708485181542L; From 76a3e31dc9826ec09c9965235f9a8311ae751f7e Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Wed, 28 Jul 2010 11:35:15 +0500 Subject: [PATCH 22/95] Updates to Issues API. --- .../com/github/api/v2/services/IssueService.java | 16 ++++++++++++++++ .../api/v2/services/constant/GitHubApiUrls.java | 2 ++ .../api/v2/services/impl/IssueServiceImpl.java | 10 ++++++++++ .../services/constant/GitHubApiUrls.properties | 1 + .../github/api/v2/services/IssueServiceTest.java | 9 +++++++++ github-api.txt | 1 + 6 files changed, 39 insertions(+) diff --git a/core/src/main/java/com/github/api/v2/services/IssueService.java b/core/src/main/java/com/github/api/v2/services/IssueService.java index 88bd95f..20108a0 100644 --- a/core/src/main/java/com/github/api/v2/services/IssueService.java +++ b/core/src/main/java/com/github/api/v2/services/IssueService.java @@ -43,6 +43,22 @@ public interface IssueService extends GitHubService { */ public List searchIssues(String userName, String repositoryName, State state, String keyword); + /** + * Search issues. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param state + * the state + * @param keyword + * the keyword + * + * @return the list< issue> + */ + public List getIssues(String userName, String repositoryName, String label); + /** * Gets the issues. * diff --git a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java index 86de4c3..c72b474 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java +++ b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java @@ -157,6 +157,8 @@ public static interface IssueApiUrls { /** The Constant ADD_COMMENT_URL. */ public static final String ADD_COMMENT_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.addComment"); + + public static final String GET_ISSUES_BY_LABEL_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.getIssuesByLabel"); } /** diff --git a/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java index 66e030c..0a30c3d 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java @@ -175,6 +175,16 @@ public List searchIssues(String userName, String repositoryName, return unmarshall(new TypeToken>(){}, json.get("issues")); } + @Override + public List getIssues(String userName, String repositoryName, + String label) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.GET_ISSUES_BY_LABEL_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.LABEL, label).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("issues")); + } + /* (non-Javadoc) * @see com.github.api.v2.services.IssueService#updateIssue(java.lang.String, java.lang.String, int, java.lang.String, java.lang.String) */ diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index 7094778..50763fd 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -37,6 +37,7 @@ com.github.api.v2.services.issueService.getIssueLabels=http://github.com/api/{ve com.github.api.v2.services.issueService.addLabel=http://github.com/api/{version}/{format}/issues/label/add/{userName}/{repositoryName}/{label}/{issueNumber} com.github.api.v2.services.issueService.removeLabel=http://github.com/api/{version}/{format}/issues/label/remove/{userName}/{repositoryName}/{label}/{issueNumber} com.github.api.v2.services.issueService.addComment=http://github.com/api/{version}/{format}/issues/comment/{userName}/{repositoryName}/{issueNumber} +com.github.api.v2.services.issueService.getIssuesByLabel=http://github.com/api/{version}/{format}/issues/list/{userName}/{repositoryName}/label/{label} # Gist API com.github.api.v2.services.gistService.getGist=http://gist.github.com/api/v1/{format}/{gistId} diff --git a/core/src/test/java/com/github/api/v2/services/IssueServiceTest.java b/core/src/test/java/com/github/api/v2/services/IssueServiceTest.java index 5617ebc..f5d5231 100644 --- a/core/src/test/java/com/github/api/v2/services/IssueServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/IssueServiceTest.java @@ -182,6 +182,15 @@ public void testSearchIssues() { assertNotNullOrEmpty("Issues cannot be null or empty.", issues); } + @Test + public void testGetIssuesByLabel() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Label."), TestConstants.TEST_ISSUE_LABEL); + List issues = service.getIssues(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_ISSUE_LABEL); + assertNotNullOrEmpty("Issues cannot be null or empty.", issues); + } + /** * Test update issue. */ diff --git a/github-api.txt b/github-api.txt index 0f1e785..6fbd9d1 100644 --- a/github-api.txt +++ b/github-api.txt @@ -6,6 +6,7 @@ http://support.github.com/discussions/api http://support.github.com/discussions/api/28-oauth2-busy-developers-guide http://github.com/account/applications/59 http://github.com/account/applications/61 +http://github.com/develop/develop.github.com githubapitest http://ajax.googleapis.com/ajax/services/feed/load?&q=http://github.com/apache.atom&v=1.0 From 02f0336b79837a1288d902548a5365f36996f9b1 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Mon, 2 Aug 2010 12:15:39 +0500 Subject: [PATCH 23/95] Updated README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f8b0e96..8366820 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ The library is divided into various services each implementing a specific portio * CommitService: Provides methods of the [Commit API](http://develop.github.com/p/commits.html). * ObjectService: Provides methods of the [Object API](http://develop.github.com/p/object.html). * FeedService: Provides methods for reading the Atom/RSS feeds. +* OAuthService: Provides methods for OAuth 2.0 authentication and authorization. ## Usage From f1c583f9a503904ce86e1a585518d1cb073ea3de Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Thu, 5 Aug 2010 20:12:47 +0500 Subject: [PATCH 24/95] Fixing the Network API. --- .../api/v2/services/NetworkService.java | 10 +- .../v2/services/impl/NetworkServiceImpl.java | 16 +- .../api/v2/services/NetworkServiceTest.java | 10 +- .../v2/services/example/NetworkApiSample.java | 8 +- github-api.txt | 6 +- .../java/com/github/api/v2/schema/Block.java | 75 ++++++ .../java/com/github/api/v2/schema/Head.java | 72 ++++++ .../github/api/v2/schema/NetworkCommit.java | 238 ++++++++++++++++++ .../schema/{Network.java => NetworkMeta.java} | 39 ++- .../com/github/api/v2/schema/NetworkUser.java | 77 ++++++ 10 files changed, 523 insertions(+), 28 deletions(-) create mode 100644 schema/src/main/java/com/github/api/v2/schema/Block.java create mode 100644 schema/src/main/java/com/github/api/v2/schema/Head.java create mode 100644 schema/src/main/java/com/github/api/v2/schema/NetworkCommit.java rename schema/src/main/java/com/github/api/v2/schema/{Network.java => NetworkMeta.java} (73%) create mode 100644 schema/src/main/java/com/github/api/v2/schema/NetworkUser.java diff --git a/core/src/main/java/com/github/api/v2/services/NetworkService.java b/core/src/main/java/com/github/api/v2/services/NetworkService.java index 9695e54..a9c0d60 100644 --- a/core/src/main/java/com/github/api/v2/services/NetworkService.java +++ b/core/src/main/java/com/github/api/v2/services/NetworkService.java @@ -18,8 +18,8 @@ import java.util.List; -import com.github.api.v2.schema.Commit; -import com.github.api.v2.schema.Network; +import com.github.api.v2.schema.NetworkCommit; +import com.github.api.v2.schema.NetworkMeta; /** * The Interface NetworkService. @@ -36,7 +36,7 @@ public interface NetworkService extends GitHubService { * * @return the network meta */ - public Network getNetworkMeta(String userName, String repositoryName); + public NetworkMeta getNetworkMeta(String userName, String repositoryName); /** * Gets the network data. @@ -50,7 +50,7 @@ public interface NetworkService extends GitHubService { * * @return the network data */ - public List getNetworkData(String userName, String repositoryName, String networkHash); + public List getNetworkData(String userName, String repositoryName, String networkHash); /** * Gets the network data. @@ -68,5 +68,5 @@ public interface NetworkService extends GitHubService { * * @return the network data */ - public List getNetworkData(String userName, String repositoryName, String networkHash, int startIndex, int endIndex); + public List getNetworkData(String userName, String repositoryName, String networkHash, int startIndex, int endIndex); } diff --git a/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java index 23ae353..1018bd6 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java @@ -18,8 +18,8 @@ import java.util.List; -import com.github.api.v2.schema.Commit; -import com.github.api.v2.schema.Network; +import com.github.api.v2.schema.NetworkCommit; +import com.github.api.v2.schema.NetworkMeta; import com.github.api.v2.services.NetworkService; import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; @@ -39,39 +39,39 @@ public class NetworkServiceImpl extends BaseGitHubService implements * @see com.github.api.v2.services.NetworkService#getNetworkData(java.lang.String, java.lang.String, java.lang.String) */ @Override - public List getNetworkData(String userName, String repositoryName, + public List getNetworkData(String userName, String repositoryName, String networkHash) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.NetworkApiUrls.GET_NETWORK_DATA_URL); String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withParameter(ParameterNames.NET_HASH, networkHash).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("commits")); + return unmarshall(new TypeToken>(){}, json.get("commits")); } /* (non-Javadoc) * @see com.github.api.v2.services.NetworkService#getNetworkData(java.lang.String, java.lang.String, java.lang.String, int, int) */ @Override - public List getNetworkData(String userName, String repositoryName, + public List getNetworkData(String userName, String repositoryName, String networkHash, int startIndex, int endIndex) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.NetworkApiUrls.GET_NETWORK_DATA_URL); String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withParameter(ParameterNames.NET_HASH, networkHash).withParameter(ParameterNames.START_INDEX, String.valueOf(startIndex)).withParameter(ParameterNames.END_INDEX, String.valueOf(endIndex)).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("commits")); + return unmarshall(new TypeToken>(){}, json.get("commits")); } /* (non-Javadoc) * @see com.github.api.v2.services.NetworkService#getNetworkMeta(java.lang.String, java.lang.String) */ @Override - public Network getNetworkMeta(String userName, String repositoryName) { + public NetworkMeta getNetworkMeta(String userName, String repositoryName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.NetworkApiUrls.GET_NETWORK_META_URL); String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); Gson gson = getGsonBuilder().setDateFormat("yyyy-MM-dd").create(); - return gson.fromJson(json, Network.class); + return gson.fromJson(json, NetworkMeta.class); } /* (non-Javadoc) diff --git a/core/src/test/java/com/github/api/v2/services/NetworkServiceTest.java b/core/src/test/java/com/github/api/v2/services/NetworkServiceTest.java index f35784e..a9794f3 100644 --- a/core/src/test/java/com/github/api/v2/services/NetworkServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/NetworkServiceTest.java @@ -22,8 +22,8 @@ import org.junit.Before; import org.junit.Test; -import com.github.api.v2.schema.Commit; -import com.github.api.v2.schema.Network; +import com.github.api.v2.schema.NetworkCommit; +import com.github.api.v2.schema.NetworkMeta; import com.github.api.v2.services.constant.TestConstants; /** @@ -61,7 +61,7 @@ public void testGetNetworkDataStringStringString() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Network Hash."), TestConstants.TEST_NETWORK_HASH); - List commits = service.getNetworkData(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_NETWORK_HASH); + List commits = service.getNetworkData(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_NETWORK_HASH); assertNotNullOrEmpty("Commits should not be null or empty.", commits); } @@ -73,7 +73,7 @@ public void testGetNetworkDataStringStringStringIntInt() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Network Hash."), TestConstants.TEST_NETWORK_HASH); - List commits = service.getNetworkData(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_NETWORK_HASH, 1, 5); + List commits = service.getNetworkData(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_NETWORK_HASH, 1, 5); assertNotNullOrEmpty("Commits should not be null or empty.", commits); } @@ -84,7 +84,7 @@ public void testGetNetworkDataStringStringStringIntInt() { public void testGetNetworkMeta() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - Network networkMeta = service.getNetworkMeta(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + NetworkMeta networkMeta = service.getNetworkMeta(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); assertNotNull("Network cannot be null", networkMeta); } diff --git a/examples/src/java/com/github/api/v2/services/example/NetworkApiSample.java b/examples/src/java/com/github/api/v2/services/example/NetworkApiSample.java index ba36cc5..ea7f78d 100644 --- a/examples/src/java/com/github/api/v2/services/example/NetworkApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/NetworkApiSample.java @@ -18,7 +18,7 @@ import java.util.List; -import com.github.api.v2.schema.Commit; +import com.github.api.v2.schema.NetworkCommit; import com.github.api.v2.services.GitHubServiceFactory; import com.github.api.v2.services.NetworkService; @@ -36,8 +36,8 @@ public class NetworkApiSample { public static void main(String[] args) { GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); NetworkService service = factory.createNetworkService(); - List commits = service.getNetworkData("facebook", "tornado", "7b80c2f4db226d6fa3a7f3dfa59277da1d642f91"); - for (Commit commit : commits) { + List commits = service.getNetworkData("facebook", "tornado", "7b80c2f4db226d6fa3a7f3dfa59277da1d642f91"); + for (NetworkCommit commit : commits) { printResult(commit); } } @@ -48,7 +48,7 @@ public static void main(String[] args) { * @param commit * the commit */ - private static void printResult(Commit commit) { + private static void printResult(NetworkCommit commit) { System.out.println(commit); } } diff --git a/github-api.txt b/github-api.txt index 6fbd9d1..2b5ae89 100644 --- a/github-api.txt +++ b/github-api.txt @@ -11,13 +11,13 @@ githubapitest http://ajax.googleapis.com/ajax/services/feed/load?&q=http://github.com/apache.atom&v=1.0 Commit class is not complete. -1. Network and commit should be separate. +X. 1. Network and commit should be separate. X. 2. Remove commons cli. X. 3. Add Feed methods using atom. 4. Update rrpo and user methods need to be fixed. X. 5. Gist and repo visibility. -6. Network Meta is not complete. -7. Fix Network API. +X. 6. Network Meta is not complete. +X. 7. Fix Network API. X. 8. Add a Readme. Feeds diff --git a/schema/src/main/java/com/github/api/v2/schema/Block.java b/schema/src/main/java/com/github/api/v2/schema/Block.java new file mode 100644 index 0000000..6d3e33d --- /dev/null +++ b/schema/src/main/java/com/github/api/v2/schema/Block.java @@ -0,0 +1,75 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +/** + * The Class Id. + */ +public class Block extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** The id. */ + private String name; + private int start; + private int count; + /** + * @return the name + */ + public String getName() { + return name; + } + /** + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + /** + * @return the start + */ + public int getStart() { + return start; + } + /** + * @param start the start to set + */ + public void setStart(int start) { + this.start = start; + } + /** + * @return the count + */ + public int getCount() { + return count; + } + /** + * @param count the count to set + */ + public void setCount(int count) { + this.count = count; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Block [count=" + count + ", name=" + name + ", start=" + start + + "]"; + } +} diff --git a/schema/src/main/java/com/github/api/v2/schema/Head.java b/schema/src/main/java/com/github/api/v2/schema/Head.java new file mode 100644 index 0000000..db85d1a --- /dev/null +++ b/schema/src/main/java/com/github/api/v2/schema/Head.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +/** + * The Class Id. + */ +public class Head extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** The id. */ + private String id; + + private String name; + + + /** + * @return the name + */ + public String getName() { + return name; + } + + /** + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the id. + * + * @return the id + */ + public String getId() { + return id; + } + + /** + * Sets the id. + * + * @param id + * the new id + */ + public void setId(String id) { + this.id = id; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Id [id=" + id + "][name=" + name + "]"; + } +} diff --git a/schema/src/main/java/com/github/api/v2/schema/NetworkCommit.java b/schema/src/main/java/com/github/api/v2/schema/NetworkCommit.java new file mode 100644 index 0000000..184f811 --- /dev/null +++ b/schema/src/main/java/com/github/api/v2/schema/NetworkCommit.java @@ -0,0 +1,238 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +import java.util.Date; +import java.util.List; + +/** + * The Class Commit. + */ +public class NetworkCommit extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** The message. */ + private String message; + + /** The time. */ + private long time; + + /** The parents. */ + private List> parents; + + /** The date. */ + private Date date; + + /** The author. */ + private String author; + + /** The id. */ + private String id; + + /** The space. */ + private int space; + + /** The gravatar. */ + private String gravatar; + + /** The login. */ + private String login; + + /** + * Gets the message. + * + * @return the message + */ + public String getMessage() { + return message; + } + + /** + * Sets the message. + * + * @param message + * the new message + */ + public void setMessage(String message) { + this.message = message; + } + + /** + * Gets the time. + * + * @return the time + */ + public long getTime() { + return time; + } + + /** + * Sets the time. + * + * @param time + * the new time + */ + public void setTime(long time) { + this.time = time; + } + + /** + * Gets the parents. + * + * @return the parents + */ + public List> getParents() { + return parents; + } + + /** + * Sets the parents. + * + * @param parents + * the new parents + */ + public void setParents(List> parents) { + this.parents = parents; + } + + /** + * Gets the date. + * + * @return the date + */ + public Date getDate() { + return date; + } + + /** + * Sets the date. + * + * @param date + * the new date + */ + public void setDate(Date date) { + this.date = date; + } + + /** + * Gets the author. + * + * @return the author + */ + public String getAuthor() { + return author; + } + + /** + * Sets the author. + * + * @param author + * the new author + */ + public void setAuthor(String author) { + this.author = author; + } + + /** + * Gets the id. + * + * @return the id + */ + public String getId() { + return id; + } + + /** + * Sets the id. + * + * @param id + * the new id + */ + public void setId(String id) { + this.id = id; + } + + /** + * Gets the space. + * + * @return the space + */ + public int getSpace() { + return space; + } + + /** + * Sets the space. + * + * @param space + * the new space + */ + public void setSpace(int space) { + this.space = space; + } + + /** + * Gets the gravatar. + * + * @return the gravatar + */ + public String getGravatar() { + return gravatar; + } + + /** + * Sets the gravatar. + * + * @param gravatar + * the new gravatar + */ + public void setGravatar(String gravatar) { + this.gravatar = gravatar; + } + + /** + * Gets the login. + * + * @return the login + */ + public String getLogin() { + return login; + } + + /** + * Sets the login. + * + * @param login + * the new login + */ + public void setLogin(String login) { + this.login = login; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "NetworkCommit [author=" + author + ", date=" + date + + ", gravatar=" + gravatar + ", id=" + id + ", login=" + login + + ", message=" + message + ", parents=" + parents + ", space=" + + space + ", time=" + time + "]"; + } +} diff --git a/schema/src/main/java/com/github/api/v2/schema/Network.java b/schema/src/main/java/com/github/api/v2/schema/NetworkMeta.java similarity index 73% rename from schema/src/main/java/com/github/api/v2/schema/Network.java rename to schema/src/main/java/com/github/api/v2/schema/NetworkMeta.java index 22a1d8f..d2b4974 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Network.java +++ b/schema/src/main/java/com/github/api/v2/schema/NetworkMeta.java @@ -22,7 +22,7 @@ /** * The Class Network. */ -public class Network extends SchemaEntity { +public class NetworkMeta extends SchemaEntity { /** The Constant serialVersionUID. */ private static final long serialVersionUID = 9155892708485181542L; @@ -36,6 +36,9 @@ public class Network extends SchemaEntity { /** The dates. */ private List dates; + private List users; + private List blocks; + /** * Gets the focus. * @@ -92,12 +95,42 @@ public List getDates() { public void setDates(List dates) { this.dates = dates; } + + /** + * @return the users + */ + public List getUsers() { + return users; + } + + /** + * @param users the users to set + */ + public void setUsers(List users) { + this.users = users; + } + + /** + * @return the blocks + */ + public List getBlocks() { + return blocks; + } + + /** + * @param blocks the blocks to set + */ + public void setBlocks(List blocks) { + this.blocks = blocks; + } + /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { - return "Network [dates=" + dates + ", focus=" + focus + ", nethash=" - + nethash + "]"; + return "NetworkMeta [blocks=" + blocks + ", dates=" + dates + + ", focus=" + focus + ", nethash=" + nethash + ", users=" + + users + "]"; } } diff --git a/schema/src/main/java/com/github/api/v2/schema/NetworkUser.java b/schema/src/main/java/com/github/api/v2/schema/NetworkUser.java new file mode 100644 index 0000000..0eacd2a --- /dev/null +++ b/schema/src/main/java/com/github/api/v2/schema/NetworkUser.java @@ -0,0 +1,77 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +import java.util.List; + + +/** + * The Class Commit. + */ +public class NetworkUser extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + private String name; + private String repo; + private List heads; + /** + * @return the name + */ + public String getName() { + return name; + } + /** + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + /** + * @return the repo + */ + public String getRepo() { + return repo; + } + /** + * @param repo the repo to set + */ + public void setRepo(String repo) { + this.repo = repo; + } + /** + * @return the heads + */ + public List getHeads() { + return heads; + } + /** + * @param heads the heads to set + */ + public void setHeads(List heads) { + this.heads = heads; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "NetworkUser [heads=" + heads + ", name=" + name + ", repo=" + + repo + "]"; + } +} From 7e7bccc1d89193ab1442bd822c49065c96569ffe Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Thu, 5 Aug 2010 20:23:07 +0500 Subject: [PATCH 25/95] Update Methods. --- .../api/v2/services/impl/RepositoryServiceImpl.java | 10 +++++----- .../github/api/v2/services/impl/UserServiceImpl.java | 10 +++++----- github-api.txt | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java index a1d260b..394f4e7 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java @@ -344,11 +344,11 @@ public void updateRepository(Repository repository) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.UPDATE_REPOSITORY_URL); String apiUrl = builder.withField(ParameterNames.USER_NAME, "").withField(ParameterNames.REPOSITORY_NAME, "").buildUrl(); Map parameters = new HashMap(); - parameters.put(ParameterNames.DESCRIPTION, ""); - parameters.put(ParameterNames.HOME_PAGE, ""); - parameters.put(ParameterNames.HAS_WIKI, ""); - parameters.put(ParameterNames.HAS_ISSUES, ""); - parameters.put(ParameterNames.HAS_DOWNLOADS, ""); + parameters.put("values[" + ParameterNames.DESCRIPTION + "]", repository.getDescription()); + parameters.put("values[" + ParameterNames.HOME_PAGE + "]", repository.getHomepage()); + parameters.put("values[" + ParameterNames.HAS_WIKI + "]", String.valueOf(repository.isHasWiki())); + parameters.put("values[" + ParameterNames.HAS_ISSUES + "]", String.valueOf(repository.isHasIssues())); + parameters.put("values[" + ParameterNames.HAS_DOWNLOADS + "]", String.valueOf(repository.isHasDownloads())); JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); unmarshall(new TypeToken(){}, json.get("repository")); diff --git a/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java index c2dd6ba..22eeec5 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java @@ -221,11 +221,11 @@ public void updateUser(User user) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.UPDATE_USER_URL); String apiUrl = builder.withField(ParameterNames.USER_NAME, user.getUsername()).buildUrl(); Map parameters = new HashMap(); - parameters.put(ParameterNames.NAME, user.getName()); - parameters.put(ParameterNames.EMAIL, user.getEmail()); - parameters.put(ParameterNames.BLOG, user.getBlog()); - parameters.put(ParameterNames.COMPANY, user.getCompany()); - parameters.put(ParameterNames.LOCATION, user.getLocation()); + parameters.put("values[" + ParameterNames.NAME + "]", user.getName()); + parameters.put("values[" + ParameterNames.EMAIL + "]", user.getEmail()); + parameters.put("values[" + ParameterNames.BLOG + "]", user.getBlog()); + parameters.put("values[" + ParameterNames.COMPANY + "]", user.getCompany()); + parameters.put("values[" + ParameterNames.LOCATION + "]", user.getLocation()); callApiPost(apiUrl, parameters); } diff --git a/github-api.txt b/github-api.txt index 2b5ae89..393304d 100644 --- a/github-api.txt +++ b/github-api.txt @@ -14,7 +14,7 @@ Commit class is not complete. X. 1. Network and commit should be separate. X. 2. Remove commons cli. X. 3. Add Feed methods using atom. -4. Update rrpo and user methods need to be fixed. +X. 4. Update rrpo and user methods need to be fixed. X. 5. Gist and repo visibility. X. 6. Network Meta is not complete. X. 7. Fix Network API. From 29b5174ee013a57facfbb4d332e44809197488ee Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Fri, 6 Aug 2010 15:16:37 +0500 Subject: [PATCH 26/95] Update methods. --- .../api/v2/services/impl/RepositoryServiceImpl.java | 2 +- .../github/api/v2/services/impl/UserServiceImpl.java | 3 ++- .../api/v2/services/constant/TestConstants.properties | 10 +++++----- github-api.txt | 3 ++- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java index 394f4e7..cc5d484 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java @@ -342,7 +342,7 @@ public void unwatchRepository(String userName, String repositoryName) { @Override public void updateRepository(Repository repository) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.UPDATE_REPOSITORY_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, "").withField(ParameterNames.REPOSITORY_NAME, "").buildUrl(); + String apiUrl = builder.withField(ParameterNames.USER_NAME, repository.getOwner()).withField(ParameterNames.REPOSITORY_NAME, repository.getName()).buildUrl(); Map parameters = new HashMap(); parameters.put("values[" + ParameterNames.DESCRIPTION + "]", repository.getDescription()); parameters.put("values[" + ParameterNames.HOME_PAGE + "]", repository.getHomepage()); diff --git a/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java index 22eeec5..242d3c5 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java @@ -219,7 +219,8 @@ public void unfollowUser(String userName) { @Override public void updateUser(User user) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.UPDATE_USER_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, user.getUsername()).buildUrl(); + String userName = (user.getUsername() == null) ? user.getLogin() : user.getUsername(); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); Map parameters = new HashMap(); parameters.put("values[" + ParameterNames.NAME + "]", user.getName()); parameters.put("values[" + ParameterNames.EMAIL + "]", user.getEmail()); diff --git a/core/src/test/resources/com/github/api/v2/services/constant/TestConstants.properties b/core/src/test/resources/com/github/api/v2/services/constant/TestConstants.properties index 78da444..34af347 100644 --- a/core/src/test/resources/com/github/api/v2/services/constant/TestConstants.properties +++ b/core/src/test/resources/com/github/api/v2/services/constant/TestConstants.properties @@ -1,11 +1,11 @@ # Authentication Parameters -com.github.api.v2.services.clientId=18790e7033ab0148f05c -com.github.api.v2.services.clientSecret=52695c3febf1721b8bc6f569c5210d38d043696c +com.github.api.v2.services.clientId= +com.github.api.v2.services.clientSecret= com.github.api.v2.services.code= -com.github.api.v2.services.accessToken=c53ac3e9a36285125f9e1da0726a1a53808ac1f1 -com.github.api.v2.services.callbackUrl=http://waveclipse.appspot.com/Main +com.github.api.v2.services.accessToken= +com.github.api.v2.services.callbackUrl= -com.github.api.v2.services.apiKey=5842ac9d1fb8ce4f7a5f0effd414e11d +com.github.api.v2.services.apiKey= com.github.api.v2.services.referrer=http://github.com/nabeelmukhtar/github-java-sdk com.github.api.v2.services.testQuery=java com.github.api.v2.services.testUserName=githubapitest diff --git a/github-api.txt b/github-api.txt index 393304d..0501d38 100644 --- a/github-api.txt +++ b/github-api.txt @@ -50,4 +50,5 @@ API Design Android Configuration - +Add github-java-sdk to the list of Github libraries. +I have created a Java library for GitHub API and added it to the libaries page. You can pull the changes from http://github.com/nabeelmukhtar/develop.github.com. From 2c2e44fa87dc49815e5da56397b77d540da0c145 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Fri, 6 Aug 2010 15:18:36 +0500 Subject: [PATCH 27/95] JAR File. --- dist/github-java-sdk.jar | Bin 0 -> 138900 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 dist/github-java-sdk.jar diff --git a/dist/github-java-sdk.jar b/dist/github-java-sdk.jar new file mode 100644 index 0000000000000000000000000000000000000000..a4b7a27d690ccfa51b6e6c9a4ff5308127fe9514 GIT binary patch literal 138900 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 Date: Tue, 10 Aug 2010 17:10:13 +0500 Subject: [PATCH 28/95] More Feed Methods. --- .../github/api/v2/services/FeedService.java | 5 ++++ .../v2/services/constant/GitHubApiUrls.java | 12 ++++++++ .../api/v2/services/impl/FeedServiceImpl.java | 29 +++++++++++++++++++ .../constant/GitHubApiUrls.properties | 5 +++- .../api/v2/services/FeedServiceTest.java | 28 ++++++++++++++++++ github-api.txt | 7 +++++ 6 files changed, 85 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/github/api/v2/services/FeedService.java b/core/src/main/java/com/github/api/v2/services/FeedService.java index 3384052..8e3edc1 100644 --- a/core/src/main/java/com/github/api/v2/services/FeedService.java +++ b/core/src/main/java/com/github/api/v2/services/FeedService.java @@ -30,4 +30,9 @@ public interface FeedService extends GitHubService { public Feed getNetworkFeed(String userName, String repositoryName); public Feed getWikiFeed(String userName, String repositoryName); public Feed getPublicTimelineFeed(); + + public Feed getDiscussionsFeed(); + public Feed getDiscussionsFeed(String topic); + public Feed getJobPositionsFeed(); + public Feed getBlogFeed(); } diff --git a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java index c72b474..b269f7a 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java +++ b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java @@ -320,6 +320,18 @@ public static interface FeedUrls { /** The Constant GET_PUBLIC_TIMELINE_FEED_URL. */ public static final String GET_PUBLIC_TIMELINE_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getPublicTimelineFeed"); + + /** The Constant GET_DISCUSSIONS_FEED_URL. */ + public static final String GET_DISCUSSIONS_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getDiscussionsFeed"); + + /** The Constant GET_DISCUSSIONS_FEED_BY_TOPIC_URL. */ + public static final String GET_DISCUSSIONS_FEED_BY_TOPIC_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getDiscussionsFeedByTopic"); + + /** The Constant GET_JOB_POSITIONS_FEED_URL. */ + public static final String GET_JOB_POSITIONS_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getJobPositionsFeed"); + + /** The Constant GET_BLOG_FEED_URL. */ + public static final String GET_BLOG_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getBlogFeed"); } /** diff --git a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java index b285a3b..664a589 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java @@ -87,6 +87,35 @@ public Feed getWikiFeed(String userName, String repositoryName) { return unmarshall(callApiGet(apiUrl)); } + @Override + public Feed getBlogFeed() { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_BLOG_FEED_URL); + String apiUrl = builder.buildUrl(); + return unmarshall(callApiGet(apiUrl)); + } + + @Override + public Feed getDiscussionsFeed() { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_DISCUSSIONS_FEED_URL); + String apiUrl = builder.buildUrl(); + return unmarshall(callApiGet(apiUrl)); + } + + @Override + public Feed getDiscussionsFeed(String topic) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_DISCUSSIONS_FEED_BY_TOPIC_URL); + String apiUrl = builder.withField(ParameterNames.KEYWORD, topic).buildUrl(); + return unmarshall(callApiGet(apiUrl)); + } + + @Override + public Feed getJobPositionsFeed() { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_JOB_POSITIONS_FEED_URL); + String apiUrl = builder.buildUrl(); + return unmarshall(callApiGet(apiUrl)); + } + + protected Feed unmarshall(InputStream is) { try { final SyndFeedInput input = new SyndFeedInput(); diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index 50763fd..b741b9f 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -92,4 +92,7 @@ com.github.api.v2.services.feedService.getCommitFeed=http://github.com/{userName com.github.api.v2.services.feedService.getNetworkFeed=http://github.com/{userName}/{repositoryName}/network/feed com.github.api.v2.services.feedService.getWikiFeed=http://wiki.github.com/{userName}/{repositoryName}/wikis.atom com.github.api.v2.services.feedService.getPublicTimelineFeed=http://github.com/timeline.atom - +com.github.api.v2.services.feedService.getDiscussionsFeed=http://support.github.com/discussions.atom +com.github.api.v2.services.feedService.getDiscussionsFeedByTopic=http://support.github.com/discussions/{keyword}.atom +com.github.api.v2.services.feedService.getJobPositionsFeed=http://jobs.github.com/positions.atom +com.github.api.v2.services.feedService.getBlogFeed=http://feeds.feedburner.com/github?format=rss diff --git a/core/src/test/java/com/github/api/v2/services/FeedServiceTest.java b/core/src/test/java/com/github/api/v2/services/FeedServiceTest.java index 3240d21..f5d1f9e 100644 --- a/core/src/test/java/com/github/api/v2/services/FeedServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/FeedServiceTest.java @@ -89,4 +89,32 @@ public void testGetWikiFeed() { assertNotNull("Feed cannot be null.", feed); assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); } + + @Test + public void testGetBlogFeed() { + Feed feed = service.getBlogFeed(); + assertNotNull("Feed cannot be null.", feed); + assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); + } + + @Test + public void testGetDiscussionsFeed() { + Feed feed = service.getDiscussionsFeed(); + assertNotNull("Feed cannot be null.", feed); + assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); + } + + @Test + public void testGetDiscussionsFeedString() { + Feed feed = service.getDiscussionsFeed("api"); + assertNotNull("Feed cannot be null.", feed); + assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); + } + + @Test + public void testGetJobPositionsFeed() { + Feed feed = service.getJobPositionsFeed(); + assertNotNull("Feed cannot be null.", feed); + assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); + } } diff --git a/github-api.txt b/github-api.txt index 0501d38..fca5deb 100644 --- a/github-api.txt +++ b/github-api.txt @@ -29,6 +29,13 @@ http://wiki.github.com/apache/cassandra/wikis.atom http://feeds.feedburner.com/thechangelog http://github.com/timeline. +http://support.github.com/discussions.atom +http://support.github.com/discussions/repos.atom +http://jobs.github.com/positions.atom +http://feeds.feedburner.com/github?format=rss + +Use Google Ajax Feed API to read feeds. + This library provides a wrapper for GitHub APi v2. Its Description From 39422b935364c0bc69c2532b12bf7d8113c297e0 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Fri, 13 Aug 2010 22:07:23 +0500 Subject: [PATCH 29/95] Removing the dependency on Rome for Feed Service. --- .../api/v2/services/impl/FeedServiceImpl.java | 147 +++++++++--------- .../constant/GitHubApiUrls.properties | 18 +-- 2 files changed, 84 insertions(+), 81 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java index 664a589..650290b 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java @@ -16,28 +16,21 @@ */ package com.github.api.v2.services.impl; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; - -import org.xml.sax.InputSource; - import com.github.api.v2.schema.Feed; -import com.github.api.v2.schema.FeedEntry; import com.github.api.v2.services.FeedService; import com.github.api.v2.services.GitHubException; import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; -import com.sun.syndication.feed.synd.SyndContent; -import com.sun.syndication.feed.synd.SyndEntry; -import com.sun.syndication.feed.synd.SyndFeed; -import com.sun.syndication.io.SyndFeedInput; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; /** * The Class NetworkServiceImpl. */ -public class FeedServiceImpl extends GitHubApiGateway implements +public class FeedServiceImpl extends BaseGitHubService implements FeedService { public FeedServiceImpl() { @@ -49,124 +42,134 @@ public FeedServiceImpl() { public Feed getCommitFeed(String userName, String repositoryName, String branchName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_COMMIT_FEED_URL); String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, branchName).buildUrl(); - return unmarshall(callApiGet(apiUrl)); + return unmarshall(apiUrl); } @Override public Feed getNetworkFeed(String userName, String repositoryName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_NETWORK_FEED_URL); String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - return unmarshall(callApiGet(apiUrl)); + return unmarshall(apiUrl); } @Override public Feed getPrivateUserFeed(String userName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_PRIVATE_USER_FEED_URL); String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); - return unmarshall(callApiGet(apiUrl)); + return unmarshall(apiUrl); } @Override public Feed getPublicTimelineFeed() { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_PUBLIC_TIMELINE_FEED_URL); String apiUrl = builder.buildUrl(); - return unmarshall(callApiGet(apiUrl)); + return unmarshall(apiUrl); } @Override public Feed getPublicUserFeed(String userName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_PUBLIC_USER_FEED_URL); String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); - return unmarshall(callApiGet(apiUrl)); + return unmarshall(apiUrl); } @Override public Feed getWikiFeed(String userName, String repositoryName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_WIKI_FEED_URL); String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - return unmarshall(callApiGet(apiUrl)); + return unmarshall(apiUrl); } @Override public Feed getBlogFeed() { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_BLOG_FEED_URL); String apiUrl = builder.buildUrl(); - return unmarshall(callApiGet(apiUrl)); + return unmarshall(apiUrl); } @Override public Feed getDiscussionsFeed() { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_DISCUSSIONS_FEED_URL); String apiUrl = builder.buildUrl(); - return unmarshall(callApiGet(apiUrl)); + return unmarshall(apiUrl); } @Override public Feed getDiscussionsFeed(String topic) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_DISCUSSIONS_FEED_BY_TOPIC_URL); String apiUrl = builder.withField(ParameterNames.KEYWORD, topic).buildUrl(); - return unmarshall(callApiGet(apiUrl)); + return unmarshall(apiUrl); } @Override public Feed getJobPositionsFeed() { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_JOB_POSITIONS_FEED_URL); String apiUrl = builder.buildUrl(); - return unmarshall(callApiGet(apiUrl)); + return unmarshall(apiUrl); } - protected Feed unmarshall(InputStream is) { - try { - final SyndFeedInput input = new SyndFeedInput(); - final SyndFeed feed = input.build(new InputSource(is)); - return populateFeed(feed); - } catch (Exception e) { - throw new GitHubException("Error while fetching feed.", e); - } finally { - closeStream(is); - } + protected Feed unmarshall(String apiUrl) { + JsonObject response = unmarshall(callApiGet(apiUrl)); + if (response.isJsonObject()) { + JsonObject json = response.getAsJsonObject(); + int status = json.get("responseStatus").getAsInt(); + if (status != 200) { + throw new GitHubException(json.get("responseDetails").getAsString()); + } + JsonElement data = json.get("responseData"); + if (data != null) { + return unmarshall(new TypeToken(){}, data.getAsJsonObject().get("feed")); + } + } + return null; } - @SuppressWarnings("unchecked") - private Feed populateFeed(SyndFeed feed) { - Feed retVal = new Feed(); - retVal.setAuthor(feed.getAuthor()); - retVal.setDescription(feed.getDescription()); - retVal.setLink(feed.getLink()); - retVal.setTitle(feed.getTitle()); - List entries = new ArrayList(feed.getEntries().size()); - retVal.setEntries(entries); - - for (SyndEntry entry : (List) feed.getEntries()) { - FeedEntry feedEntry = new FeedEntry(); - feedEntry.setAuthor(entry.getAuthor()); -// feedEntry.setCategories(entry.getCategories()); - if (entry.getContents() != null) { - StringBuilder builder = new StringBuilder(); - for (SyndContent content : (List) entry.getContents()) { - builder.append(content.getValue()); - } - feedEntry.setContent(builder.toString()); - } - feedEntry.setLink(entry.getLink()); - feedEntry.setPublishedDate(entry.getPublishedDate()); - feedEntry.setTitle(entry.getTitle()); - - entries.add(feedEntry); - } - return retVal; - } - - /** - * Creates the git hub api url builder. - * - * @param urlFormat - * the url format - * - * @return the git hub api url builder - */ - protected GitHubApiUrlBuilder createGitHubApiUrlBuilder(String urlFormat) { - return new GitHubApiUrlBuilder(urlFormat); + protected GsonBuilder getGsonBuilder() { + GsonBuilder gson = super.getGsonBuilder(); + gson.setDateFormat("EEE', 'dd' 'MMM' 'yyyy' 'HH:mm:ss' 'Z"); + return gson; } + +// @SuppressWarnings("unchecked") +// private Feed populateFeed(SyndFeed feed) { +// Feed retVal = new Feed(); +// retVal.setAuthor(feed.getAuthor()); +// retVal.setDescription(feed.getDescription()); +// retVal.setLink(feed.getLink()); +// retVal.setTitle(feed.getTitle()); +// List entries = new ArrayList(feed.getEntries().size()); +// retVal.setEntries(entries); +// +// for (SyndEntry entry : (List) feed.getEntries()) { +// FeedEntry feedEntry = new FeedEntry(); +// feedEntry.setAuthor(entry.getAuthor()); +//// feedEntry.setCategories(entry.getCategories()); +// if (entry.getContents() != null) { +// StringBuilder builder = new StringBuilder(); +// for (SyndContent content : (List) entry.getContents()) { +// builder.append(content.getValue()); +// } +// feedEntry.setContent(builder.toString()); +// } +// feedEntry.setLink(entry.getLink()); +// feedEntry.setPublishedDate(entry.getPublishedDate()); +// feedEntry.setTitle(entry.getTitle()); +// +// entries.add(feedEntry); +// } +// return retVal; +// } +// +// /** +// * Creates the git hub api url builder. +// * +// * @param urlFormat +// * the url format +// * +// * @return the git hub api url builder +// */ +// protected GitHubApiUrlBuilder createGitHubApiUrlBuilder(String urlFormat) { +// return new GitHubApiUrlBuilder(urlFormat); +// } } diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index b741b9f..2b11ece 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -86,13 +86,13 @@ com.github.api.v2.services.objectService.getBlobs=http://github.com/api/{version com.github.api.v2.services.objectService.getObjectContent=http://github.com/api/{version}/{format}/blob/show/{userName}/{repositoryName}/{sha} # Feed -com.github.api.v2.services.feedService.getPublicUserFeed=http://github.com/{userName}.atom -com.github.api.v2.services.feedService.getPrivateUserFeed=https://github.com/{userName}.private.atom -com.github.api.v2.services.feedService.getCommitFeed=http://github.com/{userName}/{repositoryName}/commits/{branch}.atom +com.github.api.v2.services.feedService.getPublicUserFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}.atom +com.github.api.v2.services.feedService.getPrivateUserFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}.atom +com.github.api.v2.services.feedService.getCommitFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}%2F{repositoryName}%2Fcommits%2F{branch}.atom com.github.api.v2.services.feedService.getNetworkFeed=http://github.com/{userName}/{repositoryName}/network/feed -com.github.api.v2.services.feedService.getWikiFeed=http://wiki.github.com/{userName}/{repositoryName}/wikis.atom -com.github.api.v2.services.feedService.getPublicTimelineFeed=http://github.com/timeline.atom -com.github.api.v2.services.feedService.getDiscussionsFeed=http://support.github.com/discussions.atom -com.github.api.v2.services.feedService.getDiscussionsFeedByTopic=http://support.github.com/discussions/{keyword}.atom -com.github.api.v2.services.feedService.getJobPositionsFeed=http://jobs.github.com/positions.atom -com.github.api.v2.services.feedService.getBlogFeed=http://feeds.feedburner.com/github?format=rss +com.github.api.v2.services.feedService.getWikiFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fwiki.github.com%2F{userName}%2F{repositoryName}%2Fwikis.atom +com.github.api.v2.services.feedService.getPublicTimelineFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2Ftimeline.atom +com.github.api.v2.services.feedService.getDiscussionsFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fsupport.github.com%2Fdiscussions.atom +com.github.api.v2.services.feedService.getDiscussionsFeedByTopic=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fsupport.github.com%2Fdiscussions%2F{keyword}.atom +com.github.api.v2.services.feedService.getJobPositionsFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fjobs.github.com%2Fpositions.atom +com.github.api.v2.services.feedService.getBlogFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Ffeeds.feedburner.com%2Fgithub%3Fformat%3Drss From 5875f1af9ffd33f1db45b9b1a23d7d2e93d9e50a Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Mon, 16 Aug 2010 11:00:57 +0500 Subject: [PATCH 30/95] Removed the dependency on Rome. --- .classpath | 2 - .../github/api/v2/services/FeedService.java | 20 ++++----- .../v2/services/constant/ParameterNames.java | 2 + .../api/v2/services/impl/FeedServiceImpl.java | 41 +++++++++--------- .../constant/GitHubApiUrls.properties | 18 ++++---- .../api/v2/services/FeedServiceTest.java | 20 ++++----- .../api/v2/services/example/FeedSample.java | 2 +- github-api.txt | 2 + lib/jdom-1.0.jar | Bin 153253 -> 0 bytes lib/rome-1.0.jar | Bin 219671 -> 0 bytes 10 files changed, 55 insertions(+), 52 deletions(-) delete mode 100644 lib/jdom-1.0.jar delete mode 100644 lib/rome-1.0.jar diff --git a/.classpath b/.classpath index 6f655b3..094e399 100644 --- a/.classpath +++ b/.classpath @@ -10,7 +10,5 @@ - - diff --git a/core/src/main/java/com/github/api/v2/services/FeedService.java b/core/src/main/java/com/github/api/v2/services/FeedService.java index 8e3edc1..07fb94f 100644 --- a/core/src/main/java/com/github/api/v2/services/FeedService.java +++ b/core/src/main/java/com/github/api/v2/services/FeedService.java @@ -24,15 +24,15 @@ */ public interface FeedService extends GitHubService { - public Feed getPublicUserFeed(String userName); - public Feed getPrivateUserFeed(String userName); - public Feed getCommitFeed(String userName, String repositoryName, String branchName); - public Feed getNetworkFeed(String userName, String repositoryName); - public Feed getWikiFeed(String userName, String repositoryName); - public Feed getPublicTimelineFeed(); + public Feed getPublicUserFeed(String userName, int count); + public Feed getPrivateUserFeed(String userName, int count); + public Feed getCommitFeed(String userName, String repositoryName, String branchName, int count); + public Feed getNetworkFeed(String userName, String repositoryName, int count); + public Feed getWikiFeed(String userName, String repositoryName, int count); + public Feed getPublicTimelineFeed(int count); - public Feed getDiscussionsFeed(); - public Feed getDiscussionsFeed(String topic); - public Feed getJobPositionsFeed(); - public Feed getBlogFeed(); + public Feed getDiscussionsFeed(int count); + public Feed getDiscussionsFeed(String topic, int count); + public Feed getJobPositionsFeed(int count); + public Feed getBlogFeed(int count); } diff --git a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java index bf2a1b0..72e12ba 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java +++ b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java @@ -152,5 +152,7 @@ public interface ParameterNames { /** The Constant DELETE_TOKEN. */ public static final String DELETE_TOKEN = "delete_token"; + + public static final String NUM = "num"; } diff --git a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java index 650290b..0e22f3c 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java @@ -39,72 +39,73 @@ public FeedServiceImpl() { } @Override - public Feed getCommitFeed(String userName, String repositoryName, String branchName) { + public Feed getCommitFeed(String userName, String repositoryName, String branchName, int count) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_COMMIT_FEED_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, branchName).buildUrl(); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, branchName).withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); return unmarshall(apiUrl); } @Override - public Feed getNetworkFeed(String userName, String repositoryName) { + public Feed getNetworkFeed(String userName, String repositoryName, int count) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_NETWORK_FEED_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); return unmarshall(apiUrl); } @Override - public Feed getPrivateUserFeed(String userName) { + public Feed getPrivateUserFeed(String userName, int count) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_PRIVATE_USER_FEED_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); return unmarshall(apiUrl); } @Override - public Feed getPublicTimelineFeed() { + public Feed getPublicTimelineFeed(int count) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_PUBLIC_TIMELINE_FEED_URL); - String apiUrl = builder.buildUrl(); + String apiUrl = builder.withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); return unmarshall(apiUrl); } @Override - public Feed getPublicUserFeed(String userName) { + public Feed getPublicUserFeed(String userName, int count) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_PUBLIC_USER_FEED_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); + System.out.println(apiUrl); return unmarshall(apiUrl); } @Override - public Feed getWikiFeed(String userName, String repositoryName) { + public Feed getWikiFeed(String userName, String repositoryName, int count) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_WIKI_FEED_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); return unmarshall(apiUrl); } @Override - public Feed getBlogFeed() { + public Feed getBlogFeed(int count) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_BLOG_FEED_URL); - String apiUrl = builder.buildUrl(); + String apiUrl = builder.withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); return unmarshall(apiUrl); } @Override - public Feed getDiscussionsFeed() { + public Feed getDiscussionsFeed(int count) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_DISCUSSIONS_FEED_URL); - String apiUrl = builder.buildUrl(); + String apiUrl = builder.withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); return unmarshall(apiUrl); } @Override - public Feed getDiscussionsFeed(String topic) { + public Feed getDiscussionsFeed(String topic, int count) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_DISCUSSIONS_FEED_BY_TOPIC_URL); - String apiUrl = builder.withField(ParameterNames.KEYWORD, topic).buildUrl(); + String apiUrl = builder.withField(ParameterNames.KEYWORD, topic).withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); return unmarshall(apiUrl); } @Override - public Feed getJobPositionsFeed() { + public Feed getJobPositionsFeed(int count) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_JOB_POSITIONS_FEED_URL); - String apiUrl = builder.buildUrl(); + String apiUrl = builder.withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); return unmarshall(apiUrl); } diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index 2b11ece..82106d5 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -86,13 +86,13 @@ com.github.api.v2.services.objectService.getBlobs=http://github.com/api/{version com.github.api.v2.services.objectService.getObjectContent=http://github.com/api/{version}/{format}/blob/show/{userName}/{repositoryName}/{sha} # Feed -com.github.api.v2.services.feedService.getPublicUserFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}.atom -com.github.api.v2.services.feedService.getPrivateUserFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}.atom -com.github.api.v2.services.feedService.getCommitFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}%2F{repositoryName}%2Fcommits%2F{branch}.atom +com.github.api.v2.services.feedService.getPublicUserFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg +com.github.api.v2.services.feedService.getPrivateUserFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg +com.github.api.v2.services.feedService.getCommitFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}%2F{repositoryName}%2Fcommits%2F{branch}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg com.github.api.v2.services.feedService.getNetworkFeed=http://github.com/{userName}/{repositoryName}/network/feed -com.github.api.v2.services.feedService.getWikiFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fwiki.github.com%2F{userName}%2F{repositoryName}%2Fwikis.atom -com.github.api.v2.services.feedService.getPublicTimelineFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2Ftimeline.atom -com.github.api.v2.services.feedService.getDiscussionsFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fsupport.github.com%2Fdiscussions.atom -com.github.api.v2.services.feedService.getDiscussionsFeedByTopic=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fsupport.github.com%2Fdiscussions%2F{keyword}.atom -com.github.api.v2.services.feedService.getJobPositionsFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fjobs.github.com%2Fpositions.atom -com.github.api.v2.services.feedService.getBlogFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Ffeeds.feedburner.com%2Fgithub%3Fformat%3Drss +com.github.api.v2.services.feedService.getWikiFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fwiki.github.com%2F{userName}%2F{repositoryName}%2Fwikis.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg +com.github.api.v2.services.feedService.getPublicTimelineFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2Ftimeline.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg +com.github.api.v2.services.feedService.getDiscussionsFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fsupport.github.com%2Fdiscussions.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg +com.github.api.v2.services.feedService.getDiscussionsFeedByTopic=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fsupport.github.com%2Fdiscussions%2F{keyword}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg +com.github.api.v2.services.feedService.getJobPositionsFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fjobs.github.com%2Fpositions.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg +com.github.api.v2.services.feedService.getBlogFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Ffeeds.feedburner.com%2Fgithub%3Fformat%3Drss&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg diff --git a/core/src/test/java/com/github/api/v2/services/FeedServiceTest.java b/core/src/test/java/com/github/api/v2/services/FeedServiceTest.java index f5d1f9e..84aafa8 100644 --- a/core/src/test/java/com/github/api/v2/services/FeedServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/FeedServiceTest.java @@ -44,7 +44,7 @@ public void tearDown() throws Exception { public void testGetCommitFeed() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - Feed feed = service.getCommitFeed(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Repository.MASTER); + Feed feed = service.getCommitFeed(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Repository.MASTER, 10); assertNotNull("Feed cannot be null.", feed); assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); } @@ -53,7 +53,7 @@ public void testGetCommitFeed() { public void testGetNetworkFeed() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - Feed feed = service.getNetworkFeed(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + Feed feed = service.getNetworkFeed(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, 10); assertNotNull("Feed cannot be null.", feed); assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); } @@ -61,14 +61,14 @@ public void testGetNetworkFeed() { @Test public void testGetPrivateUserFeed() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - Feed feed = service.getPrivateUserFeed(TestConstants.TEST_USER_NAME); + Feed feed = service.getPrivateUserFeed(TestConstants.TEST_USER_NAME, 10); assertNotNull("Feed cannot be null.", feed); assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); } @Test public void testGetPublicTimelineFeed() { - Feed feed = service.getPublicTimelineFeed(); + Feed feed = service.getPublicTimelineFeed(10); assertNotNull("Feed cannot be null.", feed); assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); } @@ -76,7 +76,7 @@ public void testGetPublicTimelineFeed() { @Test public void testGetPublicUserFeed() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - Feed feed = service.getPublicUserFeed(TestConstants.TEST_USER_NAME); + Feed feed = service.getPublicUserFeed(TestConstants.TEST_USER_NAME, 10); assertNotNull("Feed cannot be null.", feed); assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); } @@ -85,35 +85,35 @@ public void testGetPublicUserFeed() { public void testGetWikiFeed() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - Feed feed = service.getWikiFeed(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + Feed feed = service.getWikiFeed(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, 10); assertNotNull("Feed cannot be null.", feed); assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); } @Test public void testGetBlogFeed() { - Feed feed = service.getBlogFeed(); + Feed feed = service.getBlogFeed(10); assertNotNull("Feed cannot be null.", feed); assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); } @Test public void testGetDiscussionsFeed() { - Feed feed = service.getDiscussionsFeed(); + Feed feed = service.getDiscussionsFeed(10); assertNotNull("Feed cannot be null.", feed); assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); } @Test public void testGetDiscussionsFeedString() { - Feed feed = service.getDiscussionsFeed("api"); + Feed feed = service.getDiscussionsFeed("api", 10); assertNotNull("Feed cannot be null.", feed); assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); } @Test public void testGetJobPositionsFeed() { - Feed feed = service.getJobPositionsFeed(); + Feed feed = service.getJobPositionsFeed(10); assertNotNull("Feed cannot be null.", feed); assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); } diff --git a/examples/src/java/com/github/api/v2/services/example/FeedSample.java b/examples/src/java/com/github/api/v2/services/example/FeedSample.java index 5b904cd..1da8673 100644 --- a/examples/src/java/com/github/api/v2/services/example/FeedSample.java +++ b/examples/src/java/com/github/api/v2/services/example/FeedSample.java @@ -35,7 +35,7 @@ public class FeedSample { public static void main(String[] args) { GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); FeedService service = factory.createFeedService(); - Feed feed = service.getPublicUserFeed("apache"); + Feed feed = service.getPublicUserFeed("apache", 10); printResult(feed); } diff --git a/github-api.txt b/github-api.txt index fca5deb..5fadcbd 100644 --- a/github-api.txt +++ b/github-api.txt @@ -59,3 +59,5 @@ Android Configuration Add github-java-sdk to the list of Github libraries. I have created a Java library for GitHub API and added it to the libaries page. You can pull the changes from http://github.com/nabeelmukhtar/develop.github.com. + +ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg \ No newline at end of file diff --git a/lib/jdom-1.0.jar b/lib/jdom-1.0.jar deleted file mode 100644 index 288e64cb5c435f34499a58b234c2106f9d9f0783..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153253 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

_4s+#N=7*_ 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�s*dMq>JLX-P3 z%%r>#%=jLYsL>iyV^U)>Oyoh*C}~DA8HpM)8L1XjaWdDCTKw2xa}VAiYStjd7@dH~ z;9BT*kp|WX8(uiHa7OAlRB0e4P7Q$af%^Clf9<)NJ@yc4<^U4-cX#0)!WbIPSak3y zm;t9_#cN(oG;?A0D0Xn}Y~}6z*q)^tt3O&(OiwsUh9poInmC?A4ODa%ma60)j_y%s zwy)2P`8rl&a6G?qWZPp5OjI$8W$1p9w96KqQ@WZ#KR>e_{qk~tDwV8Fq-e=#1Pr@$ zjC5q2H)TOj*f1a^l>czWOxeLVhQgIA@$|%0kI0o+A<3NO9R)OY zoVXr1+a$~pO&p|+!JWb2qx2Ht<%;ZN-;cOUk9{mY;X@P+)wS#$j5?v_sX4(%?xS^v z47}c=^sS#Pg~-Cx7-+}=tk?F_#mJOX1ZC*Jo7J2)>@rh)9r9%)pV zAT$zXEv9)rMI9WEq6}j^wL(Z+XjvP&({F7S3|88);(&3s4YU-r-=-$PI!lq%@#`~TPw0S05FEwNE}vSYEp6L zC_4JU^l;BMOq!k=B;Pjn6Hk&4)c$H2?O1$3a~|L%;eJ1=YT8v30puKlbeOc0AY+K6 zcEc&Gyl2p=)DJHL8*$u9!7zRpw`qJ^w$WPgKuc*P`&4D2yVOvcdIZ>sdWWRaw^Z9H zuLH2k5U3jc$SB3U?Tof@L(F#x`4Li8;ChT_E&bJ!Z{vUZjU;1~NRQ;gtpR+myf;WV zLPdH($k6Sp5mWU-tw>C5VRsw1X;Kh7)BlRD{F)fu9s{YoHN!Gfm`;UPUV<kJQ4_83&L%=X4iK}Po@Y$v~6 z{5b`xw!hsBA^lcGMh8Tiv!5i4$roqqAia$#n z(s?{oHeF!$9MQzfOJJuQ>O)-v;tzNruY8s(2&F~>`Tp-gV6RxR=NRWE-T8^{;!{^G ze?ABqKl>>!;2-{cujo>kMAqMPhk&Ho1*hhXEul2TlJng2#sq|iNUDi_5^?+ceXXF7 zP&gHSIk#VM*S4=Z|NnnQ{WrktzptqO7?5S{jQ>>=4OX(Tn^i#dy$qh|rOs$^(<6@} zV$}FsKWD6APD-@~ik20w0b^AIrU{I=F|(Mbo#`joj%ChvD!UAnww^oUJ=%2oN(JY8 ze?D77D4hP&6_XHyhu6+cja`m?iv8fI{zvHtc1k@M2Nn!mGo~u0D!jEpmO-B&wAgnZ zxOOu|wx%`@l<)z6JRmv?=}hwlQu~I1g^iUN+7%Zjvba z1tWHPL8QH5Nd40WE&EaOXv`y#Ezm}496!f-HPrRYCDD`jg0+1@F4nvXXENX4?71S* zmAjI?vG;J@(_rn0A*UHv?umr7#(QC2(r+K$PzrV(`l3Q-E9lRIUmHpAQ>DCH?$FL# zF6C?-`nMN$57vHm5AM+vWG%&}KlQ{J0diJnh%K_&0DghkZV?`uVQFIlBgLDf-H=`3 zo6KE{0Xy$}(r~XJtzksIAR;>JVfN8kAraRb3H|{ev;l&5AxX(dUfr<;hP@H;f<<;@;u^nM8*jKZ|a^7@I8rk+J!2p3{GuME|O%tJyf=sG<2*S)Wauage!g zO3|%Z#vhP6&dxT-N$zPnQWKAfD`l>NXGV84aY(eEUQ*Xe!!`srHIPmh7lD~W7Q->H zcuR0|8Vti-w+iHW9}px}GiKJW4&PcP$H`1?d}Yr}aUHcD>27#GY;}LY<8cPW2D)>H zRYN#XhXoU|gSzwmBmlea`?d+SJ@IW5W*Y#~f%iuq^vUAeRme;-a?T`AAc*HbZcoE@*ZgLG=*e?{1!TmNjkILQEU zA2E#q_*Rm={{VI*b9TH!PaPP1J+ia6h%j0?*mpBhZ^#m|j?uZL<$XMK0n_H+743t& zBD@qkzc^{Wf#}Jnin3DIaPVh$lIo=-nrLXrPwI6PCRHTby7VwB+holb6fQ>p-7iw< zOqjP)Z8RmDGnK5OHYU~@eL=^H_Q0Gt6&GtV6f>DipHoAt<6d5jKBveB+vugrEyIdM3hAgH1&zBLbht(>j5TirSsp z)7$a(W`7?zGJ-NQLQ#y*!{oBAJ3fM@xj#)aq$(kjXNnF>lZG0cohJqEY3e-DU_7Cj zG{%;WP@Kfps@mjwM>V~X6!9}@hIOFEO@#^krS1!LVVN8mp_s&w0&V)o=nk;amT5b2 z%4WmXsi9Pkt|BImRIM6o{5L^cHwiv@CJS)}((QBjbLRDR?MjZ4BPS~GfP_b2uO3XKJHDO$Rh&B>YS!cokat4Ze?DVrtMi2r<*z{k8yMdx)Y$w zA~jkusuBdFmEM@AZW-QGm^wACSn9O`?VLq3iSMB#IE{7pE0txnH}3`V4%H~z&?S4g zO?i>+7KU0=Qm;|P_h2AhyO{1&MH{CLuu?JF?^9%HQ#2+eHbcvdVg>5Ywy`}(bj6kd zhUb) zM8=bZP`;V=tU^)AuZ97n;4iHPH=H1EkTg~*Rr%d!Ks90NrEU6G&d(i?F?RvwEOCYe z7ie+frZ?KI{J2^G-O*xjtaiH1cd&u#rfQA-;>=N>&=t8zbY&#s=AFT^bZCg>`v<8g zo6)WAjNQ#8>tx2ow7rUD%`IzX-o;dUNld0%oMj_=u=T^-OC> zi*Lx3`GhL6hAF!)wxvXTV}{!j*ty2(JSO+TJ5nI}?HZE$Nj87S#&bYtfN-PeC8==mywc{a4d8AIqrqTV=ffI{jG;j=*3n3eAZ7Op|?j&tI2> zjww&L9npX(3R`x}^P+Tr8dSH$=_YJAaH-mGR`tC%(`-@dtLGWjDUw~5bN zXWtc;3nsVK!0gFtckUtW$*0&*C#WqO=gE#aE=cSwl#`Zdz$Ebdg%g`X5H_xQNytj> zUWp+AUSJkEwtYHf&=uRCJ=e3@8K*xR4YVsC{O#FSdm6Ex;u~wZo(T?kQ(Tjm&`fx*GaaQ$r8K=f`H-YI^$P4 z{;6FZ*TUe&$?zt}2F7m+q%R~VxgLC=m07;Gef_{vkFYF66gw=t%!* ztM(-m{6B}^e_WX|c18xycK_m@`y|@fAqyc6eM+C`L@rU#(rH@BM}|ON==5NU&7}&; zSjG(+hJ}mQO()`WT@G&uy{NpQr<-Ry^&V>pBssXY5|>3YxZ1iM3UsIGgy?m5`wYQd z?p@+mmA6zH@(3My7$8IU+nZ!Zk-NfTC#WNviuIwRv#s~C!DG>~RG2z7;uARZ?bt4H znm<;^Jp~z%XIL>8)_sYh0$G(FzDt}ZJmP=kqtcgl@{Y#hZs%Pu>|^upXxp>qSVEHr zA=he0Um{O?#w1!uav#M#LwXm7e^^h^owf6j?Udfe^^47U>!*tKd6#Cyjtu|~loY|v zI^=scGy4yY%@t-41MtK9+UeZm7yfpP5yU&}lga7aY`Q`f5=zGEM!L?6B{T-Mdfm0#6*g{Ien!*Wdowv zuB!e^O(Cl`;BsGTXwdH(PHXPkXbel;*Iw7STfiO)GqYfCrxtHImY@I&WaUh~XrP8% zJ_;Qk;$pAC+;BKCUnjgPs;mB)rC&hWBE2G&b~~=Wx<-h{hPD@P{Tr!18E6Ml(RA@$ zFv~c)FYyCX zH+27<==6U)l0atzBdh;yl+;qg`RYmh0WAXs%-vDC6pzHLf(G$|ZfFAkZ4N_6mG?I! z(H=QO&UDZ?fs9}6SC{J9tzwS%O`eXl$S<9-gFyL@Z+Zka<{I*uM zCb<&@K0p3)JTbzv{9O4~1yO_kCnbOf=91c7zULK&U*S3rR91*Q%rq!aVYy+kv71*VZr)S=>5!w{nxLQO=V19)|PYsD`4WW9#I zljH#RWSNA4?tl$#`Lg~MiMB%gKqgE$8XA|ja_!dvP-l~kQ&mt{FbevKc#j5jBmQQ; zN_8eb#PqPhDorQN1zj!#D5uDA2Wu;&liWW$Insg&1O&yL@*%Skt%CdQv>~)L1Rs6dp^M=1$V-EHeIo}F&El} z)CE|T0*j^5QE37f5rRE3_vlR}x70KmV=KCWj*i(kYALQsa~gF5;>M96PUwyKbw|fF ze+VrvsR{xc8Vsn~nwq@i0-?5^C7Rl{XswmLb{{;M6E)4I< zZ(|ps;iB;lV&nE}7y6z~C8s-M0-MRY5Huh$~ALh#Rb%C~W z?JfHpy8AqySmu=Bb}_Vo>_C)PPPQA=O1Hpk%PTr9d!Oa}u5404~9-h(7b{wztnU&_}P$tUA zUmorgx$q?W+g`D!9tT_~JuJfTjk0_C%~OJJyxF;5<5Ud_b}t#qqXlL}$$wxy5ai?z z|I{P$nT}DoUur)c8ggGM%6*IgAh|6G<}UV3%e(ZWb9A{G!}!0Tx}L$jiIvy6CYLCf zmtKs-eL{QM$=ovUuK`LzwFXYgsN2dh$=grb-$*9gxjJO?E-Bo@Kd1yqDgC|n&C&8m zR33c{mjhpSas(s-cSOPg#~ZM`xh%f2n%*J;AoxmlTM5_*H_%-?%m)!mVn0J1VC{ee z7lnZAemmhL>-573psq`;-5cyb??BVSdRM@gTmk%#a>ajVqWglI{a+@!PAw1b`GrP- z#}D7`FTNScnBY$X>17f0-uzq;|2Qyc;~vtwumBO}KY!xFSy28IQAb$moT|buwqaB@ zRgo4_3Rfzxtv>2js%q(Nd0lwvWNZFjw5+VW^18g@=zg9s2K9XzvJ!Cm<#fgOxb8H` zcjV<4Pw=tV4v;9Ie*UROdlP}vxl3N%vO#ls9Z~H$kfnRWR=s?L_S(5iU;Wgkwtj)O zbsgc=v8!9%GDUOw7!lgBo1yFQhX(&4g1~ElM)wA#n)YrKrn=&Ol)5_eBzZxXYmCOs z%cN6{-NPhOE&C$*(QBVKHuEaJ#AE*iUt=#Gme(;4ki8Qh$?I4PpuZW`jMYAkcfoI6 zC0TOc|GGGeKXTvqjOAS-nYtT>$8Vh>nR*<~1=!vW%f+7G4#xp(ABO4hTNg+g6N-H(bm@BS8_V*_h4UZIh0t*-#v&Y^*v7WW)1??06YX=T(O;~TLp ze=%%*#s?@m9;*4vi{NYMv9p2$;$K?)rK0-|7z1zy0Xdk1R*JL@n$I#c+vpKu`O|=sNaEt>v_rGv zzBKj#4(f*)Z>Cv*bc;Hvc#pUttNf2^Tcca^D$KJ2E<p)LjLU+0Q7rkip6>^|MFH)}+R98eV zWP18N!)hvBw5jx6_}T$fy9g`U8|m7Z$UE7a6!#6(&k-v>8?>d2U5@pyVfLlzGK<&> zS1Eqt!|+2C0(Q{pG7s?Vniadt_siVyV-SR4$lRFCSVhE&a$xWkKc$Mj21Ry9OlbGZ z-cUJxC~I3sO!dsxh%ps-p-eS&s;H(@~RM6CgbXKxT#dRJIkU ztv{->D+SaYr=dq9qW|)p9_$JObwPASIt`<#s?mRC++sU4QdI{l?zS9dO+2%#zo8DyxNSZ{_H_$eSE%=aOFCw|s~V zM%xEgir+%a5k&(U>ad~%LVit{ucEJGRm6a`H!ClR1>8J=3Kh(j!ngB?@P*qq;E<5a zifeM%z`Bq_#IK>$+CQSl0mw%>!|e;(n2;jCQD!h9-o9M9JMIaRtW8CpT58S!7oUdu zz20mE@>U|`Risn7Kz5Pj;;rppYAX zT}KDwLhk3ut-hNYX+O%Ku}tYzsXV-CmF=-y5DG?9@b1j89GijmVURj4wsa+eFI2~-QO7(y%;Jyy)49Pok47)yE0@8== z)t?PBMs=;1v9Zp&rWVpkW3}C*ezl2n?S4UInrQVzRzqhQYgI0lhJp7G^o8sQDy z86p32lD-L};1wwwXYnU}M>WgHD(fZ1qt46@&fb8cNIO|QyJui!d0oBx7-`f?`qcQO z^=t06LLsz0l?~dBFnbR7aJ7yWa|7oP6SlnFwNBg^Pc$I6`eyQjq~4x06f(saOI={N zXrl@p)+Xjp*TO_z|DyR)z&x8=u!rAt}=5J{pA$#27%Nd?{?$?UE}D7Bk%X75RLiCM)nWc`S}zml>jgKwkoC^DIx zLvX3@vMEn)eK|e^F5T)-GsXPqCpGSW9q{grg`}hn4Hd<5xc0?e%xtD!z!uDfCK`l? zk{2N~E>-EEMGc6Y=&EY6AII5}?m9Ln9vg_fR8;0k$Wx-bJp=b*vWEjI=-v(ds$Vv6nwm~ULve}B#$g%Bh*!}712HnuHXnE z8P6{)xy~EzwJluW;G7ZZ=rqufnq$5(Wkb1As6vu-9z&kuoTjtWSKE}?S(>k@ug%vw zsA!#)hcv~wq#4D{v#Ej!P+$1B+Sf{poTG5siAV#C07fD_O)9eE8M$votm_jLDzL(} zv-+gHwmq)9^C+7m!{5-~!~Q=z6N zaW#TP(Kk16&rf>F;=VBtUQ9y`$>JQ3pznO!oFf-Hsuh(g{j)6us7UBB!U}lK#F`HK zb0=9B96k8b6k;;nS#A&{X!JO#Pr9yxU8gRhLyf-hWnyJ#tFWo~jW>E97&2F>H;sDv zqw)T788yO%kyJ>|+1|_O_iLVN5;!ad!cFO&Szq6Wb(zO__@AM$bGy#o9tJ)EK*8{- zKJ9pDjXX0k8fYes?ZlTu&!T@`#K9eXIgXv}uRCr$-Cb`+s8qWJ&3f#_Y$BPq`>UjG zK~dl!OC1yaT`tw-^#N2i+C&u34bbggL6X|(AlK|N6@|}n$k-IKnH~WD{D$S1uw-{K zvegCbQlG_KQCeG{?kaDp%G24XHGyx$GizoejBa3cYpAj|7gBH3x>&cqD7`SZ26s`G z=Ak$4s~c=gqltt#Koy0fAz^^64~^BE}`}G4Du~HH|_y9 z(l&Q{0Q7m<@6#WpcupH5J$w6syzM5kx6A$rw=Tt8_{17!v_a!Ap}^(usB`(G?GIo> zJcRLNV!CRhWcEKU!HtL>iTHF>Wqy7M!NYoS)~g%{ZO2mfZN072=F8zk6@T+C7%}vB zpvmq;x;DzC@u{cC)kFUZSG!_QNJ|ItyIs=YW?nj0zT({g8!8?1PNLkM- z>_W8FYEi$MfJr2q&>-aW#JiwRp#8 zl_82kn8%$UrGx}i!~(C+aUHiIsl}QLC;N6rTaCf)_pD;zfk$>_k9(vhx04m|3=lZ6 z<4PW?^P@F`4sGandm^*yUrM|hCz)4aSUGmZJQ|!KxhdwE1at#|iNH~LR+c#oQ?s;n zqcjFM=r$$G>eX~@pvx{Bl2zoqH&V!L-v&>?8kcgg&2Z3fT)AA_Z1CkBWb!gqb_wiK z!tWPEDy9mW`Qaurx}y20)jJy7`m4Qz5~K}em}M8n`g`e03F))QHdhzxmK*R(QN1#v zY2tOp0O9eE1!aW+{Zwcfn{FLi1Xmk&PfCRdD^|>e-IT)bN*y$*HD2Uv6P{E9X5<6| zwI(Bkr)%iz8;Rp`&+%}6BL}}!`rF#GC78pGH&k=- zlvq(%0l0@{RoR=Bo5>Jr`XtXUN6su@f+CT&t09kEnf9iLuh#Gr>v*7W;RyWr%B+~K zU*S2^Hbo7>7%2U;bVZ7MiYRG=8wQuP@f7AvQj)Is!u_A9JS~j)Yk|$tKCB z13GqK-GqJ2E?6+`Sd+JbvXKUD%YdW#95Ja#R-P?B`u*|}{gmbMjOGI&hB@C1ezpNg zh=ck0S8Djzp`w!3&LGfun-YKbHMDuC2hCI7&YNaek+x+lLI#`(R;lp1$~X^Z7jA;M zlc%lH4z{K7hE|_0`^Vz#9v0#R0RmT!W~NntCWKIGya%yigNwQ|7sD z+UI&7ncG1;?UckCp|tE}Y*P^A8E)QcOQTvs*IV*@NrqVz>SD`Irk2Rsxn4^y`?*VZ zc-cbkbV*TPY!X{^`8dSpT#B1drd>eQ2j~6gzyd+!hrG`F&9UFuLQdF+O_eXzOKi&v z+40utsl4DP-3@p1vjEyo`X|Ycg-^kb+|%yJE1DPPo4V6(I$fo|U)$&i-(VdE41hw8 zuLad7_1v50D|Z%bpFoF?PK=-ED|c*ni%-^4&Rka&^=+qP}n_PNKlZQHhO+qSK_-972d zL(gQAozz1;RqD^5ovKyqtFXZnX%81I+>*lWh;UTMbY?j&q%E*AXTOMdrZK$=?x+cj zcoBqIT_j#wJeyPw=}55k`*>Zz?mz&%EnYk$tq|xAvn?ShyR_(b7o`ZZkHgA3Z1N+N zk0rk?eQ~_TCz*H-bS~4zE+SK0h$aR)M!^175Pu~mz6@0sLl#@qr0b=P+34yue$C8|zmMQcjB4?1uwpQZ!%p%&Bi5HV5VpB=fQS+XM! zDOFd(3GrYRDyioa7cq*RQ;zf&RNK@swR>ehIm)Y@zY#&7>@jwzPaYIltl)`XCE!pVuka!$wyOfUF`K~euej=TuzHO5O7MBFiA>E%_~< zbC7$TH0Ri_@7DrNGUY*FEH~-l{*XDR^3Ml>t`y35)Aof9^%+34Vi1t>+~2er_0w0? zm&K9OT;;!|^U#{MQe24-_}8poEkXz2C>LC1>bE5jXL3t)c^2rI`DA6^qG&`rMAV?I3QRo@aQ-cNSZaV(nUD!3SVVXz)hnn_vhDiRzp zz$1oYGZ1a3MYjY(y@0(`Q%(`Ep?l2kH7E)!! z5^q>y16;p6Kztur37Fje`Z&d?7vQ-U1C~liI_NnHSw}ns{*jipm)dHRG>@byk zo_;-45Yd~~12#ZUS%g~-StTlOWR6yTJ*D-#Rpoc7Z67%-VB$i*s4R_1S~clN+TJXU z2lUkg$r@bzV#NEZdolfvycK!FO^EeQ9L)=!8-AS9-A!1}!C||roEM#VubEMv2_xxm zED2!Ev+5EaqDaxqs`KuL)ETx-i_(RGvP`OrhDIFu=dci-y_Shuju!{APZ)i*1@<)KeqlY3Gk}ox^G@YM$g! zy`P#>DE%)sSv-q6-=mg3mC{}Prd3_IRLVVJ9P^5wr|k_GLj(>7@2Nso#Nt-L<^35l zAfp+WH_+vfq9K$Gq>DI4j4K#O=LL-*X-2=2N0coEw=JbhRmwJ_F_!#2qZI_KqSu{k z7|=3ufvR&WnB8hze8ikGt*1T8WiJjk^N<$+*Qs-YN<L@sj2)pV_$8EjoEkx2&J=yn`=x^#Ha%0h-?Z^DwQcP z*f6G?D_O9&!31eKXBMC;q}YI_T&1*#Q59j?kk+hFS%kDYI7Tde@&$9(6b~Ghc=CqsYmBbI^21 zyU6!nX5Unz8C&EDJ)d$3Ew{!wSm*d|vh~YJX`4#imnLE9h#-@P1xtFu%`{`A;fK^M zzbLjRuTh(K)rD6(6(hm2Nk(^$;p{o`9?ngYyckEuBQ(8OD$$JHe`qf}%@wJ|xwx&@ zF=R!)Um)Bo^!ZrD?CuJXdrfpayCIdQHHIqmj!HZ?IZi(Ow2+%vp_>D;x{>1cPw_t1*0!h^pW5Oj}MtgUZ;&Q3Hy#e zYZ>pZue#&cZJTX^6%vT6$e5$X{9Lj9JtRPD*W-NpZx8I2Nqq1!XVA zm%S+$Yq)O|@Z#%34di#eI9{4cFr2c8-W^bqms2xaBIymA?cV`=DD$DbI-ikU$P)RB zAXiz)vMKgB$H*bZ9bEYCum#&Qg&}rXkJCB@s{ffNS<5a8^`ao)F|45JcX-9i@5P_d z8XJ+uTpJ7fwAccK{Kp|&M!O))kH?B%yDRn~y{#?x16Cf0{PEi2@$)S6yXg=>euqKR zTuy6EP7ON`;vBQmo{GA-blH!zh>oOIR}RDzs85F{dU>`;;=>W3i^(FTC*b5#rU}_4 za0k%4x&U^`>WOtD&rKfPMOaV9!J9@W>O;{R=z0;YQ*qKqtn~Ak64)zWQ?k_J;}aMT zX_Cc|atnyk!5lM>?oS-U9VoTAA{tvQA;_P{duho))eXomRmGYW!FO{si^{RuY!EkF zXC7A4HO6-vW5NaE_sX!%1a6oNz>~QhwhVBh?6r|JkqXb;Ax0v}u#SRK>APgN37dnQ#1O zecy{FOl_YkX7ambGhUn?EbaDQNtZrBQLK846gITL!)u9%doDT@lV><6ljnmi9irm) zcvN)@W*8eI--g1V`@Z4NIhFJH z1Vzfk&SC+b`9PQX&K{P+W6F?*cZb~i%h@M|`bK}jhh#@56Xebq+!S`wO3D8o@dD3- zm`9~2dWs)2xqZvvpXtf>{HSg$zT=Vu5(s4!jGt&s%jqqF;xP>qhlUfbHm`~IbiV85 z8EbS=IXSqj41*k0QAZx8N4A>kXcKETQ1>u8-7i!{eiyJz9#k@+#ZGp(2c0!}A0n2e z(mhlEs=E*Gcpn{y-WvTlsLsyeJ;utxV0&KCv(yLybKH8E;T;nmv?fvc$h{xfV3O<< z`@JFU=-|yccXccJ8>Ji)HX0XxJU#g(C@B(E`za3>&`ieT&T=oTYs4}uRyCom9*A?Z zMlg*zP#V^aPWxN{GoxZ$MP+JViE>3dxB=dF8%9_=9aN{gHe3*9Wf`E>4?Ic?u88d@N|q0FTswY?@J694YMr3_!SuPXkta9m@Hu z(2?6b6_74>TE8xrRzd(^vW#t!{vBl^wRO?ngABSemvpkzqN8ivWQkF%g3$wYun<}! zVT?!L*Ly9H4O_TOJOTiy(JsFiiL*!HPwxrPl4iM|UgWnRhidVjB7@N?7~*DL7G>17kGK&^fQQYY+)7;YfY};Da8=E1t|;p zP?-ribvRSY<_J|ia>}qNnn~k25&KN5eb((ByW9c$>>l|y02^GVwdz5b3g8<{oI#`R zsPD=qVbt^;Ug~C1%j;wKF_nFKuKs4O;U->Z3-+Zo2Ww>JQ$$&}NoIHPu503w0h8MY z59|jR_LB}}La)>Hk(=v-*4hFL-rFws2AB6HC?5*@7IfRPP}FhHf?l+G*KI(^Nn}ERDr%pnKzdMk*@F&3xci)wnbtaC>bH0n(Wg7ew3Irln26l zZ1z(?>#gECZQf|4-%9$qAZm2+vC1sFi^!#1W%#Wnw6m$%-CUzm-!|pM!>jbfubi3R zJtnML9gMCa<-9Qpp}PaSxv5J`2Nzb|dud&)zRNBG_j^3Ov{e^FIaXaY(+5tNt`oTa z$lfrf+RI^-b$6ZY@kuyck#&!9x|^xXNyE--{@6ZVN?I}oQQh}8Ue9}g?1Uf;k;5l1 z^9=*dehR0-M~Sig6YpPubXi6jhyrX$>_1oRkZTS>5qTR7?4l4^dD36tvzKb-xEG7V zz4MCqSMcWoCThzaa$i%jaOK=yfo-IjoVc^fqmpGt!|)e-d<=D*wx~KYMgxjs-}wCT zdb%D-njdHHK+Hz)Rq}z;-p=fuyi1unF<>2OexKR_WsEr^lM>7_vLjCBka0uA74eG> z3-z=*OI!&nTpeYhw77Uhky=A8fzAvs_&5_w!!~on)k0?hzr14|Z7f{1!lbp6eU}Ra z+Alc6QV+eEEzg)OM23By?>}k3KL&iBP&%y2IW>KBac+V5<^Jey&6=yuW)s1Cqql@8I>GtTXj z?&_zt!PI11w<)*I$LmYi=j_N{@9nCcQ%qCc(w);U_-@7SS(prg&E?%eM?VdrgWY&k z9%sz#N`QdWnW4nT(*t~Jujp(L$3^NUIbv$4aqhV_!CDB`+0}Qeb)}_e_~tvZdN2J_ zzj?9Pr6c=SgP*+^DE86>ukT}(tPR%6rcu0O1_QsJ;R$ctVhi6squ$@zjAB1GM{^uFO)#z5VU3726#Gx5uK}6sy~ks|o95s4cx=hsW#2vPg3eU?!i-Ns%tNl%oRd!e?#R9yvMfMpA0!bOq^97*&1 zF0^WF%VwCHe0-82x;=DIk#eaV$k8$XMlC9C=fds*saX>T1b^)Q_*1>#|BNJ!6-a_m z`jvhN0)20&&)>hq zUkD1iLqc>gB$x(kbj^g^t-~lpbu{`w%#1fWMK-BIr6Ma->y>tw0s)Q*?^`iMQHR02 z(3}$eDw7`h-n>6im>8NxEo49{6$xSYaXbJU(-!$|IBk^i(CRQxzU=zGSX`AGzUQES zF>b%=%@BIImjF5iuh;><#)Q=DgDyV#S|4CqbOm~V2mch)WsG=>^dw&xsLu0t&hwj1SvNenPRI%gh2JjTHvlqU z)*Mmwv5^~6tn65$x>+=Qso~9gtv&e%pq{hoKM6uzy)Y>5f1Ez^KeX%r{@CMxq9^{( zt@$sgYxpmOJF>{jTjj+~`iwDR0)bFkT%SGoxU?X+zMsD^gCDSjA2B>XM~E>ZXkvPt zG&?dd%6$)AU!V{{1R5^!j{8+XW#whf=|x9q&5h@mwvL+HvdYh`%B!;{Dbt_c-`h{0 zkLk(_wdLm+&*zvMQo8S_w?%vb1irF{b;?TRb?oHq{DyYQN=1$4iIZ~co(a^lDp8YW z%1Whm!DJdmjqVB5O6%~6l!`0qxPi5EM30(Pgf@GeuhEU~~x(Qr`b%SJ=$|^CF z*vc!2WS;VdQstMXiI}o0q2zBF6JNFUQp!)fWbgb2-?A&IWbfhz-wJI-kBW(G%G|OC z4oW_u<42Vq!DB2HpT>z-^><{dSB-aNs$A1!6IET?<5Knaa#h~#3Ax4xNUB_eW2WlA zDapCE$Borp3lpcB?~+unTJMxpc6AS;RB-AZiOFnQ@0L_>n(vrYe47(mRb9&yLaMke z{pEKxFtTLyVnDa+`j}t+prw7EtmJ`w8~UVQ)UGtOniyZ$di5 zx2NzAbbT><0pt3F@*17tE!Y_a<}IAGQ)lu=1w=z=3+m%>ebGa0YQ$T2^Qoapm>1X?=uttam3N zZ6x<{$?U{@cEP4PW$uHGz{jdv95%xt~!mG$>!>)dR;(VOPS zONjz3@dB*y`%LhwqVKlk;HxiK*Ou&EiLNWMIT7gXU{n7+MbJLKb`1MhaL|O#wk&}N zub+X%6IE6Ck&7A~MJ=|*2-2)^{AHYf_GGNU{1Zm(rZ%>wmLN|1KVABT_doMQZ1nQ* zvgsAgi_fkh=HJyeYZHZ;LEP8J7j2a}K#?pF(BZ!McWf3ab@qTF>4Y}zkOeL!_awQEr z8vCmKNB1Wpu@uvpTfbehG8ahO-Mk-?4PM?S-(TC69R4c5YHn7h zS1#6knf?&p)LgwhTkvOR{LgA3oP^ieF!B2A#5b7pvpO#RFdMAMC$Gn2jPKfs zcp^Rrvz~-LkRQ^QsrC)+qyvSINNusgMcojjq+~vdzKw}-Y+VcYV`5}E=Qj$Q>^i`vvOy zAxrgJ&zHX9L2eXSP?}}>Q~YLaP>reY_1b25AV+~N1B3@oX)&}E8FS>Bz7Vqbe74%c zhYw4TW2qcssh*=Vuc*?c1C4EX*(}UO#v>eV6vWY_{zwfMY@j4F$qz)>8~F)nilDdd z;zdwDv^pO&+nj`i@MEn5E}NjkT_xws=XDnh@6IFeFZs3i%jb18x~SxJ&-7M++@dGB z7fu6ZTtpvn7uxmkZZs*N&=?RS#4NeCGzV`I`HKdUR4gJcGsFmka=DP z{G^Edyx>a|N2Vl`XBTfC2E?}U@DdNz?E^|QDST4GzMU)$y468y_y1ziE1HWr~n zM(C~rsxu&xEIMqq84bn+lKGiIy^@ID2klsa^;?My z!!4}zGreY~gCFp)e0qluTryWHlSW)9A-F1o6IETUg-sYr@mu4&sJeb?&0AalW6(R| zfP#fh9L(N~@a_J5aE+v3f6Sre<*cmQDyku7|PWY;8%?0?`r8(2Jr(9jpHhVA69P*YQm(cf&O4}o{ zxVd4pueY-bp#~DH*tlh*6`QLtU^R2*O8H|en^^d~gm7%dYlTI8${t5kbC{-j;2-hf zn3{m38u!EiDt1ywM2bcWRojR~3nGp)+sD}LwABh`I2Yl1{MaR`toA=6=AnqVfO1AyX?p>qg}Q3=@a zO|YPXQHlz6S&eLD-DXg*LqH@<9s^U%A2+{u#Wq&4U2E`UyiBNlpAj=b)1>`$#!q8` z6N`{X`=@EYDe=TW%njd{Kre*E&on#nwD&v|(iw|8ZEP|E$vW4+*wfc^;{rfG7#v78 zaqG7nqsT@2!vPrWt|9{RsuxG?mHnl%*`}ql{9_^s+Lf#^U&M7m22nVO|^yF zF|LIjdG#*+_GY21q#g71TjT{Mg{J2IqE2y6%>-l;fO`NoQ`k4aqOA;_t_aPw(%*{W znt?liIHuv-)PYvz6_A!_VU(OQ=ww2YYxcdS<%H5qkHCcy8=b=XLDI5;GXpXJ#kYf^ zY(*m47OEJx&n_LyY($HaH-%9RY+h?u4ZS7B?3nSQz9)wE=XMAh^rw3q(qR$wnK)-) zTc%;&&fPE1l}Yn2Hop5)bh8Se%Jq}iWcwAHPKc!iE#hZk5BG|k_4Sucl(?ei?846+ z^kU3;sS0w@_O*}3EPK(laIW&|@2>hn$^w?e**B8whvTSRS_+ppIOkCdA>~(EtvK?{ zHx1acKuUoEG4l9fy;8aXqj=x|utkANThrENi&rbxCY}g0M$VF%TA27vVjD=i4mr9W z4k({;pB36}49+~_NE^`LH|!bwWc2-EUozA&?@~siu&fY-T06LT>IMSc@IqR7a>Vwo z2kUl-@It1$rCH{I-7X*)kyLWBR zy+czo?0Z?jf=~@$9hmQc6YY~Gy@LvP#kKUvW_r>tAtPyHFSWC)offcjpt(C}i@uC7 zG{CW4z@kHW$wVPzMIk?SuMvs*7*D#0rUVe1a>T`t<+scAU6GLgX7bEA3zy0F|57<; zz!rf{fW3XfBOephk>_Tdu{(4A>%6JFFm6wt`U7Om02lI~6?6Pdq~caCghI$sG3$&o zUuZ=1A{NPDKLBAk3kSQz2+%aP+_>1gmnNdO=kCd`wjm<^);il&d60|XQyCGcP=pXn zu#YK?WU}L$nwz5Uij2TU^%Tv4KVT-Ix=c05zh2_`KmLWROpv6}xhr0^5J))ocn$L+ zGCmn%{>cam25LH>gYl)hV*~Vsx?{uijl5@r@kM!~8r{VX9VBz>Hxwgffx-qVPd^;X zD;Z$$%dm)Hwv=@(Qes*uKH>qTb6SJAA=95h4DANXc*G6fbs5wQg%V)v5_qJZB17u| z5TSi1Pns8AP!?U8z`avL@gzaqYh~~3nIlnJ1PRo6fYPU%x(tEWU3dOsg>uq7Tj?HM zu;-|3g{le`FK~OT5nKc_p)Dd`E<5&!E1wGOp8#Z+Di2PU#9=0n%+n|jWtngUr=ZfW zJ_waHL9v#{G)P4Bqmg9NE~^T;p1^FA=D?~^)-(u33<#~`sj3PVOO|z4)Bu~M#M);u zLHZI{hsGnkF*^SHCfyFuGw`A}A#xYU7^{&?HGFg9_ovBjetS5lrL&wm_&c;a!Yg+` z@tx+1rzy_abf4rZ)jTM0-{=L%3v}9=M4TJvHZFhtEI3NHbbizLiI&+j6{9;eYNwE1 z>XzX{T&%Trzr$O?TrabjC(j*jSZgEGR7#6bw$M~hrNeuA;rar3yGGKvGoxyKnR~j% z)C!bEhlxB_^f=~M%V|Q+S{BU@tGElqdIA@{>W%OI!$?*f^dVnWBh#1USV z{I!qrnAcqKCN$3xTr(LgU&aHSl`=L@!)0(-67FjFMfTX?Ofe_KD~ZTn+ygd-yf-K{ zx$ur_sJpxi_?D7xFt`3&-UEeKM01zY4gzUI^ui>;Krq2pQ1(rbE#LpH*j6xbpJ_Wt zv~RKlf`*mVH+bHP(X(3Au5fZwEegfW2S;^)@bQEsioGpY~%RB)dm5lV(d`wSSh zU!!U0d8|dcN4?Q+TWtQ)iU;g6#K|?_D^Ga`BwZJ06Q*~Uw7zSrd$cDCiu(acKQR|L z^$YoEY_^a7UE@xlOV>xcZf|}J{l*2*&WH}8h4jvH2{}}I43#r+jgCCEuinwv1#z=R z>N8@-5~cEi7b=;HVEGeTS=GfKi|*1*kW+WXZE!kFLQEQm(-$I}ubwZiDh6cfJqu* z&eq;;l*SW*Bg%Hv`KUdldUyMHP+P@2oiNkQK7H6H6vE^X=fN zJ8woUn)Viduwc>Uup21)wO^fP;BE$fWq;|uPmlkRPZA!ER$ zFIdADkNOdwK(cSZp9co}y$d1aDkBtFkqGERc((>ageuu3@kXO7wt!`czhD_Cr0;19 z+0-+O0Ar_Y;7VA4vOT~s@m-^uuE{lJChUSI87CB1{#=zjI|a6FY_fdNP=7||J7UtW zxTfdiF!lV7($D639h%50*Ki&QNDI_1g@HPjjlJka-Gh6GnUh?2?uc>6s~yt0ZQEdY zE&;4@#LeNo){QaOL9za$3$Q&rs*&5m@X8EpU#t`1x|2P&l?DGIg%(Px4M($wRNhW$cnS3Zx zM8|l4?IoC5w|;s-+BFJnel~4E&FkkGV(-*a`3wKeR*I=|_T%nRTE^&6TYjWA`3Tge zjpj4l4FWKuf4``IpBa5lbtr{3P?CWcrLJ0?(;l=dE%lHq!zMJmtN^( zBe%m!o_L=7oieOB26NN&XQsqW_dMTWZ}Qv}c$VgrAEgu$!qR4Txp84$NI83ENaCZ5 zeFKXOb(@J9fnD^*pg~V!X2{EAY_EwKG|oe*=OR{VOy%QG$|@{ z5Ei+mRMLO-B9b}5QbAtyxV`p~J}vB0CXpo}j|7{%LmJ89pw0N!QQG$A!7JcWxDUuzi(( z!@qo@#hxdBYYR7Qv6o@ae9d7zr<%Jrl+=k)o)ft(wEjV+R}|bWaz;Mi$i|IC^g-#7 z_1b~C|54tNC|Pt}8qj<=XE@DUZq+r{S7dujBs~8j*A7KcZ>|B`aW_}t!ljvU7|TO0 zO~PkElhqFFV2g}0$7cb+ayRW{O9udq&()Oi3Er(fNPKti$5x5Xhu^dUj?jqSi^YGY zhK`<#s8YV3zY}_Y-H%oY&Y#~l{f<_N-lN5TvWSnGtH@KnWWE!8_uP-V#XI1AMZ|mH z$74kvh9#0}i)reQ++L)9=I+N%3D3E|U_>4~#C^~c+{g%OK~~itTK~=UAI85DoR`04 zh8&d=zB3Z*cZ{%3bQ) zTH4t^xB;Y?7Bobgckw|Ug~DN3BejyaWTu}#dvM=DEy8n`HAbk@V4v(2`_1qZzf7ZU zy9-(VU=v5N3p;qUO%M86`~a&o!#1vOlW;#~nNSB$>*;b8OCA6s88n!n@b;JI6f4AH zv3HG&fg@M?_eXxV_k24%f{1{iKSEH*&r-6fbDuJI*~A-s&^6x#zRDvm8c zj2Db_EYl$3FK!m4oxjGzJH1*DK*|`}0A$uKWh?milKB?a2L#3kM7?hzZCjs+yi&qh ze2MW@ZuO-Z{*=*f!*0Qiqdx1$zFQw=VR?00rPbz7+|Su9GtDf=9Xv3cAB>H@7#cK- zy&0Y#^U(GdjGYBsyj{%;=Yu$mh#=abVa{(@C~X4TLXqHDLWF)BGwMVAv!Pbhn}Z@l zlH{R&g)-nGNi2nJj;Z+H41#+LLfyGXo>2D%vSD#YURB%-Vk&!Bi@|djXo8Zs$xL9U zb%v?%Rm-p2v~-^UvJ<7T1H4Sx$VL4=3;I1|guqd5u5N%xyy+#_!VU#(_5?M{%K)*g zmM$LsMYs82tG=3^ zy5zkwO8NO;L?I8cVcOwPTd?Nl!k?3*Y3!lW^2~r%8!L%Y>18X2eU9eVFbHe+K44vwI@eC2_Ac6It*yLXx z)F3|o`xmM10DAnvUEoA-wffAy5RmVaXZOC*Kffq<_q%-*Uo6TCb_TG%I46&6`Ut*A zGY58swO(K=54(e;KeX0|xBVtx-fbax48y5bFebWI7_LHuK8UvxCpqWsY!?oztcGTQ`mL(3EA_PlBOvLXvFS zXN?KEe=7=yOi*U;7Yp@Jodr^iB4V06a076MJa9M&Z}iU}r4-+&iYeR$2+lFOy^~T( z7c0Zq{>B<`Cya%!X`^1}D^lW~EOqDEjizMNuU(>>P*>Q9qA`2nG@Mbd($hvRhVYK1 zcfg5W&IHTPEOC2~#Ct1>o#YRm3t~JeI7{e`&hb{3!dq=W3j&%=;EeXXv@NCCQRE28 z!7eyH(NOi#RtNl11QHDw9ZLa>3%sVcV96q`?iY7pl^$3jYaW2605%iHspF5}?{30P zkvip1Y{EGFR6UEE37uXbIkTb-t}LG1BRz*)BhrBYE2`YnJ-2iRuZ5FZ?MGsNX>vyT z66`?HO|%VVE8f2AX#(Tzdm*x*`%8HpNat{6bq?@Fygh7uZflwd+W>w3FK@}yue}b3 zf@cb{sCZyxW}dpw-Qqla1O4R*8`Nt#V|E}1wGgb1;LEg$nu>=8wO+el(!1==5tTih z;xCdH9?!Dl8_TYA4rEIq-X;O}#2zfT;e z6|7%(nCx{;q59}ycnLNwuSF*$Qc5L(P7f&P*s4IwU!JyOEPTD5wI|)8K6Yi0k$g(} zgcd*|3oMESSdJ3_ovE2ytSTj!T8H90w3?oNP0Wy%gAiv6_6>=h`+#Qgd!xW-k}JUM zE3W_+KM(O+%zYfU59Cxu;gt?4Uy4hYqPhGy7c{oMOLXf8eK4-V-BHNo_&P)H9HMGI|AWz&~pdQ9J51$rB$yG)-S$grnmfdI_+D zrtQd!DOH4G<$c8waE0)vNe&m#U7v<{9o~pI&5R3|=qp$}Z4wk@5Oi@UOg@TJCA6W| zS3ZFPdsnq5EH8=)vC%Ut;K^z5$8v3~AI3((J^}0H|dtRq|xzb;6SV zC808IOo zePps|IljFSxBt4HjXwx4ji{IlETfBwA)kjFECfy8xeRg{&!$3&6p40rKSZuJr6|hN zB=%XPLvy51?6th%=Ur=j;2*xeXX_%TObj3e8)9!CMzq($;6Z`OSwK<}QICWz7t|yfd;VsQa zqZ-U8!?r45tO}oCSdbCXmGh@am~Fb}4b;o+ua!%>Q-)gqSQ5RfoUQ-q8~e#ruptQOAw`&OkRFDYK7 z`H#Io1M+2xUU3<$K7mWMH{3v?cM3O>h69dis}eIn>VTpdt#=kkOGr)hVrj>#L`{SY zb=Ov(v)&30ZkyZys=Y2kPKvxb(nu>!W*2wXW#g{tJ+EMj8yj!bNfYxppDCoRlv__3 zsIwgCD9LjJ8yb~$

)#T|4sMi)+-c;|AAx)JG@koMSmP(BVbicEnvdwsoEy%m>-5 zrd3pMV|7V>xw0ZVBuY^6^ zBpbq3HEsD z%hAa@3ZIQKcjII6KF=4~N##$`8#()=EPJrS7xIC5INA*m`@s?2UhOCA{nL2NW)Snm zs=V(~{Z&KJs9_#fFK-Qu)P{2q35QZ4tU)0Fs%o%7B`)h5Dv9-SVK?;0|@Rr42#4hdD z1Z+B#*n`A9=-Q>-)jlEtRZ)QoM?`2v(LsHZU1KH=P%@5@)jqcd6igcEvI1B$q4C3~ zzKM244YVc;kvE+71ET3b=iBl;Z-^{XXn;KV(RnzlMZ)XHv2b0n{FO&{9HZtOt;)mh zClFJ%pmNRS3wO+4>ewChJ=HuNx#UG%>q}x2f zcU)5nKK|qfy|mgd@aGA+I%N(}gsGU7!!0Rl$g6twJ%mUU-KMfTG%3ixM)eGlB+17b zM?2<2As3&;4FU&=(x9v=@8d*?{5$Y+}xpp$#lFMr1V3p?X}O@EI1 zXQbj(`hT%aDE}vRCU4+qV(a|B9aRaNlK;@Mkl*U&c~!01hyw^Yg*p!aI;|kVI>BM6 z+m`VSTZx7^Aq2c>D7?N0wQ`l<9( znh==B1>8G=R&LyEN$a25QA5jXXg{`(dcS z{B@ralX<0ti3{+Ht;AZ5!^=Yu%c2}cm*ZE>d3@jL00R!>9?Y0d@)2*0Dp_kR{A9#h=0;m27?u@$#-oqpGJ z|Ka)Bvxy&!{70$@|Njffv(+rzm6tJmVmF7{atDCr z+w|M!P6wiC|1Jh+YO@~=WK)VNM^&(w9JEE4DMyvNs}4I+=BV8VM64=z)f~W}^eWz$ zMCf(KM@QS5JC4N%iore}(SuFf9u;z6wYTv<=$wUMp|vxh>7@*kj&CJIb8Azx(K-x9 zs=lwML~EF*Ho>xKuVqEAw<+6N$2ZARR4_$OX_4%*mRC#VT&GZ{jz?cRHVZAdPV75+ z7^Z6L5P)2z2*n;PZjTApZe1sL{%J>8s>2gy=Q@m#n0bA1-EiX^kU%-4ht!*7aNRBxFvbAV)xf#>7tzN3C3dn0@a(p z1B1452LofyN&ws$WpQlN9mGRewAb|c!B86~sM#kPe`OGKY?B?_g-7(`7j=mDE9@!| z!SC%VaEaxuT7|yY|H+8i;St5JH|1<+LVybXl*r+dl_eDnWTAl|Dj_3euyrr7ZVEY2 z9J`_zk`-DgYo5e*11CS8URhF{r`|hGk}ci3NvP0TxJ^x&b;hrj+i{Ls>g9y_jtpy} zNl>7X5tB3P`prUTBmMk<#yCl6Y|Lb^T`WA(j8CCLysTYEih^FYju8PA<(9RSV$TU9 z0ScEV{>y6SIyP3Ce_ND_R=oZum@zpc1FukbRFy^XOS0*nMH+SJK-Kj;Z zufQS}5W+9(6g2TPn_m6|-*<4gAzk%Y&M*vPO#H?Nb6di>vU*&5RfW3LP!Dh+ZJhOq?I>O4_T$e_Qd& zaCIS2U_?GvG@2fbmM1=JoIP;`OCluDfff+R(^^PSUqQbQTsvJA`%x4sVrHgJCH5IB zX&)L|bRa1QM|{Lklzm=$U0P?3`<9Tv)ur@klDS6mB5;X!bS*XP+<&NeTzmjrQzL)9 zgg&{j*aKHB^H7u#eVrdnuzNg+pgXK|yWT&3INPC78{4LVGjDXWJn8GcnZ~M7FJMB`? zLWsI_uVz3@>jJP#A}${ORakwxA4(bvN=;P?g?{#f&GEkEpzK&4!i^j>J+zSLlH;~b z?UXl(b-@S;nUu5Y+8P(G9*MOmGhMJfszty$s(Kn>Gc+vb_eWlm`+kofLUJ8~I=A;O zB1gE2hYH%7DhbvE7y{0TV+`L=XdV@*;m2Z5v{|0~yMU5Hhp%vcJ_W zzww;DtphGz2rd95+4K|a^f$Y|ZLL>T}+7|44#^K^3Z&%_L>`deF{zL@=v$NWVSY3seVB8WYF$e79 zb4M!NZV^S(7^gW@a%HUaSVe67h=as%64^*h{s$}o8|d($zd(~@YZ;$o&LWL6Uv;ch=x=y3}U^< z5h@h92Q3x8_tvDRwqi!Q_nM=eV%?6wSXA8;;4_tOp4lG5uLINNSM-!8c!D{r?Wz_} zl#;U@MC9swF1R71^Jjloy0`1=j5-fgIAdp24jY*h+_K&moiA}tYGcV_tc8%> z8F3yCp>{=QN+{H0;O%ur zxgOD`jB~^k16CW&wZsmrs=8#^=6!=pR>m%3MCt1U9w=e+4j-cbF&p8b`)eD8)RObl?Sx5>tmamU~*^2V(i zp}Pl?e9Vt=?3vY1$_MZ@n?sfyAK=j**XNG$ZsEfkr@3d8`VfMfV0z1);^CqE%?hg0 zpkSXJpd!rz@yTFqvnq{jr?Rp4b+t`zXPMrIe&?I#q?TPAwO-i45rTbGSQ}B??z4{a z5Dpy3T~x@`xSmb|S4;L>Mfh91ahaf}u~XI699o~AnJ_nI1Oxe+l!H*k5z+wKI{Qu8 zU{fzv>1{j8SX(J}e&3E_Wl*wmnXoG<7n`JWq7s{bf$!L@kp(C4+;PFwt?_)}lX}-t zG0oZDztmf@JzAmV3U~6BMaD3Bt3)iU$_|czd4NDf&f{+SO`P->C-U5e>3@;-PEn$@ z%d+4q+qP}nwr$(CZQHhO+qSjJu2ovM{(aErq0hcOMnBH?`DI2#W=354B1v5!9!J0) zN6nDKr!|6E8)&!`DqE9uw<3h-sMB;h6s$+EHUMc2(>g~{)oVT7-8RIcpY;@?twsH^ zMFzD+@M+h1I?7)U>Y_M8Kp0g>7=xCri?W)b7OoL5i@&SYNbkmaJKM3e=5WtB z=ivuFMH;9}2dBm-MFWGkJx-CjbjXDU#om8PHbO{EJxLf%o{POXvZ zK#@?4ket>KWo;0OE_V9ujy<K0a1R=GZ!x+W-}UBWN`OFfH(A|hZ-+sxXmy_en!kUNqerdR#aFv zGN_a?TwEntJZR-nPG4GgpeuCifn@^jj2`mtTNpUZ%wkDD?Kp*k-V|DLdJ zDlI<(i5!{EsKFg%q*%szAW<3Z6Mb#t_qU7-qK|-9PIpQr$Y@GD{&c zl?X=NlVdd+%9Rj_IhwET<;s;nOOkDqK4rGRV-302#7Xe&YdJxlT9-=}%92@C+A_UJ z-g?^xPALxG`@e#veLpCoHX(og>iZ!#|NB)3(*I;W|Acn@mp8AD5|#?OZz?e{u?55y zs1~p^Ma`dlm||q=n)SribjW5v5T(sSL{#-m>-75h-yvwSfBj?eY+Rai6gq6okkK#X z>#m|>IXR1VE00?G__gwyHi(fO7qXmYKXPA>Jo;vD+~Rt5!(hPTT?l>)RzZ#FpxYl* zLj}o3b2uzSIFRYO2|5@K#!xbM9t=7eLbM-@;<9C%BOdFrb(^CSer(_A_qDt0W(OKV zKrm7t6CN%ritGY7aGsAyu@k4lHejPnF*G=PIlzi_qYpyqLKn?MJ%)QY0EG3lQ@c}k zcF)h>j8wO`6Q(kI_KfE%0TQnRsodBgx`GP%G))#F%22&KKV1!1XEMgxn!;gl$mEf3 zp+d*Vv!G)}MbRKg9!@L@qR!;OZOHaBmgz&C=0 zjHHh6GyVBp$XaLeT+6>Tpx(8gtqdJGqN%l2RMTKy%{0Hd>O#Ki(ypWpOOBxnS$1S| zR1;vz85sv1Lnhlue1BC;X`sbjHHQ^x8%=%zvbd}Cbrza*Bs3Hh5ugi!7^SvTcJaGk z&{S{+h6>37a^ggi;MGJ)(o=ZC;%9DDy_=~0D(^~=rYL81_~YP;tD_SyPvAMqLE5eZ z&`66=&&XExJBe5k(Nd8~QdR=Pk~V(wcW5QnQ&y&elGl(>CDV7OJLNPK&juRMAD`Tkrt5A$yBL=*#rEQVz*ea&X0z){wOiKSaZ5-MB zv^l|SWsnOU_Ktv3l6%j)tCI*hL=K+f!tFnq{Rp}PtzM<)7PTp)PRMjwkfpy&Ql+iQK=lK66}`pDq?KAc9Hx@lWirr7dP6{p+Abu`UxaZ7 zed!t_aVEa)6na427zx!{tNUN^38nPrEsm*{=?Z*dYK`5mq?YRn4M0|c3FwMq-AJfE zX0X4+sreS(=Z0UP9-pZI-(Wu4!S1=5UV9=K;$L-#*NqIG@{y8E#{sXSP&E|G}zPq-8qc>I*2NLoDUWjNA5M zd_?3EO$6he=o)CX-f(Ro1ljt$vc3Sxq|TUn6)d%;i$+c{N^PW?&R4siHvMX2JMW5o zFFJWnyT3C1sxo=j^Wwbwn+%{w!rSCwayls>q5osOlhWv%hVJ?*vUM&8?T_;ouhJFZxh)Ld_J;I`zH-w>25t0~y+ECz;Ce>H(4{);jZs&a=dg+&A;qmS|3L2i)F5TKp+S*d zc)OD<`EZ<1{Fl4BxYuOHFn;G6VhZtt+Pm#aJaY)0R%B&d-QPr0*PyNjaSZdbeNI>J zjG1?x-eSP853EKaDWZzrqG<$BueiBfuLzxS?;gcE?Haq*yKB6Wh|in^*u@n0+a%}j zkuZ1R>sWbF0O*6{&b+#H2~+7Q)nA~0gpHtbaRFCFIWCxxB4ucMS+-qRCbnf3vHJU`OI8)~<{+*u^n^mre6;Og#MeYo4< zeO#Meitw`cuL|sP5gS1ZaYIkFM=M}3ad*#psd==A5;4{`mF$yXG_g|?4bhTxQxA=5 zV36P0%9HBkmxWtPEc$uM{mR5-dfi0tv}xJ zJy?6cUio!j9yiO+C#5#VW4Bs3wOUuD26gc2>VfWFN3zudWOkH{t&BrIdV}|HJLFY^gIlSl66atLX1owWqf+Y=}N$c1;bKp{MREBnYqeR zes^nvqEzb|b9F#M68th~Ar>*`kw)dsNScP*18Z}#8jRl+js~hMWhojt@?5#KQT?4| zEb|GprpRC2hL+xQUD?_^C%v8FVXM6iwv-)$G7{y+R>>*H9g0L1f=VNe846=8v8>E3 z=Ib6StBlGuQ-F)p;3#ShHk2vJ6G?8Qb?M8BE5$kbrRw|Q<0Mt<%3Z1}*mT!e>bOE_4RV4Ipb)2oG zemZ^S7%e^d{oWCf)-^neXjjIXI`iaWe{Wti!@4We$`K}_kSr|mo{3e+FO>5VD`qXA zp0bn}qcBz)#TzJw8fP3wO)O|q%v@-aCKY>ZJ5Q__dX9&HubNu4DtkTwiVL-*z9Q7w zniVCUKentlA}{>!t|$stG}tx6+e_8>A?-Ij6=%wStQ-pybG{gKTy{3MOT-ors%P0b zWXVeqO~#0$QfpAzOHesUVG@Y1x=rshOM82sgtS>%o))Kw#Oo4KGr8Wta;}{A`6Bip zXQlbRnA?^n&|{a_Wvecm=@zy#$_rT*{-XCl+^4I`#5J5SovCJy)&#@cL-branwNHj zoW{Ecm%pK3TKHsovv#t(Lz!Xk%F;m&+%j+)wNeGc=WCF*su%i6$)OyOq>_)oS}*}B zvTYX2z*-JIzbcq$4}uIDTLDmnDT$_5lV;;{@te&&@f|toKC&CZo}HZ&Z$fVVw%{Y) zjDt_%EiZ`q)69^^db%`(p+%Hg{Ah($$Hm zS&VzlSfHZ`6vKgU@|39l!S`&zn#4;$ z89$6xyhvt_re{#}2D)>&m6`3yEeWwxZ$C+4Z^}~Qx-3;1N8FT@+NAXCO+twSKCDeAm+`?pxcgzqxch9id~{n*5W`CXjVUk3H96DW4IofN07Q)Ym&AHj(q7?xL^?`!HIZIbQNd1kz>kxwD*}$6oh-M)`-0Zsh@?ZdncJgAQ;5HGj1ttf!x)Z?7Xtbfm(hP zo@b9X`CS3wVp1@-KChuUF3G+%+g%0E^zH5<`kd~K&TtCD+LON9D3X&1l0&rKz?$bL zkHR&4sSeB@VefZwpdM~@k(aIC2S2=;Yl62k@G7eJYOf-xC)fh)k|otf*--xuXk7{e|BXkLLiFA z>1Eo>!L;X1wnVqb>m!Qj5zTr~84JZp`JYe7I(tw7>1*BSklHniJq(Dnc0WG?;flop zrVD(+`W2iY=bCnQ{ne%lm9tjGIk28D&=zsCiHIuQ$_vHH+fg(bxzd3}akqC8V)qmYhjReGaNQ>eBaGR~^@WUW^hQ}0$CrH_-Hm(w~;P;XXD{YYcX zY4B0HZ$AyBz(jo$#pN;bIz@*7;xzmWLc{(VA0B|L9CA%W-f2iE5WqlvF%f2=wT+pZN=6A7s8 zQf}ps8V&fLzl)LeDkpO)I#l&%%0&eoiRmyndqm80ji@e)F^bAxAJt`~L>JBd9{Jt& zn-KL`YfS*Z?nxg3A1EfwbR}CkUTz8!5b~MUn!-=F8JoE*2sMN65wILP;MVK?Wo|hL z0)(uWx*zf}nB_6DCdObL?Sqdp+QB2)L50hh&Z9CPGV7W>hiXt#dUHXVqiKm8%G@Aq zf<=l)cME&iI)a@6&6>T#T7j7Yv=~0$Kh{3GI0JIH;m#?L+(-AFjL$*-I&=%C&WW9? z2%oBNm&%sHm3cV&YS-E$hIJ@nT{8BU5xWwENY%Sj4|>FoDwDB?y>(Hv`N!B5>_jH3 z3tx7TS2IMEq6lKFMB_f(A~1jdenOXdA|^B(6;TZ*w&!m2czRgVmo~fi(*OK{eqi9& zk#qD|Kl82dA2|5GLqVed8x;Hx9{-bGtc0ZYlU_`0N}wUYFAvW`nF7x{7^VpoX^0;Q zqYofZpF%qUD3t_rV+(K7qSu;pAyvk79pv*H%O=mdY%qVxvh14Pg>&g*Z~mpk=YnrO z&WSC{H~{?G*pcsNzU4M|o9*+vb(JUfu*W@g0BnMbB_oay}T!b%lgnL5Sh;Ra8Lr5dSQU~qeKv#sObNGA2 zyxwRCgu4CW@GNvxhp3|N$R)yEe)ZujcB(_xPT}s5GK}o+PTf#NKOJM$%(OrXp$IUd zNLy$6gyRlqt8Zld~?c_d&&FamzJ{mN`Wl;zI!)P4LjfN`a_Z z2}^2PE1XkTBJ7T}O*-0&rGbD64UWkK9b&c>tQ40c=x5)oqyl4ZSxAx!*JHP)>AqaV zvD&*chSNyRtU@x{vJ;O0s;@s6PRT*6IRz4xyeZ3zszHspk!5Y0w|ms$+lTX-P#y!| zqQ@X4lq1)wH%O6{=sC~}OW#5+y_o~^^T~*5TRt6MneO12r#>vjDQ74-gDW>y7M3H z6AnA^%0|MGW#+os5epf~h;b8`L1ksPgLmt~#ct;5%LX!;vd7_!;XRdD*9&MV6XF)ft}3(mlD%DG2ixsAzErfH=TYaXH(T?x0B z{2?mMtk2M3?fL`J2DD(@nL;{gjInk~72_5RQjAvh3wIDHp&O=B-zo4z=I zDcllZb&^*2q?)dsle)?4VX2EM`0oh0^n1Xmcq@PZIz*35t zCT!l@?N2NJ1`Tl=C&1(pG%!XuXrA{0BQsY%`9v23lv-a|tB1S=LXM^>YOf2Z(Juo^ zczX*i9L%cRBbDAxQPO|(B0tU1_9e^_(v9o+@V9VSH z_`c*7pNUWui8ZNltOZG`M8&Q1{<1jIa#KA?m z&qD*7ByrRBWyREFL2WP~$xCCY`$zYwRgd^Bs?z>G>&?G)q_w@V-rh!T3$Uj5s&3C| z4(tq$>;mK~q@W*B-zHd%wg|lRxb@*Zi}<*O%om4NQMzMiyDoBd6;v zvT_Gs;x26R2j1(RM&TpY+*huoRdV;6|0OPBfRbm}xA@m5FbZGRC!hr^Dj(Y6JcA(g z7KA~fsCOA4y7DBqPFrJ$*DN&23R+oHWa6)sp&K#yH2IETpbk!&LkNQ$_;rfprli(% zRb!)f%vtqvvzZ_u_a*N?3hH1XdK4Ia3l#4os=K;Sk#UBmy%@S;Z6KQ#0i7J?9)vKW=vxXfrNK*~x7?uV&ENV-Q*wUSvgskAHA^OO3XENZP!?qv}7ZLDu>F`g$ z-?s+u$%9WA3ZKUi2AvkB8v#_OooDs|?~0fStMgV%vm!4r08Qk2>R=@~C4L|> zqO=r}6*zX9YmL>NPT<~<%g`d7a$SLf;Krt9Xi-4=W zA8YIT^kxs@^Lc(YMuKNsuolLk{d7P;`$#lAj}S||dVV1>Gwm zqZHlIZJi0J0~B{uQ4GU6=|w0dxRP9=XduIoJ89(s2+e9lu^wHdFE}^;$7Dm^!<40` zix-tnwJgw}`KA$CgDLMK6vx<&+1(pa^861OQgdK(>K^p{)zA7W^h78kcGxP6KvZ$?+}Gt|$8b%1OW;5LR~ z6)_B(t#g^1fi6rcBKWNkzrNiySOKVTe9?T@Af#o&bu#cPCLTR_eZ7T|-UGx5fEOHu z#<6v{==!{L{XY5`U!zdtY@cdqr!4Y<)7a1qvMF*E2zZ_*vR<_oHDc{Fd!<1dh&Gb#1ba3> zJWoP!NF>Bi0^ERL-GFC^CA`uL|7hUQU=E@qO4*6@!FqZ#lWBYri3(?19iI})%mVHs z%Zw}~XrC^9l@%(H9^PB**s=T5nEohD3!NuSrg@Up0y5KQhT+~-W^z-o*mu`_f4JN`5Mt4+jLeswBOsxA^kKZ7@elyQMaOf?Gy?4LViu-ZWsTR_h8Z;& z^}rtv7&q7flY0Vxc?HvJiLm{_7zEp9=I%$|cV~+yRTS{OaX$u$`=m%fi^W%qcNwqK zpC{TY*5-?W%Am=fZt#9#1H?k#1<=|Nuy?^qxS|7Yh2IIy{u>Qk^T9^n?6=bwV%xym zx>0F?$hh)^DewY{=q1I{Bb41E7C1^gBenr1T_2ZjoOkCx>d|_zoNZrqZ<%V3w}ehI zi*Gt1$FZ{X_e`aZ-H9`1T5WhU%MBtP1xIiL<_;X==73ow;@CoNZ64NpS^UjR%-1O{ zydX84Kw4e^8f_eo9c@tTZ`XKta1?VSo;G19G2!2T5hoixe#ZA73%l=s`?UTIar&Q6 zDMZyu3Cjf8SJxI|B2WEFT?&YtB>_wGOjZ};Kg`q#)au>6=55M4|+uzg@!lE89N8jgpM6+#5}I7(&n9}I>_TXk-3=B(A33fYAu18k=hxVbDa1> z*+zy;jQqMTN=z+9~8?ziHIoa8_4|k4? zjQq|QB_k&r6ak&i40Vvfiy}MC$UB;fkR+XUn>6bZ3i$LrDN1bAhs+?w8aiq*&H@ZF zDYjW0W096RQX;F)!8B7$OG#_Bbka)vqDw0si|>(^+DfXB&cxpP&dTU$G(t;jLPqpx4cGk`kZM+B^J=V`p@mshB1Ss2YyCqm!}~5bYc8Tx>M!dm9^C=Z z>}3>*j5R6`9-5CM*c45cc&OmD6+d2|#Na#E77cmOPQ^ISeF?264U(Wau$C##W|M;2Ycq?Zq6_uQpP!+Y%Q7QxTQlaBSvbKLC+ zL_4tGqqC~O3Qf1N{S1#M)B+D5i)YY+N6hW970f*LI-i0Rw}1ns5Z#cm3B=f(7n|*KvE|%5BI{e!u zIVI)-YqRTV=id?UU%)ZTm!_%7)FzXpp(qk>!}NoO%cY6gMYJjVa=>V=nZx=eLcwV5 zD0>2zu$)toAl7HB0Nj=6QSoK+<5*Dd`}lZ5vh7S~eu0{k^6#TUR`pBnssYEZ@t^IX z7!Q5oADmqyfqiUr+^4Gow`KQ3<{@Xz%+5bC9P*;*x{;#R!f2qMSsv1f}KPk|djKG=oqUj?5nIfdY zB|@PFri0d){1_U^_^`I?!JwE)w$g6!mDvs1lzUHT=S3>27g0(jK}<>|b-$amF5v8` zz93Tfu7L*^0V01dz2-jd-1@#|J6(AH-5aV?h}7-Yh$Wk1P>faJ(|tZ-;XD0u-+`Nn z1K~^kRDUrVffEXaqhT~Qpv(tfqLj{}zh(qHk5`BwGgdB8ik^kA7f+|fI01)R(uqJi zufQ)>6UBH3Y!7%Gga&sKNEa}mg>;fgPp4N4?!fKGE(GWXX7ML}2T~uF|HVlNke&{y z52Hr19M(Ci*5V>F!zn6>!)9$JF6gz}QD9rFRGG9O?KLr3ypnO9kV`=6&1|VG#i?qV zv=16sGu_zPX$|BY_spaJEdE4MzKG@7!v#qHjyH|d^2yj=$;wd<>=ql0xbCv}{icRoZ zM{>-WyJ0wRBv~usUdQDYNzrpP1(xv1WysXkNYYPFnLX5FI~_4b7<5@&IR=_C;fJi2 ztb4GrSCn8Nf6Ttli6z6{py$a<$H7S5jns(f2&!x|+K4gbXwambbko?HC`CnDa7Zc& zGj0?&$;AMd{L)-v8mzi17DsAH!@qqBpeZojrhlHW_7s?#Hix3HRqAOI*s#gnp(t?m zvwDcdx$48&zG>z3Qg_+F6LXb+EB{bGcPW^Zw5-seF$zaIjl+1d4oeMeZVB=s> z32R>Qexo9Js3d+bzy6FE9t*%dz_p)$5guExy@EU--UkuOedGF+c((<&$>V%OnsweD z-P0{RL0FRF640yZEjERW^>&Pf@Gj@$et)*+d@cZY%iP-Vx~WgPiTi}5ZwdEA;olTy zI1oro*fbDTgq-CN8^!ZA+8%H)-thc!iAz$8Ov-y=|Kq0pWV6sLdnnZijr2F0+77>M8;*-YcOV3#Nn7V3-Oqp7CC|wwnb-b=O}9Y(JDr5~ z|6T$`+>K1^|DSV|7)70b*jvxiB5f*Rq~fuVjuGBu;FV(df+4sB6oU3ZyUdXmQ*r_H z#tuW**5uw{MFiaUFF)k_-3v{a;Qvzwgh+snK@d?>s96XI#~dh7m2K;wS= zbYge;;4pdobi#Dg_?qfw^l6oCsNJ*HxuM!?k_70ktzj*rx4-E zaK497G_!v31=6nQz+EY8RHlEdcDRyy%QN=4+c56wd6g9CC-utGTY5D_3(lv|D>6G8 zdL@K|$jqxaXH&10ZO&>gy6aT-R#>Z^9>c-j9uJj4u47t_Qt$UYr>yXp(WRGHD)i}f z)C{uk=q()j!agw6LJ!N)vct$j2Xy`!hk49eybbnuRile+l z;9=$RtHbXm&{XHidl90ffKn!ZCDAsbG16icfHif*QoYIwX#6MfF|gDK#}wA2h@J?h zXoZk_g^73RCgfjxn6h7ldP_eyOY%Rg|NrAWN5$62+{DPr#P}bUFKS@qZ0G3l9}K@n z{liUp1?Ah8@nDu14e=q6Uz{KRl)*^&UIacyVxAvY91!`^iqVN6C@F)TsX(}dSF2^w z(x(}uSq|UQ3Smk}ykt|eezDAE&C<_&&9dv=&iQ%EO!j8mn6$3tlfZ12r)loH_v_l{ zH6uyxuiF9P146%HiN_JFbC3Y7Q5YHV1xq_AKQIE zL{!N5P)!JV{6O*ml~4h+2%|b9b#j4l=m_JnQ4-updkr}5wr;p$^SilQ7_<$qtyNlq z5H8p8)(qn|#gGoK=MDAoE)B1sEeaAWlnFV18n zJIDt>AFs1px9C^eqrgLX*7*qh2%1^Yx3+V-?dRo6wzOy;>&JZc)T2a*xVEu4k0g6x zy@eVJ%iP-3`q0vXUY;>T#lvhgs@Q3iml3YVf+7hbq*9+cqOiG#sA0k~X|9^h zeZ5WpIkWsWO2h^akr0q;As;*ZiKPXr7!XNqv8za;V1v74u8A2pa`X)}DdC|+7uB3j zg_IMu)fmZ!n2|-TQ9U!4Bv6V*)TWh1?WugK(&wVKi%#wb3hi793Q$y&qM`oD6`i2N zYJ_^0#s&fu%w|E@)m`e#?#;}AJY_C=Nyy652fv(^o7i6KYAY;Ih|hh3@c1q^!hMzF zb%*G~=+z?~A3CfPlo$=_-p`s@Li1LEIXwcht3^||bdbVmj)#495~%k;gmL88aJF7L z&_HpI5f{}gI0iX*NKi$-H>_x(v3}^Hh6B4! z6lmm=G`T|-&PnE6t~grDrd1hsXLWN0-f!8heLyjlE@dRq{^iHBun;ETvJK##k_S$p*=lsKZM5)+&km%ruI%{z36O zOTFRfZ7WlFCIHq5|fDbw`{=%Xk^7LzceiBE(qG#D5Mnpv=2IcS{fxay?7#R&&Fck!ZQ z*VRY1SWk|m35YJs3cN+D8sq^g5L(xiH}SL&IVHt{4K_tn(L-0E zVx;Xp5b=c`l-XL*s?i%8q-(CAn{3`0R0iNLMl+vjNMy4n~F3+cJmuZ)UuVdrnDS-fH=2?nn(` zCaj_ueP%g&s&Y#CX-MRzK<1{YyF_daG-Z!qLxIpk6=)3ef{&PDcPa{7!jY}?f-MbH zxBfU*5f>%Q(Spq@c^lVqR;x>pJKXVDC7$QnfDTl6J?4X=p<{eO6~v($I_@z zO-~)M+O>qsXX$HCNGBqa9t+$=$gYXR-T*pFS1xlR2IROQ;;u+rz7CrwGjnQ1z1sqN zFAamB+CW-Y{U`^G0Z)lPF5ESc?_TX}Sc6jGk{}LBsKfMaeA3~=*!Z~$@MHFQq3h%2 z#Hw~iNe0;>I-_o#a5;*+R7_S9pbHy|8i3f zVvYzf>IUHLYoy#CT~Tqgbb49_tCcSNHd<*KUJ`Fr{npN-_MjSZI>0I$E#u z!7XSJKF1S7XwmE(IO+=?6qR&ArOH}dB9#S7+gF;baivQ0?VDqIfT}Kbz=g)sr=YEj z?ZU(>2*5N^e&WjhgeB`cC2lIx99dDm=O{TuzggqPTNcsbfQ{m=Qdao*s-$A=vgGn1 zt;VmzWUM49N}*Mu!~sotpLu?;VHcqFfTXEjXf-dX87);D`pb(sSLj>0X{GH;Ggf!v z3=HMBoWcb!wM;qMIszxE64$w0NnL@_L5 zFVEI<$FZCRtTY$j1i2vFP(`1?q(UDst>NB8U73rz5(jmqa^j>Shio~+cHf3OekTAm zafC6YnqL)+bNE`1?2fJUf}bo0))`PwNwOD4O9=Wm{}f9wBr`t1E_}Ks4BgTg)v!m( zTwMnsm0SH}PXD9}-#w#WU?wbe=8gt(rv>{tYbQhPw+i}Mj_&@fzSGbqXtIYHKmWDpjRw^Q9#3dvv+^aVxa9rNQ?v{W!;7=OrT zk|siVKU@nq)IC%wx!%C2X-E$*)(ZlsN3tz0(bWJ)KQAxH%bK{wdQE4!_a}`z%7E>} zCp@*X;a3vY-vdgLJfH(7-(T;`3DhOdAOlyHI@9izWgLmOB_AK-SKk_QQ+xG=Act9# zLsNgj{+Z5DJkE)0LHzpVgz@jN8ruJa_Npe17N!>et!8LKcq@x6*7@!*J(`}*5HoE{ z;L{yI5|E{#;UeUbO=#lwRcnE0kV^11*$Zr2{_7&-}qS%Fp7T{FN*-qYhTq<b+4& z>+1Q@NbBnL(b4sFbu271qY_wjI0mrf0mzN&Fj$LeDlwjY|54A$Qnc-Y zhF$xt(f4sunD4>{=yoyISF36|>}7Sn4dY4CFxD88358bc_bF3&hx85 zB6bugCKT1(ey=%sG_W0*pb0)AONY?G`=CinLFpjnqIoodXYT^7@jOvkx0J$#&H<8< zi;FLX9KK7z6=i7hSQli6ib$H41S2EdB*$~H&co|@q=Nz3_Hn8sm`jLTi^J}%p)_`* zl*gkVkl2@`{fIuiA}->+V5LVp$6Gm%}7r9!1E*y`k$gEdKnwC6i$U z@Wbb^=GAu2fvcq>>~DRVOtdC#qkIbdCZpNIkrJW#%9F=4>WcJWwnlE{C^AfCTua79 zl^VL=MLrG<8Nkn>D>E?P`T#-Mwdh0&dhDK%m-0!^$w|wh^n4#Oqv5$pd2yH>llRUF zdi0!pwnyJdNl52*m_T$sbCIL%VW-1`2l70eT6rf>`$P$f7~tFY+? zc(8Z@F^OkY0Sn~)gL+xOc^sQRBKlS9)5)%Vf2*DD-T%4Q5eoaq%Y?b8NU+6I7GQGx z&oxU<(OaLjTs31{^BTLlfb#T1nAP!Dd}_G(5@xMsq)0Tea+oP(P4pVew@N!?l902B zxLrTQDt7>BH(g7>J3n(Eo6B&uJ-Cy+aB1YP-9h{6QF~b3OV7U*uW8G;E6D>E z0~&LK$z#!TV(Qg|zKSTs*$c;{#}4Hy0umjUd4 z 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 Y`CYb)y=1%oI@n19M~1g#Z8m diff --git a/lib/rome-1.0.jar b/lib/rome-1.0.jar deleted file mode 100644 index 7138baaca14c7f239dd32aa2a92847863dd3f065..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219671 zcma&N19W8Fx-J~swr$(CZKGq`wmP=$bZpz`xRZ))ck=h%`<(lq{oQfCeQQ*$nrn;~ zb5^bSyqrq1pkOdS|9CY^*z){y@Lw0`Ki~4=YQpr=3KEP;|3wA`)bxj}pK7#L2@D9x z2>}QQ?SGQV3oA%Vh^wkG$V=2}$UAIuA@NTIehm?oyBkl%H$&?{a+BG?ltgY4O+4w$ zFLGIkBtb}X-p{+gDu;ub#c5}fC;en3J1_;pSdH`A*>1AZ*ksVuX#g_%#0FrF8l_HYVKJKE#n=X&j}`8JiwRRoH*NToq?XMQqZ+ z7EBev^s#=nd24~NYGW|87=62nlgb+gMIdI@zHr9x3R5sA;loB%L|WovwXVBi^Ee5& zghX$2hh0r($*xqupB*^uF7R|0nnt8?4!xH#@2_6aP1P?%oplGt<@7Wqq}!uQI(Ooz zsX;f%$ptYs?K_4l-|-T5E%%XS8k9CY*As2KI#>z)60itu-nF-WDg)WG&9b`?{m4kp znfOijeEws(d#f(AEpttS;GkIthx|h)*s%&~Fx%DxS#4|77ur%Y0|&r7OSAAPdlB&H z60%&!O`e0Vpbyc#v-g#rFRO_(>!2}MU-vU;2t@uOIlRW?i!Dl-eWCg;wE1*i2LI;n zl`4wc?e&XXwGow3cY5E$%|VHirZE1519^ke(ve|Y zSwA;duYjGNx2MwbgAAW)1$1{o>bcj3yQzoN^zqdk4QW7G(hkQy0ICk%QJA}EHI4L}NW}8NF=*%*apB3=E#WFNH9}PWq zs5sh)o&CZQhuHzsae4`MCF(DPWDRnO_Dz^j!OHj7Q4AW+mV`-W% zbSCnm{YGsz`szmG_-g&6O3@v&w^L#w3`CR+W|_y9Vvb6FG|IE8SXF$YFZlWM8pscE z$V14`9+WU)@NN!)mod~7>3P>9c)`^Xt#vSXj@v^DP&+Yhl3T$ijw#N!S~ETy>UPlX zcnQp|GwGuXwxWo9G$zwIds_gXEtJ7Pe9&t%3kTxrmhp@p?TI`Z}wkbk)AG%*4|BXOEK$U+1sy{#kWa?n|e=zF* zrhxh{3Kuu~|3Ov#7dihxvVX|=2bGJLy_vPCv8%Pi-*I67FB}%;=4OARh~V$oj9ve2 zDSw^h-||}9IokdYy)}PXAkp9HwR13Yvo-%8+<(VD0cXTJipOrhiih1@w=f>0QBLS`ZWnXao`n zi0*&k{O4o!&*wwb*wx(9!P$$!)YjO=B~De^VMz$>vrK-UtexI2tLa*45sm46M+90a ztwkIReV~+UBC*~1!h|95vcUYIME zlH-fB5B54;xDn?Wdu#j6#jSLW?TXVpW8Dqa+4HOg9i|_dXMFWu`&Z=Q2RUQ87(+r{ z1_5<8W%leX(Z^UCAqc75ZL0_Lv-6ai&mA_|b6&Z`?3QQh_KW*X#@IVtq8`R(X~fD+ z=O9WPbOPJ<>K*q&^;vq|Mr*Dv8Xjwr_Y>63NoEzxUKgpP<5HD;^PB@ zQV|D4lsvOLp2`4NkSiLh6rRtT+Uy6h-iD{Qant?g9tsZ)Od>N`PPaB}GO_jTvOr77 zl_(e}n>2gJdOS6X%kU}n`l+rW9ck@hxI&tyRcsIQTpfF%04zOgVTTsV-*G?E(W3cp zbZgqDs>SB-ZAa{R+5MN0a!<7DZkdVIMmTKCdu?5l)#QwI0xi_wh{{bEpDMW`MQLEL zl$D1oqHD*iu}~~xm_o)`;Tπj)V_jmK+4WlX4olW-o2!)w*K;d)64DZ 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%0DlWYnQyX~Fhkv6FwX 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

aW3ZanAOx|j!kSgE%!*DK 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 From 3f18d2d57d286f800c5817df2b12c5a2be24775b Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Mon, 16 Aug 2010 11:02:05 +0500 Subject: [PATCH 31/95] Removed the dependency on Rome. --- .../java/com/github/api/v2/services/impl/FeedServiceImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java index 0e22f3c..9eb863f 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java @@ -70,7 +70,6 @@ public Feed getPublicTimelineFeed(int count) { public Feed getPublicUserFeed(String userName, int count) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_PUBLIC_USER_FEED_URL); String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); - System.out.println(apiUrl); return unmarshall(apiUrl); } From 67bde2a58836490576ab8ea7a0d6a2bcef1aeaa6 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Mon, 16 Aug 2010 13:41:05 +0500 Subject: [PATCH 32/95] Updated README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8366820..adb57c8 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,9 @@ This project provides a Java wrapper for the [GitHub API v.2.0](http://develop.g This project is open source with [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html). ## Requirements -This project has only one dependency on Gson which can be downloaded [here](http://code.google.com/p/google-gson/). If you plan to use the Feed Service than additional jars [ROME](http://rome.dev.java.net/) and [JDOM](http://www.jdom.org/) are required. +This project has only one dependency on Gson which can be downloaded [here](http://code.google.com/p/google-gson/). -If the Feed Service is not used, the library can be employed on AppEngine and Android platforms as well. +The library is supported on AppEngine and Android platforms as well. ## Key Features The library implements all the methods of GitHub API v.2.0. Additionally it has methods for reading various atom feeds from the GitHub site. It also has a method for downloading the source as a zip archive. From 02140af39b1735b11e1ab0787de2064b87e61ef1 Mon Sep 17 00:00:00 2001 From: Scott Ferguson Date: Fri, 29 Oct 2010 13:13:44 -0500 Subject: [PATCH 33/95] Update build.xml for examples/ directory layout --- build.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.xml b/build.xml index 6877d65..da98af1 100644 --- a/build.xml +++ b/build.xml @@ -35,7 +35,7 @@ - + @@ -70,7 +70,7 @@ - + From 9a6250656542c0429fc3ee9523e0cef267a00388 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Wed, 15 Dec 2010 13:01:06 +0500 Subject: [PATCH 34/95] deleted notes. --- core/pom.xml | 2 ++ github-api.txt | 63 -------------------------------------------------- 2 files changed, 2 insertions(+), 63 deletions(-) delete mode 100644 github-api.txt diff --git a/core/pom.xml b/core/pom.xml index 2a28bb7..eda3f9c 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -28,6 +28,7 @@ 1.4 compile + com.github.api.v2 github-java-schema diff --git a/github-api.txt b/github-api.txt deleted file mode 100644 index 5fadcbd..0000000 --- a/github-api.txt +++ /dev/null @@ -1,63 +0,0 @@ -http://develop.github.com/ -com.github.api.v2 -only json. -authenticate: -http://support.github.com/discussions/api -http://support.github.com/discussions/api/28-oauth2-busy-developers-guide -http://github.com/account/applications/59 -http://github.com/account/applications/61 -http://github.com/develop/develop.github.com -githubapitest -http://ajax.googleapis.com/ajax/services/feed/load?&q=http://github.com/apache.atom&v=1.0 - -Commit class is not complete. -X. 1. Network and commit should be separate. -X. 2. Remove commons cli. -X. 3. Add Feed methods using atom. -X. 4. Update rrpo and user methods need to be fixed. -X. 5. Gist and repo visibility. -X. 6. Network Meta is not complete. -X. 7. Fix Network API. -X. 8. Add a Readme. - -Feeds -https://github.com/nabeelmukhtar.private.atom?token=5c74e74601432623f1ee9c26b3d31d81 -http://github.com/apache.atom -http://github.com/nabeelmukhtar/github-java-sdk/commits/master.atom -http://github.com/apache/cassandra/network/feed -http://wiki.github.com/apache/cassandra/wikis.atom -http://feeds.feedburner.com/thechangelog -http://github.com/timeline. - -http://support.github.com/discussions.atom -http://support.github.com/discussions/repos.atom -http://jobs.github.com/positions.atom -http://feeds.feedburner.com/github?format=rss - -Use Google Ajax Feed API to read feeds. - -This library provides a wrapper for GitHub APi v2. Its - -Description -License -Requirements -Key Features -Usage - Typical - Authenticated -More Info (Links to Wiki Pages) - -Wiki -Getting Started -Maven Support -Spring Configuration -OAuth Flow. -Asynchronous API -API Design -Android Configuration - - -Add github-java-sdk to the list of Github libraries. -I have created a Java library for GitHub API and added it to the libaries page. You can pull the changes from http://github.com/nabeelmukhtar/develop.github.com. - -ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg \ No newline at end of file From e05968c4f6f785884b43bc7da034587a70782027 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Sat, 18 Dec 2010 18:25:01 +0500 Subject: [PATCH 35/95] Organization and Teamp API. Just stubs. --- README.md | 1 + .../api/v2/services/GitHubServiceFactory.java | 10 + .../api/v2/services/OrganizationService.java | 322 +++++++++ .../v2/services/constant/GitHubApiUrls.java | 55 ++ .../v2/services/constant/ParameterNames.java | 6 + .../impl/OrganizationServiceImpl.java | 382 ++++++++++ .../constant/GitHubApiUrls.properties | 20 + .../v2/services/OrganizationServiceTest.java | 324 +++++++++ .../github/api/v2/schema/Organization.java | 653 ++++++++++++++++++ 9 files changed, 1773 insertions(+) create mode 100644 core/src/main/java/com/github/api/v2/services/OrganizationService.java create mode 100644 core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java create mode 100644 core/src/test/java/com/github/api/v2/services/OrganizationServiceTest.java create mode 100644 schema/src/main/java/com/github/api/v2/schema/Organization.java diff --git a/README.md b/README.md index adb57c8..2e022e9 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ The library is divided into various services each implementing a specific portio * RepositoryService: Provides methods of the [Repository API](http://develop.github.com/p/repo.html). * CommitService: Provides methods of the [Commit API](http://develop.github.com/p/commits.html). * ObjectService: Provides methods of the [Object API](http://develop.github.com/p/object.html). +* OrganizationService: Provides methods of the [Organization API](http://develop.github.com/p/orgs.html). * FeedService: Provides methods for reading the Atom/RSS feeds. * OAuthService: Provides methods for OAuth 2.0 authentication and authorization. diff --git a/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java b/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java index 886fe51..3b0d47b 100644 --- a/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java +++ b/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java @@ -23,6 +23,7 @@ import com.github.api.v2.services.impl.NetworkServiceImpl; import com.github.api.v2.services.impl.OAuthServiceImpl; import com.github.api.v2.services.impl.ObjectServiceImpl; +import com.github.api.v2.services.impl.OrganizationServiceImpl; import com.github.api.v2.services.impl.RepositoryServiceImpl; import com.github.api.v2.services.impl.UserServiceImpl; @@ -103,6 +104,15 @@ public RepositoryService createRepositoryService() { return new RepositoryServiceImpl(); } + /** + * Creates a new GitHubService object. + * + * @return the repository service + */ + public OrganizationService createOrganizationService() { + return new OrganizationServiceImpl(); + } + /** * Creates a new GitHubService object. * diff --git a/core/src/main/java/com/github/api/v2/services/OrganizationService.java b/core/src/main/java/com/github/api/v2/services/OrganizationService.java new file mode 100644 index 0000000..b722560 --- /dev/null +++ b/core/src/main/java/com/github/api/v2/services/OrganizationService.java @@ -0,0 +1,322 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.util.List; +import java.util.Map; +import java.util.zip.ZipInputStream; + +import com.github.api.v2.schema.Key; +import com.github.api.v2.schema.Language; +import com.github.api.v2.schema.Repository; +import com.github.api.v2.schema.User; +import com.github.api.v2.schema.Repository.Visibility; + +/** + * The Interface RepositoryService. + */ +public interface OrganizationService extends GitHubService { + + /** + * Search repositories. + * + * @param query + * the query + * + * @return the list< repository> + */ + public List searchRepositories(String query); + + /** + * Search repositories. + * + * @param query + * the query + * @param language + * the language + * + * @return the list< repository> + */ + public List searchRepositories(String query, Language language); + + /** + * Search repositories. + * + * @param query + * the query + * @param pageNumber + * the page number + * + * @return the list< repository> + */ + public List searchRepositories(String query, int pageNumber); + + /** + * Search repositories. + * + * @param query + * the query + * @param language + * the language + * @param pageNumber + * the page number + * + * @return the list< repository> + */ + public List searchRepositories(String query, Language language, int pageNumber); + + /** + * Gets the repository. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the repository + */ + public Repository getRepository(String userName, String repositoryName); + + /** + * Update repository. + * + * @param repository + * the repository + */ + public void updateRepository(Repository repository); + + /** + * Gets the repositories. + * + * @param userName + * the user name + * + * @return the repositories + */ + public List getRepositories(String userName); + + /** + * Watch repository. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + */ + public void watchRepository(String userName, String repositoryName); + + /** + * Unwatch repository. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + */ + public void unwatchRepository(String userName, String repositoryName); + + /** + * Fork repository. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the repository + */ + public Repository forkRepository(String userName, String repositoryName); + + /** + * Creates the repository. + * + * @param name + * the name + * @param description + * the description + * @param homePage + * the home page + * @param visibility + * the visibility + */ + public void createRepository(String name, String description, String homePage, Visibility visibility); + + /** + * Delete repository. + * + * @param repositoryName + * the repository name + */ + public void deleteRepository(String repositoryName); + + /** + * Change visibility. + * + * @param repositoryName + * the repository name + * @param visibility + * the visibility + */ + public void changeVisibility(String repositoryName, Visibility visibility); + + /** + * Gets the deploy keys. + * + * @param repositoryName + * the repository name + * + * @return the deploy keys + */ + public List getDeployKeys(String repositoryName); + + /** + * Adds the deploy key. + * + * @param repositoryName + * the repository name + * @param title + * the title + * @param key + * the key + * + * @return the string + */ + public List addDeployKey(String repositoryName, String title, String key); + + /** + * Removes the deploy key. + * + * @param repository + * the repository + * @param id + * the id + */ + public void removeDeployKey(String repository, String id); + + /** + * Gets the collaborators. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the collaborators + */ + public List getCollaborators(String userName, String repositoryName); + + /** + * Adds the collaborator. + * + * @param repositoryName + * the repository name + * @param collaboratorName + * the collaborator name + */ + public void addCollaborator(String repositoryName, String collaboratorName); + + /** + * Removes the collaborator. + * + * @param repositoryName + * the repository name + * @param collaboratorName + * the collaborator name + */ + public void removeCollaborator(String repositoryName, String collaboratorName); + + /** + * Gets the pushable repositories. + * + * @return the pushable repositories + */ + public List getPushableRepositories(); + + /** + * Gets the contributors. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the contributors + */ + public List getContributors(String userName, String repositoryName); + + /** + * Gets the watchers. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the watchers + */ + public List getWatchers(String userName, String repositoryName); + + /** + * Gets the forks. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the forks + */ + public List getForks(String userName, String repositoryName); + + /** + * Gets the language breakdown. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the language breakdown + */ + public Map getLanguageBreakdown(String userName, String repositoryName); + + /** + * Gets the tags. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the tags + */ + public Map getTags(String userName, String repositoryName); + + /** + * Gets the branches. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the branches + */ + public Map getBranches(String userName, String repositoryName); + + public ZipInputStream getRepositoryArchive(String userName, String repositoryName, String branchName); +} diff --git a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java index b269f7a..bb86387 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java +++ b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java @@ -299,6 +299,61 @@ public static interface ObjectApiUrls { public static final String GET_OBJECT_CONTENT_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.objectService.getObjectContent"); } + /** + * The Interface OrganizationApiUrls. + */ + public static interface OrganizationApiUrls { + + /** The Constant GET_ORGANIZATION_URL. */ + public static final String GET_ORGANIZATION_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getOrganization"); + + /** The Constant UPDATE_ORGANIZATION_URL. */ + public static final String UPDATE_ORGANIZATION_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.updateOrganization"); + + /** The Constant GET_ALL_REPOSITORIES_URL. */ + public static final String GET_ALL_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getAllRepositories"); + + /** The Constant GET_PUBLIC_REPOSITORIES_URL. */ + public static final String GET_PUBLIC_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getPublicRepositories"); + + /** The Constant GET_PUBLIC_MEMBERS_URL. */ + public static final String GET_PUBLIC_MEMBERS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getPublicMembers"); + + /** The Constant GET_TEAMS_URL. */ + public static final String GET_TEAMS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getTeams"); + + /** The Constant CREATE_TEAM_URL. */ + public static final String CREATE_TEAM_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.createTeam"); + + /** The Constant GET_TEAM_URL. */ + public static final String GET_TEAM_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getTeam"); + + /** The Constant UPDATE_TEAM_URL. */ + public static final String UPDATE_TEAM_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.updateTeam"); + + /** The Constant DELETE_TEAM_URL. */ + public static final String DELETE_TEAM_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.deleteTeam"); + + /** The Constant GET_TEAM_MEMBERS_URL. */ + public static final String GET_TEAM_MEMBERS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getTeamMembers"); + + /** The Constant ADD_TEAM_MEMBER_URL. */ + public static final String ADD_TEAM_MEMBER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.addTeamMember"); + + /** The Constant REMOVE_TEAM_MEMBER_URL. */ + public static final String REMOVE_TEAM_MEMBER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.removeTeamMember"); + + /** The Constant GET_TEAM_REPOSITORIES_URL. */ + public static final String GET_TEAM_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getTeamRepositories"); + + /** The Constant ADD_TEAM_REPOSITORY_URL. */ + public static final String ADD_TEAM_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.addTeamRepository"); + + /** The Constant REMOVE_TEAM_REPOSITORY_URL. */ + public static final String REMOVE_TEAM_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.removeTeamRepository"); + } + + /** * The Interface ObjectApiUrls. */ diff --git a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java index 72e12ba..3d281a8 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java +++ b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java @@ -155,4 +155,10 @@ public interface ParameterNames { public static final String NUM = "num"; + public static final String USER_REPOSITORY_PAIR = "userRepositoryPair"; + + public static final String ORGANIZATION_NAME = "organizationName"; + + public static final String TEAM_ID = "teamId"; + } diff --git a/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java new file mode 100644 index 0000000..1e7f857 --- /dev/null +++ b/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java @@ -0,0 +1,382 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.impl; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.zip.ZipInputStream; + +import com.github.api.v2.schema.Key; +import com.github.api.v2.schema.Language; +import com.github.api.v2.schema.Repository; +import com.github.api.v2.schema.User; +import com.github.api.v2.schema.Repository.Visibility; +import com.github.api.v2.services.OrganizationService; +import com.github.api.v2.services.constant.GitHubApiUrls; +import com.github.api.v2.services.constant.ParameterNames; +import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; + +/** + * The Class RepositoryServiceImpl. + */ +public class OrganizationServiceImpl extends BaseGitHubService implements + OrganizationService { + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#addCollaborator(java.lang.String, java.lang.String) + */ + @Override + public void addCollaborator(String repositoryName, String collaboratorName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.ADD_COLLABORATOR_URL); + String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.USER_NAME, collaboratorName).buildUrl(); + unmarshall(callApiPost(apiUrl, new HashMap())); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#addDeployKey(java.lang.String, java.lang.String, java.lang.String) + */ + @Override + public List addDeployKey(String repositoryName, String title, String key) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.ADD_DEPLOY_KEY_URL); + String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + Map parameters = new HashMap(); + parameters.put(ParameterNames.TITLE, title); + parameters.put(ParameterNames.KEY, key); + JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); + + return unmarshall(new TypeToken>(){}, json.get("public_keys")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#changeVisibility(java.lang.String, com.github.api.v2.schema.Repository.Visibility) + */ + @Override + public void changeVisibility(String repositoryName, Visibility visibility) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.CHANGE_VISIBILITY_URL); + String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).withFieldEnum(ParameterNames.VISIBILITY, visibility).buildUrl(); + JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); + + unmarshall(new TypeToken(){}, json.get("repository")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#createRepository(java.lang.String, java.lang.String, java.lang.String, com.github.api.v2.schema.Repository.Visibility) + */ + @Override + public void createRepository(String name, String description, + String homePage, Visibility visibility) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.CREATE_REPOSITORY_URL); + String apiUrl = builder.buildUrl(); + Map parameters = new HashMap(); + parameters.put(ParameterNames.NAME, name); + parameters.put(ParameterNames.DESCRIPTION, description); + parameters.put(ParameterNames.HOME_PAGE, homePage); + parameters.put(ParameterNames.PUBLIC, ((visibility == Visibility.PUBLIC)? "1" : "0")); + JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); + + unmarshall(new TypeToken(){}, json.get("repository")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#deleteRepository(java.lang.String) + */ + @Override + public void deleteRepository(String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.DELETE_REPOSITORY_URL); + String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); + if (json.has("delete_token")) { + Map parameters = new HashMap(); + parameters.put(ParameterNames.DELETE_TOKEN, json.get("delete_token").getAsString()); + callApiPost(apiUrl, parameters); + } + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#forkRepository(java.lang.String, java.lang.String) + */ + @Override + public Repository forkRepository(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.FORK_REPOSITORY_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); + return unmarshall(new TypeToken(){}, json.get("repository")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getBranches(java.lang.String, java.lang.String) + */ + @Override + public Map getBranches(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_BRANCHES_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("branches")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getCollaborators(java.lang.String, java.lang.String) + */ + @Override + public List getCollaborators(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_COLLABORATORS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("collaborators")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getContributors(java.lang.String, java.lang.String) + */ + @Override + public List getContributors(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_CONTRIBUTORS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("contributors")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getForks(java.lang.String, java.lang.String) + */ + @Override + public List getForks(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_FORKS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("network")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getDeployKeys(java.lang.String) + */ + @Override + public List getDeployKeys(String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_DEPLOY_KEYS_URL); + String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("public_keys")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getLanguageBreakdown(java.lang.String, java.lang.String) + */ + @Override + public Map getLanguageBreakdown(String userName, + String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_LANGUAGE_BREAKDOWN_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("languages")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getPushableRepositories() + */ + @Override + public List getPushableRepositories() { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_PUSHABLE_REPOSITORIES_URL); + String apiUrl = builder.buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getRepositories(java.lang.String) + */ + @Override + public List getRepositories(String userName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_REPOSITORIES_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getRepository(java.lang.String, java.lang.String) + */ + @Override + public Repository getRepository(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_REPOSITORY_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken(){}, json.get("repository")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getTags(java.lang.String, java.lang.String) + */ + @Override + public Map getTags(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_TAGS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("tags")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getWatchers(java.lang.String, java.lang.String) + */ + @Override + public List getWatchers(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_WATCHERS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("watchers")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#removeCollaborator(java.lang.String, java.lang.String) + */ + @Override + public void removeCollaborator(String repositoryName, + String collaboratorName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.REMOVE_COLLABORATOR_URL); + String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.USER_NAME, collaboratorName).buildUrl(); + unmarshall(callApiPost(apiUrl, new HashMap())); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#removeDeployKey(java.lang.String, java.lang.String) + */ + @Override + public void removeDeployKey(String repositoryName, String id) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.REMOVE_DEPLOY_KEY_URL); + String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + Map parameters = new HashMap(); + parameters.put(ParameterNames.ID, id); + unmarshall(callApiPost(apiUrl, parameters)); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#searchRepositories(java.lang.String) + */ + @Override + public List searchRepositories(String query) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); + String apiUrl = builder.withField(ParameterNames.KEYWORD, query).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#searchRepositories(java.lang.String, com.github.api.v2.schema.Language) + */ + @Override + public List searchRepositories(String query, Language language) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); + String apiUrl = builder.withField(ParameterNames.KEYWORD, query).withParameterEnum(ParameterNames.LANGUAGE, language).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#searchRepositories(java.lang.String, int) + */ + @Override + public List searchRepositories(String query, int pageNumber) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); + String apiUrl = builder.withField(ParameterNames.KEYWORD, query).withParameter(ParameterNames.START_PAGE, String.valueOf(pageNumber)).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#searchRepositories(java.lang.String, com.github.api.v2.schema.Language, int) + */ + @Override + public List searchRepositories(String query, Language language, + int pageNumber) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); + String apiUrl = builder.withField(ParameterNames.KEYWORD, query).withParameterEnum(ParameterNames.LANGUAGE, language).withParameter(ParameterNames.START_PAGE, String.valueOf(pageNumber)).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#unwatchRepository(java.lang.String, java.lang.String) + */ + @Override + public void unwatchRepository(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.UNWATCH_REPOSITORY_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + unmarshall(callApiPost(apiUrl, new HashMap())); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#updateRepository(com.github.api.v2.schema.Repository) + */ + @Override + public void updateRepository(Repository repository) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.UPDATE_REPOSITORY_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, repository.getOwner()).withField(ParameterNames.REPOSITORY_NAME, repository.getName()).buildUrl(); + Map parameters = new HashMap(); + parameters.put("values[" + ParameterNames.DESCRIPTION + "]", repository.getDescription()); + parameters.put("values[" + ParameterNames.HOME_PAGE + "]", repository.getHomepage()); + parameters.put("values[" + ParameterNames.HAS_WIKI + "]", String.valueOf(repository.isHasWiki())); + parameters.put("values[" + ParameterNames.HAS_ISSUES + "]", String.valueOf(repository.isHasIssues())); + parameters.put("values[" + ParameterNames.HAS_DOWNLOADS + "]", String.valueOf(repository.isHasDownloads())); + JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); + + unmarshall(new TypeToken(){}, json.get("repository")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#watchRepository(java.lang.String, java.lang.String) + */ + @Override + public void watchRepository(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.WATCH_REPOSITORY_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + unmarshall(callApiPost(apiUrl, new HashMap())); + } + + @Override + public ZipInputStream getRepositoryArchive(String userName, String repositoryName, String branchName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_REPOSITORY_ARCHIVE_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, branchName).buildUrl(); + return new ZipInputStream(callApiGet(apiUrl)); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.impl.BaseGitHubService#getGsonBuilder() + */ + protected GsonBuilder getGsonBuilder() { + GsonBuilder gson = super.getGsonBuilder(); + gson.setDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + return gson; + } +} diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index 82106d5..d348e20 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -23,6 +23,8 @@ com.github.api.v2.services.userService.removeKey=http://github.com/api/{version} com.github.api.v2.services.userService.getEmails=http://github.com/api/{version}/{format}/user/emails com.github.api.v2.services.userService.addEmail=http://github.com/api/{version}/{format}/user/email/add com.github.api.v2.services.userService.removeEmail=http://github.com/api/{version}/{format}/user/email/remove +com.github.api.v2.services.userService.getUserOrganizations=http://github.com/api/{version}/{format}/user/show/{userName}/organizations + # Issue API com.github.api.v2.services.issueService.searchIssues=http://github.com/api/{version}/{format}/issues/search/{userName}/{repositoryName}/{state}/{keyword} @@ -85,6 +87,24 @@ com.github.api.v2.services.objectService.getBlob=http://github.com/api/{version} com.github.api.v2.services.objectService.getBlobs=http://github.com/api/{version}/{format}/blob/full/{userName}/{repositoryName}/{sha} com.github.api.v2.services.objectService.getObjectContent=http://github.com/api/{version}/{format}/blob/show/{userName}/{repositoryName}/{sha} +# Organization API +com.github.api.v2.services.organizationService.getOrganization=http://github.com/api/{version}/{format}/organizations/{organizationName} +com.github.api.v2.services.organizationService.updateOrganization=http://github.com/api/{version}/{format}/organizations/{organizationName} +com.github.api.v2.services.organizationService.getAllRepositories=http://github.com/api/{version}/{format}/organizations/repositories +com.github.api.v2.services.organizationService.getPublicRepositories=http://github.com/api/{version}/{format}/organizations/{organizationName}/public_repositories +com.github.api.v2.services.organizationService.getPublicMembers=http://github.com/api/{version}/{format}/organizations/{organizationName}/public_members +com.github.api.v2.services.organizationService.getTeams=http://github.com/api/{version}/{format}/organizations/{organizationName}/teams +com.github.api.v2.services.organizationService.createTeam=http://github.com/api/{version}/{format}/organizations/{organizationName}/teams +com.github.api.v2.services.organizationService.getTeam=http://github.com/api/{version}/{format}/teams/{teamId} +com.github.api.v2.services.organizationService.updateTeam=http://github.com/api/{version}/{format}/teams/{teamId} +com.github.api.v2.services.organizationService.deleteTeam=http://github.com/api/{version}/{format}/teams/{teamId} +com.github.api.v2.services.organizationService.getTeamMembers=http://github.com/api/{version}/{format}/teams/{teamId}/members +com.github.api.v2.services.organizationService.addTeamMember=http://github.com/api/{version}/{format}/teams/{teamId}/members +com.github.api.v2.services.organizationService.removeTeamMember=http://github.com/api/{version}/{format}/teams/{teamId}/members?name={userName} +com.github.api.v2.services.organizationService.getTeamRepositories=http://github.com/api/{version}/{format}/teams/{teamId}/repositories +com.github.api.v2.services.organizationService.addTeamRepository=http://github.com/api/{version}/{format}/teams/{teamId}/repositories?name={userName} +com.github.api.v2.services.organizationService.removeTeamRepository=http://github.com/api/{version}/{format}/teams/{teamId}/repositories?name={userRepositoryPair} + # Feed com.github.api.v2.services.feedService.getPublicUserFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg com.github.api.v2.services.feedService.getPrivateUserFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg diff --git a/core/src/test/java/com/github/api/v2/services/OrganizationServiceTest.java b/core/src/test/java/com/github/api/v2/services/OrganizationServiceTest.java new file mode 100644 index 0000000..074eff6 --- /dev/null +++ b/core/src/test/java/com/github/api/v2/services/OrganizationServiceTest.java @@ -0,0 +1,324 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.util.List; +import java.util.Map; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.api.v2.schema.Key; +import com.github.api.v2.schema.Language; +import com.github.api.v2.schema.Repository; +import com.github.api.v2.schema.User; +import com.github.api.v2.services.constant.TestConstants; + +/** + * The Class RepositoryServiceTest. + */ +public class OrganizationServiceTest extends BaseGitHubServiceTest { + + /** The service. */ + private OrganizationService service; + + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() + */ + @Before + public void setUp() throws Exception { + super.setUp(); + service = factory.createOrganizationService(); + service.setAuthentication(authentication); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() + */ + @After + public void tearDown() throws Exception { + super.tearDown(); + service = null; + } + + /** + * Test create repository. + */ + @Test + public void testCreateRepository() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository Description."), TestConstants.TEST_REPOSITORY_DESC); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository Homepage."), TestConstants.TEST_REPOSITORY_PAGE); + service.createRepository(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_REPOSITORY_DESC, TestConstants.TEST_REPOSITORY_PAGE, Repository.Visibility.PUBLIC); + } + + + /** + * Test add collaborator. + */ + @Test + public void testAddCollaborator() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + service.addCollaborator(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_USER_NAME); + } + + /** + * Test add key. + */ + @Test + public void testAddKey() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Key Title."), TestConstants.TEST_KEY_TITLE); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Key."), TestConstants.TEST_KEY); + service.addDeployKey(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_KEY_TITLE, TestConstants.TEST_KEY); + } + + /** + * Test change visibility. + */ + @Test + public void testChangeVisibility() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + service.changeVisibility(TestConstants.TEST_REPOSITORY_NAME, Repository.Visibility.PRIVATE); + } + + /** + * Test fork repository. + */ + @Test + public void testForkRepository() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + service.forkRepository(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + } + + /** + * Test get branches. + */ + @Test + public void testGetBranches() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + Map branches = service.getBranches(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertFalse("Branches cannot be null or empty.", branches == null || branches.isEmpty()); + } + + /** + * Test get collaborators. + */ + @Test + public void testGetCollaborators() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + List collaborators = service.getCollaborators(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty("Collaborators cannot be null or empty.", collaborators); + } + + /** + * Test get contributors. + */ + @Test + public void testGetContributors() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + List contributors = service.getContributors(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty("Contributors cannot be null or empty.", contributors); + } + + /** + * Test get forks. + */ + @Test + public void testGetForks() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + List forks = service.getForks(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty("Forks cannot be null or empty.", forks); + } + + /** + * Test get keys. + */ + @Test + public void testGetKeys() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + List keys = service.getDeployKeys(TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty("Keys cannot be null or empty.", keys); + } + + /** + * Test get language breakdown. + */ + @Test + public void testGetLanguageBreakdown() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + Map languageBreakdown = service.getLanguageBreakdown(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertFalse("Language breakdown vannot be null or empty.", (languageBreakdown == null || languageBreakdown.isEmpty())); + } + + /** + * Test get pushable repositories. + */ + @Test + public void testGetPushableRepositories() { + List repositories = service.getPushableRepositories(); + assertNotNullOrEmpty("Pushable repositories cannot be null or empty.", repositories); + } + + /** + * Test get repositories. + */ + @Test + public void testGetRepositories() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + List repositories = service.getRepositories(TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); + } + + /** + * Test get repository. + */ + @Test + public void testGetRepository() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + Repository repository = service.getRepository(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertNotNull("Repository cannot be null.", repository); + } + + /** + * Test get tags. + */ + @Test + public void testGetTags() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + Map tags = service.getTags(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertFalse("Tags cannot be null or empty.", tags == null || tags.isEmpty()); + } + + /** + * Test get watchers. + */ + @Test + public void testGetWatchers() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + List watchers = service.getWatchers(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty("Watchers cannot be null or empty.", watchers); + } + + /** + * Test remove collaborator. + */ + @Test + public void testRemoveCollaborator() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + service.removeCollaborator(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_USER_NAME); + } + + /** + * Test remove key. + */ + @Test + public void testRemoveKey() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Key Id."), TestConstants.TEST_KEY_ID); + service.removeDeployKey(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_KEY_ID); + } + + /** + * Test search repositories string. + */ + @Test + public void testSearchRepositoriesString() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); + List repositories = service.searchRepositories(TestConstants.TEST_QUERY); + assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); + } + + /** + * Test search repositories string string. + */ + @Test + public void testSearchRepositoriesStringString() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); + List repositories = service.searchRepositories(TestConstants.TEST_QUERY, Language.Java); + assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); + } + + /** + * Test search repositories string int. + */ + @Test + public void testSearchRepositoriesStringInt() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); + List repositories = service.searchRepositories(TestConstants.TEST_QUERY, 1); + assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); + } + + /** + * Test search repositories string string int. + */ + @Test + public void testSearchRepositoriesStringStringInt() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); + List repositories = service.searchRepositories(TestConstants.TEST_QUERY, Language.Java, 1); + assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); + } + + /** + * Test unwatch repository. + */ + @Test + public void testUnwatchRepository() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + service.unwatchRepository(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + } + + /** + * Test update repository. + */ + @Test + public void testUpdateRepository() { +// service.updateRepository(repository); + } + + /** + * Test watch repository. + */ + @Test + public void testWatchRepository() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + service.watchRepository(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + } + + /** + * Test delete repository. + */ + @Test + public void testDeleteRepository() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); +// service.deleteRepository(TestConstants.TEST_REPOSITORY_NAME); + } +} diff --git a/schema/src/main/java/com/github/api/v2/schema/Organization.java b/schema/src/main/java/com/github/api/v2/schema/Organization.java new file mode 100644 index 0000000..b70d93f --- /dev/null +++ b/schema/src/main/java/com/github/api/v2/schema/Organization.java @@ -0,0 +1,653 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * The Class Repository. + */ +public class Organization extends SchemaEntity { + + /** + * The Enum Visibility. + */ + public enum Visibility implements ValueEnum { + + /** The PUBLIC. */ + PUBLIC("public"), + /** The PRIVATE. */ + PRIVATE("private"); + + /** The Constant stringToEnum. */ + private static final Map stringToEnum = new HashMap(); + + static { // Initialize map from constant name to enum constant + for (Visibility op : values()) { + stringToEnum.put(op.value(), op); + } + } + + /** The value. */ + private final String value; + + /** + * Instantiates a new visibility. + * + * @param value + * the value + */ + Visibility(String value) { + this.value = value; + } + + /* (non-Javadoc) + * @see com.github.api.v2.schema.ValueEnum#value() + */ + @Override + public String value() { + return value; + } + + /** + * From value. + * + * @param value + * the value + * + * @return the visibility + */ + public static Visibility fromValue(String value) { + return stringToEnum.get(value); + } + } + + /** The Constant MASTER. */ + public static final String MASTER = "master"; + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** The watchers. */ + private int watchers; + + /** The owner. */ + private String owner; + + /** The name. */ + private String name; + + /** The description. */ + private String description; + + /** The visibility. */ + private Visibility visibility; + + /** The url. */ + private String url; + + /** The open issues. */ + private int openIssues; + + /** The fork. */ + private boolean fork; + + /** The homepage. */ + private String homepage; + + /** The forks. */ + private int forks; + + /** The score. */ + private double score; + + /** The actions. */ + private int actions; + + /** The size. */ + private long size; + + /** The language. */ + private Language language; + + /** The followers. */ + private int followers; + + /** The username. */ + private String username; + + /** The type. */ + private String type; + + /** The id. */ + private String id; + + /** The pushed. */ + private Date pushed; + + /** The created. */ + private Date created; + + /** The source. */ + private String source; + + /** The parent. */ + private String parent; + + /** The has wiki. */ + private boolean hasWiki; + + /** The has issues. */ + private boolean hasIssues; + + /** The has downloads. */ + private boolean hasDownloads; + + /** + * Gets the watchers. + * + * @return the watchers + */ + public int getWatchers() { + return watchers; + } + + /** + * Sets the watchers. + * + * @param watchers + * the new watchers + */ + public void setWatchers(int watchers) { + this.watchers = watchers; + } + + /** + * Gets the owner. + * + * @return the owner + */ + public String getOwner() { + return owner; + } + + /** + * Sets the owner. + * + * @param owner + * the new owner + */ + public void setOwner(String owner) { + this.owner = owner; + } + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Sets the name. + * + * @param name + * the new name + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the description. + * + * @return the description + */ + public String getDescription() { + return description; + } + + /** + * Sets the description. + * + * @param description + * the new description + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * Gets the visibility. + * + * @return the visibility + */ + public Visibility getVisibility() { + return visibility; + } + + /** + * Sets the visibility. + * + * @param visibility + * the new visibility + */ + public void setVisibility(Visibility visibility) { + this.visibility = visibility; + } + + /** + * Gets the url. + * + * @return the url + */ + public String getUrl() { + return url; + } + + /** + * Sets the url. + * + * @param url + * the new url + */ + public void setUrl(String url) { + this.url = url; + } + + /** + * Gets the open issues. + * + * @return the open issues + */ + public int getOpenIssues() { + return openIssues; + } + + /** + * Sets the open issues. + * + * @param openIssues + * the new open issues + */ + public void setOpenIssues(int openIssues) { + this.openIssues = openIssues; + } + + /** + * Checks if is fork. + * + * @return true, if is fork + */ + public boolean isFork() { + return fork; + } + + /** + * Sets the fork. + * + * @param fork + * the new fork + */ + public void setFork(boolean fork) { + this.fork = fork; + } + + /** + * Gets the homepage. + * + * @return the homepage + */ + public String getHomepage() { + return homepage; + } + + /** + * Sets the homepage. + * + * @param homepage + * the new homepage + */ + public void setHomepage(String homepage) { + this.homepage = homepage; + } + + /** + * Gets the forks. + * + * @return the forks + */ + public int getForks() { + return forks; + } + + /** + * Sets the forks. + * + * @param forks + * the new forks + */ + public void setForks(int forks) { + this.forks = forks; + } + + /** + * Gets the score. + * + * @return the score + */ + public double getScore() { + return score; + } + + /** + * Sets the score. + * + * @param score + * the new score + */ + public void setScore(double score) { + this.score = score; + } + + /** + * Gets the actions. + * + * @return the actions + */ + public int getActions() { + return actions; + } + + /** + * Sets the actions. + * + * @param actions + * the new actions + */ + public void setActions(int actions) { + this.actions = actions; + } + + /** + * Gets the size. + * + * @return the size + */ + public long getSize() { + return size; + } + + /** + * Sets the size. + * + * @param size + * the new size + */ + public void setSize(long size) { + this.size = size; + } + + /** + * Gets the language. + * + * @return the language + */ + public Language getLanguage() { + return language; + } + + /** + * Sets the language. + * + * @param language + * the new language + */ + public void setLanguage(Language language) { + this.language = language; + } + + /** + * Gets the followers. + * + * @return the followers + */ + public int getFollowers() { + return followers; + } + + /** + * Sets the followers. + * + * @param followers + * the new followers + */ + public void setFollowers(int followers) { + this.followers = followers; + } + + /** + * Gets the username. + * + * @return the username + */ + public String getUsername() { + return username; + } + + /** + * Sets the username. + * + * @param username + * the new username + */ + public void setUsername(String username) { + this.username = username; + } + + /** + * Gets the type. + * + * @return the type + */ + public String getType() { + return type; + } + + /** + * Sets the type. + * + * @param type + * the new type + */ + public void setType(String type) { + this.type = type; + } + + /** + * Gets the id. + * + * @return the id + */ + public String getId() { + return id; + } + + /** + * Sets the id. + * + * @param id + * the new id + */ + public void setId(String id) { + this.id = id; + } + + /** + * Gets the pushed. + * + * @return the pushed + */ + public Date getPushed() { + return pushed; + } + + /** + * Sets the pushed. + * + * @param pushed + * the new pushed + */ + public void setPushed(Date pushed) { + this.pushed = pushed; + } + + /** + * Gets the created. + * + * @return the created + */ + public Date getCreated() { + return created; + } + + /** + * Sets the created. + * + * @param created + * the new created + */ + public void setCreated(Date created) { + this.created = created; + } + + /** + * Gets the source. + * + * @return the source + */ + public String getSource() { + return source; + } + + /** + * Sets the source. + * + * @param source + * the new source + */ + public void setSource(String source) { + this.source = source; + } + + /** + * Gets the parent. + * + * @return the parent + */ + public String getParent() { + return parent; + } + + /** + * Sets the parent. + * + * @param parent + * the new parent + */ + public void setParent(String parent) { + this.parent = parent; + } + + /** + * Checks if is checks for wiki. + * + * @return true, if is checks for wiki + */ + public boolean isHasWiki() { + return hasWiki; + } + + /** + * Sets the checks for wiki. + * + * @param hasWiki + * the new checks for wiki + */ + public void setHasWiki(boolean hasWiki) { + this.hasWiki = hasWiki; + } + + /** + * Checks if is checks for issues. + * + * @return true, if is checks for issues + */ + public boolean isHasIssues() { + return hasIssues; + } + + /** + * Sets the checks for issues. + * + * @param hasIssues + * the new checks for issues + */ + public void setHasIssues(boolean hasIssues) { + this.hasIssues = hasIssues; + } + + /** + * Checks if is checks for downloads. + * + * @return true, if is checks for downloads + */ + public boolean isHasDownloads() { + return hasDownloads; + } + + /** + * Sets the checks for downloads. + * + * @param hasDownloads + * the new checks for downloads + */ + public void setHasDownloads(boolean hasDownloads) { + this.hasDownloads = hasDownloads; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Repository [actions=" + actions + ", created=" + created + + ", description=" + description + ", followers=" + followers + + ", fork=" + fork + ", forks=" + forks + ", hasDownloads=" + + hasDownloads + ", hasIssues=" + hasIssues + ", hasWiki=" + + hasWiki + ", homepage=" + homepage + ", id=" + id + + ", language=" + language + ", name=" + name + ", openIssues=" + + openIssues + ", owner=" + owner + ", parent=" + parent + + ", pushed=" + pushed + ", score=" + score + ", size=" + size + + ", source=" + source + ", type=" + type + ", url=" + url + + ", username=" + username + ", visibiity=" + visibility + + ", watchers=" + watchers + "]"; + } +} From e30d4dba438a58d625b740c0cf388bb8efacf02f Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Sat, 18 Dec 2010 18:25:01 +0500 Subject: [PATCH 36/95] Organization and Team API. Just stubs. --- README.md | 1 + .../api/v2/services/GitHubServiceFactory.java | 10 + .../api/v2/services/OrganizationService.java | 322 +++++++++ .../v2/services/constant/GitHubApiUrls.java | 55 ++ .../v2/services/constant/ParameterNames.java | 6 + .../impl/OrganizationServiceImpl.java | 382 ++++++++++ .../constant/GitHubApiUrls.properties | 20 + .../v2/services/OrganizationServiceTest.java | 324 +++++++++ .../github/api/v2/schema/Organization.java | 653 ++++++++++++++++++ .../java/com/github/api/v2/schema/Team.java | 99 +++ 10 files changed, 1872 insertions(+) create mode 100644 core/src/main/java/com/github/api/v2/services/OrganizationService.java create mode 100644 core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java create mode 100644 core/src/test/java/com/github/api/v2/services/OrganizationServiceTest.java create mode 100644 schema/src/main/java/com/github/api/v2/schema/Organization.java create mode 100644 schema/src/main/java/com/github/api/v2/schema/Team.java diff --git a/README.md b/README.md index adb57c8..2e022e9 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ The library is divided into various services each implementing a specific portio * RepositoryService: Provides methods of the [Repository API](http://develop.github.com/p/repo.html). * CommitService: Provides methods of the [Commit API](http://develop.github.com/p/commits.html). * ObjectService: Provides methods of the [Object API](http://develop.github.com/p/object.html). +* OrganizationService: Provides methods of the [Organization API](http://develop.github.com/p/orgs.html). * FeedService: Provides methods for reading the Atom/RSS feeds. * OAuthService: Provides methods for OAuth 2.0 authentication and authorization. diff --git a/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java b/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java index 886fe51..3b0d47b 100644 --- a/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java +++ b/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java @@ -23,6 +23,7 @@ import com.github.api.v2.services.impl.NetworkServiceImpl; import com.github.api.v2.services.impl.OAuthServiceImpl; import com.github.api.v2.services.impl.ObjectServiceImpl; +import com.github.api.v2.services.impl.OrganizationServiceImpl; import com.github.api.v2.services.impl.RepositoryServiceImpl; import com.github.api.v2.services.impl.UserServiceImpl; @@ -103,6 +104,15 @@ public RepositoryService createRepositoryService() { return new RepositoryServiceImpl(); } + /** + * Creates a new GitHubService object. + * + * @return the repository service + */ + public OrganizationService createOrganizationService() { + return new OrganizationServiceImpl(); + } + /** * Creates a new GitHubService object. * diff --git a/core/src/main/java/com/github/api/v2/services/OrganizationService.java b/core/src/main/java/com/github/api/v2/services/OrganizationService.java new file mode 100644 index 0000000..b722560 --- /dev/null +++ b/core/src/main/java/com/github/api/v2/services/OrganizationService.java @@ -0,0 +1,322 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.util.List; +import java.util.Map; +import java.util.zip.ZipInputStream; + +import com.github.api.v2.schema.Key; +import com.github.api.v2.schema.Language; +import com.github.api.v2.schema.Repository; +import com.github.api.v2.schema.User; +import com.github.api.v2.schema.Repository.Visibility; + +/** + * The Interface RepositoryService. + */ +public interface OrganizationService extends GitHubService { + + /** + * Search repositories. + * + * @param query + * the query + * + * @return the list< repository> + */ + public List searchRepositories(String query); + + /** + * Search repositories. + * + * @param query + * the query + * @param language + * the language + * + * @return the list< repository> + */ + public List searchRepositories(String query, Language language); + + /** + * Search repositories. + * + * @param query + * the query + * @param pageNumber + * the page number + * + * @return the list< repository> + */ + public List searchRepositories(String query, int pageNumber); + + /** + * Search repositories. + * + * @param query + * the query + * @param language + * the language + * @param pageNumber + * the page number + * + * @return the list< repository> + */ + public List searchRepositories(String query, Language language, int pageNumber); + + /** + * Gets the repository. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the repository + */ + public Repository getRepository(String userName, String repositoryName); + + /** + * Update repository. + * + * @param repository + * the repository + */ + public void updateRepository(Repository repository); + + /** + * Gets the repositories. + * + * @param userName + * the user name + * + * @return the repositories + */ + public List getRepositories(String userName); + + /** + * Watch repository. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + */ + public void watchRepository(String userName, String repositoryName); + + /** + * Unwatch repository. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + */ + public void unwatchRepository(String userName, String repositoryName); + + /** + * Fork repository. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the repository + */ + public Repository forkRepository(String userName, String repositoryName); + + /** + * Creates the repository. + * + * @param name + * the name + * @param description + * the description + * @param homePage + * the home page + * @param visibility + * the visibility + */ + public void createRepository(String name, String description, String homePage, Visibility visibility); + + /** + * Delete repository. + * + * @param repositoryName + * the repository name + */ + public void deleteRepository(String repositoryName); + + /** + * Change visibility. + * + * @param repositoryName + * the repository name + * @param visibility + * the visibility + */ + public void changeVisibility(String repositoryName, Visibility visibility); + + /** + * Gets the deploy keys. + * + * @param repositoryName + * the repository name + * + * @return the deploy keys + */ + public List getDeployKeys(String repositoryName); + + /** + * Adds the deploy key. + * + * @param repositoryName + * the repository name + * @param title + * the title + * @param key + * the key + * + * @return the string + */ + public List addDeployKey(String repositoryName, String title, String key); + + /** + * Removes the deploy key. + * + * @param repository + * the repository + * @param id + * the id + */ + public void removeDeployKey(String repository, String id); + + /** + * Gets the collaborators. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the collaborators + */ + public List getCollaborators(String userName, String repositoryName); + + /** + * Adds the collaborator. + * + * @param repositoryName + * the repository name + * @param collaboratorName + * the collaborator name + */ + public void addCollaborator(String repositoryName, String collaboratorName); + + /** + * Removes the collaborator. + * + * @param repositoryName + * the repository name + * @param collaboratorName + * the collaborator name + */ + public void removeCollaborator(String repositoryName, String collaboratorName); + + /** + * Gets the pushable repositories. + * + * @return the pushable repositories + */ + public List getPushableRepositories(); + + /** + * Gets the contributors. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the contributors + */ + public List getContributors(String userName, String repositoryName); + + /** + * Gets the watchers. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the watchers + */ + public List getWatchers(String userName, String repositoryName); + + /** + * Gets the forks. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the forks + */ + public List getForks(String userName, String repositoryName); + + /** + * Gets the language breakdown. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the language breakdown + */ + public Map getLanguageBreakdown(String userName, String repositoryName); + + /** + * Gets the tags. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the tags + */ + public Map getTags(String userName, String repositoryName); + + /** + * Gets the branches. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the branches + */ + public Map getBranches(String userName, String repositoryName); + + public ZipInputStream getRepositoryArchive(String userName, String repositoryName, String branchName); +} diff --git a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java index b269f7a..bb86387 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java +++ b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java @@ -299,6 +299,61 @@ public static interface ObjectApiUrls { public static final String GET_OBJECT_CONTENT_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.objectService.getObjectContent"); } + /** + * The Interface OrganizationApiUrls. + */ + public static interface OrganizationApiUrls { + + /** The Constant GET_ORGANIZATION_URL. */ + public static final String GET_ORGANIZATION_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getOrganization"); + + /** The Constant UPDATE_ORGANIZATION_URL. */ + public static final String UPDATE_ORGANIZATION_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.updateOrganization"); + + /** The Constant GET_ALL_REPOSITORIES_URL. */ + public static final String GET_ALL_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getAllRepositories"); + + /** The Constant GET_PUBLIC_REPOSITORIES_URL. */ + public static final String GET_PUBLIC_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getPublicRepositories"); + + /** The Constant GET_PUBLIC_MEMBERS_URL. */ + public static final String GET_PUBLIC_MEMBERS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getPublicMembers"); + + /** The Constant GET_TEAMS_URL. */ + public static final String GET_TEAMS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getTeams"); + + /** The Constant CREATE_TEAM_URL. */ + public static final String CREATE_TEAM_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.createTeam"); + + /** The Constant GET_TEAM_URL. */ + public static final String GET_TEAM_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getTeam"); + + /** The Constant UPDATE_TEAM_URL. */ + public static final String UPDATE_TEAM_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.updateTeam"); + + /** The Constant DELETE_TEAM_URL. */ + public static final String DELETE_TEAM_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.deleteTeam"); + + /** The Constant GET_TEAM_MEMBERS_URL. */ + public static final String GET_TEAM_MEMBERS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getTeamMembers"); + + /** The Constant ADD_TEAM_MEMBER_URL. */ + public static final String ADD_TEAM_MEMBER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.addTeamMember"); + + /** The Constant REMOVE_TEAM_MEMBER_URL. */ + public static final String REMOVE_TEAM_MEMBER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.removeTeamMember"); + + /** The Constant GET_TEAM_REPOSITORIES_URL. */ + public static final String GET_TEAM_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getTeamRepositories"); + + /** The Constant ADD_TEAM_REPOSITORY_URL. */ + public static final String ADD_TEAM_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.addTeamRepository"); + + /** The Constant REMOVE_TEAM_REPOSITORY_URL. */ + public static final String REMOVE_TEAM_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.removeTeamRepository"); + } + + /** * The Interface ObjectApiUrls. */ diff --git a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java index 72e12ba..3d281a8 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java +++ b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java @@ -155,4 +155,10 @@ public interface ParameterNames { public static final String NUM = "num"; + public static final String USER_REPOSITORY_PAIR = "userRepositoryPair"; + + public static final String ORGANIZATION_NAME = "organizationName"; + + public static final String TEAM_ID = "teamId"; + } diff --git a/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java new file mode 100644 index 0000000..1e7f857 --- /dev/null +++ b/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java @@ -0,0 +1,382 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.impl; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.zip.ZipInputStream; + +import com.github.api.v2.schema.Key; +import com.github.api.v2.schema.Language; +import com.github.api.v2.schema.Repository; +import com.github.api.v2.schema.User; +import com.github.api.v2.schema.Repository.Visibility; +import com.github.api.v2.services.OrganizationService; +import com.github.api.v2.services.constant.GitHubApiUrls; +import com.github.api.v2.services.constant.ParameterNames; +import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; + +/** + * The Class RepositoryServiceImpl. + */ +public class OrganizationServiceImpl extends BaseGitHubService implements + OrganizationService { + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#addCollaborator(java.lang.String, java.lang.String) + */ + @Override + public void addCollaborator(String repositoryName, String collaboratorName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.ADD_COLLABORATOR_URL); + String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.USER_NAME, collaboratorName).buildUrl(); + unmarshall(callApiPost(apiUrl, new HashMap())); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#addDeployKey(java.lang.String, java.lang.String, java.lang.String) + */ + @Override + public List addDeployKey(String repositoryName, String title, String key) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.ADD_DEPLOY_KEY_URL); + String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + Map parameters = new HashMap(); + parameters.put(ParameterNames.TITLE, title); + parameters.put(ParameterNames.KEY, key); + JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); + + return unmarshall(new TypeToken>(){}, json.get("public_keys")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#changeVisibility(java.lang.String, com.github.api.v2.schema.Repository.Visibility) + */ + @Override + public void changeVisibility(String repositoryName, Visibility visibility) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.CHANGE_VISIBILITY_URL); + String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).withFieldEnum(ParameterNames.VISIBILITY, visibility).buildUrl(); + JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); + + unmarshall(new TypeToken(){}, json.get("repository")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#createRepository(java.lang.String, java.lang.String, java.lang.String, com.github.api.v2.schema.Repository.Visibility) + */ + @Override + public void createRepository(String name, String description, + String homePage, Visibility visibility) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.CREATE_REPOSITORY_URL); + String apiUrl = builder.buildUrl(); + Map parameters = new HashMap(); + parameters.put(ParameterNames.NAME, name); + parameters.put(ParameterNames.DESCRIPTION, description); + parameters.put(ParameterNames.HOME_PAGE, homePage); + parameters.put(ParameterNames.PUBLIC, ((visibility == Visibility.PUBLIC)? "1" : "0")); + JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); + + unmarshall(new TypeToken(){}, json.get("repository")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#deleteRepository(java.lang.String) + */ + @Override + public void deleteRepository(String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.DELETE_REPOSITORY_URL); + String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); + if (json.has("delete_token")) { + Map parameters = new HashMap(); + parameters.put(ParameterNames.DELETE_TOKEN, json.get("delete_token").getAsString()); + callApiPost(apiUrl, parameters); + } + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#forkRepository(java.lang.String, java.lang.String) + */ + @Override + public Repository forkRepository(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.FORK_REPOSITORY_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); + return unmarshall(new TypeToken(){}, json.get("repository")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getBranches(java.lang.String, java.lang.String) + */ + @Override + public Map getBranches(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_BRANCHES_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("branches")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getCollaborators(java.lang.String, java.lang.String) + */ + @Override + public List getCollaborators(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_COLLABORATORS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("collaborators")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getContributors(java.lang.String, java.lang.String) + */ + @Override + public List getContributors(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_CONTRIBUTORS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("contributors")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getForks(java.lang.String, java.lang.String) + */ + @Override + public List getForks(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_FORKS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("network")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getDeployKeys(java.lang.String) + */ + @Override + public List getDeployKeys(String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_DEPLOY_KEYS_URL); + String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("public_keys")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getLanguageBreakdown(java.lang.String, java.lang.String) + */ + @Override + public Map getLanguageBreakdown(String userName, + String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_LANGUAGE_BREAKDOWN_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("languages")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getPushableRepositories() + */ + @Override + public List getPushableRepositories() { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_PUSHABLE_REPOSITORIES_URL); + String apiUrl = builder.buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getRepositories(java.lang.String) + */ + @Override + public List getRepositories(String userName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_REPOSITORIES_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getRepository(java.lang.String, java.lang.String) + */ + @Override + public Repository getRepository(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_REPOSITORY_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken(){}, json.get("repository")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getTags(java.lang.String, java.lang.String) + */ + @Override + public Map getTags(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_TAGS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("tags")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getWatchers(java.lang.String, java.lang.String) + */ + @Override + public List getWatchers(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_WATCHERS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("watchers")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#removeCollaborator(java.lang.String, java.lang.String) + */ + @Override + public void removeCollaborator(String repositoryName, + String collaboratorName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.REMOVE_COLLABORATOR_URL); + String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.USER_NAME, collaboratorName).buildUrl(); + unmarshall(callApiPost(apiUrl, new HashMap())); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#removeDeployKey(java.lang.String, java.lang.String) + */ + @Override + public void removeDeployKey(String repositoryName, String id) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.REMOVE_DEPLOY_KEY_URL); + String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + Map parameters = new HashMap(); + parameters.put(ParameterNames.ID, id); + unmarshall(callApiPost(apiUrl, parameters)); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#searchRepositories(java.lang.String) + */ + @Override + public List searchRepositories(String query) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); + String apiUrl = builder.withField(ParameterNames.KEYWORD, query).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#searchRepositories(java.lang.String, com.github.api.v2.schema.Language) + */ + @Override + public List searchRepositories(String query, Language language) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); + String apiUrl = builder.withField(ParameterNames.KEYWORD, query).withParameterEnum(ParameterNames.LANGUAGE, language).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#searchRepositories(java.lang.String, int) + */ + @Override + public List searchRepositories(String query, int pageNumber) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); + String apiUrl = builder.withField(ParameterNames.KEYWORD, query).withParameter(ParameterNames.START_PAGE, String.valueOf(pageNumber)).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#searchRepositories(java.lang.String, com.github.api.v2.schema.Language, int) + */ + @Override + public List searchRepositories(String query, Language language, + int pageNumber) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); + String apiUrl = builder.withField(ParameterNames.KEYWORD, query).withParameterEnum(ParameterNames.LANGUAGE, language).withParameter(ParameterNames.START_PAGE, String.valueOf(pageNumber)).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#unwatchRepository(java.lang.String, java.lang.String) + */ + @Override + public void unwatchRepository(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.UNWATCH_REPOSITORY_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + unmarshall(callApiPost(apiUrl, new HashMap())); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#updateRepository(com.github.api.v2.schema.Repository) + */ + @Override + public void updateRepository(Repository repository) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.UPDATE_REPOSITORY_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, repository.getOwner()).withField(ParameterNames.REPOSITORY_NAME, repository.getName()).buildUrl(); + Map parameters = new HashMap(); + parameters.put("values[" + ParameterNames.DESCRIPTION + "]", repository.getDescription()); + parameters.put("values[" + ParameterNames.HOME_PAGE + "]", repository.getHomepage()); + parameters.put("values[" + ParameterNames.HAS_WIKI + "]", String.valueOf(repository.isHasWiki())); + parameters.put("values[" + ParameterNames.HAS_ISSUES + "]", String.valueOf(repository.isHasIssues())); + parameters.put("values[" + ParameterNames.HAS_DOWNLOADS + "]", String.valueOf(repository.isHasDownloads())); + JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); + + unmarshall(new TypeToken(){}, json.get("repository")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#watchRepository(java.lang.String, java.lang.String) + */ + @Override + public void watchRepository(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.WATCH_REPOSITORY_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + unmarshall(callApiPost(apiUrl, new HashMap())); + } + + @Override + public ZipInputStream getRepositoryArchive(String userName, String repositoryName, String branchName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_REPOSITORY_ARCHIVE_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, branchName).buildUrl(); + return new ZipInputStream(callApiGet(apiUrl)); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.impl.BaseGitHubService#getGsonBuilder() + */ + protected GsonBuilder getGsonBuilder() { + GsonBuilder gson = super.getGsonBuilder(); + gson.setDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + return gson; + } +} diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index 82106d5..d348e20 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -23,6 +23,8 @@ com.github.api.v2.services.userService.removeKey=http://github.com/api/{version} com.github.api.v2.services.userService.getEmails=http://github.com/api/{version}/{format}/user/emails com.github.api.v2.services.userService.addEmail=http://github.com/api/{version}/{format}/user/email/add com.github.api.v2.services.userService.removeEmail=http://github.com/api/{version}/{format}/user/email/remove +com.github.api.v2.services.userService.getUserOrganizations=http://github.com/api/{version}/{format}/user/show/{userName}/organizations + # Issue API com.github.api.v2.services.issueService.searchIssues=http://github.com/api/{version}/{format}/issues/search/{userName}/{repositoryName}/{state}/{keyword} @@ -85,6 +87,24 @@ com.github.api.v2.services.objectService.getBlob=http://github.com/api/{version} com.github.api.v2.services.objectService.getBlobs=http://github.com/api/{version}/{format}/blob/full/{userName}/{repositoryName}/{sha} com.github.api.v2.services.objectService.getObjectContent=http://github.com/api/{version}/{format}/blob/show/{userName}/{repositoryName}/{sha} +# Organization API +com.github.api.v2.services.organizationService.getOrganization=http://github.com/api/{version}/{format}/organizations/{organizationName} +com.github.api.v2.services.organizationService.updateOrganization=http://github.com/api/{version}/{format}/organizations/{organizationName} +com.github.api.v2.services.organizationService.getAllRepositories=http://github.com/api/{version}/{format}/organizations/repositories +com.github.api.v2.services.organizationService.getPublicRepositories=http://github.com/api/{version}/{format}/organizations/{organizationName}/public_repositories +com.github.api.v2.services.organizationService.getPublicMembers=http://github.com/api/{version}/{format}/organizations/{organizationName}/public_members +com.github.api.v2.services.organizationService.getTeams=http://github.com/api/{version}/{format}/organizations/{organizationName}/teams +com.github.api.v2.services.organizationService.createTeam=http://github.com/api/{version}/{format}/organizations/{organizationName}/teams +com.github.api.v2.services.organizationService.getTeam=http://github.com/api/{version}/{format}/teams/{teamId} +com.github.api.v2.services.organizationService.updateTeam=http://github.com/api/{version}/{format}/teams/{teamId} +com.github.api.v2.services.organizationService.deleteTeam=http://github.com/api/{version}/{format}/teams/{teamId} +com.github.api.v2.services.organizationService.getTeamMembers=http://github.com/api/{version}/{format}/teams/{teamId}/members +com.github.api.v2.services.organizationService.addTeamMember=http://github.com/api/{version}/{format}/teams/{teamId}/members +com.github.api.v2.services.organizationService.removeTeamMember=http://github.com/api/{version}/{format}/teams/{teamId}/members?name={userName} +com.github.api.v2.services.organizationService.getTeamRepositories=http://github.com/api/{version}/{format}/teams/{teamId}/repositories +com.github.api.v2.services.organizationService.addTeamRepository=http://github.com/api/{version}/{format}/teams/{teamId}/repositories?name={userName} +com.github.api.v2.services.organizationService.removeTeamRepository=http://github.com/api/{version}/{format}/teams/{teamId}/repositories?name={userRepositoryPair} + # Feed com.github.api.v2.services.feedService.getPublicUserFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg com.github.api.v2.services.feedService.getPrivateUserFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg diff --git a/core/src/test/java/com/github/api/v2/services/OrganizationServiceTest.java b/core/src/test/java/com/github/api/v2/services/OrganizationServiceTest.java new file mode 100644 index 0000000..074eff6 --- /dev/null +++ b/core/src/test/java/com/github/api/v2/services/OrganizationServiceTest.java @@ -0,0 +1,324 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.util.List; +import java.util.Map; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.api.v2.schema.Key; +import com.github.api.v2.schema.Language; +import com.github.api.v2.schema.Repository; +import com.github.api.v2.schema.User; +import com.github.api.v2.services.constant.TestConstants; + +/** + * The Class RepositoryServiceTest. + */ +public class OrganizationServiceTest extends BaseGitHubServiceTest { + + /** The service. */ + private OrganizationService service; + + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() + */ + @Before + public void setUp() throws Exception { + super.setUp(); + service = factory.createOrganizationService(); + service.setAuthentication(authentication); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() + */ + @After + public void tearDown() throws Exception { + super.tearDown(); + service = null; + } + + /** + * Test create repository. + */ + @Test + public void testCreateRepository() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository Description."), TestConstants.TEST_REPOSITORY_DESC); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository Homepage."), TestConstants.TEST_REPOSITORY_PAGE); + service.createRepository(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_REPOSITORY_DESC, TestConstants.TEST_REPOSITORY_PAGE, Repository.Visibility.PUBLIC); + } + + + /** + * Test add collaborator. + */ + @Test + public void testAddCollaborator() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + service.addCollaborator(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_USER_NAME); + } + + /** + * Test add key. + */ + @Test + public void testAddKey() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Key Title."), TestConstants.TEST_KEY_TITLE); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Key."), TestConstants.TEST_KEY); + service.addDeployKey(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_KEY_TITLE, TestConstants.TEST_KEY); + } + + /** + * Test change visibility. + */ + @Test + public void testChangeVisibility() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + service.changeVisibility(TestConstants.TEST_REPOSITORY_NAME, Repository.Visibility.PRIVATE); + } + + /** + * Test fork repository. + */ + @Test + public void testForkRepository() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + service.forkRepository(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + } + + /** + * Test get branches. + */ + @Test + public void testGetBranches() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + Map branches = service.getBranches(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertFalse("Branches cannot be null or empty.", branches == null || branches.isEmpty()); + } + + /** + * Test get collaborators. + */ + @Test + public void testGetCollaborators() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + List collaborators = service.getCollaborators(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty("Collaborators cannot be null or empty.", collaborators); + } + + /** + * Test get contributors. + */ + @Test + public void testGetContributors() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + List contributors = service.getContributors(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty("Contributors cannot be null or empty.", contributors); + } + + /** + * Test get forks. + */ + @Test + public void testGetForks() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + List forks = service.getForks(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty("Forks cannot be null or empty.", forks); + } + + /** + * Test get keys. + */ + @Test + public void testGetKeys() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + List keys = service.getDeployKeys(TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty("Keys cannot be null or empty.", keys); + } + + /** + * Test get language breakdown. + */ + @Test + public void testGetLanguageBreakdown() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + Map languageBreakdown = service.getLanguageBreakdown(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertFalse("Language breakdown vannot be null or empty.", (languageBreakdown == null || languageBreakdown.isEmpty())); + } + + /** + * Test get pushable repositories. + */ + @Test + public void testGetPushableRepositories() { + List repositories = service.getPushableRepositories(); + assertNotNullOrEmpty("Pushable repositories cannot be null or empty.", repositories); + } + + /** + * Test get repositories. + */ + @Test + public void testGetRepositories() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + List repositories = service.getRepositories(TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); + } + + /** + * Test get repository. + */ + @Test + public void testGetRepository() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + Repository repository = service.getRepository(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertNotNull("Repository cannot be null.", repository); + } + + /** + * Test get tags. + */ + @Test + public void testGetTags() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + Map tags = service.getTags(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertFalse("Tags cannot be null or empty.", tags == null || tags.isEmpty()); + } + + /** + * Test get watchers. + */ + @Test + public void testGetWatchers() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + List watchers = service.getWatchers(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty("Watchers cannot be null or empty.", watchers); + } + + /** + * Test remove collaborator. + */ + @Test + public void testRemoveCollaborator() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + service.removeCollaborator(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_USER_NAME); + } + + /** + * Test remove key. + */ + @Test + public void testRemoveKey() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Key Id."), TestConstants.TEST_KEY_ID); + service.removeDeployKey(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_KEY_ID); + } + + /** + * Test search repositories string. + */ + @Test + public void testSearchRepositoriesString() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); + List repositories = service.searchRepositories(TestConstants.TEST_QUERY); + assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); + } + + /** + * Test search repositories string string. + */ + @Test + public void testSearchRepositoriesStringString() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); + List repositories = service.searchRepositories(TestConstants.TEST_QUERY, Language.Java); + assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); + } + + /** + * Test search repositories string int. + */ + @Test + public void testSearchRepositoriesStringInt() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); + List repositories = service.searchRepositories(TestConstants.TEST_QUERY, 1); + assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); + } + + /** + * Test search repositories string string int. + */ + @Test + public void testSearchRepositoriesStringStringInt() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); + List repositories = service.searchRepositories(TestConstants.TEST_QUERY, Language.Java, 1); + assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); + } + + /** + * Test unwatch repository. + */ + @Test + public void testUnwatchRepository() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + service.unwatchRepository(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + } + + /** + * Test update repository. + */ + @Test + public void testUpdateRepository() { +// service.updateRepository(repository); + } + + /** + * Test watch repository. + */ + @Test + public void testWatchRepository() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + service.watchRepository(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + } + + /** + * Test delete repository. + */ + @Test + public void testDeleteRepository() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); +// service.deleteRepository(TestConstants.TEST_REPOSITORY_NAME); + } +} diff --git a/schema/src/main/java/com/github/api/v2/schema/Organization.java b/schema/src/main/java/com/github/api/v2/schema/Organization.java new file mode 100644 index 0000000..b70d93f --- /dev/null +++ b/schema/src/main/java/com/github/api/v2/schema/Organization.java @@ -0,0 +1,653 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * The Class Repository. + */ +public class Organization extends SchemaEntity { + + /** + * The Enum Visibility. + */ + public enum Visibility implements ValueEnum { + + /** The PUBLIC. */ + PUBLIC("public"), + /** The PRIVATE. */ + PRIVATE("private"); + + /** The Constant stringToEnum. */ + private static final Map stringToEnum = new HashMap(); + + static { // Initialize map from constant name to enum constant + for (Visibility op : values()) { + stringToEnum.put(op.value(), op); + } + } + + /** The value. */ + private final String value; + + /** + * Instantiates a new visibility. + * + * @param value + * the value + */ + Visibility(String value) { + this.value = value; + } + + /* (non-Javadoc) + * @see com.github.api.v2.schema.ValueEnum#value() + */ + @Override + public String value() { + return value; + } + + /** + * From value. + * + * @param value + * the value + * + * @return the visibility + */ + public static Visibility fromValue(String value) { + return stringToEnum.get(value); + } + } + + /** The Constant MASTER. */ + public static final String MASTER = "master"; + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** The watchers. */ + private int watchers; + + /** The owner. */ + private String owner; + + /** The name. */ + private String name; + + /** The description. */ + private String description; + + /** The visibility. */ + private Visibility visibility; + + /** The url. */ + private String url; + + /** The open issues. */ + private int openIssues; + + /** The fork. */ + private boolean fork; + + /** The homepage. */ + private String homepage; + + /** The forks. */ + private int forks; + + /** The score. */ + private double score; + + /** The actions. */ + private int actions; + + /** The size. */ + private long size; + + /** The language. */ + private Language language; + + /** The followers. */ + private int followers; + + /** The username. */ + private String username; + + /** The type. */ + private String type; + + /** The id. */ + private String id; + + /** The pushed. */ + private Date pushed; + + /** The created. */ + private Date created; + + /** The source. */ + private String source; + + /** The parent. */ + private String parent; + + /** The has wiki. */ + private boolean hasWiki; + + /** The has issues. */ + private boolean hasIssues; + + /** The has downloads. */ + private boolean hasDownloads; + + /** + * Gets the watchers. + * + * @return the watchers + */ + public int getWatchers() { + return watchers; + } + + /** + * Sets the watchers. + * + * @param watchers + * the new watchers + */ + public void setWatchers(int watchers) { + this.watchers = watchers; + } + + /** + * Gets the owner. + * + * @return the owner + */ + public String getOwner() { + return owner; + } + + /** + * Sets the owner. + * + * @param owner + * the new owner + */ + public void setOwner(String owner) { + this.owner = owner; + } + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Sets the name. + * + * @param name + * the new name + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the description. + * + * @return the description + */ + public String getDescription() { + return description; + } + + /** + * Sets the description. + * + * @param description + * the new description + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * Gets the visibility. + * + * @return the visibility + */ + public Visibility getVisibility() { + return visibility; + } + + /** + * Sets the visibility. + * + * @param visibility + * the new visibility + */ + public void setVisibility(Visibility visibility) { + this.visibility = visibility; + } + + /** + * Gets the url. + * + * @return the url + */ + public String getUrl() { + return url; + } + + /** + * Sets the url. + * + * @param url + * the new url + */ + public void setUrl(String url) { + this.url = url; + } + + /** + * Gets the open issues. + * + * @return the open issues + */ + public int getOpenIssues() { + return openIssues; + } + + /** + * Sets the open issues. + * + * @param openIssues + * the new open issues + */ + public void setOpenIssues(int openIssues) { + this.openIssues = openIssues; + } + + /** + * Checks if is fork. + * + * @return true, if is fork + */ + public boolean isFork() { + return fork; + } + + /** + * Sets the fork. + * + * @param fork + * the new fork + */ + public void setFork(boolean fork) { + this.fork = fork; + } + + /** + * Gets the homepage. + * + * @return the homepage + */ + public String getHomepage() { + return homepage; + } + + /** + * Sets the homepage. + * + * @param homepage + * the new homepage + */ + public void setHomepage(String homepage) { + this.homepage = homepage; + } + + /** + * Gets the forks. + * + * @return the forks + */ + public int getForks() { + return forks; + } + + /** + * Sets the forks. + * + * @param forks + * the new forks + */ + public void setForks(int forks) { + this.forks = forks; + } + + /** + * Gets the score. + * + * @return the score + */ + public double getScore() { + return score; + } + + /** + * Sets the score. + * + * @param score + * the new score + */ + public void setScore(double score) { + this.score = score; + } + + /** + * Gets the actions. + * + * @return the actions + */ + public int getActions() { + return actions; + } + + /** + * Sets the actions. + * + * @param actions + * the new actions + */ + public void setActions(int actions) { + this.actions = actions; + } + + /** + * Gets the size. + * + * @return the size + */ + public long getSize() { + return size; + } + + /** + * Sets the size. + * + * @param size + * the new size + */ + public void setSize(long size) { + this.size = size; + } + + /** + * Gets the language. + * + * @return the language + */ + public Language getLanguage() { + return language; + } + + /** + * Sets the language. + * + * @param language + * the new language + */ + public void setLanguage(Language language) { + this.language = language; + } + + /** + * Gets the followers. + * + * @return the followers + */ + public int getFollowers() { + return followers; + } + + /** + * Sets the followers. + * + * @param followers + * the new followers + */ + public void setFollowers(int followers) { + this.followers = followers; + } + + /** + * Gets the username. + * + * @return the username + */ + public String getUsername() { + return username; + } + + /** + * Sets the username. + * + * @param username + * the new username + */ + public void setUsername(String username) { + this.username = username; + } + + /** + * Gets the type. + * + * @return the type + */ + public String getType() { + return type; + } + + /** + * Sets the type. + * + * @param type + * the new type + */ + public void setType(String type) { + this.type = type; + } + + /** + * Gets the id. + * + * @return the id + */ + public String getId() { + return id; + } + + /** + * Sets the id. + * + * @param id + * the new id + */ + public void setId(String id) { + this.id = id; + } + + /** + * Gets the pushed. + * + * @return the pushed + */ + public Date getPushed() { + return pushed; + } + + /** + * Sets the pushed. + * + * @param pushed + * the new pushed + */ + public void setPushed(Date pushed) { + this.pushed = pushed; + } + + /** + * Gets the created. + * + * @return the created + */ + public Date getCreated() { + return created; + } + + /** + * Sets the created. + * + * @param created + * the new created + */ + public void setCreated(Date created) { + this.created = created; + } + + /** + * Gets the source. + * + * @return the source + */ + public String getSource() { + return source; + } + + /** + * Sets the source. + * + * @param source + * the new source + */ + public void setSource(String source) { + this.source = source; + } + + /** + * Gets the parent. + * + * @return the parent + */ + public String getParent() { + return parent; + } + + /** + * Sets the parent. + * + * @param parent + * the new parent + */ + public void setParent(String parent) { + this.parent = parent; + } + + /** + * Checks if is checks for wiki. + * + * @return true, if is checks for wiki + */ + public boolean isHasWiki() { + return hasWiki; + } + + /** + * Sets the checks for wiki. + * + * @param hasWiki + * the new checks for wiki + */ + public void setHasWiki(boolean hasWiki) { + this.hasWiki = hasWiki; + } + + /** + * Checks if is checks for issues. + * + * @return true, if is checks for issues + */ + public boolean isHasIssues() { + return hasIssues; + } + + /** + * Sets the checks for issues. + * + * @param hasIssues + * the new checks for issues + */ + public void setHasIssues(boolean hasIssues) { + this.hasIssues = hasIssues; + } + + /** + * Checks if is checks for downloads. + * + * @return true, if is checks for downloads + */ + public boolean isHasDownloads() { + return hasDownloads; + } + + /** + * Sets the checks for downloads. + * + * @param hasDownloads + * the new checks for downloads + */ + public void setHasDownloads(boolean hasDownloads) { + this.hasDownloads = hasDownloads; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Repository [actions=" + actions + ", created=" + created + + ", description=" + description + ", followers=" + followers + + ", fork=" + fork + ", forks=" + forks + ", hasDownloads=" + + hasDownloads + ", hasIssues=" + hasIssues + ", hasWiki=" + + hasWiki + ", homepage=" + homepage + ", id=" + id + + ", language=" + language + ", name=" + name + ", openIssues=" + + openIssues + ", owner=" + owner + ", parent=" + parent + + ", pushed=" + pushed + ", score=" + score + ", size=" + size + + ", source=" + source + ", type=" + type + ", url=" + url + + ", username=" + username + ", visibiity=" + visibility + + ", watchers=" + watchers + "]"; + } +} diff --git a/schema/src/main/java/com/github/api/v2/schema/Team.java b/schema/src/main/java/com/github/api/v2/schema/Team.java new file mode 100644 index 0000000..16717c6 --- /dev/null +++ b/schema/src/main/java/com/github/api/v2/schema/Team.java @@ -0,0 +1,99 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +/** + * The Class Key. + */ +public class Team extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** The id. */ + private String id; + + /** The title. */ + private String title; + + /** The key. */ + private String key; + + /** + * Gets the id. + * + * @return the id + */ + public String getId() { + return id; + } + + /** + * Sets the id. + * + * @param id + * the new id + */ + public void setId(String id) { + this.id = id; + } + + /** + * Gets the title. + * + * @return the title + */ + public String getTitle() { + return title; + } + + /** + * Sets the title. + * + * @param title + * the new title + */ + public void setTitle(String title) { + this.title = title; + } + + /** + * Gets the key. + * + * @return the key + */ + public String getKey() { + return key; + } + + /** + * Sets the key. + * + * @param key + * the new key + */ + public void setKey(String key) { + this.key = key; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Key [id=" + id + ", key=" + key + ", title=" + title + "]"; + } +} From 6434435f5c4da9f3c8b9b4112f34237bdcef10e3 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Sun, 19 Dec 2010 17:40:51 +0500 Subject: [PATCH 37/95] Organization and Team API. --- .../api/v2/services/OrganizationService.java | 316 ++-------------- .../impl/OrganizationServiceImpl.java | 357 ++++-------------- .../v2/services/OrganizationServiceTest.java | 257 ++----------- .../java/com/github/api/v2/schema/Team.java | 99 +++++ 4 files changed, 219 insertions(+), 810 deletions(-) create mode 100644 schema/src/main/java/com/github/api/v2/schema/Team.java diff --git a/core/src/main/java/com/github/api/v2/services/OrganizationService.java b/core/src/main/java/com/github/api/v2/services/OrganizationService.java index b722560..2463f85 100644 --- a/core/src/main/java/com/github/api/v2/services/OrganizationService.java +++ b/core/src/main/java/com/github/api/v2/services/OrganizationService.java @@ -17,306 +17,32 @@ package com.github.api.v2.services; import java.util.List; -import java.util.Map; -import java.util.zip.ZipInputStream; -import com.github.api.v2.schema.Key; -import com.github.api.v2.schema.Language; +import com.github.api.v2.schema.Organization; import com.github.api.v2.schema.Repository; +import com.github.api.v2.schema.Team; import com.github.api.v2.schema.User; -import com.github.api.v2.schema.Repository.Visibility; /** - * The Interface RepositoryService. + * The Interface OrganizationService. */ public interface OrganizationService extends GitHubService { - - /** - * Search repositories. - * - * @param query - * the query - * - * @return the list< repository> - */ - public List searchRepositories(String query); - - /** - * Search repositories. - * - * @param query - * the query - * @param language - * the language - * - * @return the list< repository> - */ - public List searchRepositories(String query, Language language); - - /** - * Search repositories. - * - * @param query - * the query - * @param pageNumber - * the page number - * - * @return the list< repository> - */ - public List searchRepositories(String query, int pageNumber); - - /** - * Search repositories. - * - * @param query - * the query - * @param language - * the language - * @param pageNumber - * the page number - * - * @return the list< repository> - */ - public List searchRepositories(String query, Language language, int pageNumber); - - /** - * Gets the repository. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * - * @return the repository - */ - public Repository getRepository(String userName, String repositoryName); - - /** - * Update repository. - * - * @param repository - * the repository - */ - public void updateRepository(Repository repository); - - /** - * Gets the repositories. - * - * @param userName - * the user name - * - * @return the repositories - */ - public List getRepositories(String userName); - - /** - * Watch repository. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - */ - public void watchRepository(String userName, String repositoryName); - - /** - * Unwatch repository. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - */ - public void unwatchRepository(String userName, String repositoryName); - - /** - * Fork repository. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * - * @return the repository - */ - public Repository forkRepository(String userName, String repositoryName); - - /** - * Creates the repository. - * - * @param name - * the name - * @param description - * the description - * @param homePage - * the home page - * @param visibility - * the visibility - */ - public void createRepository(String name, String description, String homePage, Visibility visibility); - - /** - * Delete repository. - * - * @param repositoryName - * the repository name - */ - public void deleteRepository(String repositoryName); - - /** - * Change visibility. - * - * @param repositoryName - * the repository name - * @param visibility - * the visibility - */ - public void changeVisibility(String repositoryName, Visibility visibility); - - /** - * Gets the deploy keys. - * - * @param repositoryName - * the repository name - * - * @return the deploy keys - */ - public List getDeployKeys(String repositoryName); - - /** - * Adds the deploy key. - * - * @param repositoryName - * the repository name - * @param title - * the title - * @param key - * the key - * - * @return the string - */ - public List addDeployKey(String repositoryName, String title, String key); - - /** - * Removes the deploy key. - * - * @param repository - * the repository - * @param id - * the id - */ - public void removeDeployKey(String repository, String id); - - /** - * Gets the collaborators. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * - * @return the collaborators - */ - public List getCollaborators(String userName, String repositoryName); - - /** - * Adds the collaborator. - * - * @param repositoryName - * the repository name - * @param collaboratorName - * the collaborator name - */ - public void addCollaborator(String repositoryName, String collaboratorName); - - /** - * Removes the collaborator. - * - * @param repositoryName - * the repository name - * @param collaboratorName - * the collaborator name - */ - public void removeCollaborator(String repositoryName, String collaboratorName); - - /** - * Gets the pushable repositories. - * - * @return the pushable repositories - */ - public List getPushableRepositories(); - - /** - * Gets the contributors. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * - * @return the contributors - */ - public List getContributors(String userName, String repositoryName); - - /** - * Gets the watchers. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * - * @return the watchers - */ - public List getWatchers(String userName, String repositoryName); - - /** - * Gets the forks. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * - * @return the forks - */ - public List getForks(String userName, String repositoryName); - - /** - * Gets the language breakdown. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * - * @return the language breakdown - */ - public Map getLanguageBreakdown(String userName, String repositoryName); - - /** - * Gets the tags. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * - * @return the tags - */ - public Map getTags(String userName, String repositoryName); - - /** - * Gets the branches. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * - * @return the branches - */ - public Map getBranches(String userName, String repositoryName); - - public ZipInputStream getRepositoryArchive(String userName, String repositoryName, String branchName); + public Organization getOrganization(String name); + public void updateOrganization(Organization organization); + public List getUserOrganizations(String userName); + public List getUserOrganizations(); + public List getAllOrganizationRepositories(); + public List getPublicRepositories(String organizationName); + public List getPublicMembers(String organizationName); + public List getTeams(String organizationName); + public void createTeam(Team team); + public Team getTeam(String teamId); + public void updateTeam(Team team); + public void deleteTeam(String teamId); + public List getTeamMembers(String teamId); + public void addTeamMember(String userName); + public void removeTeamMember(String userName); + public List getTeamRepositories(String teamId); + public void addTeamRepository(String userName, String repositoryName); + public void removeTeamRepository(String userName, String repositoryName); } diff --git a/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java index 1e7f857..9b7a647 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java @@ -16,367 +16,136 @@ */ package com.github.api.v2.services.impl; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.zip.ZipInputStream; -import com.github.api.v2.schema.Key; -import com.github.api.v2.schema.Language; +import com.github.api.v2.schema.Organization; import com.github.api.v2.schema.Repository; +import com.github.api.v2.schema.Team; import com.github.api.v2.schema.User; -import com.github.api.v2.schema.Repository.Visibility; import com.github.api.v2.services.OrganizationService; -import com.github.api.v2.services.constant.GitHubApiUrls; -import com.github.api.v2.services.constant.ParameterNames; -import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; import com.google.gson.GsonBuilder; -import com.google.gson.JsonObject; -import com.google.gson.reflect.TypeToken; /** - * The Class RepositoryServiceImpl. + * The Class OrganizationServiceImpl. */ public class OrganizationServiceImpl extends BaseGitHubService implements OrganizationService { + /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#addCollaborator(java.lang.String, java.lang.String) - */ - @Override - public void addCollaborator(String repositoryName, String collaboratorName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.ADD_COLLABORATOR_URL); - String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.USER_NAME, collaboratorName).buildUrl(); - unmarshall(callApiPost(apiUrl, new HashMap())); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#addDeployKey(java.lang.String, java.lang.String, java.lang.String) - */ - @Override - public List addDeployKey(String repositoryName, String title, String key) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.ADD_DEPLOY_KEY_URL); - String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - Map parameters = new HashMap(); - parameters.put(ParameterNames.TITLE, title); - parameters.put(ParameterNames.KEY, key); - JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); - - return unmarshall(new TypeToken>(){}, json.get("public_keys")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#changeVisibility(java.lang.String, com.github.api.v2.schema.Repository.Visibility) - */ - @Override - public void changeVisibility(String repositoryName, Visibility visibility) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.CHANGE_VISIBILITY_URL); - String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).withFieldEnum(ParameterNames.VISIBILITY, visibility).buildUrl(); - JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); - - unmarshall(new TypeToken(){}, json.get("repository")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#createRepository(java.lang.String, java.lang.String, java.lang.String, com.github.api.v2.schema.Repository.Visibility) - */ - @Override - public void createRepository(String name, String description, - String homePage, Visibility visibility) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.CREATE_REPOSITORY_URL); - String apiUrl = builder.buildUrl(); - Map parameters = new HashMap(); - parameters.put(ParameterNames.NAME, name); - parameters.put(ParameterNames.DESCRIPTION, description); - parameters.put(ParameterNames.HOME_PAGE, homePage); - parameters.put(ParameterNames.PUBLIC, ((visibility == Visibility.PUBLIC)? "1" : "0")); - JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); - - unmarshall(new TypeToken(){}, json.get("repository")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#deleteRepository(java.lang.String) - */ - @Override - public void deleteRepository(String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.DELETE_REPOSITORY_URL); - String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); - if (json.has("delete_token")) { - Map parameters = new HashMap(); - parameters.put(ParameterNames.DELETE_TOKEN, json.get("delete_token").getAsString()); - callApiPost(apiUrl, parameters); - } - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#forkRepository(java.lang.String, java.lang.String) - */ - @Override - public Repository forkRepository(String userName, String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.FORK_REPOSITORY_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); - return unmarshall(new TypeToken(){}, json.get("repository")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#getBranches(java.lang.String, java.lang.String) - */ - @Override - public Map getBranches(String userName, String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_BRANCHES_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("branches")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#getCollaborators(java.lang.String, java.lang.String) + * @see com.github.api.v2.services.impl.BaseGitHubService#getGsonBuilder() */ - @Override - public List getCollaborators(String userName, String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_COLLABORATORS_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("collaborators")); + protected GsonBuilder getGsonBuilder() { + GsonBuilder gson = super.getGsonBuilder(); + gson.setDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + return gson; } - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#getContributors(java.lang.String, java.lang.String) - */ @Override - public List getContributors(String userName, String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_CONTRIBUTORS_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("contributors")); + public void addTeamMember(String userName) { + // TODO Auto-generated method stub + } - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#getForks(java.lang.String, java.lang.String) - */ @Override - public List getForks(String userName, String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_FORKS_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("network")); + public void addTeamRepository(String userName, String repositoryName) { + // TODO Auto-generated method stub + } - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#getDeployKeys(java.lang.String) - */ @Override - public List getDeployKeys(String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_DEPLOY_KEYS_URL); - String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("public_keys")); + public void createTeam(Team team) { + // TODO Auto-generated method stub + } - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#getLanguageBreakdown(java.lang.String, java.lang.String) - */ @Override - public Map getLanguageBreakdown(String userName, - String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_LANGUAGE_BREAKDOWN_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("languages")); + public void deleteTeam(String teamId) { + // TODO Auto-generated method stub + } - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#getPushableRepositories() - */ @Override - public List getPushableRepositories() { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_PUSHABLE_REPOSITORIES_URL); - String apiUrl = builder.buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("repositories")); + public List getAllOrganizationRepositories() { + // TODO Auto-generated method stub + return null; } - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#getRepositories(java.lang.String) - */ @Override - public List getRepositories(String userName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_REPOSITORIES_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("repositories")); + public Organization getOrganization(String name) { + // TODO Auto-generated method stub + return null; } - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#getRepository(java.lang.String, java.lang.String) - */ @Override - public Repository getRepository(String userName, String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_REPOSITORY_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken(){}, json.get("repository")); + public List getPublicMembers(String organizationName) { + // TODO Auto-generated method stub + return null; } - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#getTags(java.lang.String, java.lang.String) - */ @Override - public Map getTags(String userName, String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_TAGS_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("tags")); + public List getPublicRepositories(String organizationName) { + // TODO Auto-generated method stub + return null; } - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#getWatchers(java.lang.String, java.lang.String) - */ @Override - public List getWatchers(String userName, String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_WATCHERS_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("watchers")); + public Team getTeam(String teamId) { + // TODO Auto-generated method stub + return null; } - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#removeCollaborator(java.lang.String, java.lang.String) - */ @Override - public void removeCollaborator(String repositoryName, - String collaboratorName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.REMOVE_COLLABORATOR_URL); - String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.USER_NAME, collaboratorName).buildUrl(); - unmarshall(callApiPost(apiUrl, new HashMap())); + public List getTeamMembers(String teamId) { + // TODO Auto-generated method stub + return null; } - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#removeDeployKey(java.lang.String, java.lang.String) - */ @Override - public void removeDeployKey(String repositoryName, String id) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.REMOVE_DEPLOY_KEY_URL); - String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - Map parameters = new HashMap(); - parameters.put(ParameterNames.ID, id); - unmarshall(callApiPost(apiUrl, parameters)); + public List getTeamRepositories(String teamId) { + // TODO Auto-generated method stub + return null; } - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#searchRepositories(java.lang.String) - */ @Override - public List searchRepositories(String query) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); - String apiUrl = builder.withField(ParameterNames.KEYWORD, query).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("repositories")); + public List getTeams(String organizationName) { + // TODO Auto-generated method stub + return null; } - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#searchRepositories(java.lang.String, com.github.api.v2.schema.Language) - */ @Override - public List searchRepositories(String query, Language language) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); - String apiUrl = builder.withField(ParameterNames.KEYWORD, query).withParameterEnum(ParameterNames.LANGUAGE, language).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("repositories")); + public List getUserOrganizations(String userName) { + // TODO Auto-generated method stub + return null; } - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#searchRepositories(java.lang.String, int) - */ @Override - public List searchRepositories(String query, int pageNumber) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); - String apiUrl = builder.withField(ParameterNames.KEYWORD, query).withParameter(ParameterNames.START_PAGE, String.valueOf(pageNumber)).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("repositories")); + public List getUserOrganizations() { + // TODO Auto-generated method stub + return null; } - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#searchRepositories(java.lang.String, com.github.api.v2.schema.Language, int) - */ @Override - public List searchRepositories(String query, Language language, - int pageNumber) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); - String apiUrl = builder.withField(ParameterNames.KEYWORD, query).withParameterEnum(ParameterNames.LANGUAGE, language).withParameter(ParameterNames.START_PAGE, String.valueOf(pageNumber)).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("repositories")); + public void removeTeamMember(String userName) { + // TODO Auto-generated method stub + } - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#unwatchRepository(java.lang.String, java.lang.String) - */ @Override - public void unwatchRepository(String userName, String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.UNWATCH_REPOSITORY_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - unmarshall(callApiPost(apiUrl, new HashMap())); + public void removeTeamRepository(String userName, String repositoryName) { + // TODO Auto-generated method stub + } - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#updateRepository(com.github.api.v2.schema.Repository) - */ @Override - public void updateRepository(Repository repository) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.UPDATE_REPOSITORY_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, repository.getOwner()).withField(ParameterNames.REPOSITORY_NAME, repository.getName()).buildUrl(); - Map parameters = new HashMap(); - parameters.put("values[" + ParameterNames.DESCRIPTION + "]", repository.getDescription()); - parameters.put("values[" + ParameterNames.HOME_PAGE + "]", repository.getHomepage()); - parameters.put("values[" + ParameterNames.HAS_WIKI + "]", String.valueOf(repository.isHasWiki())); - parameters.put("values[" + ParameterNames.HAS_ISSUES + "]", String.valueOf(repository.isHasIssues())); - parameters.put("values[" + ParameterNames.HAS_DOWNLOADS + "]", String.valueOf(repository.isHasDownloads())); - JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); - - unmarshall(new TypeToken(){}, json.get("repository")); + public void updateOrganization(Organization organization) { + // TODO Auto-generated method stub + } - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#watchRepository(java.lang.String, java.lang.String) - */ - @Override - public void watchRepository(String userName, String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.WATCH_REPOSITORY_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - unmarshall(callApiPost(apiUrl, new HashMap())); - } - @Override - public ZipInputStream getRepositoryArchive(String userName, String repositoryName, String branchName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_REPOSITORY_ARCHIVE_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, branchName).buildUrl(); - return new ZipInputStream(callApiGet(apiUrl)); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.impl.BaseGitHubService#getGsonBuilder() - */ - protected GsonBuilder getGsonBuilder() { - GsonBuilder gson = super.getGsonBuilder(); - gson.setDateFormat("yyyy-MM-dd'T'HH:mm:ss"); - return gson; + public void updateTeam(Team team) { + // TODO Auto-generated method stub + } } diff --git a/core/src/test/java/com/github/api/v2/services/OrganizationServiceTest.java b/core/src/test/java/com/github/api/v2/services/OrganizationServiceTest.java index 074eff6..17e2325 100644 --- a/core/src/test/java/com/github/api/v2/services/OrganizationServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/OrganizationServiceTest.java @@ -16,19 +16,10 @@ */ package com.github.api.v2.services; -import java.util.List; -import java.util.Map; - import org.junit.After; import org.junit.Before; import org.junit.Test; -import com.github.api.v2.schema.Key; -import com.github.api.v2.schema.Language; -import com.github.api.v2.schema.Repository; -import com.github.api.v2.schema.User; -import com.github.api.v2.services.constant.TestConstants; - /** * The Class RepositoryServiceTest. */ @@ -56,269 +47,93 @@ public void tearDown() throws Exception { service = null; } - /** - * Test create repository. - */ @Test - public void testCreateRepository() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository Description."), TestConstants.TEST_REPOSITORY_DESC); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository Homepage."), TestConstants.TEST_REPOSITORY_PAGE); - service.createRepository(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_REPOSITORY_DESC, TestConstants.TEST_REPOSITORY_PAGE, Repository.Visibility.PUBLIC); + public void testAddTeamMember() { + fail("Not yet implemented"); } - - /** - * Test add collaborator. - */ @Test - public void testAddCollaborator() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - service.addCollaborator(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_USER_NAME); + public void testAddTeamRepository() { + fail("Not yet implemented"); } - /** - * Test add key. - */ @Test - public void testAddKey() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Key Title."), TestConstants.TEST_KEY_TITLE); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Key."), TestConstants.TEST_KEY); - service.addDeployKey(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_KEY_TITLE, TestConstants.TEST_KEY); + public void testCreateTeam() { + fail("Not yet implemented"); } - /** - * Test change visibility. - */ @Test - public void testChangeVisibility() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - service.changeVisibility(TestConstants.TEST_REPOSITORY_NAME, Repository.Visibility.PRIVATE); + public void testDeleteTeam() { + fail("Not yet implemented"); } - /** - * Test fork repository. - */ @Test - public void testForkRepository() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - service.forkRepository(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + public void testGetAllOrganizationRepositories() { + fail("Not yet implemented"); } - /** - * Test get branches. - */ @Test - public void testGetBranches() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - Map branches = service.getBranches(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); - assertFalse("Branches cannot be null or empty.", branches == null || branches.isEmpty()); + public void testGetOrganization() { + fail("Not yet implemented"); } - /** - * Test get collaborators. - */ @Test - public void testGetCollaborators() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - List collaborators = service.getCollaborators(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty("Collaborators cannot be null or empty.", collaborators); + public void testGetPublicMembers() { + fail("Not yet implemented"); } - /** - * Test get contributors. - */ @Test - public void testGetContributors() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - List contributors = service.getContributors(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty("Contributors cannot be null or empty.", contributors); + public void testGetPublicRepositories() { + fail("Not yet implemented"); } - /** - * Test get forks. - */ @Test - public void testGetForks() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - List forks = service.getForks(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty("Forks cannot be null or empty.", forks); + public void testGetTeam() { + fail("Not yet implemented"); } - /** - * Test get keys. - */ @Test - public void testGetKeys() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - List keys = service.getDeployKeys(TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty("Keys cannot be null or empty.", keys); + public void testGetTeamMembers() { + fail("Not yet implemented"); } - /** - * Test get language breakdown. - */ @Test - public void testGetLanguageBreakdown() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - Map languageBreakdown = service.getLanguageBreakdown(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); - assertFalse("Language breakdown vannot be null or empty.", (languageBreakdown == null || languageBreakdown.isEmpty())); + public void testGetTeamRepositories() { + fail("Not yet implemented"); } - /** - * Test get pushable repositories. - */ @Test - public void testGetPushableRepositories() { - List repositories = service.getPushableRepositories(); - assertNotNullOrEmpty("Pushable repositories cannot be null or empty.", repositories); + public void testGetTeams() { + fail("Not yet implemented"); } - /** - * Test get repositories. - */ @Test - public void testGetRepositories() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - List repositories = service.getRepositories(TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); + public void testGetUserOrganizationsString() { + fail("Not yet implemented"); } - /** - * Test get repository. - */ @Test - public void testGetRepository() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - Repository repository = service.getRepository(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); - assertNotNull("Repository cannot be null.", repository); + public void testGetUserOrganizations() { + fail("Not yet implemented"); } - /** - * Test get tags. - */ @Test - public void testGetTags() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - Map tags = service.getTags(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); - assertFalse("Tags cannot be null or empty.", tags == null || tags.isEmpty()); + public void testRemoveTeamMember() { + fail("Not yet implemented"); } - /** - * Test get watchers. - */ @Test - public void testGetWatchers() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - List watchers = service.getWatchers(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty("Watchers cannot be null or empty.", watchers); + public void testRemoveTeamRepository() { + fail("Not yet implemented"); } - /** - * Test remove collaborator. - */ @Test - public void testRemoveCollaborator() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - service.removeCollaborator(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_USER_NAME); + public void testUpdateOrganization() { + fail("Not yet implemented"); } - /** - * Test remove key. - */ - @Test - public void testRemoveKey() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Key Id."), TestConstants.TEST_KEY_ID); - service.removeDeployKey(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_KEY_ID); - } - - /** - * Test search repositories string. - */ - @Test - public void testSearchRepositoriesString() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); - List repositories = service.searchRepositories(TestConstants.TEST_QUERY); - assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); - } - - /** - * Test search repositories string string. - */ - @Test - public void testSearchRepositoriesStringString() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); - List repositories = service.searchRepositories(TestConstants.TEST_QUERY, Language.Java); - assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); - } - - /** - * Test search repositories string int. - */ - @Test - public void testSearchRepositoriesStringInt() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); - List repositories = service.searchRepositories(TestConstants.TEST_QUERY, 1); - assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); - } - - /** - * Test search repositories string string int. - */ - @Test - public void testSearchRepositoriesStringStringInt() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); - List repositories = service.searchRepositories(TestConstants.TEST_QUERY, Language.Java, 1); - assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); - } - - /** - * Test unwatch repository. - */ - @Test - public void testUnwatchRepository() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - service.unwatchRepository(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); - } - - /** - * Test update repository. - */ - @Test - public void testUpdateRepository() { -// service.updateRepository(repository); - } - - /** - * Test watch repository. - */ - @Test - public void testWatchRepository() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - service.watchRepository(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); - } - - /** - * Test delete repository. - */ @Test - public void testDeleteRepository() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); -// service.deleteRepository(TestConstants.TEST_REPOSITORY_NAME); + public void testUpdateTeam() { + fail("Not yet implemented"); } } diff --git a/schema/src/main/java/com/github/api/v2/schema/Team.java b/schema/src/main/java/com/github/api/v2/schema/Team.java new file mode 100644 index 0000000..16717c6 --- /dev/null +++ b/schema/src/main/java/com/github/api/v2/schema/Team.java @@ -0,0 +1,99 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +/** + * The Class Key. + */ +public class Team extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** The id. */ + private String id; + + /** The title. */ + private String title; + + /** The key. */ + private String key; + + /** + * Gets the id. + * + * @return the id + */ + public String getId() { + return id; + } + + /** + * Sets the id. + * + * @param id + * the new id + */ + public void setId(String id) { + this.id = id; + } + + /** + * Gets the title. + * + * @return the title + */ + public String getTitle() { + return title; + } + + /** + * Sets the title. + * + * @param title + * the new title + */ + public void setTitle(String title) { + this.title = title; + } + + /** + * Gets the key. + * + * @return the key + */ + public String getKey() { + return key; + } + + /** + * Sets the key. + * + * @param key + * the new key + */ + public void setKey(String key) { + this.key = key; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Key [id=" + id + ", key=" + key + ", title=" + title + "]"; + } +} From 4e5fca30cb94f98c90dc7a72e3f2b11b563fbf12 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Mon, 20 Dec 2010 15:37:02 +0500 Subject: [PATCH 38/95] Relocated corrupt repository. --- .../api/v2/services/OrganizationService.java | 9 +- .../github/api/v2/services/UserService.java | 3 + .../v2/services/constant/GitHubApiUrls.java | 7 + .../v2/services/constant/ParameterNames.java | 3 + .../v2/services/impl/GitHubApiGateway.java | 58 ++ .../impl/OrganizationServiceImpl.java | 134 ++-- .../api/v2/services/impl/UserServiceImpl.java | 10 + .../constant/GitHubApiUrls.properties | 2 +- .../github/api/v2/schema/Organization.java | 597 +++++++----------- .../com/github/api/v2/schema/Permission.java | 60 ++ .../com/github/api/v2/schema/Repository.java | 33 + .../java/com/github/api/v2/schema/Team.java | 73 +-- .../java/com/github/api/v2/schema/User.java | 17 + 13 files changed, 538 insertions(+), 468 deletions(-) create mode 100644 schema/src/main/java/com/github/api/v2/schema/Permission.java diff --git a/core/src/main/java/com/github/api/v2/services/OrganizationService.java b/core/src/main/java/com/github/api/v2/services/OrganizationService.java index 2463f85..583f2f2 100644 --- a/core/src/main/java/com/github/api/v2/services/OrganizationService.java +++ b/core/src/main/java/com/github/api/v2/services/OrganizationService.java @@ -28,9 +28,8 @@ */ public interface OrganizationService extends GitHubService { public Organization getOrganization(String name); - public void updateOrganization(Organization organization); - public List getUserOrganizations(String userName); public List getUserOrganizations(); + public void updateOrganization(Organization organization); public List getAllOrganizationRepositories(); public List getPublicRepositories(String organizationName); public List getPublicMembers(String organizationName); @@ -40,9 +39,9 @@ public interface OrganizationService extends GitHubService { public void updateTeam(Team team); public void deleteTeam(String teamId); public List getTeamMembers(String teamId); - public void addTeamMember(String userName); - public void removeTeamMember(String userName); + public void addTeamMember(String teamId, String userName); + public void removeTeamMember(String teamId, String userName); public List getTeamRepositories(String teamId); public void addTeamRepository(String userName, String repositoryName); - public void removeTeamRepository(String userName, String repositoryName); + public void removeTeamRepository(String teamId, String userName, String repositoryName); } diff --git a/core/src/main/java/com/github/api/v2/services/UserService.java b/core/src/main/java/com/github/api/v2/services/UserService.java index 9f36830..f2223d1 100644 --- a/core/src/main/java/com/github/api/v2/services/UserService.java +++ b/core/src/main/java/com/github/api/v2/services/UserService.java @@ -19,6 +19,7 @@ import java.util.List; import com.github.api.v2.schema.Key; +import com.github.api.v2.schema.Organization; import com.github.api.v2.schema.Repository; import com.github.api.v2.schema.User; @@ -165,4 +166,6 @@ public interface UserService extends GitHubService { * the email */ public void removeEmail(String email); + + public List getUserOrganizations(String userName); } diff --git a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java index bb86387..cc54f3d 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java +++ b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java @@ -115,6 +115,10 @@ public static interface UserApiUrls { /** The Constant REMOVE_EMAIL_URL. */ public static final String REMOVE_EMAIL_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.removeEmail"); + + /** The Constant GET_USER_ORGANIZATIONS. */ + public static final String GET_USER_ORGANIZATIONS = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getUserOrganizations"); + } /** @@ -307,6 +311,9 @@ public static interface OrganizationApiUrls { /** The Constant GET_ORGANIZATION_URL. */ public static final String GET_ORGANIZATION_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getOrganization"); + /** The Constant GET_ORGANIZATION_URL. */ + public static final String GET_ORGANIZATIONS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getOrganizations"); + /** The Constant UPDATE_ORGANIZATION_URL. */ public static final String UPDATE_ORGANIZATION_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.updateOrganization"); diff --git a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java index 3d281a8..49790be 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java +++ b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java @@ -160,5 +160,8 @@ public interface ParameterNames { public static final String ORGANIZATION_NAME = "organizationName"; public static final String TEAM_ID = "teamId"; + public static final String PERMISSION = "permission"; + public static final String REPO_NAMES = "repo_names"; + public static final String BILLING_EMAIL = "billing_email"; } diff --git a/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java b/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java index 36b1ab9..2875849 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java +++ b/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java @@ -328,6 +328,64 @@ protected InputStream callApiPost(String apiUrl, Map parameters, } } + + /** + * Call api get. + * + * @param apiUrl + * the api url + * + * @return the input stream + */ + protected InputStream callApiDelete(String apiUrl) { + return callApiDelete(apiUrl, HttpURLConnection.HTTP_OK); + } + + /** + * Call api get. + * + * @param apiUrl + * the api url + * @param expected + * the expected + * + * @return the input stream + */ + protected InputStream callApiDelete(String apiUrl, int expected) { + try { + URL url = new URL(apiUrl); + + HttpURLConnection request = (HttpURLConnection) url.openConnection(); + + if (ApplicationConstants.CONNECT_TIMEOUT > -1) { + request.setConnectTimeout(ApplicationConstants.CONNECT_TIMEOUT); + } + + if (ApplicationConstants.READ_TIMEOUT > -1) { + request.setReadTimeout(ApplicationConstants.READ_TIMEOUT); + } + + for (String headerName : requestHeaders.keySet()) { + request.setRequestProperty(headerName, requestHeaders.get(headerName)); + } + + request.setRequestMethod("DELETE"); + + request.connect(); + + if (request.getResponseCode() != expected) { + throw new GitHubException(convertStreamToString(getWrappedInputStream(request.getErrorStream(), + GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())))); + } else { + return getWrappedInputStream(request.getInputStream(), + GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())); + } + } catch (IOException e) { + throw new GitHubException(e); + } + } + + /** * Gets the parameters string. * diff --git a/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java index 9b7a647..cc44242 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java @@ -16,14 +16,21 @@ */ package com.github.api.v2.services.impl; +import java.util.HashMap; import java.util.List; +import java.util.Map; import com.github.api.v2.schema.Organization; import com.github.api.v2.schema.Repository; import com.github.api.v2.schema.Team; import com.github.api.v2.schema.User; import com.github.api.v2.services.OrganizationService; +import com.github.api.v2.services.constant.GitHubApiUrls; +import com.github.api.v2.services.constant.ParameterNames; +import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; /** * The Class OrganizationServiceImpl. @@ -42,110 +49,151 @@ protected GsonBuilder getGsonBuilder() { } @Override - public void addTeamMember(String userName) { - // TODO Auto-generated method stub - + public void addTeamMember(String teamId, String userName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.ADD_TEAM_MEMBER_URL); + String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).withParameter(ParameterNames.NAME, userName).buildUrl(); + unmarshall(callApiPost(apiUrl, new HashMap())); } @Override public void addTeamRepository(String userName, String repositoryName) { - // TODO Auto-generated method stub - + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.ADD_TEAM_REPOSITORY_URL); + String apiUrl = builder.withParameter(ParameterNames.USER_REPOSITORY_PAIR, userName + "/" + repositoryName).buildUrl(); + unmarshall(callApiPost(apiUrl, new HashMap())); } @Override public void createTeam(Team team) { - // TODO Auto-generated method stub - + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.CREATE_TEAM_URL); + String apiUrl = builder.buildUrl(); + Map parameters = new HashMap(); + parameters.put("team[" + ParameterNames.NAME + "]", team.getName()); + parameters.put("team[" + ParameterNames.PERMISSION + "]", team.getPermission().value()); + parameters.put("team[" + ParameterNames.REPO_NAMES + "]", team.getRepoNames().toString()); + callApiPost(apiUrl, parameters); } @Override public void deleteTeam(String teamId) { - // TODO Auto-generated method stub - + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.DELETE_TEAM_URL); + String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).buildUrl(); + callApiDelete(apiUrl); } @Override public List getAllOrganizationRepositories() { - // TODO Auto-generated method stub - return null; + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_ALL_REPOSITORIES_URL); + String apiUrl = builder.buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("repositories")); } @Override public Organization getOrganization(String name) { - // TODO Auto-generated method stub - return null; + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_ORGANIZATION_URL); + String apiUrl = builder.withField(ParameterNames.ORGANIZATION_NAME, name).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken(){}, json.get("organization")); } @Override public List getPublicMembers(String organizationName) { - // TODO Auto-generated method stub - return null; + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_PUBLIC_MEMBERS_URL); + String apiUrl = builder.withField(ParameterNames.ORGANIZATION_NAME, organizationName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("users")); } @Override public List getPublicRepositories(String organizationName) { - // TODO Auto-generated method stub - return null; + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_PUBLIC_REPOSITORIES_URL); + String apiUrl = builder.buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("repositories")); } @Override public Team getTeam(String teamId) { - // TODO Auto-generated method stub - return null; + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_TEAM_URL); + String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken(){}, json.get("team")); } @Override public List getTeamMembers(String teamId) { - // TODO Auto-generated method stub - return null; + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_TEAM_MEMBERS_URL); + String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("users")); } @Override public List getTeamRepositories(String teamId) { - // TODO Auto-generated method stub - return null; + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_TEAM_REPOSITORIES_URL); + String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("repositories")); } @Override public List getTeams(String organizationName) { - // TODO Auto-generated method stub - return null; - } - - @Override - public List getUserOrganizations(String userName) { - // TODO Auto-generated method stub - return null; + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_TEAMS_URL); + String apiUrl = builder.withField(ParameterNames.ORGANIZATION_NAME, organizationName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("teams")); } @Override public List getUserOrganizations() { - // TODO Auto-generated method stub - return null; + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_ORGANIZATIONS_URL); + String apiUrl = builder.buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("organizations")); } - + @Override - public void removeTeamMember(String userName) { - // TODO Auto-generated method stub - + public void removeTeamMember(String teamId, String userName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.REMOVE_TEAM_MEMBER_URL); + String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).withParameter(ParameterNames.NAME, userName).buildUrl(); + callApiDelete(apiUrl); } @Override - public void removeTeamRepository(String userName, String repositoryName) { - // TODO Auto-generated method stub - + public void removeTeamRepository(String teamId, String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.REMOVE_TEAM_REPOSITORY_URL); + String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).withParameter(ParameterNames.NAME, userName + "/" + repositoryName).buildUrl(); + callApiDelete(apiUrl); } @Override public void updateOrganization(Organization organization) { - // TODO Auto-generated method stub - + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.UPDATE_ORGANIZATION_URL); + String apiUrl = builder.withField(ParameterNames.ORGANIZATION_NAME, organization.getName()).buildUrl(); + Map parameters = new HashMap(); + parameters.put("organization[" + ParameterNames.NAME + "]", organization.getName()); + parameters.put("organization[" + ParameterNames.EMAIL + "]", organization.getEmail()); + parameters.put("organization[" + ParameterNames.BLOG + "]", organization.getBlog()); + parameters.put("organization[" + ParameterNames.COMPANY + "]", organization.getCompany()); + parameters.put("organization[" + ParameterNames.LOCATION + "]", organization.getLocation()); + parameters.put("organization[" + ParameterNames.BILLING_EMAIL + "]", organization.getBillingEmail()); + callApiPost(apiUrl, parameters); } @Override public void updateTeam(Team team) { - // TODO Auto-generated method stub + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.UPDATE_TEAM_URL); + String apiUrl = builder.withField(ParameterNames.TEAM_ID, team.getId()).buildUrl(); + callApiMethod(apiUrl, getGsonBuilder().create().toJson(team), "application/json", "PUT", 200); } } diff --git a/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java index 242d3c5..b6c28a1 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java @@ -21,6 +21,7 @@ import java.util.Map; import com.github.api.v2.schema.Key; +import com.github.api.v2.schema.Organization; import com.github.api.v2.schema.Repository; import com.github.api.v2.schema.User; import com.github.api.v2.services.UserService; @@ -212,6 +213,15 @@ public void unfollowUser(String userName) { String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); callApiPost(apiUrl, new HashMap()); } + + @Override + public List getUserOrganizations(String userName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_USER_ORGANIZATIONS); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("organizations")); + } /* (non-Javadoc) * @see com.github.api.v2.services.UserService#updateUser(com.github.api.v2.schema.User) diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index d348e20..b02642e 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -25,7 +25,6 @@ com.github.api.v2.services.userService.addEmail=http://github.com/api/{version}/ com.github.api.v2.services.userService.removeEmail=http://github.com/api/{version}/{format}/user/email/remove com.github.api.v2.services.userService.getUserOrganizations=http://github.com/api/{version}/{format}/user/show/{userName}/organizations - # Issue API com.github.api.v2.services.issueService.searchIssues=http://github.com/api/{version}/{format}/issues/search/{userName}/{repositoryName}/{state}/{keyword} com.github.api.v2.services.issueService.getIssues=http://github.com/api/{version}/{format}/issues/list/{userName}/{repositoryName}/{state} @@ -88,6 +87,7 @@ com.github.api.v2.services.objectService.getBlobs=http://github.com/api/{version com.github.api.v2.services.objectService.getObjectContent=http://github.com/api/{version}/{format}/blob/show/{userName}/{repositoryName}/{sha} # Organization API +com.github.api.v2.services.organizationService.getOrganizations=http://github.com/api/{version}/{format}/organizations com.github.api.v2.services.organizationService.getOrganization=http://github.com/api/{version}/{format}/organizations/{organizationName} com.github.api.v2.services.organizationService.updateOrganization=http://github.com/api/{version}/{format}/organizations/{organizationName} com.github.api.v2.services.organizationService.getAllRepositories=http://github.com/api/{version}/{format}/organizations/repositories diff --git a/schema/src/main/java/com/github/api/v2/schema/Organization.java b/schema/src/main/java/com/github/api/v2/schema/Organization.java index b70d93f..ffa97c3 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Organization.java +++ b/schema/src/main/java/com/github/api/v2/schema/Organization.java @@ -21,25 +21,24 @@ import java.util.Map; /** - * The Class Repository. + * The Class Organization. */ public class Organization extends SchemaEntity { /** - * The Enum Visibility. + * The Enum Type. */ - public enum Visibility implements ValueEnum { + public enum Type implements ValueEnum { + + /** The ORGANIZATION. */ + ORGANIZATION("Organization"); - /** The PUBLIC. */ - PUBLIC("public"), - /** The PRIVATE. */ - PRIVATE("private"); /** The Constant stringToEnum. */ - private static final Map stringToEnum = new HashMap(); + private static final Map stringToEnum = new HashMap(); static { // Initialize map from constant name to enum constant - for (Visibility op : values()) { + for (Type op : values()) { stringToEnum.put(op.value(), op); } } @@ -48,12 +47,12 @@ public enum Visibility implements ValueEnum { private final String value; /** - * Instantiates a new visibility. + * Instantiates a new type. * * @param value * the value */ - Visibility(String value) { + Type(String value) { this.value = value; } @@ -71,132 +70,114 @@ public String value() { * @param value * the value * - * @return the visibility + * @return the type */ - public static Visibility fromValue(String value) { + public static Type fromValue(String value) { return stringToEnum.get(value); } } - /** The Constant MASTER. */ - public static final String MASTER = "master"; + /** + * + */ + private static final long serialVersionUID = 2665103321482505351L; - /** The Constant serialVersionUID. */ - private static final long serialVersionUID = 9155892708485181542L; + /** The id. */ + private String id; - /** The watchers. */ - private int watchers; + /** The gravatar id. */ + private String gravatarId; - /** The owner. */ - private String owner; + /** The login. */ + private String login; /** The name. */ private String name; - /** The description. */ - private String description; - - /** The visibility. */ - private Visibility visibility; + /** The email. */ + private String email; - /** The url. */ - private String url; + /** The location. */ + private String location; - /** The open issues. */ - private int openIssues; + /** The blog. */ + private String blog; - /** The fork. */ - private boolean fork; + /** The company. */ + private String company; - /** The homepage. */ - private String homepage; + /** The following count. */ + private int followingCount; - /** The forks. */ - private int forks; + /** The followers count. */ + private int followersCount; - /** The score. */ - private double score; + /** The public gist count. */ + private int publicGistCount; - /** The actions. */ - private int actions; + /** The public repo count. */ + private int publicRepoCount; - /** The size. */ - private long size; + /** The total private repo count. */ + private int totalPrivateRepoCount; - /** The language. */ - private Language language; + /** The owned private repo count. */ + private int ownedPrivateRepoCount; - /** The followers. */ - private int followers; + /** The private gist count. */ + private int privateGistCount; - /** The username. */ - private String username; + /** The created at. */ + private Date createdAt; - /** The type. */ - private String type; + private Permission permission; - /** The id. */ - private String id; + private String billingEmail; - /** The pushed. */ - private Date pushed; - - /** The created. */ - private Date created; - - /** The source. */ - private String source; - - /** The parent. */ - private String parent; - - /** The has wiki. */ - private boolean hasWiki; - - /** The has issues. */ - private boolean hasIssues; - - /** The has downloads. */ - private boolean hasDownloads; + private Type type; /** - * Gets the watchers. - * - * @return the watchers + * @return the permission */ - public int getWatchers() { - return watchers; + public Permission getPermission() { + return permission; } - + /** - * Sets the watchers. - * - * @param watchers - * the new watchers + * @param permission the permission to set */ - public void setWatchers(int watchers) { - this.watchers = watchers; + public void setPermission(Permission permission) { + this.permission = permission; } - + /** - * Gets the owner. - * - * @return the owner + * @return the billingEmail */ - public String getOwner() { - return owner; + public String getBillingEmail() { + return billingEmail; } - + /** - * Sets the owner. - * - * @param owner - * the new owner + * @param billingEmail the billingEmail to set */ - public void setOwner(String owner) { - this.owner = owner; + public void setBillingEmail(String billingEmail) { + this.billingEmail = billingEmail; } - + + /** + * @return the type + */ + public Type getType() { + return type; + } + + /** + * @param type the type to set + */ + public void setType(Type type) { + this.type = type; + } + /** * Gets the name. * @@ -217,437 +198,287 @@ public void setName(String name) { } /** - * Gets the description. + * Gets the location. * - * @return the description + * @return the location */ - public String getDescription() { - return description; + public String getLocation() { + return location; } /** - * Sets the description. + * Sets the location. * - * @param description - * the new description + * @param location + * the new location */ - public void setDescription(String description) { - this.description = description; + public void setLocation(String location) { + this.location = location; } /** - * Gets the visibility. + * Gets the email. * - * @return the visibility + * @return the email */ - public Visibility getVisibility() { - return visibility; + public String getEmail() { + return email; } /** - * Sets the visibility. + * Sets the email. * - * @param visibility - * the new visibility + * @param email + * the new email */ - public void setVisibility(Visibility visibility) { - this.visibility = visibility; + public void setEmail(String email) { + this.email = email; } /** - * Gets the url. + * Gets the blog. * - * @return the url + * @return the blog */ - public String getUrl() { - return url; + public String getBlog() { + return blog; } /** - * Sets the url. + * Sets the blog. * - * @param url - * the new url + * @param blog + * the new blog */ - public void setUrl(String url) { - this.url = url; + public void setBlog(String blog) { + this.blog = blog; } /** - * Gets the open issues. + * Gets the company. * - * @return the open issues + * @return the company */ - public int getOpenIssues() { - return openIssues; + public String getCompany() { + return company; } /** - * Sets the open issues. + * Sets the company. * - * @param openIssues - * the new open issues + * @param company + * the new company */ - public void setOpenIssues(int openIssues) { - this.openIssues = openIssues; + public void setCompany(String company) { + this.company = company; } /** - * Checks if is fork. - * - * @return true, if is fork - */ - public boolean isFork() { - return fork; - } - - /** - * Sets the fork. - * - * @param fork - * the new fork - */ - public void setFork(boolean fork) { - this.fork = fork; - } - - /** - * Gets the homepage. - * - * @return the homepage - */ - public String getHomepage() { - return homepage; - } - - /** - * Sets the homepage. - * - * @param homepage - * the new homepage - */ - public void setHomepage(String homepage) { - this.homepage = homepage; - } - - /** - * Gets the forks. - * - * @return the forks - */ - public int getForks() { - return forks; - } - - /** - * Sets the forks. - * - * @param forks - * the new forks - */ - public void setForks(int forks) { - this.forks = forks; - } - - /** - * Gets the score. - * - * @return the score - */ - public double getScore() { - return score; - } - - /** - * Sets the score. - * - * @param score - * the new score - */ - public void setScore(double score) { - this.score = score; - } - - /** - * Gets the actions. - * - * @return the actions - */ - public int getActions() { - return actions; - } - - /** - * Sets the actions. - * - * @param actions - * the new actions - */ - public void setActions(int actions) { - this.actions = actions; - } - - /** - * Gets the size. - * - * @return the size - */ - public long getSize() { - return size; - } - - /** - * Sets the size. - * - * @param size - * the new size - */ - public void setSize(long size) { - this.size = size; - } - - /** - * Gets the language. - * - * @return the language - */ - public Language getLanguage() { - return language; - } - - /** - * Sets the language. - * - * @param language - * the new language - */ - public void setLanguage(Language language) { - this.language = language; - } - - /** - * Gets the followers. + * Gets the id. * - * @return the followers + * @return the id */ - public int getFollowers() { - return followers; + public String getId() { + return id; } /** - * Sets the followers. + * Sets the id. * - * @param followers - * the new followers + * @param id + * the new id */ - public void setFollowers(int followers) { - this.followers = followers; + public void setId(String id) { + this.id = id; } /** - * Gets the username. + * Gets the login. * - * @return the username + * @return the login */ - public String getUsername() { - return username; + public String getLogin() { + return login; } /** - * Sets the username. + * Sets the login. * - * @param username - * the new username + * @param login + * the new login */ - public void setUsername(String username) { - this.username = username; + public void setLogin(String login) { + this.login = login; } /** - * Gets the type. + * Gets the following count. * - * @return the type + * @return the following count */ - public String getType() { - return type; + public int getFollowingCount() { + return followingCount; } /** - * Sets the type. + * Sets the following count. * - * @param type - * the new type + * @param followingCount + * the new following count */ - public void setType(String type) { - this.type = type; + public void setFollowingCount(int followingCount) { + this.followingCount = followingCount; } /** - * Gets the id. + * Gets the followers count. * - * @return the id + * @return the followers count */ - public String getId() { - return id; + public int getFollowersCount() { + return followersCount; } /** - * Sets the id. + * Sets the followers count. * - * @param id - * the new id + * @param followersCount + * the new followers count */ - public void setId(String id) { - this.id = id; + public void setFollowersCount(int followersCount) { + this.followersCount = followersCount; } /** - * Gets the pushed. + * Gets the public gist count. * - * @return the pushed + * @return the public gist count */ - public Date getPushed() { - return pushed; + public int getPublicGistCount() { + return publicGistCount; } /** - * Sets the pushed. + * Sets the public gist count. * - * @param pushed - * the new pushed + * @param publicGistCount + * the new public gist count */ - public void setPushed(Date pushed) { - this.pushed = pushed; + public void setPublicGistCount(int publicGistCount) { + this.publicGistCount = publicGistCount; } /** - * Gets the created. + * Gets the public repo count. * - * @return the created + * @return the public repo count */ - public Date getCreated() { - return created; + public int getPublicRepoCount() { + return publicRepoCount; } /** - * Sets the created. + * Sets the public repo count. * - * @param created - * the new created + * @param publicRepoCount + * the new public repo count */ - public void setCreated(Date created) { - this.created = created; + public void setPublicRepoCount(int publicRepoCount) { + this.publicRepoCount = publicRepoCount; } /** - * Gets the source. + * Gets the total private repo count. * - * @return the source + * @return the total private repo count */ - public String getSource() { - return source; + public int getTotalPrivateRepoCount() { + return totalPrivateRepoCount; } /** - * Sets the source. + * Sets the total private repo count. * - * @param source - * the new source + * @param totalPrivateRepoCount + * the new total private repo count */ - public void setSource(String source) { - this.source = source; + public void setTotalPrivateRepoCount(int totalPrivateRepoCount) { + this.totalPrivateRepoCount = totalPrivateRepoCount; } /** - * Gets the parent. + * Gets the owned private repo count. * - * @return the parent + * @return the owned private repo count */ - public String getParent() { - return parent; + public int getOwnedPrivateRepoCount() { + return ownedPrivateRepoCount; } /** - * Sets the parent. + * Sets the owned private repo count. * - * @param parent - * the new parent + * @param ownedPrivateRepoCount + * the new owned private repo count */ - public void setParent(String parent) { - this.parent = parent; + public void setOwnedPrivateRepoCount(int ownedPrivateRepoCount) { + this.ownedPrivateRepoCount = ownedPrivateRepoCount; } /** - * Checks if is checks for wiki. + * Gets the private gist count. * - * @return true, if is checks for wiki + * @return the private gist count */ - public boolean isHasWiki() { - return hasWiki; + public int getPrivateGistCount() { + return privateGistCount; } /** - * Sets the checks for wiki. + * Sets the private gist count. * - * @param hasWiki - * the new checks for wiki + * @param privateGistCount + * the new private gist count */ - public void setHasWiki(boolean hasWiki) { - this.hasWiki = hasWiki; + public void setPrivateGistCount(int privateGistCount) { + this.privateGistCount = privateGistCount; } /** - * Checks if is checks for issues. + * Gets the created at. * - * @return true, if is checks for issues + * @return the created at */ - public boolean isHasIssues() { - return hasIssues; + public Date getCreatedAt() { + return createdAt; } /** - * Sets the checks for issues. + * Sets the created at. * - * @param hasIssues - * the new checks for issues + * @param createdAt + * the new created at */ - public void setHasIssues(boolean hasIssues) { - this.hasIssues = hasIssues; + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; } /** - * Checks if is checks for downloads. + * Gets the gravatar id. * - * @return true, if is checks for downloads + * @return the gravatar id */ - public boolean isHasDownloads() { - return hasDownloads; + public String getGravatarId() { + return gravatarId; } /** - * Sets the checks for downloads. + * Sets the gravatar id. * - * @param hasDownloads - * the new checks for downloads - */ - public void setHasDownloads(boolean hasDownloads) { - this.hasDownloads = hasDownloads; - } - /* (non-Javadoc) - * @see java.lang.Object#toString() + * @param gravatarId + * the new gravatar id */ - @Override - public String toString() { - return "Repository [actions=" + actions + ", created=" + created - + ", description=" + description + ", followers=" + followers - + ", fork=" + fork + ", forks=" + forks + ", hasDownloads=" - + hasDownloads + ", hasIssues=" + hasIssues + ", hasWiki=" - + hasWiki + ", homepage=" + homepage + ", id=" + id - + ", language=" + language + ", name=" + name + ", openIssues=" - + openIssues + ", owner=" + owner + ", parent=" + parent - + ", pushed=" + pushed + ", score=" + score + ", size=" + size - + ", source=" + source + ", type=" + type + ", url=" + url - + ", username=" + username + ", visibiity=" + visibility - + ", watchers=" + watchers + "]"; + public void setGravatarId(String gravatarId) { + this.gravatarId = gravatarId; } } diff --git a/schema/src/main/java/com/github/api/v2/schema/Permission.java b/schema/src/main/java/com/github/api/v2/schema/Permission.java new file mode 100644 index 0000000..aabdba0 --- /dev/null +++ b/schema/src/main/java/com/github/api/v2/schema/Permission.java @@ -0,0 +1,60 @@ +package com.github.api.v2.schema; + +import java.util.HashMap; +import java.util.Map; + + +/** + * The Enum Permission. + */ + public enum Permission implements ValueEnum { + + /** The ADMIN. */ + ADMIN("admin"), + /** The PULL. */ + PULL("pull"), + /** The PUSH. */ + PUSH("push"); + + /** The Constant stringToEnum. */ + private static final Map stringToEnum = new HashMap(); + + static { // Initialize map from constant name to enum constant + for (Permission op : values()) { + stringToEnum.put(op.value(), op); + } + } + + /** The value. */ + private final String value; + + /** + * Instantiates a new permission. + * + * @param value + * the value + */ + Permission(String value) { + this.value = value; + } + + /* (non-Javadoc) + * @see com.github.api.v2.schema.ValueEnum#value() + */ + @Override + public String value() { + return value; + } + + /** + * From value. + * + * @param value + * the value + * + * @return the permission + */ + public static Permission fromValue(String value) { + return stringToEnum.get(value); + } + } \ No newline at end of file diff --git a/schema/src/main/java/com/github/api/v2/schema/Repository.java b/schema/src/main/java/com/github/api/v2/schema/Repository.java index ac0f3d8..7fea3b5 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Repository.java +++ b/schema/src/main/java/com/github/api/v2/schema/Repository.java @@ -159,6 +159,10 @@ public static Visibility fromValue(String value) { /** The has downloads. */ private boolean hasDownloads; + private String organization; + + private Permission permission; + /** * Gets the watchers. * @@ -633,6 +637,35 @@ public boolean isHasDownloads() { public void setHasDownloads(boolean hasDownloads) { this.hasDownloads = hasDownloads; } + + /** + * @return the organization + */ + public String getOrganization() { + return organization; + } + + /** + * @param organization the organization to set + */ + public void setOrganization(String organization) { + this.organization = organization; + } + + /** + * @return the permission + */ + public Permission getPermission() { + return permission; + } + + /** + * @param permission the permission to set + */ + public void setPermission(Permission permission) { + this.permission = permission; + } + /* (non-Javadoc) * @see java.lang.Object#toString() */ diff --git a/schema/src/main/java/com/github/api/v2/schema/Team.java b/schema/src/main/java/com/github/api/v2/schema/Team.java index 16717c6..9a8df34 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Team.java +++ b/schema/src/main/java/com/github/api/v2/schema/Team.java @@ -16,8 +16,10 @@ */ package com.github.api.v2.schema; +import java.util.List; + /** - * The Class Key. + * The Class Team. */ public class Team extends SchemaEntity { @@ -27,11 +29,13 @@ public class Team extends SchemaEntity { /** The id. */ private String id; - /** The title. */ - private String title; + /** The name. */ + private String name; + + /** The permission. */ + private Permission permission; - /** The key. */ - private String key; + private List repoNames; /** * Gets the id. @@ -51,49 +55,46 @@ public String getId() { public void setId(String id) { this.id = id; } - + /** - * Gets the title. - * - * @return the title + * @return the name */ - public String getTitle() { - return title; + public String getName() { + return name; } - + /** - * Sets the title. - * - * @param title - * the new title + * @param name the name to set */ - public void setTitle(String title) { - this.title = title; + public void setName(String name) { + this.name = name; } - + /** - * Gets the key. - * - * @return the key + * @return the permission */ - public String getKey() { - return key; + public Permission getPermission() { + return permission; } - + /** - * Sets the key. - * - * @param key - * the new key + * @param permission the permission to set + */ + public void setPermission(Permission permission) { + this.permission = permission; + } + + /** + * @return the repoNames */ - public void setKey(String key) { - this.key = key; + public List getRepoNames() { + return repoNames; } - /* (non-Javadoc) - * @see java.lang.Object#toString() + + /** + * @param repoNames the repoNames to set */ - @Override - public String toString() { - return "Key [id=" + id + ", key=" + key + ", title=" + title + "]"; + public void setRepoNames(List repoNames) { + this.repoNames = repoNames; } } diff --git a/schema/src/main/java/com/github/api/v2/schema/User.java b/schema/src/main/java/com/github/api/v2/schema/User.java index 6fb3261..450056e 100644 --- a/schema/src/main/java/com/github/api/v2/schema/User.java +++ b/schema/src/main/java/com/github/api/v2/schema/User.java @@ -89,6 +89,8 @@ public class User extends SchemaEntity { /** The plan. */ private Plan plan; + private Permission permission; + /** * Gets the name. * @@ -487,6 +489,21 @@ public String getGravatarId() { public void setGravatarId(String gravatarId) { this.gravatarId = gravatarId; } + + /** + * @return the permission + */ + public Permission getPermission() { + return permission; + } + + /** + * @param permission the permission to set + */ + public void setPermission(Permission permission) { + this.permission = permission; + } + /* (non-Javadoc) * @see java.lang.Object#toString() */ From ec233df02a8bc374be2fe1f7d4383a1330d875d5 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Tue, 21 Dec 2010 12:25:53 +0500 Subject: [PATCH 39/95] Relocated corrupt repository. --- .../example/OrganizationApiSample.java | 70 + pom.xml | 52 +- .../java/com/github/api/v2/schema/Blob.java | 167 ++ .../java/com/github/api/v2/schema/Block.java | 75 + .../com/github/api/v2/schema/Comment.java | 169 ++ .../java/com/github/api/v2/schema/Commit.java | 417 ++++ .../java/com/github/api/v2/schema/Delta.java | 77 + .../java/com/github/api/v2/schema/Feed.java | 94 + .../com/github/api/v2/schema/FeedEntry.java | 118 ++ .../java/com/github/api/v2/schema/Gist.java | 220 ++ .../java/com/github/api/v2/schema/Head.java | 72 + .../java/com/github/api/v2/schema/Id.java | 55 + .../java/com/github/api/v2/schema/Issue.java | 337 ++++ .../java/com/github/api/v2/schema/Key.java | 99 + .../com/github/api/v2/schema/Language.java | 230 +++ .../github/api/v2/schema/NetworkCommit.java | 238 +++ .../com/github/api/v2/schema/NetworkMeta.java | 136 ++ .../com/github/api/v2/schema/NetworkUser.java | 77 + .../github/api/v2/schema/Organization.java | 503 +++++ .../com/github/api/v2/schema/Permission.java | 60 + .../java/com/github/api/v2/schema/Plan.java | 122 ++ .../com/github/api/v2/schema/Repository.java | 686 +++++++ .../github/api/v2/schema/SchemaEntity.java | 33 + .../java/com/github/api/v2/schema/Team.java | 100 + .../java/com/github/api/v2/schema/Tree.java | 179 ++ .../java/com/github/api/v2/schema/User.java | 525 +++++ .../com/github/api/v2/schema/ValueEnum.java | 30 + .../api/v2/services/AsyncResponseHandler.java | 56 + .../github/api/v2/services/CommitService.java | 71 + .../github/api/v2/services/FeedService.java | 38 + .../github/api/v2/services/GistService.java | 60 + .../api/v2/services/GitHubAuthenticator.java | 50 + .../api/v2/services/GitHubCommunicator.java | 58 + .../api/v2/services/GitHubException.java | 63 + .../github/api/v2/services/GitHubService.java | 24 + .../api/v2/services/GitHubServiceFactory.java | 143 ++ .../github/api/v2/services/IssueService.java | 216 ++ .../api/v2/services/NetworkService.java | 72 + .../github/api/v2/services/OAuthService.java | 116 ++ .../github/api/v2/services/ObjectService.java | 87 + .../api/v2/services/OrganizationService.java | 47 + .../api/v2/services/RepositoryService.java | 322 +++ .../github/api/v2/services/UserService.java | 171 ++ .../api/v2/services/auth/Authentication.java | 24 + .../auth/HeaderBasedAuthentication.java | 32 + .../auth/LoginPasswordAuthentication.java | 103 + .../auth/LoginTokenAuthentication.java | 97 + .../v2/services/auth/OAuthAuthentication.java | 71 + .../auth/ParameterBasedAuthentication.java | 32 + .../constant/ApplicationConstants.java | 190 ++ .../v2/services/constant/GitHubApiUrls.java | 653 ++++++ .../v2/services/constant/ParameterNames.java | 167 ++ .../v2/services/impl/BaseGitHubService.java | 232 +++ .../v2/services/impl/CommitServiceImpl.java | 83 + .../api/v2/services/impl/FeedServiceImpl.java | 175 ++ .../api/v2/services/impl/GistServiceImpl.java | 70 + .../v2/services/impl/GitHubApiGateway.java | 545 +++++ .../v2/services/impl/IssueServiceImpl.java | 201 ++ .../v2/services/impl/NetworkServiceImpl.java | 85 + .../v2/services/impl/OAuthServiceImpl.java | 98 + .../v2/services/impl/ObjectServiceImpl.java | 86 + .../impl/OrganizationServiceImpl.java | 199 ++ .../services/impl/RepositoryServiceImpl.java | 382 ++++ .../api/v2/services/impl/UserServiceImpl.java | 243 +++ .../github/api/v2/services/util/Base64.java | 1797 +++++++++++++++++ .../constant/ApplicationConstants.properties | 10 + .../constant/GitHubApiUrls.properties | 118 ++ .../com/github/api/v2/services/AllTests.java | 48 + .../v2/services/BaseGitHubServiceTest.java | 131 ++ .../api/v2/services/CommitServiceTest.java | 91 + .../api/v2/services/FeedServiceTest.java | 120 ++ .../api/v2/services/GistServiceTest.java | 86 + .../api/v2/services/IssueServiceTest.java | 206 ++ .../api/v2/services/NetworkServiceTest.java | 91 + .../api/v2/services/OAuthServiceTest.java | 99 + .../api/v2/services/ObjectServiceTest.java | 99 + .../v2/services/OrganizationServiceTest.java | 139 ++ .../v2/services/RepositoryServiceTest.java | 324 +++ .../api/v2/services/UserServiceTest.java | 206 ++ .../v2/services/constant/TestConstants.java | 147 ++ 80 files changed, 13970 insertions(+), 45 deletions(-) create mode 100644 examples/src/java/com/github/api/v2/services/example/OrganizationApiSample.java create mode 100644 src/main/java/com/github/api/v2/schema/Blob.java create mode 100644 src/main/java/com/github/api/v2/schema/Block.java create mode 100644 src/main/java/com/github/api/v2/schema/Comment.java create mode 100644 src/main/java/com/github/api/v2/schema/Commit.java create mode 100644 src/main/java/com/github/api/v2/schema/Delta.java create mode 100644 src/main/java/com/github/api/v2/schema/Feed.java create mode 100644 src/main/java/com/github/api/v2/schema/FeedEntry.java create mode 100644 src/main/java/com/github/api/v2/schema/Gist.java create mode 100644 src/main/java/com/github/api/v2/schema/Head.java create mode 100644 src/main/java/com/github/api/v2/schema/Id.java create mode 100644 src/main/java/com/github/api/v2/schema/Issue.java create mode 100644 src/main/java/com/github/api/v2/schema/Key.java create mode 100644 src/main/java/com/github/api/v2/schema/Language.java create mode 100644 src/main/java/com/github/api/v2/schema/NetworkCommit.java create mode 100644 src/main/java/com/github/api/v2/schema/NetworkMeta.java create mode 100644 src/main/java/com/github/api/v2/schema/NetworkUser.java create mode 100644 src/main/java/com/github/api/v2/schema/Organization.java create mode 100644 src/main/java/com/github/api/v2/schema/Permission.java create mode 100644 src/main/java/com/github/api/v2/schema/Plan.java create mode 100644 src/main/java/com/github/api/v2/schema/Repository.java create mode 100644 src/main/java/com/github/api/v2/schema/SchemaEntity.java create mode 100644 src/main/java/com/github/api/v2/schema/Team.java create mode 100644 src/main/java/com/github/api/v2/schema/Tree.java create mode 100644 src/main/java/com/github/api/v2/schema/User.java create mode 100644 src/main/java/com/github/api/v2/schema/ValueEnum.java create mode 100644 src/main/java/com/github/api/v2/services/AsyncResponseHandler.java create mode 100644 src/main/java/com/github/api/v2/services/CommitService.java create mode 100644 src/main/java/com/github/api/v2/services/FeedService.java create mode 100644 src/main/java/com/github/api/v2/services/GistService.java create mode 100644 src/main/java/com/github/api/v2/services/GitHubAuthenticator.java create mode 100644 src/main/java/com/github/api/v2/services/GitHubCommunicator.java create mode 100644 src/main/java/com/github/api/v2/services/GitHubException.java create mode 100644 src/main/java/com/github/api/v2/services/GitHubService.java create mode 100644 src/main/java/com/github/api/v2/services/GitHubServiceFactory.java create mode 100644 src/main/java/com/github/api/v2/services/IssueService.java create mode 100644 src/main/java/com/github/api/v2/services/NetworkService.java create mode 100644 src/main/java/com/github/api/v2/services/OAuthService.java create mode 100644 src/main/java/com/github/api/v2/services/ObjectService.java create mode 100644 src/main/java/com/github/api/v2/services/OrganizationService.java create mode 100644 src/main/java/com/github/api/v2/services/RepositoryService.java create mode 100644 src/main/java/com/github/api/v2/services/UserService.java create mode 100644 src/main/java/com/github/api/v2/services/auth/Authentication.java create mode 100644 src/main/java/com/github/api/v2/services/auth/HeaderBasedAuthentication.java create mode 100644 src/main/java/com/github/api/v2/services/auth/LoginPasswordAuthentication.java create mode 100644 src/main/java/com/github/api/v2/services/auth/LoginTokenAuthentication.java create mode 100644 src/main/java/com/github/api/v2/services/auth/OAuthAuthentication.java create mode 100644 src/main/java/com/github/api/v2/services/auth/ParameterBasedAuthentication.java create mode 100644 src/main/java/com/github/api/v2/services/constant/ApplicationConstants.java create mode 100644 src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java create mode 100644 src/main/java/com/github/api/v2/services/constant/ParameterNames.java create mode 100644 src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java create mode 100644 src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java create mode 100644 src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java create mode 100644 src/main/java/com/github/api/v2/services/impl/GistServiceImpl.java create mode 100644 src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java create mode 100644 src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java create mode 100644 src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java create mode 100644 src/main/java/com/github/api/v2/services/impl/OAuthServiceImpl.java create mode 100644 src/main/java/com/github/api/v2/services/impl/ObjectServiceImpl.java create mode 100644 src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java create mode 100644 src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java create mode 100644 src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java create mode 100644 src/main/java/com/github/api/v2/services/util/Base64.java create mode 100644 src/main/resources/com/github/api/v2/services/constant/ApplicationConstants.properties create mode 100644 src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties create mode 100644 src/test/java/com/github/api/v2/services/AllTests.java create mode 100644 src/test/java/com/github/api/v2/services/BaseGitHubServiceTest.java create mode 100644 src/test/java/com/github/api/v2/services/CommitServiceTest.java create mode 100644 src/test/java/com/github/api/v2/services/FeedServiceTest.java create mode 100644 src/test/java/com/github/api/v2/services/GistServiceTest.java create mode 100644 src/test/java/com/github/api/v2/services/IssueServiceTest.java create mode 100644 src/test/java/com/github/api/v2/services/NetworkServiceTest.java create mode 100644 src/test/java/com/github/api/v2/services/OAuthServiceTest.java create mode 100644 src/test/java/com/github/api/v2/services/ObjectServiceTest.java create mode 100644 src/test/java/com/github/api/v2/services/OrganizationServiceTest.java create mode 100644 src/test/java/com/github/api/v2/services/RepositoryServiceTest.java create mode 100644 src/test/java/com/github/api/v2/services/UserServiceTest.java create mode 100644 src/test/java/com/github/api/v2/services/constant/TestConstants.java diff --git a/examples/src/java/com/github/api/v2/services/example/OrganizationApiSample.java b/examples/src/java/com/github/api/v2/services/example/OrganizationApiSample.java new file mode 100644 index 0000000..64117ae --- /dev/null +++ b/examples/src/java/com/github/api/v2/services/example/OrganizationApiSample.java @@ -0,0 +1,70 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.example; + +import java.util.List; + +import com.github.api.v2.schema.Organization; +import com.github.api.v2.schema.Repository; +import com.github.api.v2.schema.User; +import com.github.api.v2.services.GitHubServiceFactory; +import com.github.api.v2.services.OrganizationService; + +/** + * The Class OrganizationApiSample. + */ +public class OrganizationApiSample { + + /** + * The main method. + * + * @param args + * the arguments + */ + public static void main(String[] args) throws Exception { + GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); + OrganizationService service = factory.createOrganizationService(); + Organization organization = service.getOrganization("github"); + printResult(organization); + List publicMembers = service.getPublicMembers("github"); + for (User user : publicMembers) { + printResult(user); + } + List publicRepositories = service.getPublicRepositories("github"); + for (Repository repository : publicRepositories) { + printResult(repository); + } + } + + private static void printResult(Repository repository) { + System.out.println(repository); + } + + private static void printResult(User user) { + System.out.println(user); + } + + /** + * Prints the result. + * + * @param organization + * the repository + */ + private static void printResult(Organization organization) { + System.out.println(organization); + } +} diff --git a/pom.xml b/pom.xml index 079b739..f66491d 100644 --- a/pom.xml +++ b/pom.xml @@ -1,48 +1,10 @@ 4.0.0 - com.github.api.v2 - github-java-sdk - pom - 0.1 - GitHub API Java SDK - 2010 - A Java wrapper for GitHub API. - http://github.com/nabeelmukhtar/github-java-sdk - - - github - http://github.com/nabeelmukhtar/github-java-sdk/issues - - - - scm:git:git://github.com/nabeelmukhtar/github-java-sdk.git - scm:git:git@github.com:nabeelmukhtar/github-java-sdk.git - https://nabeelmukhtar@github.com/nabeelmukhtar/github-java-sdk.git - - - - - Nabeel Mukhtar - nabeelmukhtar - - - - - schema - core - dist - - - - - org.apache.maven.plugins - maven-compiler-plugin - 2.3.1 - - 1.6 - 1.6 - - - - + + com.github.api.v2 + github-java-sdk + 0.1 + + github-java-schema + jar \ No newline at end of file diff --git a/src/main/java/com/github/api/v2/schema/Blob.java b/src/main/java/com/github/api/v2/schema/Blob.java new file mode 100644 index 0000000..7908fc2 --- /dev/null +++ b/src/main/java/com/github/api/v2/schema/Blob.java @@ -0,0 +1,167 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +/** + * The Class Blob. + */ +public class Blob extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** The name. */ + private String name; + + /** The size. */ + private int size; + + /** The sha. */ + private String sha; + + /** The mode. */ + private String mode; + + /** The mime type. */ + private String mimeType; + + /** The data. */ + private String data; + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Sets the name. + * + * @param name + * the new name + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the size. + * + * @return the size + */ + public int getSize() { + return size; + } + + /** + * Sets the size. + * + * @param size + * the new size + */ + public void setSize(int size) { + this.size = size; + } + + /** + * Gets the sha. + * + * @return the sha + */ + public String getSha() { + return sha; + } + + /** + * Sets the sha. + * + * @param sha + * the new sha + */ + public void setSha(String sha) { + this.sha = sha; + } + + /** + * Gets the mode. + * + * @return the mode + */ + public String getMode() { + return mode; + } + + /** + * Sets the mode. + * + * @param mode + * the new mode + */ + public void setMode(String mode) { + this.mode = mode; + } + + /** + * Gets the mime type. + * + * @return the mime type + */ + public String getMimeType() { + return mimeType; + } + + /** + * Sets the mime type. + * + * @param mimeType + * the new mime type + */ + public void setMimeType(String mimeType) { + this.mimeType = mimeType; + } + + /** + * Gets the data. + * + * @return the data + */ + public String getData() { + return data; + } + + /** + * Sets the data. + * + * @param data + * the new data + */ + public void setData(String data) { + this.data = data; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Blob [data=" + data + ", mimeType=" + mimeType + ", mode=" + + mode + ", name=" + name + ", sha=" + sha + ", size=" + size + + "]"; + } +} diff --git a/src/main/java/com/github/api/v2/schema/Block.java b/src/main/java/com/github/api/v2/schema/Block.java new file mode 100644 index 0000000..6d3e33d --- /dev/null +++ b/src/main/java/com/github/api/v2/schema/Block.java @@ -0,0 +1,75 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +/** + * The Class Id. + */ +public class Block extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** The id. */ + private String name; + private int start; + private int count; + /** + * @return the name + */ + public String getName() { + return name; + } + /** + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + /** + * @return the start + */ + public int getStart() { + return start; + } + /** + * @param start the start to set + */ + public void setStart(int start) { + this.start = start; + } + /** + * @return the count + */ + public int getCount() { + return count; + } + /** + * @param count the count to set + */ + public void setCount(int count) { + this.count = count; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Block [count=" + count + ", name=" + name + ", start=" + start + + "]"; + } +} diff --git a/src/main/java/com/github/api/v2/schema/Comment.java b/src/main/java/com/github/api/v2/schema/Comment.java new file mode 100644 index 0000000..465dff0 --- /dev/null +++ b/src/main/java/com/github/api/v2/schema/Comment.java @@ -0,0 +1,169 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +import java.util.Date; + +/** + * The Class Comment. + */ +public class Comment extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** The created at. */ + private Date createdAt; + + /** The body. */ + private String body; + + /** The updated at. */ + private Date updatedAt; + + /** The id. */ + private long id; + + /** The user. */ + private String user; + + /** The gravatar id. */ + private String gravatarId; + + /** + * Gets the created at. + * + * @return the created at + */ + public Date getCreatedAt() { + return createdAt; + } + + /** + * Sets the created at. + * + * @param createdAt + * the new created at + */ + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + /** + * Gets the body. + * + * @return the body + */ + public String getBody() { + return body; + } + + /** + * Sets the body. + * + * @param body + * the new body + */ + public void setBody(String body) { + this.body = body; + } + + /** + * Gets the updated at. + * + * @return the updated at + */ + public Date getUpdatedAt() { + return updatedAt; + } + + /** + * Sets the updated at. + * + * @param updatedAt + * the new updated at + */ + public void setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + } + + /** + * Gets the id. + * + * @return the id + */ + public long getId() { + return id; + } + + /** + * Sets the id. + * + * @param id + * the new id + */ + public void setId(long id) { + this.id = id; + } + + /** + * Gets the user. + * + * @return the user + */ + public String getUser() { + return user; + } + + /** + * Sets the user. + * + * @param user + * the new user + */ + public void setUser(String user) { + this.user = user; + } + + /** + * Gets the gravatar id. + * + * @return the gravatar id + */ + public String getGravatarId() { + return gravatarId; + } + + /** + * Sets the gravatar id. + * + * @param gravatarId + * the new gravatar id + */ + public void setGravatarId(String gravatarId) { + this.gravatarId = gravatarId; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Comment [body=" + body + ", createdAt=" + createdAt + + ", gravatarId=" + gravatarId + ", id=" + id + ", updatedAt=" + + updatedAt + ", user=" + user + "]"; + } +} diff --git a/src/main/java/com/github/api/v2/schema/Commit.java b/src/main/java/com/github/api/v2/schema/Commit.java new file mode 100644 index 0000000..1b58854 --- /dev/null +++ b/src/main/java/com/github/api/v2/schema/Commit.java @@ -0,0 +1,417 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +import java.util.Date; +import java.util.List; + +/** + * The Class Commit. + */ +public class Commit extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** The message. */ + private String message; + + /** The time. */ + private long time; + + /** The parents. */ + private List parents; + + /** The date. */ + private Date date; + + /** The author. */ + private User author; + + /** The id. */ + private String id; + + /** The space. */ + private int space; + + /** The gravatar. */ + private String gravatar; + + /** The login. */ + private String login; + + /** The url. */ + private String url; + + /** The committed date. */ + private Date committedDate; + + /** The authored date. */ + private Date authoredDate; + + /** The tree. */ + private String tree; + + /** The committer. */ + private User committer; + + /** The added. */ + private List added; + + /** The removed. */ + private List removed; + + /** The modified. */ + private List modified; + + /** + * Gets the message. + * + * @return the message + */ + public String getMessage() { + return message; + } + + /** + * Sets the message. + * + * @param message + * the new message + */ + public void setMessage(String message) { + this.message = message; + } + + /** + * Gets the time. + * + * @return the time + */ + public long getTime() { + return time; + } + + /** + * Sets the time. + * + * @param time + * the new time + */ + public void setTime(long time) { + this.time = time; + } + + /** + * Gets the parents. + * + * @return the parents + */ + public List getParents() { + return parents; + } + + /** + * Sets the parents. + * + * @param parents + * the new parents + */ + public void setParents(List parents) { + this.parents = parents; + } + + /** + * Gets the date. + * + * @return the date + */ + public Date getDate() { + return date; + } + + /** + * Sets the date. + * + * @param date + * the new date + */ + public void setDate(Date date) { + this.date = date; + } + + /** + * Gets the author. + * + * @return the author + */ + public User getAuthor() { + return author; + } + + /** + * Sets the author. + * + * @param author + * the new author + */ + public void setAuthor(User author) { + this.author = author; + } + + /** + * Gets the id. + * + * @return the id + */ + public String getId() { + return id; + } + + /** + * Sets the id. + * + * @param id + * the new id + */ + public void setId(String id) { + this.id = id; + } + + /** + * Gets the space. + * + * @return the space + */ + public int getSpace() { + return space; + } + + /** + * Sets the space. + * + * @param space + * the new space + */ + public void setSpace(int space) { + this.space = space; + } + + /** + * Gets the gravatar. + * + * @return the gravatar + */ + public String getGravatar() { + return gravatar; + } + + /** + * Sets the gravatar. + * + * @param gravatar + * the new gravatar + */ + public void setGravatar(String gravatar) { + this.gravatar = gravatar; + } + + /** + * Gets the login. + * + * @return the login + */ + public String getLogin() { + return login; + } + + /** + * Sets the login. + * + * @param login + * the new login + */ + public void setLogin(String login) { + this.login = login; + } + + /** + * Gets the url. + * + * @return the url + */ + public String getUrl() { + return url; + } + + /** + * Sets the url. + * + * @param url + * the new url + */ + public void setUrl(String url) { + this.url = url; + } + + /** + * Gets the committed date. + * + * @return the committed date + */ + public Date getCommittedDate() { + return committedDate; + } + + /** + * Sets the committed date. + * + * @param committedDate + * the new committed date + */ + public void setCommittedDate(Date committedDate) { + this.committedDate = committedDate; + } + + /** + * Gets the authored date. + * + * @return the authored date + */ + public Date getAuthoredDate() { + return authoredDate; + } + + /** + * Sets the authored date. + * + * @param authoredDate + * the new authored date + */ + public void setAuthoredDate(Date authoredDate) { + this.authoredDate = authoredDate; + } + + /** + * Gets the tree. + * + * @return the tree + */ + public String getTree() { + return tree; + } + + /** + * Sets the tree. + * + * @param tree + * the new tree + */ + public void setTree(String tree) { + this.tree = tree; + } + + /** + * Gets the committer. + * + * @return the committer + */ + public User getCommitter() { + return committer; + } + + /** + * Sets the committer. + * + * @param committer + * the new committer + */ + public void setCommitter(User committer) { + this.committer = committer; + } + + /** + * Gets the added. + * + * @return the added + */ + public List getAdded() { + return added; + } + + /** + * Sets the added. + * + * @param added + * the new added + */ + public void setAdded(List added) { + this.added = added; + } + + /** + * Gets the removed. + * + * @return the removed + */ + public List getRemoved() { + return removed; + } + + /** + * Sets the removed. + * + * @param removed + * the new removed + */ + public void setRemoved(List removed) { + this.removed = removed; + } + + /** + * Gets the modified. + * + * @return the modified + */ + public List getModified() { + return modified; + } + + /** + * Sets the modified. + * + * @param modified + * the new modified + */ + public void setModified(List modified) { + this.modified = modified; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Commit [added=" + added + ", author=" + author + + ", authoredDate=" + authoredDate + ", committedDate=" + + committedDate + ", committer=" + committer + ", date=" + date + + ", gravatar=" + gravatar + ", id=" + id + ", login=" + login + + ", message=" + message + ", modified=" + modified + + ", parents=" + parents + ", removed=" + removed + ", space=" + + space + ", time=" + time + ", tree=" + tree + ", url=" + url + + "]"; + } +} diff --git a/src/main/java/com/github/api/v2/schema/Delta.java b/src/main/java/com/github/api/v2/schema/Delta.java new file mode 100644 index 0000000..1fb83d2 --- /dev/null +++ b/src/main/java/com/github/api/v2/schema/Delta.java @@ -0,0 +1,77 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +/** + * The Class Delta. + */ +public class Delta extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = -1779660351774171098L; + + /** The diff. */ + private String diff; + + /** The filename. */ + private String filename; + + /** + * Gets the diff. + * + * @return the diff + */ + public String getDiff() { + return diff; + } + + /** + * Sets the diff. + * + * @param diff + * the new diff + */ + public void setDiff(String diff) { + this.diff = diff; + } + + /** + * Gets the filename. + * + * @return the filename + */ + public String getFilename() { + return filename; + } + + /** + * Sets the filename. + * + * @param filename + * the new filename + */ + public void setFilename(String filename) { + this.filename = filename; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Delta [diff=" + diff + ", filename=" + filename + "]"; + } +} diff --git a/src/main/java/com/github/api/v2/schema/Feed.java b/src/main/java/com/github/api/v2/schema/Feed.java new file mode 100644 index 0000000..728f7cc --- /dev/null +++ b/src/main/java/com/github/api/v2/schema/Feed.java @@ -0,0 +1,94 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +import java.util.List; + +/** + * The Class Feed. + */ +public class Feed extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + private String title; + private String link; + private String author; + private String description; + private List entries; + /** + * @return the title + */ + public String getTitle() { + return title; + } + /** + * @param title the title to set + */ + public void setTitle(String title) { + this.title = title; + } + /** + * @return the link + */ + public String getLink() { + return link; + } + /** + * @param link the link to set + */ + public void setLink(String link) { + this.link = link; + } + /** + * @return the author + */ + public String getAuthor() { + return author; + } + /** + * @param author the author to set + */ + public void setAuthor(String author) { + this.author = author; + } + /** + * @return the description + */ + public String getDescription() { + return description; + } + /** + * @param description the description to set + */ + public void setDescription(String description) { + this.description = description; + } + /** + * @return the entries + */ + public List getEntries() { + return entries; + } + /** + * @param entries the entries to set + */ + public void setEntries(List entries) { + this.entries = entries; + } +} diff --git a/src/main/java/com/github/api/v2/schema/FeedEntry.java b/src/main/java/com/github/api/v2/schema/FeedEntry.java new file mode 100644 index 0000000..4a81900 --- /dev/null +++ b/src/main/java/com/github/api/v2/schema/FeedEntry.java @@ -0,0 +1,118 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +import java.util.Date; +import java.util.List; + +/** + * The Class FeedEntry. + */ +public class FeedEntry extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + private String title; + private String link; + private String author; + private Date publishedDate; + private String content; + private List categories; + /** + * @return the title + */ + public String getTitle() { + return title; + } + /** + * @param title the title to set + */ + public void setTitle(String title) { + this.title = title; + } + /** + * @return the link + */ + public String getLink() { + return link; + } + /** + * @param link the link to set + */ + public void setLink(String link) { + this.link = link; + } + /** + * @return the author + */ + public String getAuthor() { + return author; + } + /** + * @param author the author to set + */ + public void setAuthor(String author) { + this.author = author; + } + /** + * @return the publishedDate + */ + public Date getPublishedDate() { + return publishedDate; + } + /** + * @param publishedDate the publishedDate to set + */ + public void setPublishedDate(Date publishedDate) { + this.publishedDate = publishedDate; + } + /** + * @return the content + */ + public String getContent() { + return content; + } + /** + * @param content the content to set + */ + public void setContent(String content) { + this.content = content; + } + /** + * @return the categories + */ + public List getCategories() { + return categories; + } + /** + * @param categories the categories to set + */ + public void setCategories(List categories) { + this.categories = categories; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "FeedEntry [author=" + author + ", categories=" + categories + + ", content=" + content + + ", link=" + link + ", publishedDate=" + publishedDate + + ", title=" + title + "]"; + } +} diff --git a/src/main/java/com/github/api/v2/schema/Gist.java b/src/main/java/com/github/api/v2/schema/Gist.java new file mode 100644 index 0000000..a4bba5c --- /dev/null +++ b/src/main/java/com/github/api/v2/schema/Gist.java @@ -0,0 +1,220 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * The Class Gist. + */ +public class Gist extends SchemaEntity { + + /** + * The Enum Visibility. + */ + public enum Visibility implements ValueEnum { + + /** The PUBLIC. */ + PUBLIC("public"), + /** The PRIVATE. */ + PRIVATE("private"); + + /** The Constant stringToEnum. */ + private static final Map stringToEnum = new HashMap(); + + static { // Initialize map from constant name to enum constant + for (Visibility op : values()) { + stringToEnum.put(op.value(), op); + } + } + + /** The value. */ + private final String value; + + /** + * Instantiates a new visibility. + * + * @param value + * the value + */ + Visibility(String value) { + this.value = value; + } + + /* (non-Javadoc) + * @see com.github.api.v2.schema.ValueEnum#value() + */ + @Override + public String value() { + return value; + } + + /** + * From value. + * + * @param value + * the value + * + * @return the visibility + */ + public static Visibility fromValue(String value) { + return stringToEnum.get(value); + } + } + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** The description. */ + private String description; + + /** The repo. */ + private String repo; + + /** The visibility. */ + private Visibility visibility; + + /** The created at. */ + private Date createdAt; + + /** The files. */ + private List files; + + private String owner; + + /** + * Gets the description. + * + * @return the description + */ + public String getDescription() { + return description; + } + + /** + * Sets the description. + * + * @param description + * the new description + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * Gets the repo. + * + * @return the repo + */ + public String getRepo() { + return repo; + } + + /** + * Sets the repo. + * + * @param repo + * the new repo + */ + public void setRepo(String repo) { + this.repo = repo; + } + + /** + * Gets the visibility. + * + * @return the visibility + */ + public Visibility getVisibility() { + return visibility; + } + + /** + * Sets the visibility. + * + * @param visibility + * the new visibility + */ + public void setVisibility(Visibility visibility) { + this.visibility = visibility; + } + + /** + * Gets the created at. + * + * @return the created at + */ + public Date getCreatedAt() { + return createdAt; + } + + /** + * Sets the created at. + * + * @param createdAt + * the new created at + */ + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + /** + * Gets the files. + * + * @return the files + */ + public List getFiles() { + return files; + } + + /** + * Sets the files. + * + * @param files + * the new files + */ + public void setFiles(List files) { + this.files = files; + } + + /** + * @return the owner + */ + public String getOwner() { + return owner; + } + + /** + * @param owner the owner to set + */ + public void setOwner(String owner) { + this.owner = owner; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Gist [createdAt=" + createdAt + ", description=" + description + + ", files=" + files + ", repo=" + repo + ", visibility=" + + visibility + ", owner=" + owner + "]"; + } +} diff --git a/src/main/java/com/github/api/v2/schema/Head.java b/src/main/java/com/github/api/v2/schema/Head.java new file mode 100644 index 0000000..db85d1a --- /dev/null +++ b/src/main/java/com/github/api/v2/schema/Head.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +/** + * The Class Id. + */ +public class Head extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** The id. */ + private String id; + + private String name; + + + /** + * @return the name + */ + public String getName() { + return name; + } + + /** + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the id. + * + * @return the id + */ + public String getId() { + return id; + } + + /** + * Sets the id. + * + * @param id + * the new id + */ + public void setId(String id) { + this.id = id; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Id [id=" + id + "][name=" + name + "]"; + } +} diff --git a/src/main/java/com/github/api/v2/schema/Id.java b/src/main/java/com/github/api/v2/schema/Id.java new file mode 100644 index 0000000..93730d0 --- /dev/null +++ b/src/main/java/com/github/api/v2/schema/Id.java @@ -0,0 +1,55 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +/** + * The Class Id. + */ +public class Id extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** The id. */ + private String id; + + /** + * Gets the id. + * + * @return the id + */ + public String getId() { + return id; + } + + /** + * Sets the id. + * + * @param id + * the new id + */ + public void setId(String id) { + this.id = id; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Id [id=" + id + "]"; + } +} diff --git a/src/main/java/com/github/api/v2/schema/Issue.java b/src/main/java/com/github/api/v2/schema/Issue.java new file mode 100644 index 0000000..3635538 --- /dev/null +++ b/src/main/java/com/github/api/v2/schema/Issue.java @@ -0,0 +1,337 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * The Class Issue. + */ +public class Issue extends SchemaEntity { + + /** + * The Enum State. + */ + public enum State implements ValueEnum { + + /** The OPEN. */ + OPEN("open"), + + /** The CLOSED. */ + CLOSED("closed"); + + /** The Constant stringToEnum. */ + private static final Map stringToEnum = new HashMap(); + + static { // Initialize map from constant name to enum constant + for (State op : values()) { + stringToEnum.put(op.value(), op); + } + } + + /** The value. */ + private final String value; + + /** + * Instantiates a new state. + * + * @param value + * the value + */ + State(String value) { + this.value = value; + } + + /* (non-Javadoc) + * @see com.github.api.v2.schema.ValueEnum#value() + */ + @Override + public String value() { + return value; + } + + /** + * From value. + * + * @param value + * the value + * + * @return the state + */ + public static State fromValue(String value) { + return stringToEnum.get(value); + } + } + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** The user. */ + private String user; + + /** The gravatar id. */ + private String gravatarId; + + /** The updated at. */ + private Date updatedAt; + + /** The votes. */ + private int votes; + + /** The number. */ + private int number; + + /** The comments. */ + private int comments; + + /** The position. */ + private double position; + + /** The title. */ + private String title; + + /** The body. */ + private String body; + + /** The state. */ + private State state; + + /** The created at. */ + private Date createdAt; + + /** + * Gets the user. + * + * @return the user + */ + public String getUser() { + return user; + } + + /** + * Sets the user. + * + * @param user + * the new user + */ + public void setUser(String user) { + this.user = user; + } + + /** + * Gets the gravatar id. + * + * @return the gravatar id + */ + public String getGravatarId() { + return gravatarId; + } + + /** + * Sets the gravatar id. + * + * @param gravatarId + * the new gravatar id + */ + public void setGravatarId(String gravatarId) { + this.gravatarId = gravatarId; + } + + /** + * Gets the updated at. + * + * @return the updated at + */ + public Date getUpdatedAt() { + return updatedAt; + } + + /** + * Sets the updated at. + * + * @param updatedAt + * the new updated at + */ + public void setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + } + + /** + * Gets the votes. + * + * @return the votes + */ + public int getVotes() { + return votes; + } + + /** + * Sets the votes. + * + * @param votes + * the new votes + */ + public void setVotes(int votes) { + this.votes = votes; + } + + /** + * Gets the number. + * + * @return the number + */ + public int getNumber() { + return number; + } + + /** + * Sets the number. + * + * @param number + * the new number + */ + public void setNumber(int number) { + this.number = number; + } + + /** + * Gets the position. + * + * @return the position + */ + public double getPosition() { + return position; + } + + /** + * Sets the position. + * + * @param position + * the new position + */ + public void setPosition(double position) { + this.position = position; + } + + /** + * Gets the title. + * + * @return the title + */ + public String getTitle() { + return title; + } + + /** + * Sets the title. + * + * @param title + * the new title + */ + public void setTitle(String title) { + this.title = title; + } + + /** + * Gets the body. + * + * @return the body + */ + public String getBody() { + return body; + } + + /** + * Sets the body. + * + * @param body + * the new body + */ + public void setBody(String body) { + this.body = body; + } + + /** + * Gets the state. + * + * @return the state + */ + public State getState() { + return state; + } + + /** + * Sets the state. + * + * @param state + * the new state + */ + public void setState(State state) { + this.state = state; + } + + /** + * Gets the created at. + * + * @return the created at + */ + public Date getCreatedAt() { + return createdAt; + } + + /** + * Sets the created at. + * + * @param createdAt + * the new created at + */ + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + /** + * Gets the comments. + * + * @return the comments + */ + public int getComments() { + return comments; + } + + /** + * Sets the comments. + * + * @param comments + * the new comments + */ + public void setComments(int comments) { + this.comments = comments; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Issue [body=" + body + ", comments=" + comments + + ", createdAt=" + createdAt + ", gravatarId=" + gravatarId + + ", number=" + number + ", position=" + position + ", state=" + + state + ", title=" + title + ", updatedAt=" + updatedAt + + ", user=" + user + ", votes=" + votes + "]"; + } +} diff --git a/src/main/java/com/github/api/v2/schema/Key.java b/src/main/java/com/github/api/v2/schema/Key.java new file mode 100644 index 0000000..e0b731a --- /dev/null +++ b/src/main/java/com/github/api/v2/schema/Key.java @@ -0,0 +1,99 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +/** + * The Class Key. + */ +public class Key extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** The id. */ + private String id; + + /** The title. */ + private String title; + + /** The key. */ + private String key; + + /** + * Gets the id. + * + * @return the id + */ + public String getId() { + return id; + } + + /** + * Sets the id. + * + * @param id + * the new id + */ + public void setId(String id) { + this.id = id; + } + + /** + * Gets the title. + * + * @return the title + */ + public String getTitle() { + return title; + } + + /** + * Sets the title. + * + * @param title + * the new title + */ + public void setTitle(String title) { + this.title = title; + } + + /** + * Gets the key. + * + * @return the key + */ + public String getKey() { + return key; + } + + /** + * Sets the key. + * + * @param key + * the new key + */ + public void setKey(String key) { + this.key = key; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Key [id=" + id + ", key=" + key + ", title=" + title + "]"; + } +} diff --git a/src/main/java/com/github/api/v2/schema/Language.java b/src/main/java/com/github/api/v2/schema/Language.java new file mode 100644 index 0000000..aa089e8 --- /dev/null +++ b/src/main/java/com/github/api/v2/schema/Language.java @@ -0,0 +1,230 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +import java.util.HashMap; +import java.util.Map; + +/** + * The Enum Language. + */ +public enum Language implements ValueEnum { + + /** The Action script. */ + ActionScript("ActionScript"), + + /** The Arc. */ + Arc("Arc"), + + /** The ASP. */ + ASP("ASP"), + + /** The Assembly. */ + Assembly("Assembly"), + + /** The Boo. */ + Boo("Boo"), + + /** The C. */ + C("C"), + + /** The C_ sharp. */ + C_SHARP("C#"), + + /** The CPP. */ + CPP("C++"), + + /** The Clojure. */ + Clojure("Clojure"), + + /** The Coffee script. */ + CoffeeScript("CoffeeScript"), + + /** The Cold fusion. */ + ColdFusion("ColdFusion"), + + /** The Common lisp. */ + CommonLisp("Common Lisp"), + + /** The D. */ + D("D"), + + /** The Delphi. */ + Delphi("Delphi"), + + /** The Duby. */ + Duby("Duby"), + + /** The Eiffel. */ + Eiffel("Eiffel"), + + /** The Emacs lisp. */ + EmacsLisp("Emacs Lisp"), + + /** The Erlang. */ + Erlang("Erlang"), + + /** The F_ sharp. */ + F_SHARP("F#"), + + /** The FORTRAN. */ + FORTRAN("FORTRAN"), + + /** The Go. */ + Go("Go"), + + /** The Groovy. */ + Groovy("Groovy"), + + /** The Haskell. */ + Haskell("Haskell"), + + /** The Ha xe. */ + HaXe("HaXe"), + + /** The Io. */ + Io("Io"), + + /** The Java. */ + Java("Java"), + + /** The Java script. */ + JavaScript("JavaScript"), + + /** The Lua. */ + Lua("Lua"), + + /** The Max_ msp. */ + Max_MSP("Max/MSP"), + + /** The Nu. */ + Nu("Nu"), + + /** The Objective_ c. */ + Objective_C("Objective-C"), + + /** The Objective_ j. */ + Objective_J("Objective-J"), + + /** The O caml. */ + OCaml("OCaml"), + + /** The ooc. */ + ooc("ooc"), + + /** The Perl. */ + Perl("Perl"), + + /** The PHP. */ + PHP("PHP"), + + /** The Pure_ data. */ + Pure_Data("Pure Data"), + + /** The Python. */ + Python("Python"), + + /** The R. */ + R("R"), + + /** The Racket. */ + Racket("Racket"), + + /** The Ruby. */ + Ruby("Ruby"), + + /** The Scala. */ + Scala("Scala"), + + /** The Scheme. */ + Scheme("Scheme"), + + /** The sclang. */ + sclang("sclang"), + + /** The Self. */ + Self("Self"), + + /** The Shell. */ + Shell("Shell"), + + /** The Smalltalk. */ + Smalltalk("Smalltalk"), + + /** The Super collider. */ + SuperCollider("SuperCollider"), + + /** The Tcl. */ + Tcl("Tcl"), + + /** The Vala. */ + Vala("Vala"), + + /** The Verilog. */ + Verilog("Verilog"), + + /** The VHDL. */ + VHDL("VHDL"), + + /** The Vim l. */ + VimL("VimL"), + + /** The Visual basic. */ + VisualBasic("Visual Basic"); + + /** The Constant stringToEnum. */ + private static final Map stringToEnum = new HashMap(); + + static { // Initialize map from constant name to enum constant + for (Language op : values()) { + stringToEnum.put(op.value(), op); + } + } + + /** The value. */ + private final String value; + + /** + * Instantiates a new language. + * + * @param value + * the value + */ + Language(String value) { + this.value = value; + } + + /* (non-Javadoc) + * @see com.github.api.v2.schema.ValueEnum#value() + */ + @Override + public String value() { + return value; + } + + /** + * From value. + * + * @param value + * the value + * + * @return the language + */ + public static Language fromValue(String value) { + return stringToEnum.get(value); + } +} diff --git a/src/main/java/com/github/api/v2/schema/NetworkCommit.java b/src/main/java/com/github/api/v2/schema/NetworkCommit.java new file mode 100644 index 0000000..184f811 --- /dev/null +++ b/src/main/java/com/github/api/v2/schema/NetworkCommit.java @@ -0,0 +1,238 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +import java.util.Date; +import java.util.List; + +/** + * The Class Commit. + */ +public class NetworkCommit extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** The message. */ + private String message; + + /** The time. */ + private long time; + + /** The parents. */ + private List> parents; + + /** The date. */ + private Date date; + + /** The author. */ + private String author; + + /** The id. */ + private String id; + + /** The space. */ + private int space; + + /** The gravatar. */ + private String gravatar; + + /** The login. */ + private String login; + + /** + * Gets the message. + * + * @return the message + */ + public String getMessage() { + return message; + } + + /** + * Sets the message. + * + * @param message + * the new message + */ + public void setMessage(String message) { + this.message = message; + } + + /** + * Gets the time. + * + * @return the time + */ + public long getTime() { + return time; + } + + /** + * Sets the time. + * + * @param time + * the new time + */ + public void setTime(long time) { + this.time = time; + } + + /** + * Gets the parents. + * + * @return the parents + */ + public List> getParents() { + return parents; + } + + /** + * Sets the parents. + * + * @param parents + * the new parents + */ + public void setParents(List> parents) { + this.parents = parents; + } + + /** + * Gets the date. + * + * @return the date + */ + public Date getDate() { + return date; + } + + /** + * Sets the date. + * + * @param date + * the new date + */ + public void setDate(Date date) { + this.date = date; + } + + /** + * Gets the author. + * + * @return the author + */ + public String getAuthor() { + return author; + } + + /** + * Sets the author. + * + * @param author + * the new author + */ + public void setAuthor(String author) { + this.author = author; + } + + /** + * Gets the id. + * + * @return the id + */ + public String getId() { + return id; + } + + /** + * Sets the id. + * + * @param id + * the new id + */ + public void setId(String id) { + this.id = id; + } + + /** + * Gets the space. + * + * @return the space + */ + public int getSpace() { + return space; + } + + /** + * Sets the space. + * + * @param space + * the new space + */ + public void setSpace(int space) { + this.space = space; + } + + /** + * Gets the gravatar. + * + * @return the gravatar + */ + public String getGravatar() { + return gravatar; + } + + /** + * Sets the gravatar. + * + * @param gravatar + * the new gravatar + */ + public void setGravatar(String gravatar) { + this.gravatar = gravatar; + } + + /** + * Gets the login. + * + * @return the login + */ + public String getLogin() { + return login; + } + + /** + * Sets the login. + * + * @param login + * the new login + */ + public void setLogin(String login) { + this.login = login; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "NetworkCommit [author=" + author + ", date=" + date + + ", gravatar=" + gravatar + ", id=" + id + ", login=" + login + + ", message=" + message + ", parents=" + parents + ", space=" + + space + ", time=" + time + "]"; + } +} diff --git a/src/main/java/com/github/api/v2/schema/NetworkMeta.java b/src/main/java/com/github/api/v2/schema/NetworkMeta.java new file mode 100644 index 0000000..d2b4974 --- /dev/null +++ b/src/main/java/com/github/api/v2/schema/NetworkMeta.java @@ -0,0 +1,136 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +import java.util.Date; +import java.util.List; + +/** + * The Class Network. + */ +public class NetworkMeta extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** The focus. */ + private int focus; + + /** The nethash. */ + private String nethash; + + /** The dates. */ + private List dates; + + private List users; + private List blocks; + + /** + * Gets the focus. + * + * @return the focus + */ + public int getFocus() { + return focus; + } + + /** + * Sets the focus. + * + * @param focus + * the new focus + */ + public void setFocus(int focus) { + this.focus = focus; + } + + /** + * Gets the nethash. + * + * @return the nethash + */ + public String getNethash() { + return nethash; + } + + /** + * Sets the nethash. + * + * @param nethash + * the new nethash + */ + public void setNethash(String nethash) { + this.nethash = nethash; + } + + /** + * Gets the dates. + * + * @return the dates + */ + public List getDates() { + return dates; + } + + /** + * Sets the dates. + * + * @param dates + * the new dates + */ + public void setDates(List dates) { + this.dates = dates; + } + + /** + * @return the users + */ + public List getUsers() { + return users; + } + + /** + * @param users the users to set + */ + public void setUsers(List users) { + this.users = users; + } + + /** + * @return the blocks + */ + public List getBlocks() { + return blocks; + } + + /** + * @param blocks the blocks to set + */ + public void setBlocks(List blocks) { + this.blocks = blocks; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "NetworkMeta [blocks=" + blocks + ", dates=" + dates + + ", focus=" + focus + ", nethash=" + nethash + ", users=" + + users + "]"; + } +} diff --git a/src/main/java/com/github/api/v2/schema/NetworkUser.java b/src/main/java/com/github/api/v2/schema/NetworkUser.java new file mode 100644 index 0000000..0eacd2a --- /dev/null +++ b/src/main/java/com/github/api/v2/schema/NetworkUser.java @@ -0,0 +1,77 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +import java.util.List; + + +/** + * The Class Commit. + */ +public class NetworkUser extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + private String name; + private String repo; + private List heads; + /** + * @return the name + */ + public String getName() { + return name; + } + /** + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + /** + * @return the repo + */ + public String getRepo() { + return repo; + } + /** + * @param repo the repo to set + */ + public void setRepo(String repo) { + this.repo = repo; + } + /** + * @return the heads + */ + public List getHeads() { + return heads; + } + /** + * @param heads the heads to set + */ + public void setHeads(List heads) { + this.heads = heads; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "NetworkUser [heads=" + heads + ", name=" + name + ", repo=" + + repo + "]"; + } +} diff --git a/src/main/java/com/github/api/v2/schema/Organization.java b/src/main/java/com/github/api/v2/schema/Organization.java new file mode 100644 index 0000000..e95669d --- /dev/null +++ b/src/main/java/com/github/api/v2/schema/Organization.java @@ -0,0 +1,503 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * The Class Organization. + */ +public class Organization extends SchemaEntity { + + /** + * The Enum Type. + */ + public enum Type implements ValueEnum { + + /** The ORGANIZATION. */ + ORGANIZATION("Organization"); + + + /** The Constant stringToEnum. */ + private static final Map stringToEnum = new HashMap(); + + static { // Initialize map from constant name to enum constant + for (Type op : values()) { + stringToEnum.put(op.value(), op); + } + } + + /** The value. */ + private final String value; + + /** + * Instantiates a new type. + * + * @param value + * the value + */ + Type(String value) { + this.value = value; + } + + /* (non-Javadoc) + * @see com.github.api.v2.schema.ValueEnum#value() + */ + @Override + public String value() { + return value; + } + + /** + * From value. + * + * @param value + * the value + * + * @return the type + */ + public static Type fromValue(String value) { + return stringToEnum.get(value); + } + } + + /** + * + */ + private static final long serialVersionUID = 2665103321482505351L; + + /** The id. */ + private String id; + + /** The gravatar id. */ + private String gravatarId; + + /** The login. */ + private String login; + + /** The name. */ + private String name; + + /** The email. */ + private String email; + + /** The location. */ + private String location; + + /** The blog. */ + private String blog; + + /** The company. */ + private String company; + + /** The following count. */ + private int followingCount; + + /** The followers count. */ + private int followersCount; + + /** The public gist count. */ + private int publicGistCount; + + /** The public repo count. */ + private int publicRepoCount; + + /** The total private repo count. */ + private int totalPrivateRepoCount; + + /** The owned private repo count. */ + private int ownedPrivateRepoCount; + + /** The private gist count. */ + private int privateGistCount; + + /** The created at. */ + private Date createdAt; + + private Permission permission; + + private String billingEmail; + + private Type type; + + /** + * @return the permission + */ + public Permission getPermission() { + return permission; + } + + /** + * @param permission the permission to set + */ + public void setPermission(Permission permission) { + this.permission = permission; + } + + /** + * @return the billingEmail + */ + public String getBillingEmail() { + return billingEmail; + } + + /** + * @param billingEmail the billingEmail to set + */ + public void setBillingEmail(String billingEmail) { + this.billingEmail = billingEmail; + } + + /** + * @return the type + */ + public Type getType() { + return type; + } + + /** + * @param type the type to set + */ + public void setType(Type type) { + this.type = type; + } + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Sets the name. + * + * @param name + * the new name + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the location. + * + * @return the location + */ + public String getLocation() { + return location; + } + + /** + * Sets the location. + * + * @param location + * the new location + */ + public void setLocation(String location) { + this.location = location; + } + + /** + * Gets the email. + * + * @return the email + */ + public String getEmail() { + return email; + } + + /** + * Sets the email. + * + * @param email + * the new email + */ + public void setEmail(String email) { + this.email = email; + } + + /** + * Gets the blog. + * + * @return the blog + */ + public String getBlog() { + return blog; + } + + /** + * Sets the blog. + * + * @param blog + * the new blog + */ + public void setBlog(String blog) { + this.blog = blog; + } + + /** + * Gets the company. + * + * @return the company + */ + public String getCompany() { + return company; + } + + /** + * Sets the company. + * + * @param company + * the new company + */ + public void setCompany(String company) { + this.company = company; + } + + /** + * Gets the id. + * + * @return the id + */ + public String getId() { + return id; + } + + /** + * Sets the id. + * + * @param id + * the new id + */ + public void setId(String id) { + this.id = id; + } + + /** + * Gets the login. + * + * @return the login + */ + public String getLogin() { + return login; + } + + /** + * Sets the login. + * + * @param login + * the new login + */ + public void setLogin(String login) { + this.login = login; + } + + /** + * Gets the following count. + * + * @return the following count + */ + public int getFollowingCount() { + return followingCount; + } + + /** + * Sets the following count. + * + * @param followingCount + * the new following count + */ + public void setFollowingCount(int followingCount) { + this.followingCount = followingCount; + } + + /** + * Gets the followers count. + * + * @return the followers count + */ + public int getFollowersCount() { + return followersCount; + } + + /** + * Sets the followers count. + * + * @param followersCount + * the new followers count + */ + public void setFollowersCount(int followersCount) { + this.followersCount = followersCount; + } + + /** + * Gets the public gist count. + * + * @return the public gist count + */ + public int getPublicGistCount() { + return publicGistCount; + } + + /** + * Sets the public gist count. + * + * @param publicGistCount + * the new public gist count + */ + public void setPublicGistCount(int publicGistCount) { + this.publicGistCount = publicGistCount; + } + + /** + * Gets the public repo count. + * + * @return the public repo count + */ + public int getPublicRepoCount() { + return publicRepoCount; + } + + /** + * Sets the public repo count. + * + * @param publicRepoCount + * the new public repo count + */ + public void setPublicRepoCount(int publicRepoCount) { + this.publicRepoCount = publicRepoCount; + } + + /** + * Gets the total private repo count. + * + * @return the total private repo count + */ + public int getTotalPrivateRepoCount() { + return totalPrivateRepoCount; + } + + /** + * Sets the total private repo count. + * + * @param totalPrivateRepoCount + * the new total private repo count + */ + public void setTotalPrivateRepoCount(int totalPrivateRepoCount) { + this.totalPrivateRepoCount = totalPrivateRepoCount; + } + + /** + * Gets the owned private repo count. + * + * @return the owned private repo count + */ + public int getOwnedPrivateRepoCount() { + return ownedPrivateRepoCount; + } + + /** + * Sets the owned private repo count. + * + * @param ownedPrivateRepoCount + * the new owned private repo count + */ + public void setOwnedPrivateRepoCount(int ownedPrivateRepoCount) { + this.ownedPrivateRepoCount = ownedPrivateRepoCount; + } + + /** + * Gets the private gist count. + * + * @return the private gist count + */ + public int getPrivateGistCount() { + return privateGistCount; + } + + /** + * Sets the private gist count. + * + * @param privateGistCount + * the new private gist count + */ + public void setPrivateGistCount(int privateGistCount) { + this.privateGistCount = privateGistCount; + } + + /** + * Gets the created at. + * + * @return the created at + */ + public Date getCreatedAt() { + return createdAt; + } + + /** + * Sets the created at. + * + * @param createdAt + * the new created at + */ + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + /** + * Gets the gravatar id. + * + * @return the gravatar id + */ + public String getGravatarId() { + return gravatarId; + } + + /** + * Sets the gravatar id. + * + * @param gravatarId + * the new gravatar id + */ + public void setGravatarId(String gravatarId) { + this.gravatarId = gravatarId; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Organization [billingEmail=" + billingEmail + ", blog=" + blog + + ", company=" + company + ", createdAt=" + createdAt + + ", email=" + email + ", followersCount=" + followersCount + + ", followingCount=" + followingCount + ", gravatarId=" + + gravatarId + ", id=" + id + ", location=" + location + + ", login=" + login + ", name=" + name + + ", ownedPrivateRepoCount=" + ownedPrivateRepoCount + + ", permission=" + permission + ", privateGistCount=" + + privateGistCount + ", publicGistCount=" + publicGistCount + + ", publicRepoCount=" + publicRepoCount + + ", totalPrivateRepoCount=" + totalPrivateRepoCount + + ", type=" + type + "]"; + } +} diff --git a/src/main/java/com/github/api/v2/schema/Permission.java b/src/main/java/com/github/api/v2/schema/Permission.java new file mode 100644 index 0000000..aabdba0 --- /dev/null +++ b/src/main/java/com/github/api/v2/schema/Permission.java @@ -0,0 +1,60 @@ +package com.github.api.v2.schema; + +import java.util.HashMap; +import java.util.Map; + + +/** + * The Enum Permission. + */ + public enum Permission implements ValueEnum { + + /** The ADMIN. */ + ADMIN("admin"), + /** The PULL. */ + PULL("pull"), + /** The PUSH. */ + PUSH("push"); + + /** The Constant stringToEnum. */ + private static final Map stringToEnum = new HashMap(); + + static { // Initialize map from constant name to enum constant + for (Permission op : values()) { + stringToEnum.put(op.value(), op); + } + } + + /** The value. */ + private final String value; + + /** + * Instantiates a new permission. + * + * @param value + * the value + */ + Permission(String value) { + this.value = value; + } + + /* (non-Javadoc) + * @see com.github.api.v2.schema.ValueEnum#value() + */ + @Override + public String value() { + return value; + } + + /** + * From value. + * + * @param value + * the value + * + * @return the permission + */ + public static Permission fromValue(String value) { + return stringToEnum.get(value); + } + } \ No newline at end of file diff --git a/src/main/java/com/github/api/v2/schema/Plan.java b/src/main/java/com/github/api/v2/schema/Plan.java new file mode 100644 index 0000000..76bce67 --- /dev/null +++ b/src/main/java/com/github/api/v2/schema/Plan.java @@ -0,0 +1,122 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +/** + * The Class Plan. + */ +public class Plan extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = -716103936969784665L; + + /** The name. */ + private String name; + + /** The collaborators. */ + private int collaborators; + + /** The space. */ + private long space; + + /** The private repos. */ + private int privateRepos; + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Sets the name. + * + * @param name + * the new name + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the collaborators. + * + * @return the collaborators + */ + public int getCollaborators() { + return collaborators; + } + + /** + * Sets the collaborators. + * + * @param collaborators + * the new collaborators + */ + public void setCollaborators(int collaborators) { + this.collaborators = collaborators; + } + + /** + * Gets the space. + * + * @return the space + */ + public long getSpace() { + return space; + } + + /** + * Sets the space. + * + * @param space + * the new space + */ + public void setSpace(long space) { + this.space = space; + } + + /** + * Gets the private repos. + * + * @return the private repos + */ + public int getPrivateRepos() { + return privateRepos; + } + + /** + * Sets the private repos. + * + * @param privateRepos + * the new private repos + */ + public void setPrivateRepos(int privateRepos) { + this.privateRepos = privateRepos; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Plan [collaborators=" + collaborators + ", name=" + name + + ", privateRepos=" + privateRepos + ", space=" + space + "]"; + } +} diff --git a/src/main/java/com/github/api/v2/schema/Repository.java b/src/main/java/com/github/api/v2/schema/Repository.java new file mode 100644 index 0000000..7fea3b5 --- /dev/null +++ b/src/main/java/com/github/api/v2/schema/Repository.java @@ -0,0 +1,686 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * The Class Repository. + */ +public class Repository extends SchemaEntity { + + /** + * The Enum Visibility. + */ + public enum Visibility implements ValueEnum { + + /** The PUBLIC. */ + PUBLIC("public"), + /** The PRIVATE. */ + PRIVATE("private"); + + /** The Constant stringToEnum. */ + private static final Map stringToEnum = new HashMap(); + + static { // Initialize map from constant name to enum constant + for (Visibility op : values()) { + stringToEnum.put(op.value(), op); + } + } + + /** The value. */ + private final String value; + + /** + * Instantiates a new visibility. + * + * @param value + * the value + */ + Visibility(String value) { + this.value = value; + } + + /* (non-Javadoc) + * @see com.github.api.v2.schema.ValueEnum#value() + */ + @Override + public String value() { + return value; + } + + /** + * From value. + * + * @param value + * the value + * + * @return the visibility + */ + public static Visibility fromValue(String value) { + return stringToEnum.get(value); + } + } + + /** The Constant MASTER. */ + public static final String MASTER = "master"; + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** The watchers. */ + private int watchers; + + /** The owner. */ + private String owner; + + /** The name. */ + private String name; + + /** The description. */ + private String description; + + /** The visibility. */ + private Visibility visibility; + + /** The url. */ + private String url; + + /** The open issues. */ + private int openIssues; + + /** The fork. */ + private boolean fork; + + /** The homepage. */ + private String homepage; + + /** The forks. */ + private int forks; + + /** The score. */ + private double score; + + /** The actions. */ + private int actions; + + /** The size. */ + private long size; + + /** The language. */ + private Language language; + + /** The followers. */ + private int followers; + + /** The username. */ + private String username; + + /** The type. */ + private String type; + + /** The id. */ + private String id; + + /** The pushed. */ + private Date pushed; + + /** The created. */ + private Date created; + + /** The source. */ + private String source; + + /** The parent. */ + private String parent; + + /** The has wiki. */ + private boolean hasWiki; + + /** The has issues. */ + private boolean hasIssues; + + /** The has downloads. */ + private boolean hasDownloads; + + private String organization; + + private Permission permission; + + /** + * Gets the watchers. + * + * @return the watchers + */ + public int getWatchers() { + return watchers; + } + + /** + * Sets the watchers. + * + * @param watchers + * the new watchers + */ + public void setWatchers(int watchers) { + this.watchers = watchers; + } + + /** + * Gets the owner. + * + * @return the owner + */ + public String getOwner() { + return owner; + } + + /** + * Sets the owner. + * + * @param owner + * the new owner + */ + public void setOwner(String owner) { + this.owner = owner; + } + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Sets the name. + * + * @param name + * the new name + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the description. + * + * @return the description + */ + public String getDescription() { + return description; + } + + /** + * Sets the description. + * + * @param description + * the new description + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * Gets the visibility. + * + * @return the visibility + */ + public Visibility getVisibility() { + return visibility; + } + + /** + * Sets the visibility. + * + * @param visibility + * the new visibility + */ + public void setVisibility(Visibility visibility) { + this.visibility = visibility; + } + + /** + * Gets the url. + * + * @return the url + */ + public String getUrl() { + return url; + } + + /** + * Sets the url. + * + * @param url + * the new url + */ + public void setUrl(String url) { + this.url = url; + } + + /** + * Gets the open issues. + * + * @return the open issues + */ + public int getOpenIssues() { + return openIssues; + } + + /** + * Sets the open issues. + * + * @param openIssues + * the new open issues + */ + public void setOpenIssues(int openIssues) { + this.openIssues = openIssues; + } + + /** + * Checks if is fork. + * + * @return true, if is fork + */ + public boolean isFork() { + return fork; + } + + /** + * Sets the fork. + * + * @param fork + * the new fork + */ + public void setFork(boolean fork) { + this.fork = fork; + } + + /** + * Gets the homepage. + * + * @return the homepage + */ + public String getHomepage() { + return homepage; + } + + /** + * Sets the homepage. + * + * @param homepage + * the new homepage + */ + public void setHomepage(String homepage) { + this.homepage = homepage; + } + + /** + * Gets the forks. + * + * @return the forks + */ + public int getForks() { + return forks; + } + + /** + * Sets the forks. + * + * @param forks + * the new forks + */ + public void setForks(int forks) { + this.forks = forks; + } + + /** + * Gets the score. + * + * @return the score + */ + public double getScore() { + return score; + } + + /** + * Sets the score. + * + * @param score + * the new score + */ + public void setScore(double score) { + this.score = score; + } + + /** + * Gets the actions. + * + * @return the actions + */ + public int getActions() { + return actions; + } + + /** + * Sets the actions. + * + * @param actions + * the new actions + */ + public void setActions(int actions) { + this.actions = actions; + } + + /** + * Gets the size. + * + * @return the size + */ + public long getSize() { + return size; + } + + /** + * Sets the size. + * + * @param size + * the new size + */ + public void setSize(long size) { + this.size = size; + } + + /** + * Gets the language. + * + * @return the language + */ + public Language getLanguage() { + return language; + } + + /** + * Sets the language. + * + * @param language + * the new language + */ + public void setLanguage(Language language) { + this.language = language; + } + + /** + * Gets the followers. + * + * @return the followers + */ + public int getFollowers() { + return followers; + } + + /** + * Sets the followers. + * + * @param followers + * the new followers + */ + public void setFollowers(int followers) { + this.followers = followers; + } + + /** + * Gets the username. + * + * @return the username + */ + public String getUsername() { + return username; + } + + /** + * Sets the username. + * + * @param username + * the new username + */ + public void setUsername(String username) { + this.username = username; + } + + /** + * Gets the type. + * + * @return the type + */ + public String getType() { + return type; + } + + /** + * Sets the type. + * + * @param type + * the new type + */ + public void setType(String type) { + this.type = type; + } + + /** + * Gets the id. + * + * @return the id + */ + public String getId() { + return id; + } + + /** + * Sets the id. + * + * @param id + * the new id + */ + public void setId(String id) { + this.id = id; + } + + /** + * Gets the pushed. + * + * @return the pushed + */ + public Date getPushed() { + return pushed; + } + + /** + * Sets the pushed. + * + * @param pushed + * the new pushed + */ + public void setPushed(Date pushed) { + this.pushed = pushed; + } + + /** + * Gets the created. + * + * @return the created + */ + public Date getCreated() { + return created; + } + + /** + * Sets the created. + * + * @param created + * the new created + */ + public void setCreated(Date created) { + this.created = created; + } + + /** + * Gets the source. + * + * @return the source + */ + public String getSource() { + return source; + } + + /** + * Sets the source. + * + * @param source + * the new source + */ + public void setSource(String source) { + this.source = source; + } + + /** + * Gets the parent. + * + * @return the parent + */ + public String getParent() { + return parent; + } + + /** + * Sets the parent. + * + * @param parent + * the new parent + */ + public void setParent(String parent) { + this.parent = parent; + } + + /** + * Checks if is checks for wiki. + * + * @return true, if is checks for wiki + */ + public boolean isHasWiki() { + return hasWiki; + } + + /** + * Sets the checks for wiki. + * + * @param hasWiki + * the new checks for wiki + */ + public void setHasWiki(boolean hasWiki) { + this.hasWiki = hasWiki; + } + + /** + * Checks if is checks for issues. + * + * @return true, if is checks for issues + */ + public boolean isHasIssues() { + return hasIssues; + } + + /** + * Sets the checks for issues. + * + * @param hasIssues + * the new checks for issues + */ + public void setHasIssues(boolean hasIssues) { + this.hasIssues = hasIssues; + } + + /** + * Checks if is checks for downloads. + * + * @return true, if is checks for downloads + */ + public boolean isHasDownloads() { + return hasDownloads; + } + + /** + * Sets the checks for downloads. + * + * @param hasDownloads + * the new checks for downloads + */ + public void setHasDownloads(boolean hasDownloads) { + this.hasDownloads = hasDownloads; + } + + /** + * @return the organization + */ + public String getOrganization() { + return organization; + } + + /** + * @param organization the organization to set + */ + public void setOrganization(String organization) { + this.organization = organization; + } + + /** + * @return the permission + */ + public Permission getPermission() { + return permission; + } + + /** + * @param permission the permission to set + */ + public void setPermission(Permission permission) { + this.permission = permission; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Repository [actions=" + actions + ", created=" + created + + ", description=" + description + ", followers=" + followers + + ", fork=" + fork + ", forks=" + forks + ", hasDownloads=" + + hasDownloads + ", hasIssues=" + hasIssues + ", hasWiki=" + + hasWiki + ", homepage=" + homepage + ", id=" + id + + ", language=" + language + ", name=" + name + ", openIssues=" + + openIssues + ", owner=" + owner + ", parent=" + parent + + ", pushed=" + pushed + ", score=" + score + ", size=" + size + + ", source=" + source + ", type=" + type + ", url=" + url + + ", username=" + username + ", visibiity=" + visibility + + ", watchers=" + watchers + "]"; + } +} diff --git a/src/main/java/com/github/api/v2/schema/SchemaEntity.java b/src/main/java/com/github/api/v2/schema/SchemaEntity.java new file mode 100644 index 0000000..4a8a58c --- /dev/null +++ b/src/main/java/com/github/api/v2/schema/SchemaEntity.java @@ -0,0 +1,33 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +import java.io.Serializable; +import java.util.logging.Logger; + + +/** + * The Class SchemaEntity. + */ +public abstract class SchemaEntity implements Serializable { + + /** The logger. */ + protected final Logger logger = Logger.getLogger(getClass().getCanonicalName()); + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 250056223059654638L; +} diff --git a/src/main/java/com/github/api/v2/schema/Team.java b/src/main/java/com/github/api/v2/schema/Team.java new file mode 100644 index 0000000..9a8df34 --- /dev/null +++ b/src/main/java/com/github/api/v2/schema/Team.java @@ -0,0 +1,100 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +import java.util.List; + +/** + * The Class Team. + */ +public class Team extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** The id. */ + private String id; + + /** The name. */ + private String name; + + /** The permission. */ + private Permission permission; + + private List repoNames; + + /** + * Gets the id. + * + * @return the id + */ + public String getId() { + return id; + } + + /** + * Sets the id. + * + * @param id + * the new id + */ + public void setId(String id) { + this.id = id; + } + + /** + * @return the name + */ + public String getName() { + return name; + } + + /** + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + + /** + * @return the permission + */ + public Permission getPermission() { + return permission; + } + + /** + * @param permission the permission to set + */ + public void setPermission(Permission permission) { + this.permission = permission; + } + + /** + * @return the repoNames + */ + public List getRepoNames() { + return repoNames; + } + + /** + * @param repoNames the repoNames to set + */ + public void setRepoNames(List repoNames) { + this.repoNames = repoNames; + } +} diff --git a/src/main/java/com/github/api/v2/schema/Tree.java b/src/main/java/com/github/api/v2/schema/Tree.java new file mode 100644 index 0000000..f38f770 --- /dev/null +++ b/src/main/java/com/github/api/v2/schema/Tree.java @@ -0,0 +1,179 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +import java.util.HashMap; +import java.util.Map; + +/** + * The Class Tree. + */ +public class Tree extends SchemaEntity { + + /** + * The Enum Type. + */ + public enum Type implements ValueEnum { + + /** The TREE. */ + TREE("tree"), + + /** The BLOB. */ + BLOB("blob"); + + /** The Constant stringToEnum. */ + private static final Map stringToEnum = new HashMap(); + + static { // Initialize map from constant name to enum constant + for (Type op : values()) { + stringToEnum.put(op.value(), op); + } + } + + /** The value. */ + private final String value; + + /** + * Instantiates a new type. + * + * @param value + * the value + */ + Type(String value) { + this.value = value; + } + + /* (non-Javadoc) + * @see com.github.api.v2.schema.ValueEnum#value() + */ + @Override + public String value() { + return value; + } + + /** + * From value. + * + * @param value + * the value + * + * @return the type + */ + public static Type fromValue(String value) { + return stringToEnum.get(value); + } + } + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** The name. */ + private String name; + + /** The sha. */ + private String sha; + + /** The mode. */ + private String mode; + + /** The type. */ + private Type type; + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Sets the name. + * + * @param name + * the new name + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the sha. + * + * @return the sha + */ + public String getSha() { + return sha; + } + + /** + * Sets the sha. + * + * @param sha + * the new sha + */ + public void setSha(String sha) { + this.sha = sha; + } + + /** + * Gets the mode. + * + * @return the mode + */ + public String getMode() { + return mode; + } + + /** + * Sets the mode. + * + * @param mode + * the new mode + */ + public void setMode(String mode) { + this.mode = mode; + } + + /** + * Gets the type. + * + * @return the type + */ + public Type getType() { + return type; + } + + /** + * Sets the type. + * + * @param type + * the new type + */ + public void setType(Type type) { + this.type = type; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Tree [mode=" + mode + ", name=" + name + ", sha=" + sha + + ", type=" + type + "]"; + } +} diff --git a/src/main/java/com/github/api/v2/schema/User.java b/src/main/java/com/github/api/v2/schema/User.java new file mode 100644 index 0000000..450056e --- /dev/null +++ b/src/main/java/com/github/api/v2/schema/User.java @@ -0,0 +1,525 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +import java.util.Date; + +/** + * The Class User. + */ +public class User extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** The id. */ + private String id; + + /** The gravatar id. */ + private String gravatarId; + + /** The login. */ + private String login; + + /** The name. */ + private String name; + + /** The email. */ + private String email; + + /** The location. */ + private String location; + + /** The fullname. */ + private String fullname; + + /** The username. */ + private String username; + + /** The blog. */ + private String blog; + + /** The company. */ + private String company; + + /** The following count. */ + private int followingCount; + + /** The followers count. */ + private int followersCount; + + /** The public gist count. */ + private int publicGistCount; + + /** The public repo count. */ + private int publicRepoCount; + + /** The total private repo count. */ + private int totalPrivateRepoCount; + + /** The collaborators. */ + private int collaborators; + + /** The disk usage. */ + private int diskUsage; + + /** The owned private repo count. */ + private int ownedPrivateRepoCount; + + /** The private gist count. */ + private int privateGistCount; + + /** The created at. */ + private Date createdAt; + + /** The plan. */ + private Plan plan; + + private Permission permission; + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Sets the name. + * + * @param name + * the new name + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the location. + * + * @return the location + */ + public String getLocation() { + return location; + } + + /** + * Sets the location. + * + * @param location + * the new location + */ + public void setLocation(String location) { + this.location = location; + } + + /** + * Gets the fullname. + * + * @return the fullname + */ + public String getFullname() { + return fullname; + } + + /** + * Sets the fullname. + * + * @param fullname + * the new fullname + */ + public void setFullname(String fullname) { + this.fullname = fullname; + } + + /** + * Gets the username. + * + * @return the username + */ + public String getUsername() { + return username; + } + + /** + * Sets the username. + * + * @param username + * the new username + */ + public void setUsername(String username) { + this.username = username; + } + + /** + * Gets the email. + * + * @return the email + */ + public String getEmail() { + return email; + } + + /** + * Sets the email. + * + * @param email + * the new email + */ + public void setEmail(String email) { + this.email = email; + } + + /** + * Gets the blog. + * + * @return the blog + */ + public String getBlog() { + return blog; + } + + /** + * Sets the blog. + * + * @param blog + * the new blog + */ + public void setBlog(String blog) { + this.blog = blog; + } + + /** + * Gets the company. + * + * @return the company + */ + public String getCompany() { + return company; + } + + /** + * Sets the company. + * + * @param company + * the new company + */ + public void setCompany(String company) { + this.company = company; + } + + /** + * Gets the id. + * + * @return the id + */ + public String getId() { + return id; + } + + /** + * Sets the id. + * + * @param id + * the new id + */ + public void setId(String id) { + this.id = id; + } + + /** + * Gets the login. + * + * @return the login + */ + public String getLogin() { + return login; + } + + /** + * Sets the login. + * + * @param login + * the new login + */ + public void setLogin(String login) { + this.login = login; + } + + /** + * Gets the following count. + * + * @return the following count + */ + public int getFollowingCount() { + return followingCount; + } + + /** + * Sets the following count. + * + * @param followingCount + * the new following count + */ + public void setFollowingCount(int followingCount) { + this.followingCount = followingCount; + } + + /** + * Gets the followers count. + * + * @return the followers count + */ + public int getFollowersCount() { + return followersCount; + } + + /** + * Sets the followers count. + * + * @param followersCount + * the new followers count + */ + public void setFollowersCount(int followersCount) { + this.followersCount = followersCount; + } + + /** + * Gets the public gist count. + * + * @return the public gist count + */ + public int getPublicGistCount() { + return publicGistCount; + } + + /** + * Sets the public gist count. + * + * @param publicGistCount + * the new public gist count + */ + public void setPublicGistCount(int publicGistCount) { + this.publicGistCount = publicGistCount; + } + + /** + * Gets the public repo count. + * + * @return the public repo count + */ + public int getPublicRepoCount() { + return publicRepoCount; + } + + /** + * Sets the public repo count. + * + * @param publicRepoCount + * the new public repo count + */ + public void setPublicRepoCount(int publicRepoCount) { + this.publicRepoCount = publicRepoCount; + } + + /** + * Gets the total private repo count. + * + * @return the total private repo count + */ + public int getTotalPrivateRepoCount() { + return totalPrivateRepoCount; + } + + /** + * Sets the total private repo count. + * + * @param totalPrivateRepoCount + * the new total private repo count + */ + public void setTotalPrivateRepoCount(int totalPrivateRepoCount) { + this.totalPrivateRepoCount = totalPrivateRepoCount; + } + + /** + * Gets the collaborators. + * + * @return the collaborators + */ + public int getCollaborators() { + return collaborators; + } + + /** + * Sets the collaborators. + * + * @param collaborators + * the new collaborators + */ + public void setCollaborators(int collaborators) { + this.collaborators = collaborators; + } + + /** + * Gets the disk usage. + * + * @return the disk usage + */ + public int getDiskUsage() { + return diskUsage; + } + + /** + * Sets the disk usage. + * + * @param diskUsage + * the new disk usage + */ + public void setDiskUsage(int diskUsage) { + this.diskUsage = diskUsage; + } + + /** + * Gets the owned private repo count. + * + * @return the owned private repo count + */ + public int getOwnedPrivateRepoCount() { + return ownedPrivateRepoCount; + } + + /** + * Sets the owned private repo count. + * + * @param ownedPrivateRepoCount + * the new owned private repo count + */ + public void setOwnedPrivateRepoCount(int ownedPrivateRepoCount) { + this.ownedPrivateRepoCount = ownedPrivateRepoCount; + } + + /** + * Gets the private gist count. + * + * @return the private gist count + */ + public int getPrivateGistCount() { + return privateGistCount; + } + + /** + * Sets the private gist count. + * + * @param privateGistCount + * the new private gist count + */ + public void setPrivateGistCount(int privateGistCount) { + this.privateGistCount = privateGistCount; + } + + /** + * Gets the plan. + * + * @return the plan + */ + public Plan getPlan() { + return plan; + } + + /** + * Sets the plan. + * + * @param plan + * the new plan + */ + public void setPlan(Plan plan) { + this.plan = plan; + } + + /** + * Gets the created at. + * + * @return the created at + */ + public Date getCreatedAt() { + return createdAt; + } + + /** + * Sets the created at. + * + * @param createdAt + * the new created at + */ + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + /** + * Gets the gravatar id. + * + * @return the gravatar id + */ + public String getGravatarId() { + return gravatarId; + } + + /** + * Sets the gravatar id. + * + * @param gravatarId + * the new gravatar id + */ + public void setGravatarId(String gravatarId) { + this.gravatarId = gravatarId; + } + + /** + * @return the permission + */ + public Permission getPermission() { + return permission; + } + + /** + * @param permission the permission to set + */ + public void setPermission(Permission permission) { + this.permission = permission; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "User [blog=" + blog + ", collaborators=" + collaborators + + ", company=" + company + ", createdAt=" + createdAt + + ", diskUsage=" + diskUsage + ", email=" + email + + ", followersCount=" + followersCount + ", followingCount=" + + followingCount + ", fullname=" + fullname + ", gravatarId=" + + gravatarId + ", id=" + id + ", location=" + location + + ", login=" + login + ", name=" + name + + ", ownedPrivateRepoCount=" + ownedPrivateRepoCount + + ", plan=" + plan + ", privateGistCount=" + privateGistCount + + ", publicGistCount=" + publicGistCount + ", publicRepoCount=" + + publicRepoCount + ", totalPrivateRepoCount=" + + totalPrivateRepoCount + ", username=" + username + "]"; + } +} diff --git a/src/main/java/com/github/api/v2/schema/ValueEnum.java b/src/main/java/com/github/api/v2/schema/ValueEnum.java new file mode 100644 index 0000000..6e6d28b --- /dev/null +++ b/src/main/java/com/github/api/v2/schema/ValueEnum.java @@ -0,0 +1,30 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +/** + * The Interface ValueEnum. + */ +public interface ValueEnum { + + /** + * Value. + * + * @return the string + */ + public abstract String value(); +} \ No newline at end of file diff --git a/src/main/java/com/github/api/v2/services/AsyncResponseHandler.java b/src/main/java/com/github/api/v2/services/AsyncResponseHandler.java new file mode 100644 index 0000000..d3bc72b --- /dev/null +++ b/src/main/java/com/github/api/v2/services/AsyncResponseHandler.java @@ -0,0 +1,56 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.util.concurrent.Future; + + +/** + * The Class AsyncResponseHandler. + */ +public abstract class AsyncResponseHandler { + + /** The future. */ + private Future future; + + /** + * Sets the future. + * + * @param future + * the new future + */ + public void setFuture(Future future) { + this.future = future; + } + + /** + * Gets the future. + * + * @return the future + */ + public Future getFuture() { + return future; + } + + /** + * Handle response. + * + * @param response + * the response + */ + public abstract void handleResponse(T response); +} diff --git a/src/main/java/com/github/api/v2/services/CommitService.java b/src/main/java/com/github/api/v2/services/CommitService.java new file mode 100644 index 0000000..d3d88c4 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/CommitService.java @@ -0,0 +1,71 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.util.List; + +import com.github.api.v2.schema.Commit; + +/** + * The Interface CommitService. + */ +public interface CommitService extends GitHubService { + + /** + * Gets the commits. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param branch + * the branch + * + * @return the commits + */ + public List getCommits(String userName, String repositoryName, String branch); + + /** + * Gets the commits. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param branch + * the branch + * @param filePath + * the file path + * + * @return the commits + */ + public List getCommits(String userName, String repositoryName, String branch, String filePath); + + /** + * Gets the commit. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param sha + * the sha + * + * @return the commit + */ + public Commit getCommit(String userName, String repositoryName, String sha); +} diff --git a/src/main/java/com/github/api/v2/services/FeedService.java b/src/main/java/com/github/api/v2/services/FeedService.java new file mode 100644 index 0000000..07fb94f --- /dev/null +++ b/src/main/java/com/github/api/v2/services/FeedService.java @@ -0,0 +1,38 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import com.github.api.v2.schema.Feed; + + +/** + * The Interface FeedService. + */ +public interface FeedService extends GitHubService { + + public Feed getPublicUserFeed(String userName, int count); + public Feed getPrivateUserFeed(String userName, int count); + public Feed getCommitFeed(String userName, String repositoryName, String branchName, int count); + public Feed getNetworkFeed(String userName, String repositoryName, int count); + public Feed getWikiFeed(String userName, String repositoryName, int count); + public Feed getPublicTimelineFeed(int count); + + public Feed getDiscussionsFeed(int count); + public Feed getDiscussionsFeed(String topic, int count); + public Feed getJobPositionsFeed(int count); + public Feed getBlogFeed(int count); +} diff --git a/src/main/java/com/github/api/v2/services/GistService.java b/src/main/java/com/github/api/v2/services/GistService.java new file mode 100644 index 0000000..36dfa76 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/GistService.java @@ -0,0 +1,60 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.io.InputStream; +import java.util.List; + +import com.github.api.v2.schema.Gist; + +/** + * The Interface GistService. + */ +public interface GistService extends GitHubService { + + /** + * Gets the gist. + * + * @param gistId + * the gist id + * + * @return the gist + */ + public Gist getGist(String gistId); + + /** + * Gets the gist content. + * + * @param gistId + * the gist id + * @param fileName + * the file name + * + * @return the gist content + */ + public InputStream getGistContent(String gistId, String fileName); + + /** + * Gets the user gists. + * + * @param userName + * the user name + * + * @return the user gists + */ + public List getUserGists(String userName); +} diff --git a/src/main/java/com/github/api/v2/services/GitHubAuthenticator.java b/src/main/java/com/github/api/v2/services/GitHubAuthenticator.java new file mode 100644 index 0000000..c576026 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/GitHubAuthenticator.java @@ -0,0 +1,50 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import com.github.api.v2.services.auth.Authentication; + + +/** + * The Interface GitHubAuthenticator. + */ +public interface GitHubAuthenticator extends GitHubCommunicator { + + /** + * Sets the authentication. + * + * @param authentication + * the new authentication + */ + public void setAuthentication(Authentication authentication); + + /** + * Sets the user ip address. + * + * @param userIpAddress + * the new user ip address + */ + public void setUserIpAddress(String userIpAddress); + + /** + * Sets the referrer. + * + * @param referrer + * the new referrer + */ + public void setReferrer(String referrer); +} diff --git a/src/main/java/com/github/api/v2/services/GitHubCommunicator.java b/src/main/java/com/github/api/v2/services/GitHubCommunicator.java new file mode 100644 index 0000000..f9b6ec4 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/GitHubCommunicator.java @@ -0,0 +1,58 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.util.Map; + +/** + * The Interface GitHubCommunicator. + */ +public interface GitHubCommunicator { + + /** + * Sets the request headers. + * + * @param requestHeaders + * the request headers + */ + public void setRequestHeaders(Map requestHeaders); + + /** + * Gets the request headers. + * + * @return the request headers + */ + public Map getRequestHeaders(); + + /** + * Adds the request header. + * + * @param headerName + * the header name + * @param headerValue + * the header value + */ + public void addRequestHeader(String headerName, String headerValue); + + /** + * Removes the request header. + * + * @param headerName + * the header name + */ + public void removeRequestHeader(String headerName); +} diff --git a/src/main/java/com/github/api/v2/services/GitHubException.java b/src/main/java/com/github/api/v2/services/GitHubException.java new file mode 100644 index 0000000..39332dd --- /dev/null +++ b/src/main/java/com/github/api/v2/services/GitHubException.java @@ -0,0 +1,63 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +/** + * The Class GitHubException. + */ +public class GitHubException extends RuntimeException { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = -2392119987027760999L; + + /** + * Instantiates a new git hub exception. + */ + public GitHubException() {} + + /** + * Instantiates a new git hub exception. + * + * @param message + * the message + */ + public GitHubException(String message) { + super(message); + } + + /** + * Instantiates a new git hub exception. + * + * @param cause + * the cause + */ + public GitHubException(Throwable cause) { + super(cause); + } + + /** + * Instantiates a new git hub exception. + * + * @param message + * the message + * @param cause + * the cause + */ + public GitHubException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/com/github/api/v2/services/GitHubService.java b/src/main/java/com/github/api/v2/services/GitHubService.java new file mode 100644 index 0000000..36a84d2 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/GitHubService.java @@ -0,0 +1,24 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +/** + * The Interface GitHubService. + */ +public interface GitHubService extends GitHubAuthenticator { + +} diff --git a/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java b/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java new file mode 100644 index 0000000..3b0d47b --- /dev/null +++ b/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java @@ -0,0 +1,143 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import com.github.api.v2.services.impl.CommitServiceImpl; +import com.github.api.v2.services.impl.FeedServiceImpl; +import com.github.api.v2.services.impl.GistServiceImpl; +import com.github.api.v2.services.impl.IssueServiceImpl; +import com.github.api.v2.services.impl.NetworkServiceImpl; +import com.github.api.v2.services.impl.OAuthServiceImpl; +import com.github.api.v2.services.impl.ObjectServiceImpl; +import com.github.api.v2.services.impl.OrganizationServiceImpl; +import com.github.api.v2.services.impl.RepositoryServiceImpl; +import com.github.api.v2.services.impl.UserServiceImpl; + + + + +/** + * A factory for creating GitHubService objects. + */ +public class GitHubServiceFactory { + + /** + * Instantiates a new git hub service factory. + */ + private GitHubServiceFactory() { + } + + /** + * New instance. + * + * @return the git hub service factory + */ + public static GitHubServiceFactory newInstance() { + return new GitHubServiceFactory(); + } + + /** + * Creates a new GitHubService object. + * + * @return the commit service + */ + public CommitService createCommitService() { + return new CommitServiceImpl(); + } + + /** + * Creates a new GitHubService object. + * + * @return the gist service + */ + public GistService createGistService() { + return new GistServiceImpl(); + } + + /** + * Creates a new GitHubService object. + * + * @return the issue service + */ + public IssueService createIssueService() { + return new IssueServiceImpl(); + } + + /** + * Creates a new GitHubService object. + * + * @return the network service + */ + public NetworkService createNetworkService() { + return new NetworkServiceImpl(); + } + + /** + * Creates a new GitHubService object. + * + * @return the object service + */ + public ObjectService createObjectService() { + return new ObjectServiceImpl(); + } + + /** + * Creates a new GitHubService object. + * + * @return the repository service + */ + public RepositoryService createRepositoryService() { + return new RepositoryServiceImpl(); + } + + /** + * Creates a new GitHubService object. + * + * @return the repository service + */ + public OrganizationService createOrganizationService() { + return new OrganizationServiceImpl(); + } + + /** + * Creates a new GitHubService object. + * + * @return the user service + */ + public UserService createUserService() { + return new UserServiceImpl(); + } + + /** + * Creates a new GitHubService object. + * + * @param clientId + * the client id + * @param secret + * the secret + * + * @return the o auth service + */ + public OAuthService createOAuthService(String clientId, String secret) { + return new OAuthServiceImpl(clientId, secret); + } + + public FeedService createFeedService() { + return new FeedServiceImpl(); + } + +} diff --git a/src/main/java/com/github/api/v2/services/IssueService.java b/src/main/java/com/github/api/v2/services/IssueService.java new file mode 100644 index 0000000..20108a0 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/IssueService.java @@ -0,0 +1,216 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.util.List; + +import com.github.api.v2.schema.Comment; +import com.github.api.v2.schema.Issue; +import com.github.api.v2.schema.Issue.State; + +/** + * The Interface IssueService. + */ +public interface IssueService extends GitHubService { + + /** + * Search issues. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param state + * the state + * @param keyword + * the keyword + * + * @return the list< issue> + */ + public List searchIssues(String userName, String repositoryName, State state, String keyword); + + /** + * Search issues. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param state + * the state + * @param keyword + * the keyword + * + * @return the list< issue> + */ + public List getIssues(String userName, String repositoryName, String label); + + /** + * Gets the issues. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param state + * the state + * + * @return the issues + */ + public List getIssues(String userName, String repositoryName, State state); + + /** + * Gets the issue. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param issueNumber + * the issue number + * + * @return the issue + */ + public Issue getIssue(String userName, String repositoryName, int issueNumber); + + /** + * Gets the issue comments. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param issueNumber + * the issue number + * + * @return the issue comments + */ + public List getIssueComments(String userName, String repositoryName, int issueNumber); + + /** + * Creates the issue. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param title + * the title + * @param body + * the body + */ + public void createIssue(String userName, String repositoryName, String title, String body); + + /** + * Close issue. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param issueNumber + * the issue number + */ + public void closeIssue(String userName, String repositoryName, int issueNumber); + + /** + * Reopen issue. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param issueNumber + * the issue number + */ + public void reopenIssue(String userName, String repositoryName, int issueNumber); + + /** + * Update issue. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param issueNumber + * the issue number + * @param title + * the title + * @param body + * the body + */ + public void updateIssue(String userName, String repositoryName, int issueNumber, String title, String body); + + /** + * Gets the issue labels. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the issue labels + */ + public List getIssueLabels(String userName, String repositoryName); + + /** + * Adds the label. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param issueNumber + * the issue number + * @param label + * the label + * + * @return the list< string> + */ + public List addLabel(String userName, String repositoryName, int issueNumber, String label); + + /** + * Removes the label. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param issueNumber + * the issue number + * @param label + * the label + * + * @return the list< string> + */ + public List removeLabel(String userName, String repositoryName, int issueNumber, String label); + + /** + * Adds the comment. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param issueNumber + * the issue number + * @param comment + * the comment + */ + public void addComment(String userName, String repositoryName, int issueNumber, String comment); + +} diff --git a/src/main/java/com/github/api/v2/services/NetworkService.java b/src/main/java/com/github/api/v2/services/NetworkService.java new file mode 100644 index 0000000..a9c0d60 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/NetworkService.java @@ -0,0 +1,72 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.util.List; + +import com.github.api.v2.schema.NetworkCommit; +import com.github.api.v2.schema.NetworkMeta; + +/** + * The Interface NetworkService. + */ +public interface NetworkService extends GitHubService { + + /** + * Gets the network meta. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the network meta + */ + public NetworkMeta getNetworkMeta(String userName, String repositoryName); + + /** + * Gets the network data. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param networkHash + * the network hash + * + * @return the network data + */ + public List getNetworkData(String userName, String repositoryName, String networkHash); + + /** + * Gets the network data. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param networkHash + * the network hash + * @param startIndex + * the start index + * @param endIndex + * the end index + * + * @return the network data + */ + public List getNetworkData(String userName, String repositoryName, String networkHash, int startIndex, int endIndex); +} diff --git a/src/main/java/com/github/api/v2/services/OAuthService.java b/src/main/java/com/github/api/v2/services/OAuthService.java new file mode 100644 index 0000000..3b64a19 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/OAuthService.java @@ -0,0 +1,116 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +import com.github.api.v2.schema.ValueEnum; + +/** + * The Interface OAuthService. + */ +public interface OAuthService extends GitHubService { + + /** + * The Enum Permission. + */ + public enum Scope implements ValueEnum { + + /** The USER. */ + USER("user"), + /** The REPOSITORY. */ + REPOSITORY("repo"); + + /** The Constant stringToEnum. */ + private static final Map stringToEnum = new HashMap(); + + static { // Initialize map from constant name to enum constant + for (Scope op : values()) { + stringToEnum.put(op.value(), op); + } + } + + /** The value. */ + private final String value; + + /** + * Instantiates a new permission. + * + * @param value + * the value + */ + Scope(String value) { + this.value = value; + } + + /* (non-Javadoc) + * @see com.github.api.v2.schema.ValueEnum#value() + */ + @Override + public String value() { + return value; + } + + /** + * From value. + * + * @param value + * the value + * + * @return the permission + */ + public static Scope fromValue(String value) { + return stringToEnum.get(value); + } + } + + /** + * Gets the authorization url. + * + * @param callBackUrl + * the call back url + * + * @return the authorization url + */ + public String getAuthorizationUrl(String callBackUrl); + + /** + * Gets the authorization url. + * + * @param callBackUrl + * the call back url + * @param permissions + * the permissions + * + * @return the authorization url + */ + public String getAuthorizationUrl(String callBackUrl, Set permissions); + + /** + * Gets the access token. + * + * @param callBackUrl + * the call back url + * @param code + * the code + * + * @return the access token + */ + public String getAccessToken(String callBackUrl, String code); +} diff --git a/src/main/java/com/github/api/v2/services/ObjectService.java b/src/main/java/com/github/api/v2/services/ObjectService.java new file mode 100644 index 0000000..941919a --- /dev/null +++ b/src/main/java/com/github/api/v2/services/ObjectService.java @@ -0,0 +1,87 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.io.InputStream; +import java.util.List; + +import com.github.api.v2.schema.Blob; +import com.github.api.v2.schema.Tree; + +/** + * The Interface ObjectService. + */ +public interface ObjectService extends GitHubService { + + /** + * Gets the tree. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param treeSha + * the tree sha + * + * @return the tree + */ + public List getTree(String userName, String repositoryName, String treeSha); + + /** + * Gets the blob. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param treeSha + * the tree sha + * @param filePath + * the file path + * + * @return the blob + */ + public Blob getBlob(String userName, String repositoryName, String treeSha, String filePath); + + /** + * Gets the blobs. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param treeSha + * the tree sha + * + * @return the blobs + */ + public List getBlobs(String userName, String repositoryName, String treeSha); + + /** + * Gets the object content. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param objectSha + * the object sha + * + * @return the object content + */ + public InputStream getObjectContent(String userName, String repositoryName, String objectSha); +} diff --git a/src/main/java/com/github/api/v2/services/OrganizationService.java b/src/main/java/com/github/api/v2/services/OrganizationService.java new file mode 100644 index 0000000..583f2f2 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/OrganizationService.java @@ -0,0 +1,47 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.util.List; + +import com.github.api.v2.schema.Organization; +import com.github.api.v2.schema.Repository; +import com.github.api.v2.schema.Team; +import com.github.api.v2.schema.User; + +/** + * The Interface OrganizationService. + */ +public interface OrganizationService extends GitHubService { + public Organization getOrganization(String name); + public List getUserOrganizations(); + public void updateOrganization(Organization organization); + public List getAllOrganizationRepositories(); + public List getPublicRepositories(String organizationName); + public List getPublicMembers(String organizationName); + public List getTeams(String organizationName); + public void createTeam(Team team); + public Team getTeam(String teamId); + public void updateTeam(Team team); + public void deleteTeam(String teamId); + public List getTeamMembers(String teamId); + public void addTeamMember(String teamId, String userName); + public void removeTeamMember(String teamId, String userName); + public List getTeamRepositories(String teamId); + public void addTeamRepository(String userName, String repositoryName); + public void removeTeamRepository(String teamId, String userName, String repositoryName); +} diff --git a/src/main/java/com/github/api/v2/services/RepositoryService.java b/src/main/java/com/github/api/v2/services/RepositoryService.java new file mode 100644 index 0000000..a085f54 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/RepositoryService.java @@ -0,0 +1,322 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.util.List; +import java.util.Map; +import java.util.zip.ZipInputStream; + +import com.github.api.v2.schema.Key; +import com.github.api.v2.schema.Language; +import com.github.api.v2.schema.Repository; +import com.github.api.v2.schema.User; +import com.github.api.v2.schema.Repository.Visibility; + +/** + * The Interface RepositoryService. + */ +public interface RepositoryService extends GitHubService { + + /** + * Search repositories. + * + * @param query + * the query + * + * @return the list< repository> + */ + public List searchRepositories(String query); + + /** + * Search repositories. + * + * @param query + * the query + * @param language + * the language + * + * @return the list< repository> + */ + public List searchRepositories(String query, Language language); + + /** + * Search repositories. + * + * @param query + * the query + * @param pageNumber + * the page number + * + * @return the list< repository> + */ + public List searchRepositories(String query, int pageNumber); + + /** + * Search repositories. + * + * @param query + * the query + * @param language + * the language + * @param pageNumber + * the page number + * + * @return the list< repository> + */ + public List searchRepositories(String query, Language language, int pageNumber); + + /** + * Gets the repository. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the repository + */ + public Repository getRepository(String userName, String repositoryName); + + /** + * Update repository. + * + * @param repository + * the repository + */ + public void updateRepository(Repository repository); + + /** + * Gets the repositories. + * + * @param userName + * the user name + * + * @return the repositories + */ + public List getRepositories(String userName); + + /** + * Watch repository. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + */ + public void watchRepository(String userName, String repositoryName); + + /** + * Unwatch repository. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + */ + public void unwatchRepository(String userName, String repositoryName); + + /** + * Fork repository. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the repository + */ + public Repository forkRepository(String userName, String repositoryName); + + /** + * Creates the repository. + * + * @param name + * the name + * @param description + * the description + * @param homePage + * the home page + * @param visibility + * the visibility + */ + public void createRepository(String name, String description, String homePage, Visibility visibility); + + /** + * Delete repository. + * + * @param repositoryName + * the repository name + */ + public void deleteRepository(String repositoryName); + + /** + * Change visibility. + * + * @param repositoryName + * the repository name + * @param visibility + * the visibility + */ + public void changeVisibility(String repositoryName, Visibility visibility); + + /** + * Gets the deploy keys. + * + * @param repositoryName + * the repository name + * + * @return the deploy keys + */ + public List getDeployKeys(String repositoryName); + + /** + * Adds the deploy key. + * + * @param repositoryName + * the repository name + * @param title + * the title + * @param key + * the key + * + * @return the string + */ + public List addDeployKey(String repositoryName, String title, String key); + + /** + * Removes the deploy key. + * + * @param repository + * the repository + * @param id + * the id + */ + public void removeDeployKey(String repository, String id); + + /** + * Gets the collaborators. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the collaborators + */ + public List getCollaborators(String userName, String repositoryName); + + /** + * Adds the collaborator. + * + * @param repositoryName + * the repository name + * @param collaboratorName + * the collaborator name + */ + public void addCollaborator(String repositoryName, String collaboratorName); + + /** + * Removes the collaborator. + * + * @param repositoryName + * the repository name + * @param collaboratorName + * the collaborator name + */ + public void removeCollaborator(String repositoryName, String collaboratorName); + + /** + * Gets the pushable repositories. + * + * @return the pushable repositories + */ + public List getPushableRepositories(); + + /** + * Gets the contributors. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the contributors + */ + public List getContributors(String userName, String repositoryName); + + /** + * Gets the watchers. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the watchers + */ + public List getWatchers(String userName, String repositoryName); + + /** + * Gets the forks. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the forks + */ + public List getForks(String userName, String repositoryName); + + /** + * Gets the language breakdown. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the language breakdown + */ + public Map getLanguageBreakdown(String userName, String repositoryName); + + /** + * Gets the tags. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the tags + */ + public Map getTags(String userName, String repositoryName); + + /** + * Gets the branches. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * + * @return the branches + */ + public Map getBranches(String userName, String repositoryName); + + public ZipInputStream getRepositoryArchive(String userName, String repositoryName, String branchName); +} diff --git a/src/main/java/com/github/api/v2/services/UserService.java b/src/main/java/com/github/api/v2/services/UserService.java new file mode 100644 index 0000000..f2223d1 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/UserService.java @@ -0,0 +1,171 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.util.List; + +import com.github.api.v2.schema.Key; +import com.github.api.v2.schema.Organization; +import com.github.api.v2.schema.Repository; +import com.github.api.v2.schema.User; + +/** + * The Interface UserService. + */ +public interface UserService extends GitHubService { + + /** + * Search users by name. + * + * @param name + * the name + * + * @return the list< user> + */ + public List searchUsersByName(String name); + + /** + * Gets the user by email. + * + * @param email + * the email + * + * @return the user by email + */ + public User getUserByEmail(String email); + + /** + * Gets the user by username. + * + * @param userName + * the user name + * + * @return the user by username + */ + public User getUserByUsername(String userName); + + /** + * Gets the current user. + * + * @return the current user + */ + public User getCurrentUser(); + + /** + * Update user. + * + * @param user + * the user + */ + public void updateUser(User user); + + /** + * Gets the user followers. + * + * @param userName + * the user name + * + * @return the user followers + */ + public List getUserFollowers(String userName); + + /** + * Gets the user following. + * + * @param userName + * the user name + * + * @return the user following + */ + public List getUserFollowing(String userName); + + /** + * Follow user. + * + * @param userName + * the user name + */ + public void followUser(String userName); + + /** + * Unfollow user. + * + * @param userName + * the user name + */ + public void unfollowUser(String userName); + + /** + * Gets the watched repositories. + * + * @param userName + * the user name + * + * @return the watched repositories + */ + public List getWatchedRepositories(String userName); + + /** + * Gets the keys. + * + * @return the keys + */ + public List getKeys(); + + /** + * Adds the key. + * + * @param title + * the title + * @param key + * the key + */ + public void addKey(String title, String key); + + /** + * Removes the key. + * + * @param id + * the id + */ + public void removeKey(String id); + + /** + * Gets the emails. + * + * @return the emails + */ + public List getEmails(); + + /** + * Adds the email. + * + * @param email + * the email + */ + public void addEmail(String email); + + /** + * Removes the email. + * + * @param email + * the email + */ + public void removeEmail(String email); + + public List getUserOrganizations(String userName); +} diff --git a/src/main/java/com/github/api/v2/services/auth/Authentication.java b/src/main/java/com/github/api/v2/services/auth/Authentication.java new file mode 100644 index 0000000..05afe8a --- /dev/null +++ b/src/main/java/com/github/api/v2/services/auth/Authentication.java @@ -0,0 +1,24 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.auth; + +/** + * The Interface Authentication. + */ +public interface Authentication { + +} diff --git a/src/main/java/com/github/api/v2/services/auth/HeaderBasedAuthentication.java b/src/main/java/com/github/api/v2/services/auth/HeaderBasedAuthentication.java new file mode 100644 index 0000000..6f321f6 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/auth/HeaderBasedAuthentication.java @@ -0,0 +1,32 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.auth; + +import java.util.Map; + +/** + * The Interface HeaderBasedAuthentication. + */ +public interface HeaderBasedAuthentication extends Authentication { + + /** + * Gets the headers. + * + * @return the headers + */ + public Map getHeaders(); +} diff --git a/src/main/java/com/github/api/v2/services/auth/LoginPasswordAuthentication.java b/src/main/java/com/github/api/v2/services/auth/LoginPasswordAuthentication.java new file mode 100644 index 0000000..1217479 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/auth/LoginPasswordAuthentication.java @@ -0,0 +1,103 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.auth; + +import java.util.HashMap; +import java.util.Map; + +import com.github.api.v2.services.util.Base64; + + +/** + * The Class LoginPasswordAuthentication. + */ +public class LoginPasswordAuthentication implements HeaderBasedAuthentication { + + /** The Constant AUTHORIZATION. */ + private static final String AUTHORIZATION = "Authorization"; + + /** The Constant BASIC. */ + private static final String BASIC = "Basic "; + + /** The login. */ + public String login; + + /** The password. */ + public String password; + + /** + * Instantiates a new login password authentication. + * + * @param login + * the login + * @param password + * the password + */ + public LoginPasswordAuthentication(String login, String password) { + this.login = login; + this.password = password; + } + + /** + * Gets the login. + * + * @return the login + */ + public String getLogin() { + return login; + } + + /** + * Sets the login. + * + * @param login + * the new login + */ + public void setLogin(String login) { + this.login = login; + } + + /** + * Gets the password. + * + * @return the password + */ + public String getPassword() { + return password; + } + + /** + * Sets the password. + * + * @param password + * the new password + */ + public void setPassword(String password) { + this.password = password; + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.auth.HeaderBasedAuthentication#getHeaders() + */ + @Override + public Map getHeaders() { + Map headers = new HashMap(); + String credentials = login + ":" + password; + headers.put(AUTHORIZATION, BASIC + Base64.encodeBytes(credentials.getBytes())); + return headers; + } +} diff --git a/src/main/java/com/github/api/v2/services/auth/LoginTokenAuthentication.java b/src/main/java/com/github/api/v2/services/auth/LoginTokenAuthentication.java new file mode 100644 index 0000000..3b1fd25 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/auth/LoginTokenAuthentication.java @@ -0,0 +1,97 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.auth; + +import java.util.HashMap; +import java.util.Map; + +import com.github.api.v2.services.constant.ParameterNames; + + +/** + * The Class LoginTokenAuthentication. + */ +public class LoginTokenAuthentication implements ParameterBasedAuthentication { + + /** The login. */ + private String login; + + /** The token. */ + private String token; + + /** + * Instantiates a new login token authentication. + * + * @param login + * the login + * @param token + * the token + */ + public LoginTokenAuthentication(String login, String token) { + this.login = login; + this.token = token; + } + + /** + * Gets the login. + * + * @return the login + */ + public String getLogin() { + return login; + } + + /** + * Sets the login. + * + * @param login + * the new login + */ + public void setLogin(String login) { + this.login = login; + } + + /** + * Gets the token. + * + * @return the token + */ + public String getToken() { + return token; + } + + /** + * Sets the token. + * + * @param token + * the new token + */ + public void setToken(String token) { + this.token = token; + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.auth.ParameterBasedAuthentication#getParameters() + */ + @Override + public Map getParameters() { + Map parameters = new HashMap(); + parameters.put(ParameterNames.LOGIN, login); + parameters.put(ParameterNames.TOKEN, token); + return parameters; + } +} diff --git a/src/main/java/com/github/api/v2/services/auth/OAuthAuthentication.java b/src/main/java/com/github/api/v2/services/auth/OAuthAuthentication.java new file mode 100644 index 0000000..7aaa723 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/auth/OAuthAuthentication.java @@ -0,0 +1,71 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.auth; + +import java.util.HashMap; +import java.util.Map; + +import com.github.api.v2.services.constant.ParameterNames; + + +/** + * The Class OAuthAuthentication. + */ +public class OAuthAuthentication implements ParameterBasedAuthentication { + + /** The access token. */ + private String accessToken; + + /** + * Instantiates a new o auth authentication. + * + * @param accessToken + * the access token + */ + public OAuthAuthentication(String accessToken) { + this.accessToken = accessToken; + } + + /** + * Gets the access token. + * + * @return the access token + */ + public String getAccessToken() { + return accessToken; + } + + /** + * Sets the access token. + * + * @param accessToken + * the new access token + */ + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.auth.ParameterBasedAuthentication#getParameters() + */ + @Override + public Map getParameters() { + Map parameters = new HashMap(); + parameters.put(ParameterNames.ACCESS_TOKEN, accessToken); + return parameters; + } +} diff --git a/src/main/java/com/github/api/v2/services/auth/ParameterBasedAuthentication.java b/src/main/java/com/github/api/v2/services/auth/ParameterBasedAuthentication.java new file mode 100644 index 0000000..ce8d497 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/auth/ParameterBasedAuthentication.java @@ -0,0 +1,32 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.auth; + +import java.util.Map; + +/** + * The Interface ParameterBasedAuthentication. + */ +public interface ParameterBasedAuthentication extends Authentication { + + /** + * Gets the parameters. + * + * @return the parameters + */ + public Map getParameters(); +} diff --git a/src/main/java/com/github/api/v2/services/constant/ApplicationConstants.java b/src/main/java/com/github/api/v2/services/constant/ApplicationConstants.java new file mode 100644 index 0000000..f867b00 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/constant/ApplicationConstants.java @@ -0,0 +1,190 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.constant; + +import java.io.IOException; +import java.util.Properties; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.regex.Pattern; + +/** + * The Class ApplicationConstants. + */ +public final class ApplicationConstants { + + /** The Constant APP_CONSTANTS_FILE. */ + public static final String APP_CONSTANTS_FILE = "ApplicationConstants.properties"; + + /** The Constant LOG. */ + private static final Logger LOG = Logger.getLogger(ApplicationConstants.class.getCanonicalName()); + + /** The Constant applicationConstants. */ + private static final Properties applicationConstants = new Properties(); + + static { + try { + applicationConstants.load( + ApplicationConstants.class.getResourceAsStream(APP_CONSTANTS_FILE)); + } catch (IOException e) { + LOG.log(Level.SEVERE, "An error occurred while loading properties.", e); + } + } + + /** The Constant CONTENT_ENCODING. */ + public static final String CONTENT_ENCODING = getProperty("com.github.api.v2.services.encoding"); + + /** The Constant DEFAULT_API_VERSION. */ + public static final String DEFAULT_API_VERSION = getProperty("com.github.api.v2.services.defaultApiVersion"); + + /** The Constant DEFAULT_FORMAT. */ + public static final String DEFAULT_FORMAT = getProperty("com.github.api.v2.services.defaultFormat"); + + /** The Constant DATE_FORMAT. */ + public static final String DATE_FORMAT = getProperty("com.github.api.v2.services.dateFormat"); + + /** The Constant CONNECT_TIMEOUT. */ + public static final int CONNECT_TIMEOUT = getIntProperty("com.github.api.v2.services.connectTimeout"); + + /** The Constant READ_TIMEOUT. */ + public static final int READ_TIMEOUT = getIntProperty("com.github.api.v2.services.readTimeout"); + + /** The Constant ACCESS_TOKEN_PATTERN. */ + public static final Pattern ACCESS_TOKEN_PATTERN = getPatternProperty("com.github.api.v2.services.accessTokenPattern"); + + /** The Constant ACCESS_DENIED_PATTERN. */ + public static final Pattern ACCESS_DENIED_PATTERN = getPatternProperty("com.github.api.v2.services.accessDeniedPattern"); + + /** + * Instantiates a new application constants. + */ + private ApplicationConstants() {} + + /** + * Gets the property. + * + * @param key + * the key + * + * @return the property + */ + public static String getProperty(String key) { + return applicationConstants.getProperty(key); + } + + /** + * Gets the int property. + * + * @param key + * the key + * + * @return the int property + */ + public static int getIntProperty(String key) { + String property = applicationConstants.getProperty(key); + + if (isNullOrEmpty(property)) { + return 0; + } else { + return Integer.parseInt(property); + } + } + + /** + * Gets the boolean property. + * + * @param key + * the key + * + * @return the boolean property + */ + public static boolean getBooleanProperty(String key) { + String property = applicationConstants.getProperty(key); + + if (isNullOrEmpty(property)) { + return false; + } else { + return Boolean.parseBoolean(property); + } + } + + /** + * Gets the double property. + * + * @param key + * the key + * + * @return the double property + */ + public static double getDoubleProperty(String key) { + String property = applicationConstants.getProperty(key); + + if (isNullOrEmpty(property)) { + return 0; + } else { + return Double.parseDouble(property); + } + } + + /** + * Gets the long property. + * + * @param key + * the key + * + * @return the long property + */ + public static long getLongProperty(String key) { + String property = applicationConstants.getProperty(key); + + if (isNullOrEmpty(property)) { + return 0; + } else { + return Long.parseLong(property); + } + } + + /** + * Gets the pattern property. + * + * @param key + * the key + * + * @return the pattern property + */ + public static Pattern getPatternProperty(String key) { + String property = applicationConstants.getProperty(key); + + if (isNullOrEmpty(property)) { + return null; + } else { + return Pattern.compile(property); + } + } + + /** + * Checks if is null or empty. + * + * @param s + * the s + * + * @return true, if is null or empty + */ + private static boolean isNullOrEmpty(String s) { + return ((s == null) || s.length() == 0); + } +} diff --git a/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java b/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java new file mode 100644 index 0000000..cc54f3d --- /dev/null +++ b/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java @@ -0,0 +1,653 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.constant; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Properties; +import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; + +import com.github.api.v2.schema.ValueEnum; + +/** + * The Class GitHubApiUrls. + */ +public final class GitHubApiUrls { + + /** The Constant API_URLS_FILE. */ + public static final String API_URLS_FILE = "GitHubApiUrls.properties"; + + /** The Constant logger. */ + private static final Logger logger = Logger.getLogger(GitHubApiUrls.class.getCanonicalName()); + + /** The Constant gitHubApiUrls. */ + private static final Properties gitHubApiUrls = new Properties(); + + static { + try { + gitHubApiUrls.load(GitHubApiUrls.class.getResourceAsStream(API_URLS_FILE)); + } catch (IOException e) { + logger.log(Level.SEVERE, "An error occurred while loading urls.", e); + } + } + + /** + * The Interface OAuthUrls. + */ + public static interface OAuthUrls { + + /** The Constant AUTHORIZE_URL. */ + public static final String AUTHORIZE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.oauthService.authorize"); + + /** The Constant ACCESS_TOKEN_URL. */ + public static final String ACCESS_TOKEN_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.oauthService.accessToken"); + } + + /** + * The Interface UserApiUrls. + */ + public static interface UserApiUrls { + + /** The Constant SEARCH_USERS_BY_NAME_URL. */ + public static final String SEARCH_USERS_BY_NAME_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.searchUsersByName"); + + /** The Constant SEARCH_USERS_BY_EMAIL_URL. */ + public static final String SEARCH_USERS_BY_EMAIL_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.searchUsersByEmail"); + + /** The Constant GET_USER_URL. */ + public static final String GET_USER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getUser"); + + /** The Constant GET_CURRENT_USER_URL. */ + public static final String GET_CURRENT_USER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getCurrentUser"); + + /** The Constant UPDATE_USER_URL. */ + public static final String UPDATE_USER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.updateUser"); + + /** The Constant GET_USER_FOLLOWERS_URL. */ + public static final String GET_USER_FOLLOWERS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getUserFollowers"); + + /** The Constant GET_USER_FOLLOWING_URL. */ + public static final String GET_USER_FOLLOWING_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getUserFollowing"); + + /** The Constant FOLLOW_USER_URL. */ + public static final String FOLLOW_USER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.followUser"); + + /** The Constant UNFOLLOW_USER_URL. */ + public static final String UNFOLLOW_USER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.unfollowUser"); + + /** The Constant GET_WATCHED_REPOSITORIES_URL. */ + public static final String GET_WATCHED_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getWatchedRepositories"); + + /** The Constant GET_KEYS_URL. */ + public static final String GET_KEYS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getKeys"); + + /** The Constant ADD_KEY_URL. */ + public static final String ADD_KEY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.addKey"); + + /** The Constant REMOVE_KEY_URL. */ + public static final String REMOVE_KEY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.removeKey"); + + /** The Constant GET_EMAILS_URL. */ + public static final String GET_EMAILS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getEmails"); + + /** The Constant ADD_EMAIL_URL. */ + public static final String ADD_EMAIL_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.addEmail"); + + /** The Constant REMOVE_EMAIL_URL. */ + public static final String REMOVE_EMAIL_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.removeEmail"); + + /** The Constant GET_USER_ORGANIZATIONS. */ + public static final String GET_USER_ORGANIZATIONS = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getUserOrganizations"); + + } + + /** + * The Interface IssueApiUrls. + */ + public static interface IssueApiUrls { + + /** The Constant SEARCH_ISSUES_URL. */ + public static final String SEARCH_ISSUES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.searchIssues"); + + /** The Constant GET_ISSUES_URL. */ + public static final String GET_ISSUES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.getIssues"); + + /** The Constant GET_ISSUE_URL. */ + public static final String GET_ISSUE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.getIssue"); + + /** The Constant GET_ISSUE_COMMENTS_URL. */ + public static final String GET_ISSUE_COMMENTS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.getIssueComments"); + + /** The Constant CREATE_ISSUE_URL. */ + public static final String CREATE_ISSUE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.createIssue"); + + /** The Constant CLOSE_ISSUE_URL. */ + public static final String CLOSE_ISSUE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.closeIssue"); + + /** The Constant REOPEN_ISSUE_URL. */ + public static final String REOPEN_ISSUE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.reopenIssue"); + + /** The Constant UPDATE_ISSUE_URL. */ + public static final String UPDATE_ISSUE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.updateIssue"); + + /** The Constant GET_ISSUE_LABELS_URL. */ + public static final String GET_ISSUE_LABELS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.getIssueLabels"); + + /** The Constant ADD_LABEL_URL. */ + public static final String ADD_LABEL_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.addLabel"); + + /** The Constant REMOVE_LABEL_URL. */ + public static final String REMOVE_LABEL_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.removeLabel"); + + /** The Constant ADD_COMMENT_URL. */ + public static final String ADD_COMMENT_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.addComment"); + + public static final String GET_ISSUES_BY_LABEL_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.getIssuesByLabel"); + } + + /** + * The Interface GistApiUrls. + */ + public static interface GistApiUrls { + + /** The Constant GET_GIST_URL. */ + public static final String GET_GIST_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.gistService.getGist"); + + /** The Constant GET_GIST_CONTENT_URL. */ + public static final String GET_GIST_CONTENT_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.gistService.getGistContent"); + + /** The Constant GET_USER_GISTS_URL. */ + public static final String GET_USER_GISTS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.gistService.getUserGists"); + } + + /** + * The Interface NetworkApiUrls. + */ + public static interface NetworkApiUrls { + + /** The Constant GET_NETWORK_META_URL. */ + public static final String GET_NETWORK_META_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.networkService.getNetworkMeta"); + + /** The Constant GET_NETWORK_DATA_URL. */ + public static final String GET_NETWORK_DATA_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.networkService.getNetworkData"); + } + + /** + * The Interface RepositoryApiUrls. + */ + public static interface RepositoryApiUrls { + + /** The Constant SEARCH_REPOSITORIES_URL. */ + public static final String SEARCH_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.searchRepositories"); + + /** The Constant GET_REPOSITORY_URL. */ + public static final String GET_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getRepository"); + + /** The Constant UPDATE_REPOSITORY_URL. */ + public static final String UPDATE_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.updateRepository"); + + /** The Constant GET_REPOSITORIES_URL. */ + public static final String GET_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getRepositories"); + + /** The Constant WATCH_REPOSITORY_URL. */ + public static final String WATCH_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.watchRepository"); + + /** The Constant UNWATCH_REPOSITORY_URL. */ + public static final String UNWATCH_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.unwatchRepository"); + + /** The Constant FORK_REPOSITORY_URL. */ + public static final String FORK_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.forkRepository"); + + /** The Constant CREATE_REPOSITORY_URL. */ + public static final String CREATE_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.createRepository"); + + /** The Constant DELETE_REPOSITORY_URL. */ + public static final String DELETE_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.deleteRepository"); + + /** The Constant CHANGE_VISIBILITY_URL. */ + public static final String CHANGE_VISIBILITY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.changeVisibility"); + + /** The Constant GET_DEPLOY_KEYS_URL. */ + public static final String GET_DEPLOY_KEYS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getKeys"); + + /** The Constant ADD_DEPLOY_KEY_URL. */ + public static final String ADD_DEPLOY_KEY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.addKey"); + + /** The Constant REMOVE_DEPLOY_KEY_URL. */ + public static final String REMOVE_DEPLOY_KEY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.removeKey"); + + /** The Constant GET_COLLABORATORS_URL. */ + public static final String GET_COLLABORATORS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getCollaborators"); + + /** The Constant ADD_COLLABORATOR_URL. */ + public static final String ADD_COLLABORATOR_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.addCollaborator"); + + /** The Constant REMOVE_COLLABORATOR_URL. */ + public static final String REMOVE_COLLABORATOR_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.removeCollaborator"); + + /** The Constant GET_PUSHABLE_REPOSITORIES_URL. */ + public static final String GET_PUSHABLE_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getPushableRepositories"); + + /** The Constant GET_CONTRIBUTORS_URL. */ + public static final String GET_CONTRIBUTORS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getContributors"); + + /** The Constant GET_WATCHERS_URL. */ + public static final String GET_WATCHERS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getWatchers"); + + /** The Constant GET_FORKS_URL. */ + public static final String GET_FORKS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getForks"); + + /** The Constant GET_LANGUAGE_BREAKDOWN_URL. */ + public static final String GET_LANGUAGE_BREAKDOWN_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getLanguageBreakdown"); + + /** The Constant GET_TAGS_URL. */ + public static final String GET_TAGS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getTags"); + + /** The Constant GET_BRANCHES_URL. */ + public static final String GET_BRANCHES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getBranches"); + + /** The Constant GET_REPOSITORY_ARCHIVE_URL. */ + public static final String GET_REPOSITORY_ARCHIVE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getRepositoryArchive"); + } + + /** + * The Interface CommitApiUrls. + */ + public static interface CommitApiUrls { + + /** The Constant GET_COMMITS_URL. */ + public static final String GET_COMMITS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.commitService.getCommits"); + + /** The Constant GET_COMMITS_FILE_URL. */ + public static final String GET_COMMITS_FILE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.commitService.getCommitsFile"); + + /** The Constant GET_COMMIT_URL. */ + public static final String GET_COMMIT_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.commitService.getCommit"); + } + + /** + * The Interface ObjectApiUrls. + */ + public static interface ObjectApiUrls { + + /** The Constant GET_TREE_URL. */ + public static final String GET_TREE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.objectService.getTree"); + + /** The Constant GET_BLOB_URL. */ + public static final String GET_BLOB_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.objectService.getBlob"); + + /** The Constant GET_BLOBS_URL. */ + public static final String GET_BLOBS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.objectService.getBlobs"); + + /** The Constant GET_OBJECT_CONTENT_URL. */ + public static final String GET_OBJECT_CONTENT_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.objectService.getObjectContent"); + } + + /** + * The Interface OrganizationApiUrls. + */ + public static interface OrganizationApiUrls { + + /** The Constant GET_ORGANIZATION_URL. */ + public static final String GET_ORGANIZATION_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getOrganization"); + + /** The Constant GET_ORGANIZATION_URL. */ + public static final String GET_ORGANIZATIONS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getOrganizations"); + + /** The Constant UPDATE_ORGANIZATION_URL. */ + public static final String UPDATE_ORGANIZATION_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.updateOrganization"); + + /** The Constant GET_ALL_REPOSITORIES_URL. */ + public static final String GET_ALL_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getAllRepositories"); + + /** The Constant GET_PUBLIC_REPOSITORIES_URL. */ + public static final String GET_PUBLIC_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getPublicRepositories"); + + /** The Constant GET_PUBLIC_MEMBERS_URL. */ + public static final String GET_PUBLIC_MEMBERS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getPublicMembers"); + + /** The Constant GET_TEAMS_URL. */ + public static final String GET_TEAMS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getTeams"); + + /** The Constant CREATE_TEAM_URL. */ + public static final String CREATE_TEAM_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.createTeam"); + + /** The Constant GET_TEAM_URL. */ + public static final String GET_TEAM_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getTeam"); + + /** The Constant UPDATE_TEAM_URL. */ + public static final String UPDATE_TEAM_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.updateTeam"); + + /** The Constant DELETE_TEAM_URL. */ + public static final String DELETE_TEAM_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.deleteTeam"); + + /** The Constant GET_TEAM_MEMBERS_URL. */ + public static final String GET_TEAM_MEMBERS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getTeamMembers"); + + /** The Constant ADD_TEAM_MEMBER_URL. */ + public static final String ADD_TEAM_MEMBER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.addTeamMember"); + + /** The Constant REMOVE_TEAM_MEMBER_URL. */ + public static final String REMOVE_TEAM_MEMBER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.removeTeamMember"); + + /** The Constant GET_TEAM_REPOSITORIES_URL. */ + public static final String GET_TEAM_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getTeamRepositories"); + + /** The Constant ADD_TEAM_REPOSITORY_URL. */ + public static final String ADD_TEAM_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.addTeamRepository"); + + /** The Constant REMOVE_TEAM_REPOSITORY_URL. */ + public static final String REMOVE_TEAM_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.removeTeamRepository"); + } + + + /** + * The Interface ObjectApiUrls. + */ + public static interface FeedUrls { + /** The Constant GET_PUBLIC_USER_FEED_URL. */ + public static final String GET_PUBLIC_USER_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getPublicUserFeed"); + + /** The Constant GET_PRIVATE_USER_FEED_URL. */ + public static final String GET_PRIVATE_USER_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getPrivateUserFeed"); + + /** The Constant GET_COMMIT_FEED_URL. */ + public static final String GET_COMMIT_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getCommitFeed"); + + /** The Constant GET_NETWORK_FEED_URL. */ + public static final String GET_NETWORK_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getNetworkFeed"); + + /** The Constant GET_WIKI_FEED_URL. */ + public static final String GET_WIKI_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getWikiFeed"); + + /** The Constant GET_PUBLIC_TIMELINE_FEED_URL. */ + public static final String GET_PUBLIC_TIMELINE_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getPublicTimelineFeed"); + + /** The Constant GET_DISCUSSIONS_FEED_URL. */ + public static final String GET_DISCUSSIONS_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getDiscussionsFeed"); + + /** The Constant GET_DISCUSSIONS_FEED_BY_TOPIC_URL. */ + public static final String GET_DISCUSSIONS_FEED_BY_TOPIC_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getDiscussionsFeedByTopic"); + + /** The Constant GET_JOB_POSITIONS_FEED_URL. */ + public static final String GET_JOB_POSITIONS_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getJobPositionsFeed"); + + /** The Constant GET_BLOG_FEED_URL. */ + public static final String GET_BLOG_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getBlogFeed"); + } + + /** + * Instantiates a new git hub api urls. + */ + private GitHubApiUrls() {} + + /** + * The Class GitHubApiUrlBuilder. + */ + public static class GitHubApiUrlBuilder { + + /** The Constant API_URLS_PLACEHOLDER_START. */ + private static final char API_URLS_PLACEHOLDER_START = '{'; + + /** The Constant API_URLS_PLACEHOLDER_END. */ + private static final char API_URLS_PLACEHOLDER_END = '}'; + + /** The url format. */ + private String urlFormat; + + /** The parameters map. */ + private Map parametersMap = new HashMap(); + + /** The fields map. */ + private Map fieldsMap = new HashMap(); + + /** + * Instantiates a new git hub api url builder. + * + * @param urlFormat + * the url format + */ + public GitHubApiUrlBuilder(String urlFormat) { + this(urlFormat, ApplicationConstants.DEFAULT_API_VERSION, ApplicationConstants.DEFAULT_FORMAT); + } + + /** + * Instantiates a new git hub api url builder. + * + * @param urlFormat + * the url format + * @param apiVersion + * the api version + * @param format + * the format + */ + public GitHubApiUrlBuilder(String urlFormat, String apiVersion, String format) { + this.urlFormat = urlFormat; + fieldsMap.put(ParameterNames.VERSION, apiVersion); + fieldsMap.put(ParameterNames.FORMAT, format); + } + + /** + * With parameter. + * + * @param name + * the name + * @param value + * the value + * + * @return the git hub api url builder + */ + public GitHubApiUrlBuilder withParameter(String name, String value) { + if (value != null && value.length() > 0) { + parametersMap.put(name, encodeUrl(value)); + } + + return this; + } + + /** + * With parameter enum. + * + * @param name + * the name + * @param value + * the value + * + * @return the git hub api url builder + */ + public GitHubApiUrlBuilder withParameterEnum(String name, ValueEnum value) { + withParameter(name, value.value()); + + return this; + } + + /** + * With parameter enum set. + * + * @param name + * the name + * @param enumSet + * the enum set + * @param separator + * the separator + * + * @return the git hub api url builder + */ + public GitHubApiUrlBuilder withParameterEnumSet(String name, Set enumSet, String separator) { + StringBuilder builder = new StringBuilder(); + + for (Iterator iterator = enumSet.iterator(); iterator.hasNext();) { + builder.append(encodeUrl(iterator.next().value())); + if (iterator.hasNext()) { + builder.append(separator); + } + } + + parametersMap.put(name, builder.toString()); + + return this; + } + + /** + * With empty field. + * + * @param name + * the name + * + * @return the git hub api url builder + */ + public GitHubApiUrlBuilder withEmptyField(String name) { + fieldsMap.put(name, ""); + + return this; + } + + /** + * With field. + * + * @param name + * the name + * @param value + * the value + * + * @return the git hub api url builder + */ + public GitHubApiUrlBuilder withField(String name, String value) { + withField(name, value, false); + + return this; + } + + /** + * With field. + * + * @param name + * the name + * @param value + * the value + * @param escape + * the escape + * + * @return the git hub api url builder + */ + public GitHubApiUrlBuilder withField(String name, String value, + boolean escape) { + if (escape) { + fieldsMap.put(name, encodeUrl(value)); + } else { + fieldsMap.put(name, value); + } + + return this; + } + + /** + * With field enum. + * + * @param name + * the name + * @param value + * the value + * + * @return the git hub api url builder + */ + public GitHubApiUrlBuilder withFieldEnum(String name, ValueEnum value) { + if (value.value() == null || value.value().length() == 0) { + fieldsMap.put(name, ""); + } else { + fieldsMap.put(name, value.value()); + } + + return this; + } + + + /** + * Builds the url. + * + * @return the string + */ + public String buildUrl() { + StringBuilder urlBuilder = new StringBuilder(); + StringBuilder placeHolderBuilder = new StringBuilder(); + boolean placeHolderFlag = false; + boolean firstParameter = true; + for (int i = 0; i < urlFormat.length(); i++) { + if (urlFormat.charAt(i) == API_URLS_PLACEHOLDER_START) { + placeHolderBuilder = new StringBuilder(); + placeHolderFlag = true; + } else if (placeHolderFlag + && urlFormat.charAt(i) == API_URLS_PLACEHOLDER_END) { + String placeHolder = placeHolderBuilder.toString(); + if (fieldsMap.containsKey(placeHolder)) { + urlBuilder.append(fieldsMap.get(placeHolder)); + } else if (parametersMap.containsKey(placeHolder)) { + StringBuilder builder = new StringBuilder(); + if (firstParameter) { + firstParameter = false; + } else { + builder.append("&"); + } + builder.append(placeHolder); + builder.append("="); + builder.append(parametersMap.get(placeHolder)); + urlBuilder.append(builder.toString()); + } else { + // we did not find a binding for the placeholder. + // skip it. + // urlBuilder.append(API_URLS_PLACEHOLDER_START); + // urlBuilder.append(placeHolder); + // urlBuilder.append(API_URLS_PLACEHOLDER_END); + } + placeHolderFlag = false; + } else if (placeHolderFlag) { + placeHolderBuilder.append(urlFormat.charAt(i)); + } else { + urlBuilder.append(urlFormat.charAt(i)); + } + } + + + logger.log(Level.FINE, "URL generated: " + urlBuilder.toString()); + + return urlBuilder.toString(); + } + + /** + * Encode url. + * + * @param original + * the original + * + * @return the string + */ + private static String encodeUrl(String original) { + try { + return URLEncoder.encode(original, ApplicationConstants.CONTENT_ENCODING); + } catch (UnsupportedEncodingException e) { + // should never be here.. + return original; + } + } + } +} diff --git a/src/main/java/com/github/api/v2/services/constant/ParameterNames.java b/src/main/java/com/github/api/v2/services/constant/ParameterNames.java new file mode 100644 index 0000000..49790be --- /dev/null +++ b/src/main/java/com/github/api/v2/services/constant/ParameterNames.java @@ -0,0 +1,167 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.constant; + +/** + * The Interface ParameterNames. + */ +public interface ParameterNames { + + /** The Constant VERSION. */ + public static final String VERSION = "version"; + + /** The Constant USER_NAME. */ + public static final String USER_NAME = "userName"; + + /** The Constant EMAIL. */ + public static final String EMAIL = "email"; + + /** The Constant REPOSITORY_NAME. */ + public static final String REPOSITORY_NAME = "repositoryName"; + + /** The Constant KEYWORD. */ + public static final String KEYWORD = "keyword"; + + /** The Constant STATE. */ + public static final String STATE = "state"; + + /** The Constant ISSUE_NUMBER. */ + public static final String ISSUE_NUMBER = "issueNumber"; + + /** The Constant LABEL. */ + public static final String LABEL = "label"; + + /** The Constant GIST_ID. */ + public static final String GIST_ID = "gistId"; + + /** The Constant FILE_NAME. */ + public static final String FILE_NAME = "fileName"; + + /** The Constant NET_HASH. */ + public static final String NET_HASH = "netHash"; + + /** The Constant START_INDEX. */ + public static final String START_INDEX = "startIndex"; + + /** The Constant END_INDEX. */ + public static final String END_INDEX = "endIndex"; + + /** The Constant LANGUAGE. */ + public static final String LANGUAGE = "language"; + + /** The Constant START_PAGE. */ + public static final String START_PAGE = "startPage"; + + /** The Constant VISIBILITY. */ + public static final String VISIBILITY = "visibility"; + + /** The Constant BRANCH. */ + public static final String BRANCH = "branch"; + + /** The Constant FILE_PATH. */ + public static final String FILE_PATH = "filePath"; + + /** The Constant SHA. */ + public static final String SHA = "sha"; + + /** The Constant FORMAT. */ + public static final String FORMAT = "format"; + + /** The Constant NAME. */ + public static final String NAME = "name"; + + /** The Constant BLOG. */ + public static final String BLOG = "blog"; + + /** The Constant COMPANY. */ + public static final String COMPANY = "company"; + + /** The Constant LOCATION. */ + public static final String LOCATION = "location"; + + /** The Constant ID. */ + public static final String ID = "id"; + + /** The Constant TITLE. */ + public static final String TITLE = "title"; + + /** The Constant KEY. */ + public static final String KEY = "key"; + + /** The Constant BODY. */ + public static final String BODY = "body"; + + /** The Constant COMMENT. */ + public static final String COMMENT = "comment"; + + /** The Constant DESCRIPTION. */ + public static final String DESCRIPTION = "description"; + + /** The Constant HOME_PAGE. */ + public static final String HOME_PAGE = "homepage"; + + /** The Constant HAS_WIKI. */ + public static final String HAS_WIKI = "has_wiki"; + + /** The Constant HAS_ISSUES. */ + public static final String HAS_ISSUES = "has_issues"; + + /** The Constant HAS_DOWNLOADS. */ + public static final String HAS_DOWNLOADS = "has_downloads"; + + /** The Constant LOGIN. */ + public static final String LOGIN = "login"; + + /** The Constant TOKEN. */ + public static final String TOKEN = "token"; + + /** The Constant ACCESS_TOKEN. */ + public static final String ACCESS_TOKEN = "access_token"; + + /** The Constant CLIENT_ID. */ + public static final String CLIENT_ID = "client_id"; + + /** The Constant CLIENT_SECRET. */ + public static final String CLIENT_SECRET = "client_secret"; + + /** The Constant REDIRECT_URI. */ + public static final String REDIRECT_URI = "redirect_uri"; + + /** The Constant CODE. */ + public static final String CODE = "code"; + + /** The Constant SCOPE. */ + public static final String SCOPE = "scope"; + + /** The Constant PUBLIC. */ + public static final String PUBLIC = "public"; + + /** The Constant DELETE_TOKEN. */ + public static final String DELETE_TOKEN = "delete_token"; + + public static final String NUM = "num"; + + public static final String USER_REPOSITORY_PAIR = "userRepositoryPair"; + + public static final String ORGANIZATION_NAME = "organizationName"; + + public static final String TEAM_ID = "teamId"; + public static final String PERMISSION = "permission"; + public static final String REPO_NAMES = "repo_names"; + public static final String BILLING_EMAIL = "billing_email"; + +} diff --git a/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java b/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java new file mode 100644 index 0000000..ec405cc --- /dev/null +++ b/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java @@ -0,0 +1,232 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.impl; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.lang.reflect.Field; +import java.lang.reflect.Type; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.List; + +import com.github.api.v2.schema.Gist; +import com.github.api.v2.schema.Issue; +import com.github.api.v2.schema.Language; +import com.github.api.v2.schema.Organization; +import com.github.api.v2.schema.Permission; +import com.github.api.v2.schema.Repository; +import com.github.api.v2.schema.SchemaEntity; +import com.github.api.v2.schema.Tree; +import com.github.api.v2.services.AsyncResponseHandler; +import com.github.api.v2.services.GitHubException; +import com.github.api.v2.services.GitHubService; +import com.github.api.v2.services.constant.ApplicationConstants; +import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; +import com.google.gson.FieldNamingPolicy; +import com.google.gson.FieldNamingStrategy; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; + +/** + * The Class BaseGitHubService. + */ +public abstract class BaseGitHubService extends GitHubApiGateway implements GitHubService { + + protected static final Charset UTF_8_CHAR_SET = Charset.forName(ApplicationConstants.CONTENT_ENCODING); + + /** The parser. */ + private final JsonParser parser = new JsonParser(); + + /** The handlers. */ + private List>> handlers = new ArrayList>>(); + + /** + * Instantiates a new base git hub service. + */ + public BaseGitHubService() { + // by default we compress contents + requestHeaders.put("Accept-Encoding", "gzip, deflate"); + } + + /** + * Instantiates a new base git hub service. + * + * @param apiVersion + * the api version + */ + public BaseGitHubService(String apiVersion) { + setApiVersion(apiVersion); + } + + /** + * Unmarshall. + * + * @param typeToken + * the type token + * @param response + * the response + * + * @return the t + */ + @SuppressWarnings("unchecked") + protected T unmarshall(TypeToken typeToken, JsonElement response) { + Gson gson = getGsonBuilder().create(); + return (T) gson.fromJson(response, typeToken.getType()); + } + + /** + * Notify observers. + * + * @param response + * the response + */ + protected void notifyObservers(List response) { + for(AsyncResponseHandler> handler : handlers) { + handler.handleResponse(response); + } + } + + /* (non-Javadoc) + * @see com.google.code.stackexchange.client.query.StackExchangeApiQuery#addResonseHandler(com.google.code.stackexchange.client.AsyncResponseHandler) + */ + /** + * Adds the resonse handler. + * + * @param handler + * the handler + */ + public void addResonseHandler(AsyncResponseHandler> handler) { + handlers.add(handler); + } + + /** + * Gets the gson builder. + * + * @return the gson builder + */ + protected GsonBuilder getGsonBuilder() { + GsonBuilder builder = new GsonBuilder(); + builder.setDateFormat(ApplicationConstants.DATE_FORMAT); + builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); + builder.setFieldNamingStrategy(new FieldNamingStrategy() { + @Override + public String translateName(Field field) { + if (field.getType().equals(Repository.Visibility.class)) { + return "private"; + } else if (field.getType().equals(Gist.Visibility.class)) { + return "public"; + } else { + return field.getName(); + } + } + + }); + builder.registerTypeAdapter(Issue.State.class, new JsonDeserializer() { + @Override + public Issue.State deserialize(JsonElement arg0, Type arg1, + JsonDeserializationContext arg2) throws JsonParseException { + return Issue.State.fromValue(arg0.getAsString()); + } + }); + builder.registerTypeAdapter(Repository.Visibility.class, new JsonDeserializer() { + @Override + public Repository.Visibility deserialize(JsonElement arg0, Type arg1, + JsonDeserializationContext arg2) throws JsonParseException { + return (arg0.getAsBoolean())? Repository.Visibility.PRIVATE : Repository.Visibility.PUBLIC; + } + }); + builder.registerTypeAdapter(Gist.Visibility.class, new JsonDeserializer() { + @Override + public Gist.Visibility deserialize(JsonElement arg0, Type arg1, + JsonDeserializationContext arg2) throws JsonParseException { + return (arg0.getAsBoolean())? Gist.Visibility.PUBLIC : Gist.Visibility.PRIVATE; + } + }); + builder.registerTypeAdapter(Language.class, new JsonDeserializer() { + @Override + public Language deserialize(JsonElement arg0, Type arg1, + JsonDeserializationContext arg2) throws JsonParseException { + return Language.fromValue(arg0.getAsString()); + } + }); + builder.registerTypeAdapter(Tree.Type.class, new JsonDeserializer() { + @Override + public Tree.Type deserialize(JsonElement arg0, Type arg1, + JsonDeserializationContext arg2) throws JsonParseException { + return Tree.Type.fromValue(arg0.getAsString()); + } + }); + builder.registerTypeAdapter(Organization.Type.class, new JsonDeserializer() { + @Override + public Organization.Type deserialize(JsonElement arg0, Type arg1, + JsonDeserializationContext arg2) throws JsonParseException { + return Organization.Type.fromValue(arg0.getAsString()); + } + }); + builder.registerTypeAdapter(Permission.class, new JsonDeserializer() { + @Override + public Permission deserialize(JsonElement arg0, Type arg1, + JsonDeserializationContext arg2) throws JsonParseException { + return Permission.fromValue(arg0.getAsString()); + } + }); + return builder; + } + + /** + * Unmarshall. + * + * @param jsonContent + * the json content + * + * @return the json object + */ + protected JsonObject unmarshall(InputStream jsonContent) { + try { + JsonElement element = parser.parse(new InputStreamReader(jsonContent, UTF_8_CHAR_SET)); + if (element.isJsonObject()) { + return element.getAsJsonObject(); + } else { + throw new GitHubException("Unknown content found in response." + element); + } + } catch (Exception e) { + throw new GitHubException(e); + } finally { + closeStream(jsonContent); + } + } + + /** + * Creates the git hub api url builder. + * + * @param urlFormat + * the url format + * + * @return the git hub api url builder + */ + protected GitHubApiUrlBuilder createGitHubApiUrlBuilder(String urlFormat) { + return new GitHubApiUrlBuilder(urlFormat); + } +} diff --git a/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java b/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java new file mode 100644 index 0000000..dfedeb5 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java @@ -0,0 +1,83 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.impl; + +import java.util.List; + +import com.github.api.v2.schema.Commit; +import com.github.api.v2.services.CommitService; +import com.github.api.v2.services.constant.GitHubApiUrls; +import com.github.api.v2.services.constant.ParameterNames; +import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; + +/** + * The Class CommitServiceImpl. + */ +public class CommitServiceImpl extends BaseGitHubService implements + CommitService { + + /* (non-Javadoc) + * @see com.github.api.v2.services.CommitService#getCommit(java.lang.String, java.lang.String, java.lang.String) + */ + @Override + public Commit getCommit(String userName, String repositoryName, String sha) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.CommitApiUrls.GET_COMMIT_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.SHA, sha).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken(){}, json.get("commit")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.CommitService#getCommits(java.lang.String, java.lang.String, java.lang.String) + */ + @Override + public List getCommits(String userName, String repositoryName, + String branch) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.CommitApiUrls.GET_COMMITS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, branch).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("commits")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.CommitService#getCommits(java.lang.String, java.lang.String, java.lang.String, java.lang.String) + */ + @Override + public List getCommits(String userName, String repositoryName, + String branch, String filePath) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.CommitApiUrls.GET_COMMITS_FILE_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, branch).withField(ParameterNames.FILE_PATH, filePath).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("commits")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.impl.BaseGitHubService#getGsonBuilder() + */ + @Override + protected GsonBuilder getGsonBuilder() { + GsonBuilder gson = super.getGsonBuilder(); + gson.setDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + return gson; + } +} diff --git a/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java b/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java new file mode 100644 index 0000000..9eb863f --- /dev/null +++ b/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java @@ -0,0 +1,175 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.impl; + +import com.github.api.v2.schema.Feed; +import com.github.api.v2.services.FeedService; +import com.github.api.v2.services.GitHubException; +import com.github.api.v2.services.constant.GitHubApiUrls; +import com.github.api.v2.services.constant.ParameterNames; +import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; + +/** + * The Class NetworkServiceImpl. + */ +public class FeedServiceImpl extends BaseGitHubService implements + FeedService { + + public FeedServiceImpl() { + // by default we compress contents + requestHeaders.put("Accept-Encoding", "gzip, deflate"); + } + + @Override + public Feed getCommitFeed(String userName, String repositoryName, String branchName, int count) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_COMMIT_FEED_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, branchName).withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); + return unmarshall(apiUrl); + } + + @Override + public Feed getNetworkFeed(String userName, String repositoryName, int count) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_NETWORK_FEED_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); + return unmarshall(apiUrl); + } + + @Override + public Feed getPrivateUserFeed(String userName, int count) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_PRIVATE_USER_FEED_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); + return unmarshall(apiUrl); + } + + @Override + public Feed getPublicTimelineFeed(int count) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_PUBLIC_TIMELINE_FEED_URL); + String apiUrl = builder.withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); + return unmarshall(apiUrl); + } + + @Override + public Feed getPublicUserFeed(String userName, int count) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_PUBLIC_USER_FEED_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); + return unmarshall(apiUrl); + } + + @Override + public Feed getWikiFeed(String userName, String repositoryName, int count) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_WIKI_FEED_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); + return unmarshall(apiUrl); + } + + @Override + public Feed getBlogFeed(int count) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_BLOG_FEED_URL); + String apiUrl = builder.withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); + return unmarshall(apiUrl); + } + + @Override + public Feed getDiscussionsFeed(int count) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_DISCUSSIONS_FEED_URL); + String apiUrl = builder.withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); + return unmarshall(apiUrl); + } + + @Override + public Feed getDiscussionsFeed(String topic, int count) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_DISCUSSIONS_FEED_BY_TOPIC_URL); + String apiUrl = builder.withField(ParameterNames.KEYWORD, topic).withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); + return unmarshall(apiUrl); + } + + @Override + public Feed getJobPositionsFeed(int count) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_JOB_POSITIONS_FEED_URL); + String apiUrl = builder.withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); + return unmarshall(apiUrl); + } + + + protected Feed unmarshall(String apiUrl) { + JsonObject response = unmarshall(callApiGet(apiUrl)); + if (response.isJsonObject()) { + JsonObject json = response.getAsJsonObject(); + int status = json.get("responseStatus").getAsInt(); + if (status != 200) { + throw new GitHubException(json.get("responseDetails").getAsString()); + } + JsonElement data = json.get("responseData"); + if (data != null) { + return unmarshall(new TypeToken(){}, data.getAsJsonObject().get("feed")); + } + } + return null; + } + + protected GsonBuilder getGsonBuilder() { + GsonBuilder gson = super.getGsonBuilder(); + gson.setDateFormat("EEE', 'dd' 'MMM' 'yyyy' 'HH:mm:ss' 'Z"); + return gson; + } + +// @SuppressWarnings("unchecked") +// private Feed populateFeed(SyndFeed feed) { +// Feed retVal = new Feed(); +// retVal.setAuthor(feed.getAuthor()); +// retVal.setDescription(feed.getDescription()); +// retVal.setLink(feed.getLink()); +// retVal.setTitle(feed.getTitle()); +// List entries = new ArrayList(feed.getEntries().size()); +// retVal.setEntries(entries); +// +// for (SyndEntry entry : (List) feed.getEntries()) { +// FeedEntry feedEntry = new FeedEntry(); +// feedEntry.setAuthor(entry.getAuthor()); +//// feedEntry.setCategories(entry.getCategories()); +// if (entry.getContents() != null) { +// StringBuilder builder = new StringBuilder(); +// for (SyndContent content : (List) entry.getContents()) { +// builder.append(content.getValue()); +// } +// feedEntry.setContent(builder.toString()); +// } +// feedEntry.setLink(entry.getLink()); +// feedEntry.setPublishedDate(entry.getPublishedDate()); +// feedEntry.setTitle(entry.getTitle()); +// +// entries.add(feedEntry); +// } +// return retVal; +// } +// +// /** +// * Creates the git hub api url builder. +// * +// * @param urlFormat +// * the url format +// * +// * @return the git hub api url builder +// */ +// protected GitHubApiUrlBuilder createGitHubApiUrlBuilder(String urlFormat) { +// return new GitHubApiUrlBuilder(urlFormat); +// } +} diff --git a/src/main/java/com/github/api/v2/services/impl/GistServiceImpl.java b/src/main/java/com/github/api/v2/services/impl/GistServiceImpl.java new file mode 100644 index 0000000..d8bb3b1 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/impl/GistServiceImpl.java @@ -0,0 +1,70 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.impl; + +import java.io.InputStream; +import java.util.List; + +import com.github.api.v2.schema.Gist; +import com.github.api.v2.services.GistService; +import com.github.api.v2.services.constant.GitHubApiUrls; +import com.github.api.v2.services.constant.ParameterNames; +import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; + +/** + * The Class GistServiceImpl. + */ +public class GistServiceImpl extends BaseGitHubService implements + GistService { + + /* (non-Javadoc) + * @see com.github.api.v2.services.GistService#getGist(java.lang.String) + */ + @Override + public Gist getGist(String gistId) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.GistApiUrls.GET_GIST_URL); + String apiUrl = builder.withField(ParameterNames.GIST_ID, gistId).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + List gists = unmarshall(new TypeToken>(){}, json.get("gists")); + return (gists.isEmpty())? null : gists.get(0); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.GistService#getGistContent(java.lang.String, java.lang.String) + */ + @Override + public InputStream getGistContent(String gistId, String fileName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.GistApiUrls.GET_GIST_CONTENT_URL); + String apiUrl = builder.withField(ParameterNames.GIST_ID, gistId).withField(ParameterNames.FILE_NAME, fileName).buildUrl(); + return callApiGet(apiUrl); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.GistService#getUserGists(java.lang.String) + */ + @Override + public List getUserGists(String userName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.GistApiUrls.GET_USER_GISTS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("gists")); + } +} diff --git a/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java b/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java new file mode 100644 index 0000000..2875849 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java @@ -0,0 +1,545 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.impl; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintStream; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.zip.GZIPInputStream; + +import com.github.api.v2.services.GitHubException; +import com.github.api.v2.services.auth.Authentication; +import com.github.api.v2.services.auth.HeaderBasedAuthentication; +import com.github.api.v2.services.auth.ParameterBasedAuthentication; +import com.github.api.v2.services.constant.ApplicationConstants; + +/** + * The Class GitHubApiGateway. + */ +public abstract class GitHubApiGateway { + + /** The logger. */ + protected final Logger logger = Logger.getLogger(getClass().getCanonicalName()); + + /** The Constant GZIP_ENCODING. */ + private static final String GZIP_ENCODING = "gzip"; + + /** The Constant REFERRER. */ + private static final String REFERRER = "Referer"; + + /** The request headers. */ + protected Map requestHeaders = new HashMap(); + + /** The request parameters. */ + protected Map requestParameters = new HashMap(); + + /** The user ip address. */ + protected String userIpAddress; + + /** The api version. */ + protected String apiVersion = ApplicationConstants.DEFAULT_API_VERSION; + + /** + * Gets the api version. + * + * @return the api version + */ + public String getApiVersion() { + return apiVersion; + } + + /** + * Sets the api version. + * + * @param apiVersion + * the new api version + */ + public void setApiVersion(String apiVersion) { + this.apiVersion = apiVersion; + } + + /** + * Sets the request headers. + * + * @param requestHeaders + * the request headers + */ + public void setRequestHeaders(Map requestHeaders) { + this.requestHeaders = requestHeaders; + } + + /** + * Gets the request headers. + * + * @return the request headers + */ + public Map getRequestHeaders() { + return requestHeaders; + } + + /** + * Adds the request header. + * + * @param headerName + * the header name + * @param headerValue + * the header value + */ + public void addRequestHeader(String headerName, String headerValue) { + requestHeaders.put(headerName, headerValue); + } + + /** + * Removes the request header. + * + * @param headerName + * the header name + */ + public void removeRequestHeader(String headerName) { + requestHeaders.remove(headerName); + } + + /** + * Sets the referrer. + * + * @param referrer + * the new referrer + */ + public void setReferrer(String referrer) { + requestHeaders.put(REFERRER, referrer); + } + + /** + * Sets the user ip address. + * + * @param userIpAddress + * the new user ip address + */ + public void setUserIpAddress(String userIpAddress) { + this.userIpAddress = userIpAddress; + } + + /** + * Sets the authentication. + * + * @param authentication + * the new authentication + */ + public void setAuthentication(Authentication authentication) { + if (authentication != null) { + if (authentication instanceof ParameterBasedAuthentication) { + requestParameters.putAll(((ParameterBasedAuthentication) authentication).getParameters()); + } else if (authentication instanceof HeaderBasedAuthentication) { + requestHeaders.putAll(((HeaderBasedAuthentication) authentication).getHeaders()); + } + } + } + + /** + * Convert stream to string. + * + * @param is + * the is + * + * @return the string + */ + protected static String convertStreamToString(InputStream is) { + /* + * To convert the InputStream to String we use the BufferedReader.readLine() + * method. We iterate until the BufferedReader return null which means + * there's no more data to read. Each line will appended to a StringBuilder + * and returned as String. + */ + BufferedReader reader = new BufferedReader(new InputStreamReader(is)); + StringBuilder sb = new StringBuilder(); + + String line = null; + try { + while ((line = reader.readLine()) != null) { + sb.append(line + "\n"); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + return sb.toString(); + } + + /** + * Call api get. + * + * @param apiUrl + * the api url + * + * @return the input stream + */ + protected InputStream callApiGet(String apiUrl) { + return callApiGet(apiUrl, HttpURLConnection.HTTP_OK); + } + + /** + * Call api get. + * + * @param apiUrl + * the api url + * @param expected + * the expected + * + * @return the input stream + */ + protected InputStream callApiGet(String apiUrl, int expected) { + try { + URL url = new URL(apiUrl); + if (!requestParameters.isEmpty()) { + if (url.getQuery() == null) { + url = new URL(apiUrl + "?" + getParametersString(requestParameters)); + } else { + url = new URL(apiUrl + "&" + getParametersString(requestParameters)); + } + } + + HttpURLConnection request = (HttpURLConnection) url.openConnection(); + + if (ApplicationConstants.CONNECT_TIMEOUT > -1) { + request.setConnectTimeout(ApplicationConstants.CONNECT_TIMEOUT); + } + + if (ApplicationConstants.READ_TIMEOUT > -1) { + request.setReadTimeout(ApplicationConstants.READ_TIMEOUT); + } + + for (String headerName : requestHeaders.keySet()) { + request.setRequestProperty(headerName, requestHeaders.get(headerName)); + } + + request.connect(); + + if (request.getResponseCode() != expected) { + throw new GitHubException(convertStreamToString(getWrappedInputStream(request.getErrorStream(), + GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())))); + } else { + return getWrappedInputStream(request.getInputStream(), + GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())); + } + } catch (IOException e) { + throw new GitHubException(e); + } + } + + /** + * Call api post. + * + * @param apiUrl + * the api url + * @param parameters + * the parameters + * + * @return the input stream + */ + protected InputStream callApiPost(String apiUrl, Map parameters) { + return callApiPost(apiUrl, parameters, HttpURLConnection.HTTP_OK); + } + + /** + * Call api post. + * + * @param apiUrl + * the api url + * @param parameters + * the parameters + * @param expected + * the expected + * + * @return the input stream + */ + protected InputStream callApiPost(String apiUrl, Map parameters, int expected) { + try { + URL url = new URL(apiUrl); + HttpURLConnection request = (HttpURLConnection) url.openConnection(); + + if (ApplicationConstants.CONNECT_TIMEOUT > -1) { + request.setConnectTimeout(ApplicationConstants.CONNECT_TIMEOUT); + } + + if (ApplicationConstants.READ_TIMEOUT > -1) { + request.setReadTimeout(ApplicationConstants.READ_TIMEOUT); + } + + for (String headerName : requestHeaders.keySet()) { + request.setRequestProperty(headerName, requestHeaders.get(headerName)); + } + + parameters.putAll(requestParameters); + + request.setRequestMethod("POST"); + request.setDoOutput(true); + + PrintStream out = new PrintStream(new BufferedOutputStream(request.getOutputStream())); + + out.print(getParametersString(parameters)); + out.flush(); + out.close(); + + request.connect(); + + if (request.getResponseCode() != expected) { + return getWrappedInputStream(request.getErrorStream(), + GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())); + } else { + return getWrappedInputStream(request.getInputStream(), + GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())); + } + } catch (IOException e) { + throw new GitHubException(e); + } finally { + } + } + + + /** + * Call api get. + * + * @param apiUrl + * the api url + * + * @return the input stream + */ + protected InputStream callApiDelete(String apiUrl) { + return callApiDelete(apiUrl, HttpURLConnection.HTTP_OK); + } + + /** + * Call api get. + * + * @param apiUrl + * the api url + * @param expected + * the expected + * + * @return the input stream + */ + protected InputStream callApiDelete(String apiUrl, int expected) { + try { + URL url = new URL(apiUrl); + + HttpURLConnection request = (HttpURLConnection) url.openConnection(); + + if (ApplicationConstants.CONNECT_TIMEOUT > -1) { + request.setConnectTimeout(ApplicationConstants.CONNECT_TIMEOUT); + } + + if (ApplicationConstants.READ_TIMEOUT > -1) { + request.setReadTimeout(ApplicationConstants.READ_TIMEOUT); + } + + for (String headerName : requestHeaders.keySet()) { + request.setRequestProperty(headerName, requestHeaders.get(headerName)); + } + + request.setRequestMethod("DELETE"); + + request.connect(); + + if (request.getResponseCode() != expected) { + throw new GitHubException(convertStreamToString(getWrappedInputStream(request.getErrorStream(), + GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())))); + } else { + return getWrappedInputStream(request.getInputStream(), + GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())); + } + } catch (IOException e) { + throw new GitHubException(e); + } + } + + + /** + * Gets the parameters string. + * + * @param parameters + * the parameters + * + * @return the parameters string + */ + protected String getParametersString(Map parameters) { + StringBuilder builder = new StringBuilder(); + for (Iterator> iterator = parameters.entrySet().iterator(); iterator.hasNext();) { + Map.Entry entry = iterator.next(); + builder.append(entry.getKey()); + builder.append("="); + builder.append(encodeUrl(entry.getValue())); + if (iterator.hasNext()) { + builder.append("&"); + } + } + + return builder.toString(); + } + + /** + * Call api method. + * + * @param apiUrl + * the api url + * @param xmlContent + * the xml content + * @param contentType + * the content type + * @param method + * the method + * @param expected + * the expected + * + * @return the input stream + */ + protected InputStream callApiMethod(String apiUrl, String xmlContent, String contentType, + String method, int expected) { + try { + URL url = new URL(apiUrl); + HttpURLConnection request = (HttpURLConnection) url.openConnection(); + + if (ApplicationConstants.CONNECT_TIMEOUT > -1) { + request.setConnectTimeout(ApplicationConstants.CONNECT_TIMEOUT); + } + + if (ApplicationConstants.READ_TIMEOUT > -1) { + request.setReadTimeout(ApplicationConstants.READ_TIMEOUT); + } + + for (String headerName : requestHeaders.keySet()) { + request.setRequestProperty(headerName, requestHeaders.get(headerName)); + } + + request.setRequestMethod(method); + request.setDoOutput(true); + + if (contentType != null) { + request.setRequestProperty("Content-Type", contentType); + } + + if (xmlContent != null) { + PrintStream out = new PrintStream(new BufferedOutputStream(request.getOutputStream())); + + out.print(xmlContent); + out.flush(); + out.close(); + } + + request.connect(); + + if (request.getResponseCode() != expected) { + throw new GitHubException(convertStreamToString(getWrappedInputStream(request.getErrorStream(), + GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())))); + } else { + return getWrappedInputStream(request.getInputStream(), + GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())); + } + } catch (IOException e) { + throw new GitHubException(e); + } + } + + /** + * Close stream. + * + * @param is + * the is + */ + protected void closeStream(InputStream is) { + try { + if (is != null) { + is.close(); + } + } catch (IOException e) { + logger.log(Level.SEVERE, "An error occurred while closing stream.", e); + } + } + + /** + * Close connection. + * + * @param connection + * the connection + */ + protected void closeConnection(HttpURLConnection connection) { + try { + if (connection != null) { + connection.disconnect(); + } + } catch (Exception e) { + logger.log(Level.SEVERE, "An error occurred while disconnecting connection.", e); + } + } + + /** + * Gets the wrapped input stream. + * + * @param is + * the is + * @param gzip + * the gzip + * + * @return the wrapped input stream + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ + protected InputStream getWrappedInputStream(InputStream is, boolean gzip) + throws IOException { + if (gzip) { + return new BufferedInputStream(new GZIPInputStream(is)); + } else { + return new BufferedInputStream(is); + } + } + + /** + * Encode url. + * + * @param original + * the original + * + * @return the string + */ + private static String encodeUrl(String original) { + try { + return URLEncoder.encode(original, ApplicationConstants.CONTENT_ENCODING); + } catch (UnsupportedEncodingException e) { + // should never be here.. + return original; + } + } +} diff --git a/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java b/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java new file mode 100644 index 0000000..0a30c3d --- /dev/null +++ b/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java @@ -0,0 +1,201 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.impl; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.github.api.v2.schema.Comment; +import com.github.api.v2.schema.Issue; +import com.github.api.v2.schema.Issue.State; +import com.github.api.v2.services.IssueService; +import com.github.api.v2.services.constant.GitHubApiUrls; +import com.github.api.v2.services.constant.ParameterNames; +import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; + +/** + * The Class IssueServiceImpl. + */ +public class IssueServiceImpl extends BaseGitHubService implements + IssueService { + + /* (non-Javadoc) + * @see com.github.api.v2.services.IssueService#addComment(java.lang.String, java.lang.String, int, java.lang.String) + */ + @Override + public void addComment(String userName, String repositoryName, + int issueNumber, String comment) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.ADD_COMMENT_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.ISSUE_NUMBER, String.valueOf(issueNumber)).buildUrl(); + Map parameters = new HashMap(); + parameters.put(ParameterNames.COMMENT, comment); + callApiPost(apiUrl, parameters); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.IssueService#addLabel(java.lang.String, java.lang.String, int, java.lang.String) + */ + @Override + public List addLabel(String userName, String repositoryName, + int issueNumber, String label) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.ADD_LABEL_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.LABEL, label).withField(ParameterNames.ISSUE_NUMBER, String.valueOf(issueNumber)).buildUrl(); + JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); + + return unmarshall(new TypeToken>(){}, json.get("labels")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.IssueService#closeIssue(java.lang.String, java.lang.String, int) + */ + @Override + public void closeIssue(String userName, String repositoryName, + int issueNumber) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.CLOSE_ISSUE_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.ISSUE_NUMBER, String.valueOf(issueNumber)).buildUrl(); + callApiPost(apiUrl, new HashMap()); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.IssueService#createIssue(java.lang.String, java.lang.String, java.lang.String, java.lang.String) + */ + @Override + public void createIssue(String userName, String repositoryName, + String title, String body) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.CREATE_ISSUE_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + Map parameters = new HashMap(); + parameters.put(ParameterNames.TITLE, title); + parameters.put(ParameterNames.BODY, body); + callApiPost(apiUrl, parameters); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.IssueService#getIssue(java.lang.String, java.lang.String, int) + */ + @Override + public Issue getIssue(String userName, String repositoryName, + int issueNumber) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.GET_ISSUE_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.ISSUE_NUMBER, String.valueOf(issueNumber)).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken(){}, json.get("issue")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.IssueService#getIssueComments(java.lang.String, java.lang.String, int) + */ + @Override + public List getIssueComments(String userName, + String repositoryName, int issueNumber) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.GET_ISSUE_COMMENTS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.ISSUE_NUMBER, String.valueOf(issueNumber)).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("comments")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.IssueService#getIssueLabels(java.lang.String, java.lang.String) + */ + @Override + public List getIssueLabels(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.GET_ISSUE_LABELS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("labels")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.IssueService#getIssues(java.lang.String, java.lang.String, com.github.api.v2.schema.Issue.State) + */ + @Override + public List getIssues(String userName, String repositoryName, + State state) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.GET_ISSUES_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withFieldEnum(ParameterNames.STATE, state).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("issues")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.IssueService#removeLabel(java.lang.String, java.lang.String, int, java.lang.String) + */ + @Override + public List removeLabel(String userName, String repositoryName, + int issueNumber, String label) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.REMOVE_LABEL_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.LABEL, label).withField(ParameterNames.ISSUE_NUMBER, String.valueOf(issueNumber)).buildUrl(); + JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); + + return unmarshall(new TypeToken>(){}, json.get("labels")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.IssueService#reopenIssue(java.lang.String, java.lang.String, int) + */ + @Override + public void reopenIssue(String userName, String repositoryName, + int issueNumber) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.REOPEN_ISSUE_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.ISSUE_NUMBER, String.valueOf(issueNumber)).buildUrl(); + callApiPost(apiUrl, new HashMap()); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.IssueService#searchIssues(java.lang.String, java.lang.String, com.github.api.v2.schema.Issue.State, java.lang.String) + */ + @Override + public List searchIssues(String userName, String repositoryName, + State state, String keyword) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.SEARCH_ISSUES_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withFieldEnum(ParameterNames.STATE, state).withField(ParameterNames.KEYWORD, keyword).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("issues")); + } + + @Override + public List getIssues(String userName, String repositoryName, + String label) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.GET_ISSUES_BY_LABEL_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.LABEL, label).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("issues")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.IssueService#updateIssue(java.lang.String, java.lang.String, int, java.lang.String, java.lang.String) + */ + @Override + public void updateIssue(String userName, String repositoryName, + int issueNumber, String title, String body) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.UPDATE_ISSUE_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.ISSUE_NUMBER, String.valueOf(issueNumber)).buildUrl(); + Map parameters = new HashMap(); + parameters.put(ParameterNames.TITLE, title); + parameters.put(ParameterNames.BODY, body); + callApiPost(apiUrl, parameters); + } +} diff --git a/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java b/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java new file mode 100644 index 0000000..1018bd6 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java @@ -0,0 +1,85 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.impl; + +import java.util.List; + +import com.github.api.v2.schema.NetworkCommit; +import com.github.api.v2.schema.NetworkMeta; +import com.github.api.v2.services.NetworkService; +import com.github.api.v2.services.constant.GitHubApiUrls; +import com.github.api.v2.services.constant.ParameterNames; +import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; + +/** + * The Class NetworkServiceImpl. + */ +public class NetworkServiceImpl extends BaseGitHubService implements + NetworkService { + + /* (non-Javadoc) + * @see com.github.api.v2.services.NetworkService#getNetworkData(java.lang.String, java.lang.String, java.lang.String) + */ + @Override + public List getNetworkData(String userName, String repositoryName, + String networkHash) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.NetworkApiUrls.GET_NETWORK_DATA_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withParameter(ParameterNames.NET_HASH, networkHash).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("commits")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.NetworkService#getNetworkData(java.lang.String, java.lang.String, java.lang.String, int, int) + */ + @Override + public List getNetworkData(String userName, String repositoryName, + String networkHash, int startIndex, int endIndex) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.NetworkApiUrls.GET_NETWORK_DATA_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withParameter(ParameterNames.NET_HASH, networkHash).withParameter(ParameterNames.START_INDEX, String.valueOf(startIndex)).withParameter(ParameterNames.END_INDEX, String.valueOf(endIndex)).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("commits")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.NetworkService#getNetworkMeta(java.lang.String, java.lang.String) + */ + @Override + public NetworkMeta getNetworkMeta(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.NetworkApiUrls.GET_NETWORK_META_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + Gson gson = getGsonBuilder().setDateFormat("yyyy-MM-dd").create(); + return gson.fromJson(json, NetworkMeta.class); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.impl.BaseGitHubService#getGsonBuilder() + */ + protected GsonBuilder getGsonBuilder() { + GsonBuilder gson = super.getGsonBuilder(); + gson.setDateFormat("yyyy-MM-dd HH:mm:ss"); + return gson; + } +} diff --git a/src/main/java/com/github/api/v2/services/impl/OAuthServiceImpl.java b/src/main/java/com/github/api/v2/services/impl/OAuthServiceImpl.java new file mode 100644 index 0000000..185f740 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/impl/OAuthServiceImpl.java @@ -0,0 +1,98 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.impl; + +import java.util.Set; +import java.util.regex.Matcher; + +import com.github.api.v2.services.GitHubException; +import com.github.api.v2.services.OAuthService; +import com.github.api.v2.services.constant.ApplicationConstants; +import com.github.api.v2.services.constant.GitHubApiUrls; +import com.github.api.v2.services.constant.ParameterNames; +import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; + +/** + * The Class OAuthServiceImpl. + */ +public class OAuthServiceImpl extends BaseGitHubService implements OAuthService { + + /** The client id. */ + private final String clientId; + + /** The secret. */ + private final String secret; + + /** + * Instantiates a new o auth service impl. + * + * @param clientId + * the client id + * @param secret + * the secret + */ + public OAuthServiceImpl(String clientId, String secret) { + this.clientId = clientId; + this.secret = secret; + } + + /* (non-Javadoc) + * @see com.google.code.facebook.graph.client.oauth.FacebookOAuthService#getAuthorizationUrl(java.lang.String) + */ + @Override + public String getAuthorizationUrl(String callBackUrl) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OAuthUrls.AUTHORIZE_URL); + builder.withParameter(ParameterNames.CLIENT_ID, clientId).withParameter(ParameterNames.REDIRECT_URI, callBackUrl); + return builder.buildUrl(); + } + + /* (non-Javadoc) + * @see com.google.code.facebook.graph.client.oauth.FacebookOAuthService#getAuthorizationUrl(java.lang.String, java.util.Set) + */ + @Override + public String getAuthorizationUrl(String callBackUrl, + Set permissions) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OAuthUrls.AUTHORIZE_URL); + builder.withParameter(ParameterNames.CLIENT_ID, clientId).withParameter(ParameterNames.REDIRECT_URI, callBackUrl); + builder.withParameterEnumSet(ParameterNames.SCOPE, permissions, ","); + return builder.buildUrl(); + } + + /* (non-Javadoc) + * @see com.google.code.facebook.graph.client.oauth.FacebookOAuthService#getAccessToken(java.lang.String, java.lang.String) + */ + @Override + public String getAccessToken(String callBackUrl, String code) { + try { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OAuthUrls.ACCESS_TOKEN_URL); + builder.withParameter(ParameterNames.CLIENT_ID, clientId); + builder.withParameter(ParameterNames.CLIENT_SECRET, secret); + builder.withParameter(ParameterNames.REDIRECT_URI, callBackUrl); + builder.withParameter(ParameterNames.CODE, code); + + String response = convertStreamToString(callApiGet(builder.buildUrl())); + Matcher matcher = ApplicationConstants.ACCESS_TOKEN_PATTERN.matcher(response); + if (matcher.find()) { + return matcher.group(1); + } else { + throw new GitHubException(response); + } + } catch (Exception e) { + throw new GitHubException(e); + } + } +} diff --git a/src/main/java/com/github/api/v2/services/impl/ObjectServiceImpl.java b/src/main/java/com/github/api/v2/services/impl/ObjectServiceImpl.java new file mode 100644 index 0000000..e3fd543 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/impl/ObjectServiceImpl.java @@ -0,0 +1,86 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.impl; + +import java.io.InputStream; +import java.util.List; + +import com.github.api.v2.schema.Blob; +import com.github.api.v2.schema.Tree; +import com.github.api.v2.services.ObjectService; +import com.github.api.v2.services.constant.GitHubApiUrls; +import com.github.api.v2.services.constant.ParameterNames; +import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; + +/** + * The Class ObjectServiceImpl. + */ +public class ObjectServiceImpl extends BaseGitHubService implements + ObjectService { + + /* (non-Javadoc) + * @see com.github.api.v2.services.ObjectService#getBlob(java.lang.String, java.lang.String, java.lang.String, java.lang.String) + */ + @Override + public Blob getBlob(String userName, String repositoryName, String treeSha, + String filePath) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.ObjectApiUrls.GET_BLOBS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.SHA, treeSha).withField(ParameterNames.FILE_PATH, filePath).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken(){}, json.get("blob")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.ObjectService#getBlobs(java.lang.String, java.lang.String, java.lang.String) + */ + @Override + public List getBlobs(String userName, String repositoryName, + String treeSha) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.ObjectApiUrls.GET_BLOBS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.SHA, treeSha).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("blobs")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.ObjectService#getObjectContent(java.lang.String, java.lang.String, java.lang.String) + */ + @Override + public InputStream getObjectContent(String userName, String repositoryName, + String objectSha) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.ObjectApiUrls.GET_OBJECT_CONTENT_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.SHA, objectSha).buildUrl(); + return callApiGet(apiUrl); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.ObjectService#getTree(java.lang.String, java.lang.String, java.lang.String) + */ + @Override + public List getTree(String userName, String repositoryName, + String treeSha) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.ObjectApiUrls.GET_TREE_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.SHA, treeSha).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("tree")); + } +} diff --git a/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java b/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java new file mode 100644 index 0000000..52acc7f --- /dev/null +++ b/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java @@ -0,0 +1,199 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.impl; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.github.api.v2.schema.Organization; +import com.github.api.v2.schema.Repository; +import com.github.api.v2.schema.Team; +import com.github.api.v2.schema.User; +import com.github.api.v2.services.OrganizationService; +import com.github.api.v2.services.constant.GitHubApiUrls; +import com.github.api.v2.services.constant.ParameterNames; +import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; + +/** + * The Class OrganizationServiceImpl. + */ +public class OrganizationServiceImpl extends BaseGitHubService implements + OrganizationService { + + + /* (non-Javadoc) + * @see com.github.api.v2.services.impl.BaseGitHubService#getGsonBuilder() + */ + protected GsonBuilder getGsonBuilder() { + GsonBuilder gson = super.getGsonBuilder(); + gson.setDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + return gson; + } + + @Override + public void addTeamMember(String teamId, String userName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.ADD_TEAM_MEMBER_URL); + String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).withParameter(ParameterNames.NAME, userName).buildUrl(); + unmarshall(callApiPost(apiUrl, new HashMap())); + } + + @Override + public void addTeamRepository(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.ADD_TEAM_REPOSITORY_URL); + String apiUrl = builder.withParameter(ParameterNames.USER_REPOSITORY_PAIR, userName + "/" + repositoryName).buildUrl(); + unmarshall(callApiPost(apiUrl, new HashMap())); + } + + @Override + public void createTeam(Team team) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.CREATE_TEAM_URL); + String apiUrl = builder.buildUrl(); + Map parameters = new HashMap(); + parameters.put("team[" + ParameterNames.NAME + "]", team.getName()); + parameters.put("team[" + ParameterNames.PERMISSION + "]", team.getPermission().value()); + parameters.put("team[" + ParameterNames.REPO_NAMES + "]", team.getRepoNames().toString()); + callApiPost(apiUrl, parameters); + } + + @Override + public void deleteTeam(String teamId) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.DELETE_TEAM_URL); + String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).buildUrl(); + callApiDelete(apiUrl); + } + + @Override + public List getAllOrganizationRepositories() { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_ALL_REPOSITORIES_URL); + String apiUrl = builder.buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + + @Override + public Organization getOrganization(String name) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_ORGANIZATION_URL); + String apiUrl = builder.withField(ParameterNames.ORGANIZATION_NAME, name).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken(){}, json.get("organization")); + } + + @Override + public List getPublicMembers(String organizationName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_PUBLIC_MEMBERS_URL); + String apiUrl = builder.withField(ParameterNames.ORGANIZATION_NAME, organizationName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("users")); + } + + @Override + public List getPublicRepositories(String organizationName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_PUBLIC_REPOSITORIES_URL); + String apiUrl = builder.withField(ParameterNames.ORGANIZATION_NAME, organizationName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + + @Override + public Team getTeam(String teamId) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_TEAM_URL); + String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken(){}, json.get("team")); + } + + @Override + public List getTeamMembers(String teamId) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_TEAM_MEMBERS_URL); + String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("users")); + } + + @Override + public List getTeamRepositories(String teamId) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_TEAM_REPOSITORIES_URL); + String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + + @Override + public List getTeams(String organizationName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_TEAMS_URL); + String apiUrl = builder.withField(ParameterNames.ORGANIZATION_NAME, organizationName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("teams")); + } + + @Override + public List getUserOrganizations() { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_ORGANIZATIONS_URL); + String apiUrl = builder.buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("organizations")); + } + + @Override + public void removeTeamMember(String teamId, String userName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.REMOVE_TEAM_MEMBER_URL); + String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).withParameter(ParameterNames.NAME, userName).buildUrl(); + callApiDelete(apiUrl); + } + + @Override + public void removeTeamRepository(String teamId, String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.REMOVE_TEAM_REPOSITORY_URL); + String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).withParameter(ParameterNames.NAME, userName + "/" + repositoryName).buildUrl(); + callApiDelete(apiUrl); + } + + @Override + public void updateOrganization(Organization organization) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.UPDATE_ORGANIZATION_URL); + String apiUrl = builder.withField(ParameterNames.ORGANIZATION_NAME, organization.getName()).buildUrl(); + Map parameters = new HashMap(); + parameters.put("organization[" + ParameterNames.NAME + "]", organization.getName()); + parameters.put("organization[" + ParameterNames.EMAIL + "]", organization.getEmail()); + parameters.put("organization[" + ParameterNames.BLOG + "]", organization.getBlog()); + parameters.put("organization[" + ParameterNames.COMPANY + "]", organization.getCompany()); + parameters.put("organization[" + ParameterNames.LOCATION + "]", organization.getLocation()); + parameters.put("organization[" + ParameterNames.BILLING_EMAIL + "]", organization.getBillingEmail()); + callApiPost(apiUrl, parameters); + } + + @Override + public void updateTeam(Team team) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.UPDATE_TEAM_URL); + String apiUrl = builder.withField(ParameterNames.TEAM_ID, team.getId()).buildUrl(); + + callApiMethod(apiUrl, getGsonBuilder().create().toJson(team), "application/json", "PUT", 200); + } +} diff --git a/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java b/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java new file mode 100644 index 0000000..cc5d484 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java @@ -0,0 +1,382 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.impl; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.zip.ZipInputStream; + +import com.github.api.v2.schema.Key; +import com.github.api.v2.schema.Language; +import com.github.api.v2.schema.Repository; +import com.github.api.v2.schema.User; +import com.github.api.v2.schema.Repository.Visibility; +import com.github.api.v2.services.RepositoryService; +import com.github.api.v2.services.constant.GitHubApiUrls; +import com.github.api.v2.services.constant.ParameterNames; +import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; + +/** + * The Class RepositoryServiceImpl. + */ +public class RepositoryServiceImpl extends BaseGitHubService implements + RepositoryService { + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#addCollaborator(java.lang.String, java.lang.String) + */ + @Override + public void addCollaborator(String repositoryName, String collaboratorName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.ADD_COLLABORATOR_URL); + String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.USER_NAME, collaboratorName).buildUrl(); + unmarshall(callApiPost(apiUrl, new HashMap())); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#addDeployKey(java.lang.String, java.lang.String, java.lang.String) + */ + @Override + public List addDeployKey(String repositoryName, String title, String key) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.ADD_DEPLOY_KEY_URL); + String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + Map parameters = new HashMap(); + parameters.put(ParameterNames.TITLE, title); + parameters.put(ParameterNames.KEY, key); + JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); + + return unmarshall(new TypeToken>(){}, json.get("public_keys")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#changeVisibility(java.lang.String, com.github.api.v2.schema.Repository.Visibility) + */ + @Override + public void changeVisibility(String repositoryName, Visibility visibility) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.CHANGE_VISIBILITY_URL); + String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).withFieldEnum(ParameterNames.VISIBILITY, visibility).buildUrl(); + JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); + + unmarshall(new TypeToken(){}, json.get("repository")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#createRepository(java.lang.String, java.lang.String, java.lang.String, com.github.api.v2.schema.Repository.Visibility) + */ + @Override + public void createRepository(String name, String description, + String homePage, Visibility visibility) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.CREATE_REPOSITORY_URL); + String apiUrl = builder.buildUrl(); + Map parameters = new HashMap(); + parameters.put(ParameterNames.NAME, name); + parameters.put(ParameterNames.DESCRIPTION, description); + parameters.put(ParameterNames.HOME_PAGE, homePage); + parameters.put(ParameterNames.PUBLIC, ((visibility == Visibility.PUBLIC)? "1" : "0")); + JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); + + unmarshall(new TypeToken(){}, json.get("repository")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#deleteRepository(java.lang.String) + */ + @Override + public void deleteRepository(String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.DELETE_REPOSITORY_URL); + String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); + if (json.has("delete_token")) { + Map parameters = new HashMap(); + parameters.put(ParameterNames.DELETE_TOKEN, json.get("delete_token").getAsString()); + callApiPost(apiUrl, parameters); + } + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#forkRepository(java.lang.String, java.lang.String) + */ + @Override + public Repository forkRepository(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.FORK_REPOSITORY_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); + return unmarshall(new TypeToken(){}, json.get("repository")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getBranches(java.lang.String, java.lang.String) + */ + @Override + public Map getBranches(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_BRANCHES_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("branches")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getCollaborators(java.lang.String, java.lang.String) + */ + @Override + public List getCollaborators(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_COLLABORATORS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("collaborators")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getContributors(java.lang.String, java.lang.String) + */ + @Override + public List getContributors(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_CONTRIBUTORS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("contributors")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getForks(java.lang.String, java.lang.String) + */ + @Override + public List getForks(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_FORKS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("network")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getDeployKeys(java.lang.String) + */ + @Override + public List getDeployKeys(String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_DEPLOY_KEYS_URL); + String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("public_keys")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getLanguageBreakdown(java.lang.String, java.lang.String) + */ + @Override + public Map getLanguageBreakdown(String userName, + String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_LANGUAGE_BREAKDOWN_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("languages")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getPushableRepositories() + */ + @Override + public List getPushableRepositories() { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_PUSHABLE_REPOSITORIES_URL); + String apiUrl = builder.buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getRepositories(java.lang.String) + */ + @Override + public List getRepositories(String userName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_REPOSITORIES_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getRepository(java.lang.String, java.lang.String) + */ + @Override + public Repository getRepository(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_REPOSITORY_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken(){}, json.get("repository")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getTags(java.lang.String, java.lang.String) + */ + @Override + public Map getTags(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_TAGS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("tags")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getWatchers(java.lang.String, java.lang.String) + */ + @Override + public List getWatchers(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_WATCHERS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("watchers")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#removeCollaborator(java.lang.String, java.lang.String) + */ + @Override + public void removeCollaborator(String repositoryName, + String collaboratorName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.REMOVE_COLLABORATOR_URL); + String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.USER_NAME, collaboratorName).buildUrl(); + unmarshall(callApiPost(apiUrl, new HashMap())); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#removeDeployKey(java.lang.String, java.lang.String) + */ + @Override + public void removeDeployKey(String repositoryName, String id) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.REMOVE_DEPLOY_KEY_URL); + String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + Map parameters = new HashMap(); + parameters.put(ParameterNames.ID, id); + unmarshall(callApiPost(apiUrl, parameters)); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#searchRepositories(java.lang.String) + */ + @Override + public List searchRepositories(String query) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); + String apiUrl = builder.withField(ParameterNames.KEYWORD, query).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#searchRepositories(java.lang.String, com.github.api.v2.schema.Language) + */ + @Override + public List searchRepositories(String query, Language language) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); + String apiUrl = builder.withField(ParameterNames.KEYWORD, query).withParameterEnum(ParameterNames.LANGUAGE, language).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#searchRepositories(java.lang.String, int) + */ + @Override + public List searchRepositories(String query, int pageNumber) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); + String apiUrl = builder.withField(ParameterNames.KEYWORD, query).withParameter(ParameterNames.START_PAGE, String.valueOf(pageNumber)).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#searchRepositories(java.lang.String, com.github.api.v2.schema.Language, int) + */ + @Override + public List searchRepositories(String query, Language language, + int pageNumber) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); + String apiUrl = builder.withField(ParameterNames.KEYWORD, query).withParameterEnum(ParameterNames.LANGUAGE, language).withParameter(ParameterNames.START_PAGE, String.valueOf(pageNumber)).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#unwatchRepository(java.lang.String, java.lang.String) + */ + @Override + public void unwatchRepository(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.UNWATCH_REPOSITORY_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + unmarshall(callApiPost(apiUrl, new HashMap())); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#updateRepository(com.github.api.v2.schema.Repository) + */ + @Override + public void updateRepository(Repository repository) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.UPDATE_REPOSITORY_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, repository.getOwner()).withField(ParameterNames.REPOSITORY_NAME, repository.getName()).buildUrl(); + Map parameters = new HashMap(); + parameters.put("values[" + ParameterNames.DESCRIPTION + "]", repository.getDescription()); + parameters.put("values[" + ParameterNames.HOME_PAGE + "]", repository.getHomepage()); + parameters.put("values[" + ParameterNames.HAS_WIKI + "]", String.valueOf(repository.isHasWiki())); + parameters.put("values[" + ParameterNames.HAS_ISSUES + "]", String.valueOf(repository.isHasIssues())); + parameters.put("values[" + ParameterNames.HAS_DOWNLOADS + "]", String.valueOf(repository.isHasDownloads())); + JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); + + unmarshall(new TypeToken(){}, json.get("repository")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#watchRepository(java.lang.String, java.lang.String) + */ + @Override + public void watchRepository(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.WATCH_REPOSITORY_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + unmarshall(callApiPost(apiUrl, new HashMap())); + } + + @Override + public ZipInputStream getRepositoryArchive(String userName, String repositoryName, String branchName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_REPOSITORY_ARCHIVE_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, branchName).buildUrl(); + return new ZipInputStream(callApiGet(apiUrl)); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.impl.BaseGitHubService#getGsonBuilder() + */ + protected GsonBuilder getGsonBuilder() { + GsonBuilder gson = super.getGsonBuilder(); + gson.setDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + return gson; + } +} diff --git a/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java b/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java new file mode 100644 index 0000000..b6c28a1 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java @@ -0,0 +1,243 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.impl; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.github.api.v2.schema.Key; +import com.github.api.v2.schema.Organization; +import com.github.api.v2.schema.Repository; +import com.github.api.v2.schema.User; +import com.github.api.v2.services.UserService; +import com.github.api.v2.services.constant.GitHubApiUrls; +import com.github.api.v2.services.constant.ParameterNames; +import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; + +/** + * The Class UserServiceImpl. + */ +public class UserServiceImpl extends BaseGitHubService implements + UserService { + + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#addEmail(java.lang.String) + */ + @Override + public void addEmail(String email) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.ADD_EMAIL_URL); + String apiUrl = builder.buildUrl(); + Map parameters = new HashMap(); + parameters.put(ParameterNames.EMAIL, email); + callApiPost(apiUrl, parameters); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#addKey(java.lang.String, java.lang.String) + */ + @Override + public void addKey(String title, String key) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.ADD_KEY_URL); + String apiUrl = builder.buildUrl(); + Map parameters = new HashMap(); + parameters.put(ParameterNames.TITLE, title); + parameters.put(ParameterNames.KEY, key); + callApiPost(apiUrl, parameters); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#followUser(java.lang.String) + */ + @Override + public void followUser(String userName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.FOLLOW_USER_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); + callApiPost(apiUrl, new HashMap()); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#getCurrentUser() + */ + @Override + public User getCurrentUser() { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_CURRENT_USER_URL); + String apiUrl = builder.buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken(){}, json.get("user")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#getEmails() + */ + @Override + public List getEmails() { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_EMAILS_URL); + String apiUrl = builder.buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("emails")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#getKeys() + */ + @Override + public List getKeys() { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_KEYS_URL); + String apiUrl = builder.buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("keys")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#getUserByUsername(java.lang.String) + */ + @Override + public User getUserByUsername(String userName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_USER_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken(){}, json.get("user")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#getUserFollowers(java.lang.String) + */ + @Override + public List getUserFollowers(String userName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_USER_FOLLOWERS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("users")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#getUserFollowing(java.lang.String) + */ + @Override + public List getUserFollowing(String userName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_USER_FOLLOWING_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("users")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#getWatchedRepositories(java.lang.String) + */ + @Override + public List getWatchedRepositories(String userName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_WATCHED_REPOSITORIES_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#removeEmail(java.lang.String) + */ + @Override + public void removeEmail(String email) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.REMOVE_EMAIL_URL); + String apiUrl = builder.buildUrl(); + Map parameters = new HashMap(); + parameters.put(ParameterNames.EMAIL, email); + callApiPost(apiUrl, parameters); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#removeKey(java.lang.String) + */ + @Override + public void removeKey(String id) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.REMOVE_KEY_URL); + String apiUrl = builder.buildUrl(); + Map parameters = new HashMap(); + parameters.put(ParameterNames.ID, id); + callApiPost(apiUrl, parameters); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#getUserByEmail(java.lang.String) + */ + @Override + public User getUserByEmail(String email) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.SEARCH_USERS_BY_EMAIL_URL); + String apiUrl = builder.withField(ParameterNames.EMAIL, email).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken(){}, json.get("user")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#searchUsersByName(java.lang.String) + */ + @Override + public List searchUsersByName(String name) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.SEARCH_USERS_BY_NAME_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, name).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("users")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#unfollowUser(java.lang.String) + */ + @Override + public void unfollowUser(String userName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.UNFOLLOW_USER_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); + callApiPost(apiUrl, new HashMap()); + } + + @Override + public List getUserOrganizations(String userName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_USER_ORGANIZATIONS); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("organizations")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#updateUser(com.github.api.v2.schema.User) + */ + @Override + public void updateUser(User user) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.UPDATE_USER_URL); + String userName = (user.getUsername() == null) ? user.getLogin() : user.getUsername(); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); + Map parameters = new HashMap(); + parameters.put("values[" + ParameterNames.NAME + "]", user.getName()); + parameters.put("values[" + ParameterNames.EMAIL + "]", user.getEmail()); + parameters.put("values[" + ParameterNames.BLOG + "]", user.getBlog()); + parameters.put("values[" + ParameterNames.COMPANY + "]", user.getCompany()); + parameters.put("values[" + ParameterNames.LOCATION + "]", user.getLocation()); + callApiPost(apiUrl, parameters); + } + +} diff --git a/src/main/java/com/github/api/v2/services/util/Base64.java b/src/main/java/com/github/api/v2/services/util/Base64.java new file mode 100644 index 0000000..2aaaf31 --- /dev/null +++ b/src/main/java/com/github/api/v2/services/util/Base64.java @@ -0,0 +1,1797 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.util; + +/** + * The Class Base64. + */ +public class Base64 +{ + +/* ******** P U B L I C F I E L D S ******** */ + + + /** The Constant NO_OPTIONS. */ + public final static int NO_OPTIONS = 0; + + /** The Constant ENCODE. */ + public final static int ENCODE = 1; + + + /** The Constant DECODE. */ + public final static int DECODE = 0; + + + /** The Constant GZIP. */ + public final static int GZIP = 2; + + /** The Constant DONT_GUNZIP. */ + public final static int DONT_GUNZIP = 4; + + + /** The Constant DO_BREAK_LINES. */ + public final static int DO_BREAK_LINES = 8; + + /** The Constant URL_SAFE. */ + public final static int URL_SAFE = 16; + + + /** The Constant ORDERED. */ + public final static int ORDERED = 32; + + +/* ******** P R I V A T E F I E L D S ******** */ + + + /** The Constant MAX_LINE_LENGTH. */ + private final static int MAX_LINE_LENGTH = 76; + + + /** The Constant EQUALS_SIGN. */ + private final static byte EQUALS_SIGN = (byte)'='; + + + /** The Constant NEW_LINE. */ + private final static byte NEW_LINE = (byte)'\n'; + + + /** The Constant PREFERRED_ENCODING. */ + private final static String PREFERRED_ENCODING = "US-ASCII"; + + + /** The Constant WHITE_SPACE_ENC. */ + private final static byte WHITE_SPACE_ENC = -5; // Indicates white space in encoding + + /** The Constant EQUALS_SIGN_ENC. */ + private final static byte EQUALS_SIGN_ENC = -1; // Indicates equals sign in encoding + + +/* ******** S T A N D A R D B A S E 6 4 A L P H A B E T ******** */ + + /** The Constant _STANDARD_ALPHABET. */ + /* Host platform me be something funny like EBCDIC, so we hardcode these values. */ + private final static byte[] _STANDARD_ALPHABET = { + (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G', + (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N', + (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U', + (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z', + (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', + (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n', + (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u', + (byte)'v', (byte)'w', (byte)'x', (byte)'y', (byte)'z', + (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', + (byte)'6', (byte)'7', (byte)'8', (byte)'9', (byte)'+', (byte)'/' + }; + + + /** The Constant _STANDARD_DECODABET. */ + private final static byte[] _STANDARD_DECODABET = { + -9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 0 - 8 + -5,-5, // Whitespace: Tab and Linefeed + -9,-9, // Decimal 11 - 12 + -5, // Whitespace: Carriage Return + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 14 - 26 + -9,-9,-9,-9,-9, // Decimal 27 - 31 + -5, // Whitespace: Space + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 33 - 42 + 62, // Plus sign at decimal 43 + -9,-9,-9, // Decimal 44 - 46 + 63, // Slash at decimal 47 + 52,53,54,55,56,57,58,59,60,61, // Numbers zero through nine + -9,-9,-9, // Decimal 58 - 60 + -1, // Equals sign at decimal 61 + -9,-9,-9, // Decimal 62 - 64 + 0,1,2,3,4,5,6,7,8,9,10,11,12,13, // Letters 'A' through 'N' + 14,15,16,17,18,19,20,21,22,23,24,25, // Letters 'O' through 'Z' + -9,-9,-9,-9,-9,-9, // Decimal 91 - 96 + 26,27,28,29,30,31,32,33,34,35,36,37,38, // Letters 'a' through 'm' + 39,40,41,42,43,44,45,46,47,48,49,50,51, // Letters 'n' through 'z' + -9,-9,-9,-9,-9 // Decimal 123 - 127 + ,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 128 - 139 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 + }; + + +/* ******** U R L S A F E B A S E 6 4 A L P H A B E T ******** */ + + /** The Constant _URL_SAFE_ALPHABET. */ + private final static byte[] _URL_SAFE_ALPHABET = { + (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G', + (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N', + (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U', + (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z', + (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', + (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n', + (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u', + (byte)'v', (byte)'w', (byte)'x', (byte)'y', (byte)'z', + (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', + (byte)'6', (byte)'7', (byte)'8', (byte)'9', (byte)'-', (byte)'_' + }; + + /** The Constant _URL_SAFE_DECODABET. */ + private final static byte[] _URL_SAFE_DECODABET = { + -9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 0 - 8 + -5,-5, // Whitespace: Tab and Linefeed + -9,-9, // Decimal 11 - 12 + -5, // Whitespace: Carriage Return + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 14 - 26 + -9,-9,-9,-9,-9, // Decimal 27 - 31 + -5, // Whitespace: Space + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 33 - 42 + -9, // Plus sign at decimal 43 + -9, // Decimal 44 + 62, // Minus sign at decimal 45 + -9, // Decimal 46 + -9, // Slash at decimal 47 + 52,53,54,55,56,57,58,59,60,61, // Numbers zero through nine + -9,-9,-9, // Decimal 58 - 60 + -1, // Equals sign at decimal 61 + -9,-9,-9, // Decimal 62 - 64 + 0,1,2,3,4,5,6,7,8,9,10,11,12,13, // Letters 'A' through 'N' + 14,15,16,17,18,19,20,21,22,23,24,25, // Letters 'O' through 'Z' + -9,-9,-9,-9, // Decimal 91 - 94 + 63, // Underscore at decimal 95 + -9, // Decimal 96 + 26,27,28,29,30,31,32,33,34,35,36,37,38, // Letters 'a' through 'm' + 39,40,41,42,43,44,45,46,47,48,49,50,51, // Letters 'n' through 'z' + -9,-9,-9,-9,-9 // Decimal 123 - 127 + ,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 128 - 139 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 + }; + + + +/* ******** O R D E R E D B A S E 6 4 A L P H A B E T ******** */ + + /** The Constant _ORDERED_ALPHABET. */ + private final static byte[] _ORDERED_ALPHABET = { + (byte)'-', + (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', + (byte)'5', (byte)'6', (byte)'7', (byte)'8', (byte)'9', + (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G', + (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N', + (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U', + (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z', + (byte)'_', + (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', + (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n', + (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u', + (byte)'v', (byte)'w', (byte)'x', (byte)'y', (byte)'z' + }; + + /** The Constant _ORDERED_DECODABET. */ + private final static byte[] _ORDERED_DECODABET = { + -9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 0 - 8 + -5,-5, // Whitespace: Tab and Linefeed + -9,-9, // Decimal 11 - 12 + -5, // Whitespace: Carriage Return + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 14 - 26 + -9,-9,-9,-9,-9, // Decimal 27 - 31 + -5, // Whitespace: Space + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 33 - 42 + -9, // Plus sign at decimal 43 + -9, // Decimal 44 + 0, // Minus sign at decimal 45 + -9, // Decimal 46 + -9, // Slash at decimal 47 + 1,2,3,4,5,6,7,8,9,10, // Numbers zero through nine + -9,-9,-9, // Decimal 58 - 60 + -1, // Equals sign at decimal 61 + -9,-9,-9, // Decimal 62 - 64 + 11,12,13,14,15,16,17,18,19,20,21,22,23, // Letters 'A' through 'M' + 24,25,26,27,28,29,30,31,32,33,34,35,36, // Letters 'N' through 'Z' + -9,-9,-9,-9, // Decimal 91 - 94 + 37, // Underscore at decimal 95 + -9, // Decimal 96 + 38,39,40,41,42,43,44,45,46,47,48,49,50, // Letters 'a' through 'm' + 51,52,53,54,55,56,57,58,59,60,61,62,63, // Letters 'n' through 'z' + -9,-9,-9,-9,-9 // Decimal 123 - 127 + ,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 128 - 139 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243 + -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 + }; + + +/* ******** D E T E R M I N E W H I C H A L H A B E T ******** */ + + + /** + * Gets the alphabet. + * + * @param options + * the options + * + * @return the alphabet + */ + private final static byte[] getAlphabet( int options ) { + if ((options & URL_SAFE) == URL_SAFE) { + return _URL_SAFE_ALPHABET; + } else if ((options & ORDERED) == ORDERED) { + return _ORDERED_ALPHABET; + } else { + return _STANDARD_ALPHABET; + } + } // end getAlphabet + + + /** + * Gets the decodabet. + * + * @param options + * the options + * + * @return the decodabet + */ + private final static byte[] getDecodabet( int options ) { + if( (options & URL_SAFE) == URL_SAFE) { + return _URL_SAFE_DECODABET; + } else if ((options & ORDERED) == ORDERED) { + return _ORDERED_DECODABET; + } else { + return _STANDARD_DECODABET; + } + } // end getAlphabet + + + + /** + * Instantiates a new base64. + */ + private Base64(){} + + + + +/* ******** E N C O D I N G M E T H O D S ******** */ + + + /** + * Encode3to4. + * + * @param b4 + * the b4 + * @param threeBytes + * the three bytes + * @param numSigBytes + * the num sig bytes + * @param options + * the options + * + * @return the byte[] + */ + private static byte[] encode3to4( byte[] b4, byte[] threeBytes, int numSigBytes, int options ) { + encode3to4( threeBytes, 0, numSigBytes, b4, 0, options ); + return b4; + } // end encode3to4 + + + /** + * Encode3to4. + * + * @param source + * the source + * @param srcOffset + * the src offset + * @param numSigBytes + * the num sig bytes + * @param destination + * the destination + * @param destOffset + * the dest offset + * @param options + * the options + * + * @return the byte[] + */ + private static byte[] encode3to4( + byte[] source, int srcOffset, int numSigBytes, + byte[] destination, int destOffset, int options ) { + + byte[] ALPHABET = getAlphabet( options ); + + // 1 2 3 + // 01234567890123456789012345678901 Bit position + // --------000000001111111122222222 Array position from threeBytes + // --------| || || || | Six bit groups to index ALPHABET + // >>18 >>12 >> 6 >> 0 Right shift necessary + // 0x3f 0x3f 0x3f Additional AND + + // Create buffer with zero-padding if there are only one or two + // significant bytes passed in the array. + // We have to shift left 24 in order to flush out the 1's that appear + // when Java treats a value as negative that is cast from a byte to an int. + int inBuff = ( numSigBytes > 0 ? ((source[ srcOffset ] << 24) >>> 8) : 0 ) + | ( numSigBytes > 1 ? ((source[ srcOffset + 1 ] << 24) >>> 16) : 0 ) + | ( numSigBytes > 2 ? ((source[ srcOffset + 2 ] << 24) >>> 24) : 0 ); + + switch( numSigBytes ) + { + case 3: + destination[ destOffset ] = ALPHABET[ (inBuff >>> 18) ]; + destination[ destOffset + 1 ] = ALPHABET[ (inBuff >>> 12) & 0x3f ]; + destination[ destOffset + 2 ] = ALPHABET[ (inBuff >>> 6) & 0x3f ]; + destination[ destOffset + 3 ] = ALPHABET[ (inBuff ) & 0x3f ]; + return destination; + + case 2: + destination[ destOffset ] = ALPHABET[ (inBuff >>> 18) ]; + destination[ destOffset + 1 ] = ALPHABET[ (inBuff >>> 12) & 0x3f ]; + destination[ destOffset + 2 ] = ALPHABET[ (inBuff >>> 6) & 0x3f ]; + destination[ destOffset + 3 ] = EQUALS_SIGN; + return destination; + + case 1: + destination[ destOffset ] = ALPHABET[ (inBuff >>> 18) ]; + destination[ destOffset + 1 ] = ALPHABET[ (inBuff >>> 12) & 0x3f ]; + destination[ destOffset + 2 ] = EQUALS_SIGN; + destination[ destOffset + 3 ] = EQUALS_SIGN; + return destination; + + default: + return destination; + } // end switch + } // end encode3to4 + + + + /** + * Encode. + * + * @param raw + * the raw + * @param encoded + * the encoded + */ + public static void encode( java.nio.ByteBuffer raw, java.nio.ByteBuffer encoded ){ + byte[] raw3 = new byte[3]; + byte[] enc4 = new byte[4]; + + while( raw.hasRemaining() ){ + int rem = Math.min(3,raw.remaining()); + raw.get(raw3,0,rem); + Base64.encode3to4(enc4, raw3, rem, Base64.NO_OPTIONS ); + encoded.put(enc4); + } // end input remaining + } + + + /** + * Encode. + * + * @param raw + * the raw + * @param encoded + * the encoded + */ + public static void encode( java.nio.ByteBuffer raw, java.nio.CharBuffer encoded ){ + byte[] raw3 = new byte[3]; + byte[] enc4 = new byte[4]; + + while( raw.hasRemaining() ){ + int rem = Math.min(3,raw.remaining()); + raw.get(raw3,0,rem); + Base64.encode3to4(enc4, raw3, rem, Base64.NO_OPTIONS ); + for( int i = 0; i < 4; i++ ){ + encoded.put( (char)(enc4[i] & 0xFF) ); + } + } // end input remaining + } + + + + + /** + * Encode object. + * + * @param serializableObject + * the serializable object + * + * @return the string + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ + public static String encodeObject( java.io.Serializable serializableObject ) + throws java.io.IOException { + return encodeObject( serializableObject, NO_OPTIONS ); + } // end encodeObject + + + + /** + * Encode object. + * + * @param serializableObject + * the serializable object + * @param options + * the options + * + * @return the string + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ + public static String encodeObject( java.io.Serializable serializableObject, int options ) + throws java.io.IOException { + + if( serializableObject == null ){ + throw new NullPointerException( "Cannot serialize a null object." ); + } // end if: null + + // Streams + java.io.ByteArrayOutputStream baos = null; + java.io.OutputStream b64os = null; + java.util.zip.GZIPOutputStream gzos = null; + java.io.ObjectOutputStream oos = null; + + + try { + // ObjectOutputStream -> (GZIP) -> Base64 -> ByteArrayOutputStream + baos = new java.io.ByteArrayOutputStream(); + b64os = new Base64.OutputStream( baos, ENCODE | options ); + if( (options & GZIP) != 0 ){ + // Gzip + gzos = new java.util.zip.GZIPOutputStream(b64os); + oos = new java.io.ObjectOutputStream( gzos ); + } else { + // Not gzipped + oos = new java.io.ObjectOutputStream( b64os ); + } + oos.writeObject( serializableObject ); + } // end try + catch( java.io.IOException e ) { + // Catch it and then throw it immediately so that + // the finally{} block is called for cleanup. + throw e; + } // end catch + finally { + try{ oos.close(); } catch( Exception e ){} + try{ gzos.close(); } catch( Exception e ){} + try{ b64os.close(); } catch( Exception e ){} + try{ baos.close(); } catch( Exception e ){} + } // end finally + + // Return value according to relevant encoding. + try { + return new String( baos.toByteArray(), PREFERRED_ENCODING ); + } // end try + catch (java.io.UnsupportedEncodingException uue){ + // Fall back to some Java default + return new String( baos.toByteArray() ); + } // end catch + + } // end encode + + + + /** + * Encode bytes. + * + * @param source + * the source + * + * @return the string + */ + public static String encodeBytes( byte[] source ) { + // Since we're not going to have the GZIP encoding turned on, + // we're not going to have an java.io.IOException thrown, so + // we should not force the user to have to catch it. + String encoded = null; + try { + encoded = encodeBytes(source, 0, source.length, NO_OPTIONS); + } catch (java.io.IOException ex) { + assert false : ex.getMessage(); + } // end catch + assert encoded != null; + return encoded; + } // end encodeBytes + + + + /** + * Encode bytes. + * + * @param source + * the source + * @param options + * the options + * + * @return the string + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ + public static String encodeBytes( byte[] source, int options ) throws java.io.IOException { + return encodeBytes( source, 0, source.length, options ); + } // end encodeBytes + + + /** + * Encode bytes. + * + * @param source + * the source + * @param off + * the off + * @param len + * the len + * + * @return the string + */ + public static String encodeBytes( byte[] source, int off, int len ) { + // Since we're not going to have the GZIP encoding turned on, + // we're not going to have an java.io.IOException thrown, so + // we should not force the user to have to catch it. + String encoded = null; + try { + encoded = encodeBytes( source, off, len, NO_OPTIONS ); + } catch (java.io.IOException ex) { + assert false : ex.getMessage(); + } // end catch + assert encoded != null; + return encoded; + } // end encodeBytes + + + + /** + * Encode bytes. + * + * @param source + * the source + * @param off + * the off + * @param len + * the len + * @param options + * the options + * + * @return the string + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ + public static String encodeBytes( byte[] source, int off, int len, int options ) throws java.io.IOException { + byte[] encoded = encodeBytesToBytes( source, off, len, options ); + + // Return value according to relevant encoding. + try { + return new String( encoded, PREFERRED_ENCODING ); + } // end try + catch (java.io.UnsupportedEncodingException uue) { + return new String( encoded ); + } // end catch + + } // end encodeBytes + + + + + /** + * Encode bytes to bytes. + * + * @param source + * the source + * + * @return the byte[] + */ + public static byte[] encodeBytesToBytes( byte[] source ) { + byte[] encoded = null; + try { + encoded = encodeBytesToBytes( source, 0, source.length, Base64.NO_OPTIONS ); + } catch( java.io.IOException ex ) { + assert false : "IOExceptions only come from GZipping, which is turned off: " + ex.getMessage(); + } + return encoded; + } + + + /** + * Encode bytes to bytes. + * + * @param source + * the source + * @param off + * the off + * @param len + * the len + * @param options + * the options + * + * @return the byte[] + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ + public static byte[] encodeBytesToBytes( byte[] source, int off, int len, int options ) throws java.io.IOException { + + if( source == null ){ + throw new NullPointerException( "Cannot serialize a null array." ); + } // end if: null + + if( off < 0 ){ + throw new IllegalArgumentException( "Cannot have negative offset: " + off ); + } // end if: off < 0 + + if( len < 0 ){ + throw new IllegalArgumentException( "Cannot have length offset: " + len ); + } // end if: len < 0 + + if( off + len > source.length ){ + throw new IllegalArgumentException( + String.format( "Cannot have offset of %d and length of %d with array of length %d", off,len,source.length)); + } // end if: off < 0 + + + + // Compress? + if( (options & GZIP) != 0 ) { + java.io.ByteArrayOutputStream baos = null; + java.util.zip.GZIPOutputStream gzos = null; + Base64.OutputStream b64os = null; + + try { + // GZip -> Base64 -> ByteArray + baos = new java.io.ByteArrayOutputStream(); + b64os = new Base64.OutputStream( baos, ENCODE | options ); + gzos = new java.util.zip.GZIPOutputStream( b64os ); + + gzos.write( source, off, len ); + gzos.close(); + } // end try + catch( java.io.IOException e ) { + // Catch it and then throw it immediately so that + // the finally{} block is called for cleanup. + throw e; + } // end catch + finally { + try{ gzos.close(); } catch( Exception e ){} + try{ b64os.close(); } catch( Exception e ){} + try{ baos.close(); } catch( Exception e ){} + } // end finally + + return baos.toByteArray(); + } // end if: compress + + // Else, don't compress. Better not to use streams at all then. + else { + boolean breakLines = (options & DO_BREAK_LINES) != 0; + + //int len43 = len * 4 / 3; + //byte[] outBuff = new byte[ ( len43 ) // Main 4:3 + // + ( (len % 3) > 0 ? 4 : 0 ) // Account for padding + // + (breakLines ? ( len43 / MAX_LINE_LENGTH ) : 0) ]; // New lines + // Try to determine more precisely how big the array needs to be. + // If we get it right, we don't have to do an array copy, and + // we save a bunch of memory. + int encLen = ( len / 3 ) * 4 + ( len % 3 > 0 ? 4 : 0 ); // Bytes needed for actual encoding + if( breakLines ){ + encLen += encLen / MAX_LINE_LENGTH; // Plus extra newline characters + } + byte[] outBuff = new byte[ encLen ]; + + + int d = 0; + int e = 0; + int len2 = len - 2; + int lineLength = 0; + for( ; d < len2; d+=3, e+=4 ) { + encode3to4( source, d+off, 3, outBuff, e, options ); + + lineLength += 4; + if( breakLines && lineLength >= MAX_LINE_LENGTH ) + { + outBuff[e+4] = NEW_LINE; + e++; + lineLength = 0; + } // end if: end of line + } // en dfor: each piece of array + + if( d < len ) { + encode3to4( source, d+off, len - d, outBuff, e, options ); + e += 4; + } // end if: some padding needed + + + // Only resize array if we didn't guess it right. + if( e <= outBuff.length - 1 ){ + // If breaking lines and the last byte falls right at + // the line length (76 bytes per line), there will be + // one extra byte, and the array will need to be resized. + // Not too bad of an estimate on array size, I'd say. + byte[] finalOut = new byte[e]; + System.arraycopy(outBuff,0, finalOut,0,e); + //System.err.println("Having to resize array from " + outBuff.length + " to " + e ); + return finalOut; + } else { + //System.err.println("No need to resize array."); + return outBuff; + } + + } // end else: don't compress + + } // end encodeBytesToBytes + + + + + +/* ******** D E C O D I N G M E T H O D S ******** */ + + + /** + * Decode4to3. + * + * @param source + * the source + * @param srcOffset + * the src offset + * @param destination + * the destination + * @param destOffset + * the dest offset + * @param options + * the options + * + * @return the int + */ + private static int decode4to3( + byte[] source, int srcOffset, + byte[] destination, int destOffset, int options ) { + + // Lots of error checking and exception throwing + if( source == null ){ + throw new NullPointerException( "Source array was null." ); + } // end if + if( destination == null ){ + throw new NullPointerException( "Destination array was null." ); + } // end if + if( srcOffset < 0 || srcOffset + 3 >= source.length ){ + throw new IllegalArgumentException( String.format( + "Source array with length %d cannot have offset of %d and still process four bytes.", source.length, srcOffset ) ); + } // end if + if( destOffset < 0 || destOffset +2 >= destination.length ){ + throw new IllegalArgumentException( String.format( + "Destination array with length %d cannot have offset of %d and still store three bytes.", destination.length, destOffset ) ); + } // end if + + + byte[] DECODABET = getDecodabet( options ); + + // Example: Dk== + if( source[ srcOffset + 2] == EQUALS_SIGN ) { + // Two ways to do the same thing. Don't know which way I like best. + //int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 ) + // | ( ( DECODABET[ source[ srcOffset + 1] ] << 24 ) >>> 12 ); + int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 ) + | ( ( DECODABET[ source[ srcOffset + 1] ] & 0xFF ) << 12 ); + + destination[ destOffset ] = (byte)( outBuff >>> 16 ); + return 1; + } + + // Example: DkL= + else if( source[ srcOffset + 3 ] == EQUALS_SIGN ) { + // Two ways to do the same thing. Don't know which way I like best. + //int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 ) + // | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 ) + // | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 ); + int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 ) + | ( ( DECODABET[ source[ srcOffset + 1 ] ] & 0xFF ) << 12 ) + | ( ( DECODABET[ source[ srcOffset + 2 ] ] & 0xFF ) << 6 ); + + destination[ destOffset ] = (byte)( outBuff >>> 16 ); + destination[ destOffset + 1 ] = (byte)( outBuff >>> 8 ); + return 2; + } + + // Example: DkLE + else { + // Two ways to do the same thing. Don't know which way I like best. + //int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 ) + // | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 ) + // | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 ) + // | ( ( DECODABET[ source[ srcOffset + 3 ] ] << 24 ) >>> 24 ); + int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 ) + | ( ( DECODABET[ source[ srcOffset + 1 ] ] & 0xFF ) << 12 ) + | ( ( DECODABET[ source[ srcOffset + 2 ] ] & 0xFF ) << 6) + | ( ( DECODABET[ source[ srcOffset + 3 ] ] & 0xFF ) ); + + + destination[ destOffset ] = (byte)( outBuff >> 16 ); + destination[ destOffset + 1 ] = (byte)( outBuff >> 8 ); + destination[ destOffset + 2 ] = (byte)( outBuff ); + + return 3; + } + } // end decodeToBytes + + + + + + /** + * Decode. + * + * @param source + * the source + * + * @return the byte[] + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ + public static byte[] decode( byte[] source ) + throws java.io.IOException { + byte[] decoded = null; +// try { + decoded = decode( source, 0, source.length, Base64.NO_OPTIONS ); +// } catch( java.io.IOException ex ) { +// assert false : "IOExceptions only come from GZipping, which is turned off: " + ex.getMessage(); +// } + return decoded; + } + + + + /** + * Decode. + * + * @param source + * the source + * @param off + * the off + * @param len + * the len + * @param options + * the options + * + * @return the byte[] + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ + public static byte[] decode( byte[] source, int off, int len, int options ) + throws java.io.IOException { + + // Lots of error checking and exception throwing + if( source == null ){ + throw new NullPointerException( "Cannot decode null source array." ); + } // end if + if( off < 0 || off + len > source.length ){ + throw new IllegalArgumentException( String.format( + "Source array with length %d cannot have offset of %d and process %d bytes.", source.length, off, len ) ); + } // end if + + if( len == 0 ){ + return new byte[0]; + }else if( len < 4 ){ + throw new IllegalArgumentException( + "Base64-encoded string must have at least four characters, but length specified was " + len ); + } // end if + + byte[] DECODABET = getDecodabet( options ); + + int len34 = len * 3 / 4; // Estimate on array size + byte[] outBuff = new byte[ len34 ]; // Upper limit on size of output + int outBuffPosn = 0; // Keep track of where we're writing + + byte[] b4 = new byte[4]; // Four byte buffer from source, eliminating white space + int b4Posn = 0; // Keep track of four byte input buffer + int i = 0; // Source array counter + byte sbiDecode = 0; // Special value from DECODABET + + for( i = off; i < off+len; i++ ) { // Loop through source + + sbiDecode = DECODABET[ source[i]&0xFF ]; + + // White space, Equals sign, or legit Base64 character + // Note the values such as -5 and -9 in the + // DECODABETs at the top of the file. + if( sbiDecode >= WHITE_SPACE_ENC ) { + if( sbiDecode >= EQUALS_SIGN_ENC ) { + b4[ b4Posn++ ] = source[i]; // Save non-whitespace + if( b4Posn > 3 ) { // Time to decode? + outBuffPosn += decode4to3( b4, 0, outBuff, outBuffPosn, options ); + b4Posn = 0; + + // If that was the equals sign, break out of 'for' loop + if( source[i] == EQUALS_SIGN ) { + break; + } // end if: equals sign + } // end if: quartet built + } // end if: equals sign or better + } // end if: white space, equals sign or better + else { + // There's a bad input character in the Base64 stream. + throw new java.io.IOException( String.format( + "Bad Base64 input character decimal %d in array position %d", ((int)source[i])&0xFF, i ) ); + } // end else: + } // each input character + + byte[] out = new byte[ outBuffPosn ]; + System.arraycopy( outBuff, 0, out, 0, outBuffPosn ); + return out; + } // end decode + + + + + /** + * Decode. + * + * @param s + * the s + * + * @return the byte[] + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ + public static byte[] decode( String s ) throws java.io.IOException { + return decode( s, NO_OPTIONS ); + } + + + + /** + * Decode. + * + * @param s + * the s + * @param options + * the options + * + * @return the byte[] + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ + public static byte[] decode( String s, int options ) throws java.io.IOException { + + if( s == null ){ + throw new NullPointerException( "Input string was null." ); + } // end if + + byte[] bytes; + try { + bytes = s.getBytes( PREFERRED_ENCODING ); + } // end try + catch( java.io.UnsupportedEncodingException uee ) { + bytes = s.getBytes(); + } // end catch + // + + // Decode + bytes = decode( bytes, 0, bytes.length, options ); + + // Check to see if it's gzip-compressed + // GZIP Magic Two-Byte Number: 0x8b1f (35615) + boolean dontGunzip = (options & DONT_GUNZIP) != 0; + if( (bytes != null) && (bytes.length >= 4) && (!dontGunzip) ) { + + int head = ((int)bytes[0] & 0xff) | ((bytes[1] << 8) & 0xff00); + if( java.util.zip.GZIPInputStream.GZIP_MAGIC == head ) { + java.io.ByteArrayInputStream bais = null; + java.util.zip.GZIPInputStream gzis = null; + java.io.ByteArrayOutputStream baos = null; + byte[] buffer = new byte[2048]; + int length = 0; + + try { + baos = new java.io.ByteArrayOutputStream(); + bais = new java.io.ByteArrayInputStream( bytes ); + gzis = new java.util.zip.GZIPInputStream( bais ); + + while( ( length = gzis.read( buffer ) ) >= 0 ) { + baos.write(buffer,0,length); + } // end while: reading input + + // No error? Get new bytes. + bytes = baos.toByteArray(); + + } // end try + catch( java.io.IOException e ) { + e.printStackTrace(); + // Just return originally-decoded bytes + } // end catch + finally { + try{ baos.close(); } catch( Exception e ){} + try{ gzis.close(); } catch( Exception e ){} + try{ bais.close(); } catch( Exception e ){} + } // end finally + + } // end if: gzipped + } // end if: bytes.length >= 2 + + return bytes; + } // end decode + + + + /** + * Decode to object. + * + * @param encodedObject + * the encoded object + * + * @return the object + * + * @throws IOException + * Signals that an I/O exception has occurred. + * @throws ClassNotFoundException + * the class not found exception + */ + public static Object decodeToObject( String encodedObject ) + throws java.io.IOException, java.lang.ClassNotFoundException { + return decodeToObject(encodedObject,NO_OPTIONS,null); + } + + + /** + * Decode to object. + * + * @param encodedObject + * the encoded object + * @param options + * the options + * @param loader + * the loader + * + * @return the object + * + * @throws IOException + * Signals that an I/O exception has occurred. + * @throws ClassNotFoundException + * the class not found exception + */ + public static Object decodeToObject( + String encodedObject, int options, final ClassLoader loader ) + throws java.io.IOException, java.lang.ClassNotFoundException { + + // Decode and gunzip if necessary + byte[] objBytes = decode( encodedObject, options ); + + java.io.ByteArrayInputStream bais = null; + java.io.ObjectInputStream ois = null; + Object obj = null; + + try { + bais = new java.io.ByteArrayInputStream( objBytes ); + + // If no custom class loader is provided, use Java's builtin OIS. + if( loader == null ){ + ois = new java.io.ObjectInputStream( bais ); + } // end if: no loader provided + + // Else make a customized object input stream that uses + // the provided class loader. + else { + ois = new java.io.ObjectInputStream(bais){ + @Override + public Class resolveClass(java.io.ObjectStreamClass streamClass) + throws java.io.IOException, ClassNotFoundException { + Class c = Class.forName(streamClass.getName(), false, loader); + if( c == null ){ + return super.resolveClass(streamClass); + } else { + return c; // Class loader knows of this class. + } // end else: not null + } // end resolveClass + }; // end ois + } // end else: no custom class loader + + obj = ois.readObject(); + } // end try + catch( java.io.IOException e ) { + throw e; // Catch and throw in order to execute finally{} + } // end catch + catch( java.lang.ClassNotFoundException e ) { + throw e; // Catch and throw in order to execute finally{} + } // end catch + finally { + try{ bais.close(); } catch( Exception e ){} + try{ ois.close(); } catch( Exception e ){} + } // end finally + + return obj; + } // end decodeObject + + + + /** + * Encode to file. + * + * @param dataToEncode + * the data to encode + * @param filename + * the filename + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ + public static void encodeToFile( byte[] dataToEncode, String filename ) + throws java.io.IOException { + + if( dataToEncode == null ){ + throw new NullPointerException( "Data to encode was null." ); + } // end iff + + Base64.OutputStream bos = null; + try { + bos = new Base64.OutputStream( + new java.io.FileOutputStream( filename ), Base64.ENCODE ); + bos.write( dataToEncode ); + } // end try + catch( java.io.IOException e ) { + throw e; // Catch and throw to execute finally{} block + } // end catch: java.io.IOException + finally { + try{ bos.close(); } catch( Exception e ){} + } // end finally + + } // end encodeToFile + + + /** + * Decode to file. + * + * @param dataToDecode + * the data to decode + * @param filename + * the filename + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ + public static void decodeToFile( String dataToDecode, String filename ) + throws java.io.IOException { + + Base64.OutputStream bos = null; + try{ + bos = new Base64.OutputStream( + new java.io.FileOutputStream( filename ), Base64.DECODE ); + bos.write( dataToDecode.getBytes( PREFERRED_ENCODING ) ); + } // end try + catch( java.io.IOException e ) { + throw e; // Catch and throw to execute finally{} block + } // end catch: java.io.IOException + finally { + try{ bos.close(); } catch( Exception e ){} + } // end finally + + } // end decodeToFile + + + + + /** + * Decode from file. + * + * @param filename + * the filename + * + * @return the byte[] + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ + public static byte[] decodeFromFile( String filename ) + throws java.io.IOException { + + byte[] decodedData = null; + Base64.InputStream bis = null; + try + { + // Set up some useful variables + java.io.File file = new java.io.File( filename ); + byte[] buffer = null; + int length = 0; + int numBytes = 0; + + // Check for size of file + if( file.length() > Integer.MAX_VALUE ) + { + throw new java.io.IOException( "File is too big for this convenience method (" + file.length() + " bytes)." ); + } // end if: file too big for int index + buffer = new byte[ (int)file.length() ]; + + // Open a stream + bis = new Base64.InputStream( + new java.io.BufferedInputStream( + new java.io.FileInputStream( file ) ), Base64.DECODE ); + + // Read until done + while( ( numBytes = bis.read( buffer, length, 4096 ) ) >= 0 ) { + length += numBytes; + } // end while + + // Save in a variable to return + decodedData = new byte[ length ]; + System.arraycopy( buffer, 0, decodedData, 0, length ); + + } // end try + catch( java.io.IOException e ) { + throw e; // Catch and release to execute finally{} + } // end catch: java.io.IOException + finally { + try{ bis.close(); } catch( Exception e) {} + } // end finally + + return decodedData; + } // end decodeFromFile + + + + /** + * Encode from file. + * + * @param filename + * the filename + * + * @return the string + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ + public static String encodeFromFile( String filename ) + throws java.io.IOException { + + String encodedData = null; + Base64.InputStream bis = null; + try + { + // Set up some useful variables + java.io.File file = new java.io.File( filename ); + byte[] buffer = new byte[ Math.max((int)(file.length() * 1.4+1),40) ]; // Need max() for math on small files (v2.2.1); Need +1 for a few corner cases (v2.3.5) + int length = 0; + int numBytes = 0; + + // Open a stream + bis = new Base64.InputStream( + new java.io.BufferedInputStream( + new java.io.FileInputStream( file ) ), Base64.ENCODE ); + + // Read until done + while( ( numBytes = bis.read( buffer, length, 4096 ) ) >= 0 ) { + length += numBytes; + } // end while + + // Save in a variable to return + encodedData = new String( buffer, 0, length, Base64.PREFERRED_ENCODING ); + + } // end try + catch( java.io.IOException e ) { + throw e; // Catch and release to execute finally{} + } // end catch: java.io.IOException + finally { + try{ bis.close(); } catch( Exception e) {} + } // end finally + + return encodedData; + } // end encodeFromFile + + /** + * Encode file to file. + * + * @param infile + * the infile + * @param outfile + * the outfile + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ + public static void encodeFileToFile( String infile, String outfile ) + throws java.io.IOException { + + String encoded = Base64.encodeFromFile( infile ); + java.io.OutputStream out = null; + try{ + out = new java.io.BufferedOutputStream( + new java.io.FileOutputStream( outfile ) ); + out.write( encoded.getBytes("US-ASCII") ); // Strict, 7-bit output. + } // end try + catch( java.io.IOException e ) { + throw e; // Catch and release to execute finally{} + } // end catch + finally { + try { out.close(); } + catch( Exception ex ){} + } // end finally + } // end encodeFileToFile + + + /** + * Decode file to file. + * + * @param infile + * the infile + * @param outfile + * the outfile + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ + public static void decodeFileToFile( String infile, String outfile ) + throws java.io.IOException { + + byte[] decoded = Base64.decodeFromFile( infile ); + java.io.OutputStream out = null; + try{ + out = new java.io.BufferedOutputStream( + new java.io.FileOutputStream( outfile ) ); + out.write( decoded ); + } // end try + catch( java.io.IOException e ) { + throw e; // Catch and release to execute finally{} + } // end catch + finally { + try { out.close(); } + catch( Exception ex ){} + } // end finally + } // end decodeFileToFile + + + /* ******** I N N E R C L A S S I N P U T S T R E A M ******** */ + + + + /** + * The Class InputStream. + */ + public static class InputStream extends java.io.FilterInputStream { + + /** The encode. */ + private boolean encode; // Encoding or decoding + + /** The position. */ + private int position; // Current position in the buffer + + /** The buffer. */ + private byte[] buffer; // Small buffer holding converted data + + /** The buffer length. */ + private int bufferLength; // Length of buffer (3 or 4) + + /** The num sig bytes. */ + private int numSigBytes; // Number of meaningful bytes in the buffer + + /** The line length. */ + private int lineLength; + + /** The break lines. */ + private boolean breakLines; // Break lines at less than 80 characters + + /** The options. */ + private int options; // Record options used to create the stream. + + /** The decodabet. */ + private byte[] decodabet; // Local copies to avoid extra method calls + + + /** + * Instantiates a new input stream. + * + * @param in + * the in + */ + public InputStream( java.io.InputStream in ) { + this( in, DECODE ); + } // end constructor + + + /** + * Instantiates a new input stream. + * + * @param in + * the in + * @param options + * the options + */ + public InputStream( java.io.InputStream in, int options ) { + + super( in ); + this.options = options; // Record for later + this.breakLines = (options & DO_BREAK_LINES) > 0; + this.encode = (options & ENCODE) > 0; + this.bufferLength = encode ? 4 : 3; + this.buffer = new byte[ bufferLength ]; + this.position = -1; + this.lineLength = 0; + this.decodabet = getDecodabet(options); + } // end constructor + + /* (non-Javadoc) + * @see java.io.FilterInputStream#read() + */ + @Override + public int read() throws java.io.IOException { + + // Do we need to get data? + if( position < 0 ) { + if( encode ) { + byte[] b3 = new byte[3]; + int numBinaryBytes = 0; + for( int i = 0; i < 3; i++ ) { + int b = in.read(); + + // If end of stream, b is -1. + if( b >= 0 ) { + b3[i] = (byte)b; + numBinaryBytes++; + } else { + break; // out of for loop + } // end else: end of stream + + } // end for: each needed input byte + + if( numBinaryBytes > 0 ) { + encode3to4( b3, 0, numBinaryBytes, buffer, 0, options ); + position = 0; + numSigBytes = 4; + } // end if: got data + else { + return -1; // Must be end of stream + } // end else + } // end if: encoding + + // Else decoding + else { + byte[] b4 = new byte[4]; + int i = 0; + for( i = 0; i < 4; i++ ) { + // Read four "meaningful" bytes: + int b = 0; + do{ b = in.read(); } + while( b >= 0 && decodabet[ b & 0x7f ] <= WHITE_SPACE_ENC ); + + if( b < 0 ) { + break; // Reads a -1 if end of stream + } // end if: end of stream + + b4[i] = (byte)b; + } // end for: each needed input byte + + if( i == 4 ) { + numSigBytes = decode4to3( b4, 0, buffer, 0, options ); + position = 0; + } // end if: got four characters + else if( i == 0 ){ + return -1; + } // end else if: also padded correctly + else { + // Must have broken out from above. + throw new java.io.IOException( "Improperly padded Base64 input." ); + } // end + + } // end else: decode + } // end else: get data + + // Got data? + if( position >= 0 ) { + // End of relevant data? + if( /*!encode &&*/ position >= numSigBytes ){ + return -1; + } // end if: got data + + if( encode && breakLines && lineLength >= MAX_LINE_LENGTH ) { + lineLength = 0; + return '\n'; + } // end if + else { + lineLength++; // This isn't important when decoding + // but throwing an extra "if" seems + // just as wasteful. + + int b = buffer[ position++ ]; + + if( position >= bufferLength ) { + position = -1; + } // end if: end + + return b & 0xFF; // This is how you "cast" a byte that's + // intended to be unsigned. + } // end else + } // end if: position >= 0 + + // Else error + else { + throw new java.io.IOException( "Error in Base64 code reading stream." ); + } // end else + } // end read + + + /* (non-Javadoc) + * @see java.io.FilterInputStream#read(byte[], int, int) + */ + @Override + public int read( byte[] dest, int off, int len ) + throws java.io.IOException { + int i; + int b; + for( i = 0; i < len; i++ ) { + b = read(); + + if( b >= 0 ) { + dest[off + i] = (byte) b; + } + else if( i == 0 ) { + return -1; + } + else { + break; // Out of 'for' loop + } // Out of 'for' loop + } // end for: each byte read + return i; + } // end read + + } // end inner class InputStream + + + + + + + /* ******** I N N E R C L A S S O U T P U T S T R E A M ******** */ + + + + /** + * The Class OutputStream. + */ + public static class OutputStream extends java.io.FilterOutputStream { + + /** The encode. */ + private boolean encode; + + /** The position. */ + private int position; + + /** The buffer. */ + private byte[] buffer; + + /** The buffer length. */ + private int bufferLength; + + /** The line length. */ + private int lineLength; + + /** The break lines. */ + private boolean breakLines; + + /** The b4. */ + private byte[] b4; // Scratch used in a few places + + /** The suspend encoding. */ + private boolean suspendEncoding; + + /** The options. */ + private int options; // Record for later + + /** The decodabet. */ + private byte[] decodabet; // Local copies to avoid extra method calls + + /** + * Instantiates a new output stream. + * + * @param out + * the out + */ + public OutputStream( java.io.OutputStream out ) { + this( out, ENCODE ); + } // end constructor + + + /** + * Instantiates a new output stream. + * + * @param out + * the out + * @param options + * the options + */ + public OutputStream( java.io.OutputStream out, int options ) { + super( out ); + this.breakLines = (options & DO_BREAK_LINES) != 0; + this.encode = (options & ENCODE) != 0; + this.bufferLength = encode ? 3 : 4; + this.buffer = new byte[ bufferLength ]; + this.position = 0; + this.lineLength = 0; + this.suspendEncoding = false; + this.b4 = new byte[4]; + this.options = options; + this.decodabet = getDecodabet(options); + } // end constructor + + + /* (non-Javadoc) + * @see java.io.FilterOutputStream#write(int) + */ + @Override + public void write(int theByte) + throws java.io.IOException { + // Encoding suspended? + if( suspendEncoding ) { + this.out.write( theByte ); + return; + } // end if: supsended + + // Encode? + if( encode ) { + buffer[ position++ ] = (byte)theByte; + if( position >= bufferLength ) { // Enough to encode. + + this.out.write( encode3to4( b4, buffer, bufferLength, options ) ); + + lineLength += 4; + if( breakLines && lineLength >= MAX_LINE_LENGTH ) { + this.out.write( NEW_LINE ); + lineLength = 0; + } // end if: end of line + + position = 0; + } // end if: enough to output + } // end if: encoding + + // Else, Decoding + else { + // Meaningful Base64 character? + if( decodabet[ theByte & 0x7f ] > WHITE_SPACE_ENC ) { + buffer[ position++ ] = (byte)theByte; + if( position >= bufferLength ) { // Enough to output. + + int len = Base64.decode4to3( buffer, 0, b4, 0, options ); + out.write( b4, 0, len ); + position = 0; + } // end if: enough to output + } // end if: meaningful base64 character + else if( decodabet[ theByte & 0x7f ] != WHITE_SPACE_ENC ) { + throw new java.io.IOException( "Invalid character in Base64 data." ); + } // end else: not white space either + } // end else: decoding + } // end write + + + + /* (non-Javadoc) + * @see java.io.FilterOutputStream#write(byte[], int, int) + */ + @Override + public void write( byte[] theBytes, int off, int len ) + throws java.io.IOException { + // Encoding suspended? + if( suspendEncoding ) { + this.out.write( theBytes, off, len ); + return; + } // end if: supsended + + for( int i = 0; i < len; i++ ) { + write( theBytes[ off + i ] ); + } // end for: each byte written + + } // end write + + + + /** + * Flush base64. + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ + public void flushBase64() throws java.io.IOException { + if( position > 0 ) { + if( encode ) { + out.write( encode3to4( b4, buffer, position, options ) ); + position = 0; + } // end if: encoding + else { + throw new java.io.IOException( "Base64 input not properly padded." ); + } // end else: decoding + } // end if: buffer partially full + + } // end flush + + + /* (non-Javadoc) + * @see java.io.FilterOutputStream#close() + */ + @Override + public void close() throws java.io.IOException { + // 1. Ensure that pending characters are written + flushBase64(); + + // 2. Actually close the stream + // Base class both flushes and closes. + super.close(); + + buffer = null; + out = null; + } // end close + + + + /** + * Suspend encoding. + * + * @throws IOException + * Signals that an I/O exception has occurred. + */ + public void suspendEncoding() throws java.io.IOException { + flushBase64(); + this.suspendEncoding = true; + } // end suspendEncoding + + + /** + * Resume encoding. + */ + public void resumeEncoding() { + this.suspendEncoding = false; + } // end resumeEncoding + + + + } // end inner class OutputStream + + +} // end class Base64 diff --git a/src/main/resources/com/github/api/v2/services/constant/ApplicationConstants.properties b/src/main/resources/com/github/api/v2/services/constant/ApplicationConstants.properties new file mode 100644 index 0000000..f65ca29 --- /dev/null +++ b/src/main/resources/com/github/api/v2/services/constant/ApplicationConstants.properties @@ -0,0 +1,10 @@ +com.github.api.v2.services.encoding=UTF-8 +com.github.api.v2.services.connectTimeout=-1 +com.github.api.v2.services.readTimeout=-1 +com.github.api.v2.services.defaultApiVersion=v2 +com.github.api.v2.services.defaultFormat=json +com.github.api.v2.services.requestHeaders.Accept-Encoding=gzip, deflate +com.github.api.v2.services.dateFormat=yyyy/MM/dd HH:mm:ss Z +com.github.api.v2.services.accessTokenPattern=access_token=([^&]+)(&expires=(\\d+))? +com.github.api.v2.services.accessDeniedPattern=false + diff --git a/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties new file mode 100644 index 0000000..b02642e --- /dev/null +++ b/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -0,0 +1,118 @@ +# API URLs +########## + +#OAuth URLs +########### +com.github.api.v2.services.oauthService.authorize=https://github.com/login/oauth/authorize?{client_id}{redirect_uri}{scope} +com.github.api.v2.services.oauthService.accessToken=https://github.com/login/oauth/access_token?{client_id}{client_secret}{redirect_uri}{code} + +# User API +com.github.api.v2.services.userService.searchUsersByName=http://github.com/api/{version}/{format}/user/search/{userName} +com.github.api.v2.services.userService.searchUsersByEmail=http://github.com/api/{version}/{format}/user/email/{email} +com.github.api.v2.services.userService.getUser=http://github.com/api/{version}/{format}/user/show/{userName} +com.github.api.v2.services.userService.getCurrentUser=http://github.com/api/{version}/{format}/user/show +com.github.api.v2.services.userService.updateUser=http://github.com/api/{version}/{format}/user/show/{userName} +com.github.api.v2.services.userService.getUserFollowers=http://github.com/api/{version}/{format}/user/show/{userName}/followers +com.github.api.v2.services.userService.getUserFollowing=http://github.com/api/{version}/{format}/user/show/{userName}/following +com.github.api.v2.services.userService.followUser=http://github.com/api/{version}/{format}/user/follow/{userName} +com.github.api.v2.services.userService.unfollowUser=http://github.com/api/{version}/{format}/user/unfollow/{userName} +com.github.api.v2.services.userService.getWatchedRepositories=http://github.com/api/{version}/{format}/repos/watched/{userName} +com.github.api.v2.services.userService.getKeys=http://github.com/api/{version}/{format}/user/keys +com.github.api.v2.services.userService.addKey=http://github.com/api/{version}/{format}/user/key/add +com.github.api.v2.services.userService.removeKey=http://github.com/api/{version}/{format}/user/key/remove +com.github.api.v2.services.userService.getEmails=http://github.com/api/{version}/{format}/user/emails +com.github.api.v2.services.userService.addEmail=http://github.com/api/{version}/{format}/user/email/add +com.github.api.v2.services.userService.removeEmail=http://github.com/api/{version}/{format}/user/email/remove +com.github.api.v2.services.userService.getUserOrganizations=http://github.com/api/{version}/{format}/user/show/{userName}/organizations + +# Issue API +com.github.api.v2.services.issueService.searchIssues=http://github.com/api/{version}/{format}/issues/search/{userName}/{repositoryName}/{state}/{keyword} +com.github.api.v2.services.issueService.getIssues=http://github.com/api/{version}/{format}/issues/list/{userName}/{repositoryName}/{state} +com.github.api.v2.services.issueService.getIssue=http://github.com/api/{version}/{format}/issues/show/{userName}/{repositoryName}/{issueNumber} +com.github.api.v2.services.issueService.getIssueComments=http://github.com/api/{version}/{format}/issues/comments/{userName}/{repositoryName}/{issueNumber} +com.github.api.v2.services.issueService.createIssue=http://github.com/api/{version}/{format}/issues/open/{userName}/{repositoryName} +com.github.api.v2.services.issueService.closeIssue=http://github.com/api/{version}/{format}/issues/close/{userName}/{repositoryName}/{issueNumber} +com.github.api.v2.services.issueService.reopenIssue=http://github.com/api/{version}/{format}/issues/reopen/{userName}/{repositoryName}/{issueNumber} +com.github.api.v2.services.issueService.updateIssue=http://github.com/api/{version}/{format}/issues/edit/{userName}/{repositoryName}/{issueNumber} +com.github.api.v2.services.issueService.getIssueLabels=http://github.com/api/{version}/{format}/issues/labels/{userName}/{repositoryName} +com.github.api.v2.services.issueService.addLabel=http://github.com/api/{version}/{format}/issues/label/add/{userName}/{repositoryName}/{label}/{issueNumber} +com.github.api.v2.services.issueService.removeLabel=http://github.com/api/{version}/{format}/issues/label/remove/{userName}/{repositoryName}/{label}/{issueNumber} +com.github.api.v2.services.issueService.addComment=http://github.com/api/{version}/{format}/issues/comment/{userName}/{repositoryName}/{issueNumber} +com.github.api.v2.services.issueService.getIssuesByLabel=http://github.com/api/{version}/{format}/issues/list/{userName}/{repositoryName}/label/{label} + +# Gist API +com.github.api.v2.services.gistService.getGist=http://gist.github.com/api/v1/{format}/{gistId} +com.github.api.v2.services.gistService.getGistContent=http://gist.github.com/raw/{gistId}/{fileName} +com.github.api.v2.services.gistService.getUserGists=http://gist.github.com/api/v1/{format}/gists/{userName} + +# Network API +com.github.api.v2.services.networkService.getNetworkMeta=http://github.com/{userName}/{repositoryName}/network_meta +com.github.api.v2.services.networkService.getNetworkData=http://github.com/{userName}/{repositoryName}/network_data_chunk?{netHash}{startIndex}{endIndex} + +# Repository API +com.github.api.v2.services.repositoryService.searchRepositories=http://github.com/api/{version}/{format}/repos/search/{keyword}?{language}{startPage} +com.github.api.v2.services.repositoryService.getRepository=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName} +com.github.api.v2.services.repositoryService.updateRepository=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName} +com.github.api.v2.services.repositoryService.getRepositories=http://github.com/api/{version}/{format}/repos/show/{userName} +com.github.api.v2.services.repositoryService.watchRepository=http://github.com/api/{version}/{format}/repos/watch/{userName}/{repositoryName} +com.github.api.v2.services.repositoryService.unwatchRepository=http://github.com/api/{version}/{format}/repos/unwatch/{userName}/{repositoryName} +com.github.api.v2.services.repositoryService.forkRepository=http://github.com/api/{version}/{format}/repos/fork/{userName}/{repositoryName} +com.github.api.v2.services.repositoryService.createRepository=http://github.com/api/{version}/{format}/repos/create +com.github.api.v2.services.repositoryService.deleteRepository=http://github.com/api/{version}/{format}/repos/delete/{repositoryName} +com.github.api.v2.services.repositoryService.changeVisibility=http://github.com/api/{version}/{format}/repos/set/{visibility}/{repositoryName} +com.github.api.v2.services.repositoryService.getKeys=http://github.com/api/{version}/{format}/repos/keys/{repositoryName} +com.github.api.v2.services.repositoryService.addKey=http://github.com/api/{version}/{format}/repos/key/{repositoryName}/add +com.github.api.v2.services.repositoryService.removeKey=http://github.com/api/{version}/{format}/repos/key/{repositoryName}/remove +com.github.api.v2.services.repositoryService.getCollaborators=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/collaborators +com.github.api.v2.services.repositoryService.addCollaborator=http://github.com/api/{version}/{format}/repos/collaborators/{repositoryName}/add/{userName} +com.github.api.v2.services.repositoryService.removeCollaborator=http://github.com/api/{version}/{format}/repos/collaborators/{repositoryName}/remove/{userName} +com.github.api.v2.services.repositoryService.getPushableRepositories=http://github.com/api/{version}/{format}/repos/pushable +com.github.api.v2.services.repositoryService.getContributors=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/contributors +com.github.api.v2.services.repositoryService.getWatchers=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/watchers +com.github.api.v2.services.repositoryService.getForks=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/network +com.github.api.v2.services.repositoryService.getLanguageBreakdown=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/languages +com.github.api.v2.services.repositoryService.getTags=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/tags +com.github.api.v2.services.repositoryService.getBranches=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/branches +com.github.api.v2.services.repositoryService.getRepositoryArchive=http://github.com/{userName}/{repositoryName}/zipball/{branch} + +# Commit API +com.github.api.v2.services.commitService.getCommits=http://github.com/api/{version}/{format}/commits/list/{userName}/{repositoryName}/{branch} +com.github.api.v2.services.commitService.getCommitsFile=http://github.com/api/{version}/{format}/commits/list/{userName}/{repositoryName}/{branch}/{filePath} +com.github.api.v2.services.commitService.getCommit=http://github.com/api/{version}/{format}/commits/show/{userName}/{repositoryName}/{sha} + +# Object API +com.github.api.v2.services.objectService.getTree=http://github.com/api/{version}/{format}/tree/full/{userName}/{repositoryName}/{sha} +com.github.api.v2.services.objectService.getBlob=http://github.com/api/{version}/{format}/blob/show/{userName}/{repositoryName}/{sha}/{filePath} +com.github.api.v2.services.objectService.getBlobs=http://github.com/api/{version}/{format}/blob/full/{userName}/{repositoryName}/{sha} +com.github.api.v2.services.objectService.getObjectContent=http://github.com/api/{version}/{format}/blob/show/{userName}/{repositoryName}/{sha} + +# Organization API +com.github.api.v2.services.organizationService.getOrganizations=http://github.com/api/{version}/{format}/organizations +com.github.api.v2.services.organizationService.getOrganization=http://github.com/api/{version}/{format}/organizations/{organizationName} +com.github.api.v2.services.organizationService.updateOrganization=http://github.com/api/{version}/{format}/organizations/{organizationName} +com.github.api.v2.services.organizationService.getAllRepositories=http://github.com/api/{version}/{format}/organizations/repositories +com.github.api.v2.services.organizationService.getPublicRepositories=http://github.com/api/{version}/{format}/organizations/{organizationName}/public_repositories +com.github.api.v2.services.organizationService.getPublicMembers=http://github.com/api/{version}/{format}/organizations/{organizationName}/public_members +com.github.api.v2.services.organizationService.getTeams=http://github.com/api/{version}/{format}/organizations/{organizationName}/teams +com.github.api.v2.services.organizationService.createTeam=http://github.com/api/{version}/{format}/organizations/{organizationName}/teams +com.github.api.v2.services.organizationService.getTeam=http://github.com/api/{version}/{format}/teams/{teamId} +com.github.api.v2.services.organizationService.updateTeam=http://github.com/api/{version}/{format}/teams/{teamId} +com.github.api.v2.services.organizationService.deleteTeam=http://github.com/api/{version}/{format}/teams/{teamId} +com.github.api.v2.services.organizationService.getTeamMembers=http://github.com/api/{version}/{format}/teams/{teamId}/members +com.github.api.v2.services.organizationService.addTeamMember=http://github.com/api/{version}/{format}/teams/{teamId}/members +com.github.api.v2.services.organizationService.removeTeamMember=http://github.com/api/{version}/{format}/teams/{teamId}/members?name={userName} +com.github.api.v2.services.organizationService.getTeamRepositories=http://github.com/api/{version}/{format}/teams/{teamId}/repositories +com.github.api.v2.services.organizationService.addTeamRepository=http://github.com/api/{version}/{format}/teams/{teamId}/repositories?name={userName} +com.github.api.v2.services.organizationService.removeTeamRepository=http://github.com/api/{version}/{format}/teams/{teamId}/repositories?name={userRepositoryPair} + +# Feed +com.github.api.v2.services.feedService.getPublicUserFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg +com.github.api.v2.services.feedService.getPrivateUserFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg +com.github.api.v2.services.feedService.getCommitFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}%2F{repositoryName}%2Fcommits%2F{branch}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg +com.github.api.v2.services.feedService.getNetworkFeed=http://github.com/{userName}/{repositoryName}/network/feed +com.github.api.v2.services.feedService.getWikiFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fwiki.github.com%2F{userName}%2F{repositoryName}%2Fwikis.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg +com.github.api.v2.services.feedService.getPublicTimelineFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2Ftimeline.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg +com.github.api.v2.services.feedService.getDiscussionsFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fsupport.github.com%2Fdiscussions.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg +com.github.api.v2.services.feedService.getDiscussionsFeedByTopic=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fsupport.github.com%2Fdiscussions%2F{keyword}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg +com.github.api.v2.services.feedService.getJobPositionsFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fjobs.github.com%2Fpositions.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg +com.github.api.v2.services.feedService.getBlogFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Ffeeds.feedburner.com%2Fgithub%3Fformat%3Drss&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg diff --git a/src/test/java/com/github/api/v2/services/AllTests.java b/src/test/java/com/github/api/v2/services/AllTests.java new file mode 100644 index 0000000..0a08302 --- /dev/null +++ b/src/test/java/com/github/api/v2/services/AllTests.java @@ -0,0 +1,48 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import junit.framework.Test; +import junit.framework.TestSuite; + +/** + * The Class AllTests. + */ +public class AllTests { + + /** + * Suite. + * + * @return the test + */ + public static Test suite() { + TestSuite suite = new TestSuite("Test for com.github.api.v2.services"); + //$JUnit-BEGIN$ +// suite.addTestSuite(OAuthServiceTest.class); + suite.addTestSuite(CommitServiceTest.class); + suite.addTestSuite(RepositoryServiceTest.class); + suite.addTestSuite(IssueServiceTest.class); + suite.addTestSuite(ObjectServiceTest.class); + suite.addTestSuite(NetworkServiceTest.class); + suite.addTestSuite(UserServiceTest.class); + suite.addTestSuite(GistServiceTest.class); + suite.addTestSuite(FeedServiceTest.class); + //$JUnit-END$ + return suite; + } + +} diff --git a/src/test/java/com/github/api/v2/services/BaseGitHubServiceTest.java b/src/test/java/com/github/api/v2/services/BaseGitHubServiceTest.java new file mode 100644 index 0000000..9dc0e7a --- /dev/null +++ b/src/test/java/com/github/api/v2/services/BaseGitHubServiceTest.java @@ -0,0 +1,131 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Collection; + +import junit.framework.TestCase; + +import org.junit.After; +import org.junit.Before; + +import com.github.api.v2.services.auth.Authentication; +import com.github.api.v2.services.auth.LoginTokenAuthentication; +import com.github.api.v2.services.constant.TestConstants; + +/** + * The Class BaseGitHubServiceTest. + */ +public class BaseGitHubServiceTest extends TestCase { + + /** The Constant RESOURCE_MISSING_MESSAGE. */ + protected static final String RESOURCE_MISSING_MESSAGE = "Please define a test %s in TestConstants.properties file."; + + /** The factory. */ + protected GitHubServiceFactory factory; + + /** The authentication. */ + protected Authentication authentication; + + /* (non-Javadoc) + * @see junit.framework.TestCase#setUp() + */ + @Before + public void setUp() throws Exception { + super.setUp(); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test API Key."), TestConstants.TEST_API_KEY); + authentication = new LoginTokenAuthentication(TestConstants.TEST_USER_NAME, TestConstants.TEST_API_KEY); + factory = GitHubServiceFactory.newInstance(); + + } + + /* (non-Javadoc) + * @see junit.framework.TestCase#tearDown() + */ + @After + public void tearDown() throws Exception { + super.tearDown(); + factory = null; + } + + /** + * Assert not null or empty. + * + * @param message + * the message + * @param value + * the value + */ + protected static void assertNotNullOrEmpty(String message, String value) { + assertNotNull(message, value); + assertFalse(message, "".equals(value)); + } + + /** + * Assert not null or empty. + * + * @param message + * the message + * @param value + * the value + */ + protected static void assertNotNullOrEmpty(String message, Collection value) { + assertNotNull(message, value); + assertFalse(message, value.isEmpty()); + } + + /** + * Convert stream to string. + * + * @param is + * the is + * + * @return the string + */ + protected static String convertStreamToString(InputStream is) { + /* + * To convert the InputStream to String we use the BufferedReader.readLine() + * method. We iterate until the BufferedReader return null which means + * there's no more data to read. Each line will appended to a StringBuilder + * and returned as String. + */ + BufferedReader reader = new BufferedReader(new InputStreamReader(is)); + StringBuilder sb = new StringBuilder(); + + String line = null; + try { + while ((line = reader.readLine()) != null) { + sb.append(line + "\n"); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + return sb.toString(); + } +} diff --git a/src/test/java/com/github/api/v2/services/CommitServiceTest.java b/src/test/java/com/github/api/v2/services/CommitServiceTest.java new file mode 100644 index 0000000..65a14ec --- /dev/null +++ b/src/test/java/com/github/api/v2/services/CommitServiceTest.java @@ -0,0 +1,91 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.util.List; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.api.v2.schema.Commit; +import com.github.api.v2.schema.Repository; +import com.github.api.v2.services.constant.TestConstants; + +/** + * The Class CommitServiceTest. + */ +public class CommitServiceTest extends BaseGitHubServiceTest { + + /** The service. */ + private CommitService service; + + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() + */ + @Before + public void setUp() throws Exception { + super.setUp(); + service = factory.createCommitService(); + service.setAuthentication(authentication); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() + */ + @After + public void tearDown() throws Exception { + super.tearDown(); + service = null; + } + + /** + * Test get commit. + */ + @Test + public void testGetCommit() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test SHA."), TestConstants.TEST_COMMIT_HASH); + Commit commit = service.getCommit(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_COMMIT_HASH); + assertNotNull("Commit cannot be null", commit); + } + + /** + * Test get commits string string string. + */ + @Test + public void testGetCommitsStringStringString() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test SHA."), TestConstants.TEST_COMMIT_HASH); + List commits = service.getCommits(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Repository.MASTER); + assertNotNullOrEmpty("Commits cannot be null or empty", commits); + } + + /** + * Test get commits string string string string. + */ + @Test + public void testGetCommitsStringStringStringString() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test SHA."), TestConstants.TEST_COMMIT_HASH); + List commits = service.getCommits(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Repository.MASTER); + assertNotNullOrEmpty("Commits cannot be null or empty", commits); + } +} diff --git a/src/test/java/com/github/api/v2/services/FeedServiceTest.java b/src/test/java/com/github/api/v2/services/FeedServiceTest.java new file mode 100644 index 0000000..84aafa8 --- /dev/null +++ b/src/test/java/com/github/api/v2/services/FeedServiceTest.java @@ -0,0 +1,120 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.api.v2.schema.Feed; +import com.github.api.v2.schema.Repository; +import com.github.api.v2.services.constant.TestConstants; + +public class FeedServiceTest extends BaseGitHubServiceTest { + private FeedService service; + + @Before + public void setUp() throws Exception { + super.setUp(); + service = factory.createFeedService(); + service.setAuthentication(authentication); + } + + @After + public void tearDown() throws Exception { + super.tearDown(); + service = null; + } + + @Test + public void testGetCommitFeed() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + Feed feed = service.getCommitFeed(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Repository.MASTER, 10); + assertNotNull("Feed cannot be null.", feed); + assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); + } + + @Test + public void testGetNetworkFeed() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + Feed feed = service.getNetworkFeed(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, 10); + assertNotNull("Feed cannot be null.", feed); + assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); + } + + @Test + public void testGetPrivateUserFeed() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + Feed feed = service.getPrivateUserFeed(TestConstants.TEST_USER_NAME, 10); + assertNotNull("Feed cannot be null.", feed); + assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); + } + + @Test + public void testGetPublicTimelineFeed() { + Feed feed = service.getPublicTimelineFeed(10); + assertNotNull("Feed cannot be null.", feed); + assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); + } + + @Test + public void testGetPublicUserFeed() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + Feed feed = service.getPublicUserFeed(TestConstants.TEST_USER_NAME, 10); + assertNotNull("Feed cannot be null.", feed); + assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); + } + + @Test + public void testGetWikiFeed() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + Feed feed = service.getWikiFeed(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, 10); + assertNotNull("Feed cannot be null.", feed); + assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); + } + + @Test + public void testGetBlogFeed() { + Feed feed = service.getBlogFeed(10); + assertNotNull("Feed cannot be null.", feed); + assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); + } + + @Test + public void testGetDiscussionsFeed() { + Feed feed = service.getDiscussionsFeed(10); + assertNotNull("Feed cannot be null.", feed); + assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); + } + + @Test + public void testGetDiscussionsFeedString() { + Feed feed = service.getDiscussionsFeed("api", 10); + assertNotNull("Feed cannot be null.", feed); + assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); + } + + @Test + public void testGetJobPositionsFeed() { + Feed feed = service.getJobPositionsFeed(10); + assertNotNull("Feed cannot be null.", feed); + assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); + } +} diff --git a/src/test/java/com/github/api/v2/services/GistServiceTest.java b/src/test/java/com/github/api/v2/services/GistServiceTest.java new file mode 100644 index 0000000..ae70488 --- /dev/null +++ b/src/test/java/com/github/api/v2/services/GistServiceTest.java @@ -0,0 +1,86 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.io.InputStream; +import java.util.List; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.api.v2.schema.Gist; +import com.github.api.v2.services.constant.TestConstants; + +/** + * The Class GistServiceTest. + */ +public class GistServiceTest extends BaseGitHubServiceTest { + + /** The service. */ + private GistService service; + + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() + */ + @Before + public void setUp() throws Exception { + super.setUp(); + service = factory.createGistService(); + service.setAuthentication(authentication); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() + */ + @After + public void tearDown() throws Exception { + super.tearDown(); + service = null; + } + + /** + * Test get gist. + */ + @Test + public void testGetGist() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Gist Id."), TestConstants.TEST_GIST_ID); + Gist gist = service.getGist(TestConstants.TEST_GIST_ID); + assertNotNull("Gist cannot be null", gist); + } + + /** + * Test get gist content. + */ + @Test + public void testGetGistContent() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Gist Id."), TestConstants.TEST_GIST_ID); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Gist File."), TestConstants.TEST_GIST_FILE); + InputStream gistContent = service.getGistContent(TestConstants.TEST_GIST_ID, TestConstants.TEST_GIST_FILE); + assertNotNullOrEmpty("Gist content cannot be null or empty", convertStreamToString(gistContent)); + } + + /** + * Test get user gists. + */ + @Test + public void testGetUserGists() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + List gists = service.getUserGists(TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty("Gists cannot be null or empty.", gists); + } +} diff --git a/src/test/java/com/github/api/v2/services/IssueServiceTest.java b/src/test/java/com/github/api/v2/services/IssueServiceTest.java new file mode 100644 index 0000000..f5d5231 --- /dev/null +++ b/src/test/java/com/github/api/v2/services/IssueServiceTest.java @@ -0,0 +1,206 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.util.List; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.api.v2.schema.Comment; +import com.github.api.v2.schema.Issue; +import com.github.api.v2.services.constant.TestConstants; + +/** + * The Class IssueServiceTest. + */ +public class IssueServiceTest extends BaseGitHubServiceTest { + + /** The service. */ + private IssueService service; + + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() + */ + @Before + public void setUp() throws Exception { + super.setUp(); + service = factory.createIssueService(); + service.setAuthentication(authentication); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() + */ + @After + public void tearDown() throws Exception { + super.tearDown(); + service = null; + } + + /** + * Test add comment. + */ + @Test + public void testAddComment() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Issue No."), TestConstants.TEST_ISSUE_NUMBER); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Comment."), TestConstants.TEST_ISSUE_COMMENT); + service.addComment(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Integer.parseInt(TestConstants.TEST_ISSUE_NUMBER), TestConstants.TEST_ISSUE_COMMENT); + } + + /** + * Test add label. + */ + @Test + public void testAddLabel() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Issue No."), TestConstants.TEST_ISSUE_NUMBER); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Label."), TestConstants.TEST_ISSUE_LABEL); + service.addLabel(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Integer.parseInt(TestConstants.TEST_ISSUE_NUMBER), TestConstants.TEST_ISSUE_LABEL); + } + + /** + * Test close issue. + */ + @Test + public void testCloseIssue() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Issue No."), TestConstants.TEST_ISSUE_NUMBER); + service.closeIssue(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Integer.parseInt(TestConstants.TEST_ISSUE_NUMBER)); + } + + /** + * Test create issue. + */ + @Test + public void testCreateIssue() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Issue Title."), TestConstants.TEST_ISSUE_TITLE); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Issue Body."), TestConstants.TEST_ISSUE_BODY); + service.createIssue(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_ISSUE_TITLE, TestConstants.TEST_ISSUE_BODY); + } + + /** + * Test get issue. + */ + @Test + public void testGetIssue() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Issue No."), TestConstants.TEST_ISSUE_NUMBER); + Issue issue = service.getIssue(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Integer.parseInt(TestConstants.TEST_ISSUE_NUMBER)); + assertNotNull("Issue cannot be null.", issue); + } + + /** + * Test get issue comments. + */ + @Test + public void testGetIssueComments() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Issue No."), TestConstants.TEST_ISSUE_NUMBER); + List issueComments = service.getIssueComments(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Integer.parseInt(TestConstants.TEST_ISSUE_NUMBER)); + assertNotNullOrEmpty("Issue comments cannot be null or empty.", issueComments); + } + + /** + * Test get issue labels. + */ + @Test + public void testGetIssueLabels() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + List issueLabels = service.getIssueLabels(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty("Issue labels should not be null or empty.", issueLabels); + } + + /** + * Test get issues. + */ + @Test + public void testGetIssues() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + List issues = service.getIssues(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Issue.State.OPEN); + assertNotNullOrEmpty("Issues cannot be null or empty.", issues); + } + + /** + * Test remove label. + */ + @Test + public void testRemoveLabel() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Issue No."), TestConstants.TEST_ISSUE_NUMBER); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Label."), TestConstants.TEST_ISSUE_LABEL); + List labels = service.removeLabel(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Integer.parseInt(TestConstants.TEST_ISSUE_NUMBER), TestConstants.TEST_ISSUE_LABEL); + assertFalse("Label should not be in the list.", labels.contains(TestConstants.TEST_ISSUE_LABEL)); + } + + /** + * Test reopen issue. + */ + @Test + public void testReopenIssue() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Issue No."), TestConstants.TEST_ISSUE_NUMBER); + service.reopenIssue(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Integer.parseInt(TestConstants.TEST_ISSUE_NUMBER)); + } + + /** + * Test search issues. + */ + @Test + public void testSearchIssues() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); + List issues = service.searchIssues(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Issue.State.OPEN, TestConstants.TEST_QUERY); + assertNotNullOrEmpty("Issues cannot be null or empty.", issues); + } + + @Test + public void testGetIssuesByLabel() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Label."), TestConstants.TEST_ISSUE_LABEL); + List issues = service.getIssues(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_ISSUE_LABEL); + assertNotNullOrEmpty("Issues cannot be null or empty.", issues); + } + + /** + * Test update issue. + */ + @Test + public void testUpdateIssue() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Issue No."), TestConstants.TEST_ISSUE_NUMBER); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Issue Title."), TestConstants.TEST_ISSUE_TITLE); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Issue Body."), TestConstants.TEST_ISSUE_BODY); + service.updateIssue(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Integer.parseInt(TestConstants.TEST_ISSUE_NUMBER), TestConstants.TEST_ISSUE_TITLE, TestConstants.TEST_ISSUE_BODY); + } +} diff --git a/src/test/java/com/github/api/v2/services/NetworkServiceTest.java b/src/test/java/com/github/api/v2/services/NetworkServiceTest.java new file mode 100644 index 0000000..a9794f3 --- /dev/null +++ b/src/test/java/com/github/api/v2/services/NetworkServiceTest.java @@ -0,0 +1,91 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.util.List; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.api.v2.schema.NetworkCommit; +import com.github.api.v2.schema.NetworkMeta; +import com.github.api.v2.services.constant.TestConstants; + +/** + * The Class NetworkServiceTest. + */ +public class NetworkServiceTest extends BaseGitHubServiceTest { + + /** The service. */ + private NetworkService service; + + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() + */ + @Before + public void setUp() throws Exception { + super.setUp(); + service = factory.createNetworkService(); + service.setAuthentication(authentication); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() + */ + @After + public void tearDown() throws Exception { + super.tearDown(); + service = null; + } + + /** + * Test get network data string string string. + */ + @Test + public void testGetNetworkDataStringStringString() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Network Hash."), TestConstants.TEST_NETWORK_HASH); + List commits = service.getNetworkData(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_NETWORK_HASH); + assertNotNullOrEmpty("Commits should not be null or empty.", commits); + } + + /** + * Test get network data string string string int int. + */ + @Test + public void testGetNetworkDataStringStringStringIntInt() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Network Hash."), TestConstants.TEST_NETWORK_HASH); + List commits = service.getNetworkData(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_NETWORK_HASH, 1, 5); + assertNotNullOrEmpty("Commits should not be null or empty.", commits); + } + + /** + * Test get network meta. + */ + @Test + public void testGetNetworkMeta() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + NetworkMeta networkMeta = service.getNetworkMeta(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertNotNull("Network cannot be null", networkMeta); + } + +} diff --git a/src/test/java/com/github/api/v2/services/OAuthServiceTest.java b/src/test/java/com/github/api/v2/services/OAuthServiceTest.java new file mode 100644 index 0000000..fe70578 --- /dev/null +++ b/src/test/java/com/github/api/v2/services/OAuthServiceTest.java @@ -0,0 +1,99 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.EnumSet; + +import com.github.api.v2.services.OAuthService.Scope; +import com.github.api.v2.services.constant.TestConstants; + +/** + * The Class OAuthServiceTest. + */ +public class OAuthServiceTest extends BaseGitHubServiceTest { + + /** The service. */ + private OAuthService service; + + /* (non-Javadoc) + * @see com.google.code.facebook.graph.client.BaseFacebookGraphApiTestCase#setUp() + */ + public void setUp() throws Exception { + super.setUp(); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test consumer key."), TestConstants.TEST_CLIENT_ID); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test consumer secret."), TestConstants.TEST_CLIENT_SECRET); + service = factory.createOAuthService(TestConstants.TEST_CLIENT_ID, TestConstants.TEST_CLIENT_SECRET); + } + + /* (non-Javadoc) + * @see com.google.code.facebook.graph.client.BaseFacebookGraphApiTestCase#tearDown() + */ + public void tearDown() throws Exception { + super.tearDown(); + service = null; + } + + /** + * Test get authorization url. + */ + public void testGetAuthorizationUrl() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test callback URL."), TestConstants.TEST_CALLBACK_URL); + String authorizationUrl = service.getAuthorizationUrl(TestConstants.TEST_CALLBACK_URL); + assertNotNullOrEmpty("Authorization URL should not be null.", authorizationUrl); + try { + URL url = new URL(authorizationUrl); + HttpURLConnection request = (HttpURLConnection) url.openConnection(); + + if (request.getResponseCode() != HttpURLConnection.HTTP_OK) { + fail(convertStreamToString(request.getErrorStream())); + } + } catch (Exception e) { + fail(e.getMessage()); + } + } + + /** + * Test get authorization url set. + */ + public void testGetAuthorizationUrlSet() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test callback URL."), TestConstants.TEST_CALLBACK_URL); + String authorizationUrl = service.getAuthorizationUrl(TestConstants.TEST_CALLBACK_URL, EnumSet.of(Scope.USER, Scope.REPOSITORY)); + assertNotNullOrEmpty("Authorization URL should not be null.", authorizationUrl); + try { + URL url = new URL(authorizationUrl); + HttpURLConnection request = (HttpURLConnection) url.openConnection(); + + if (request.getResponseCode() != HttpURLConnection.HTTP_OK) { + fail(convertStreamToString(request.getErrorStream())); + } + } catch (Exception e) { + fail(e.getMessage()); + } + } + + /** + * Test get access token. + */ + public void testGetAccessToken() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test callback URL."), TestConstants.TEST_CALLBACK_URL); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test code."), TestConstants.TEST_CODE); + String accessToken = service.getAccessToken(TestConstants.TEST_CALLBACK_URL, TestConstants.TEST_CODE); + assertNotNullOrEmpty("Access token should not be null.", accessToken); + } +} diff --git a/src/test/java/com/github/api/v2/services/ObjectServiceTest.java b/src/test/java/com/github/api/v2/services/ObjectServiceTest.java new file mode 100644 index 0000000..519984a --- /dev/null +++ b/src/test/java/com/github/api/v2/services/ObjectServiceTest.java @@ -0,0 +1,99 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.io.InputStream; +import java.util.List; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.api.v2.schema.Blob; +import com.github.api.v2.schema.Tree; +import com.github.api.v2.services.constant.TestConstants; + +/** + * The Class ObjectServiceTest. + */ +public class ObjectServiceTest extends BaseGitHubServiceTest { + + /** The service. */ + private ObjectService service; + + @Before + public void setUp() throws Exception { + super.setUp(); + service = factory.createObjectService(); + service.setAuthentication(authentication); + } + + @After + public void tearDown() throws Exception { + super.tearDown(); + service = null; + } + + /** + * Test get blob. + */ + @Test + public void testGetBlob() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Tree SHA."), TestConstants.TEST_TREE_SHA); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test File Path."), TestConstants.TEST_FILE_PATH); + Blob blob = service.getBlob(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_TREE_SHA, TestConstants.TEST_FILE_PATH); + assertNotNull("Blob cannot be null or empty", blob); + } + + /** + * Test get blobs. + */ + @Test + public void testGetBlobs() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Tree SHA."), TestConstants.TEST_TREE_SHA); + List blobs = service.getBlobs(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_TREE_SHA); + assertNotNullOrEmpty("Blobs cannot be null or empty", blobs); + } + + /** + * Test get object content. + */ + @Test + public void testGetObjectContent() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Tree SHA."), TestConstants.TEST_TREE_SHA); + InputStream objectContent = service.getObjectContent(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_TREE_SHA); + assertNotNullOrEmpty("Object content cannot be null or empty", convertStreamToString(objectContent)); + } + + /** + * Test get tree. + */ + @Test + public void testGetTree() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Tree SHA."), TestConstants.TEST_TREE_SHA); + List trees = service.getTree(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_TREE_SHA); + assertNotNullOrEmpty("Tree cannot be null or empty", trees); + } +} diff --git a/src/test/java/com/github/api/v2/services/OrganizationServiceTest.java b/src/test/java/com/github/api/v2/services/OrganizationServiceTest.java new file mode 100644 index 0000000..17e2325 --- /dev/null +++ b/src/test/java/com/github/api/v2/services/OrganizationServiceTest.java @@ -0,0 +1,139 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * The Class RepositoryServiceTest. + */ +public class OrganizationServiceTest extends BaseGitHubServiceTest { + + /** The service. */ + private OrganizationService service; + + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() + */ + @Before + public void setUp() throws Exception { + super.setUp(); + service = factory.createOrganizationService(); + service.setAuthentication(authentication); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() + */ + @After + public void tearDown() throws Exception { + super.tearDown(); + service = null; + } + + @Test + public void testAddTeamMember() { + fail("Not yet implemented"); + } + + @Test + public void testAddTeamRepository() { + fail("Not yet implemented"); + } + + @Test + public void testCreateTeam() { + fail("Not yet implemented"); + } + + @Test + public void testDeleteTeam() { + fail("Not yet implemented"); + } + + @Test + public void testGetAllOrganizationRepositories() { + fail("Not yet implemented"); + } + + @Test + public void testGetOrganization() { + fail("Not yet implemented"); + } + + @Test + public void testGetPublicMembers() { + fail("Not yet implemented"); + } + + @Test + public void testGetPublicRepositories() { + fail("Not yet implemented"); + } + + @Test + public void testGetTeam() { + fail("Not yet implemented"); + } + + @Test + public void testGetTeamMembers() { + fail("Not yet implemented"); + } + + @Test + public void testGetTeamRepositories() { + fail("Not yet implemented"); + } + + @Test + public void testGetTeams() { + fail("Not yet implemented"); + } + + @Test + public void testGetUserOrganizationsString() { + fail("Not yet implemented"); + } + + @Test + public void testGetUserOrganizations() { + fail("Not yet implemented"); + } + + @Test + public void testRemoveTeamMember() { + fail("Not yet implemented"); + } + + @Test + public void testRemoveTeamRepository() { + fail("Not yet implemented"); + } + + @Test + public void testUpdateOrganization() { + fail("Not yet implemented"); + } + + @Test + public void testUpdateTeam() { + fail("Not yet implemented"); + } +} diff --git a/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java b/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java new file mode 100644 index 0000000..04b5323 --- /dev/null +++ b/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java @@ -0,0 +1,324 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.util.List; +import java.util.Map; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.api.v2.schema.Key; +import com.github.api.v2.schema.Language; +import com.github.api.v2.schema.Repository; +import com.github.api.v2.schema.User; +import com.github.api.v2.services.constant.TestConstants; + +/** + * The Class RepositoryServiceTest. + */ +public class RepositoryServiceTest extends BaseGitHubServiceTest { + + /** The service. */ + private RepositoryService service; + + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() + */ + @Before + public void setUp() throws Exception { + super.setUp(); + service = factory.createRepositoryService(); + service.setAuthentication(authentication); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() + */ + @After + public void tearDown() throws Exception { + super.tearDown(); + service = null; + } + + /** + * Test create repository. + */ + @Test + public void testCreateRepository() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository Description."), TestConstants.TEST_REPOSITORY_DESC); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository Homepage."), TestConstants.TEST_REPOSITORY_PAGE); + service.createRepository(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_REPOSITORY_DESC, TestConstants.TEST_REPOSITORY_PAGE, Repository.Visibility.PUBLIC); + } + + + /** + * Test add collaborator. + */ + @Test + public void testAddCollaborator() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + service.addCollaborator(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_USER_NAME); + } + + /** + * Test add key. + */ + @Test + public void testAddKey() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Key Title."), TestConstants.TEST_KEY_TITLE); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Key."), TestConstants.TEST_KEY); + service.addDeployKey(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_KEY_TITLE, TestConstants.TEST_KEY); + } + + /** + * Test change visibility. + */ + @Test + public void testChangeVisibility() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + service.changeVisibility(TestConstants.TEST_REPOSITORY_NAME, Repository.Visibility.PRIVATE); + } + + /** + * Test fork repository. + */ + @Test + public void testForkRepository() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + service.forkRepository(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + } + + /** + * Test get branches. + */ + @Test + public void testGetBranches() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + Map branches = service.getBranches(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertFalse("Branches cannot be null or empty.", branches == null || branches.isEmpty()); + } + + /** + * Test get collaborators. + */ + @Test + public void testGetCollaborators() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + List collaborators = service.getCollaborators(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty("Collaborators cannot be null or empty.", collaborators); + } + + /** + * Test get contributors. + */ + @Test + public void testGetContributors() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + List contributors = service.getContributors(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty("Contributors cannot be null or empty.", contributors); + } + + /** + * Test get forks. + */ + @Test + public void testGetForks() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + List forks = service.getForks(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty("Forks cannot be null or empty.", forks); + } + + /** + * Test get keys. + */ + @Test + public void testGetKeys() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + List keys = service.getDeployKeys(TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty("Keys cannot be null or empty.", keys); + } + + /** + * Test get language breakdown. + */ + @Test + public void testGetLanguageBreakdown() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + Map languageBreakdown = service.getLanguageBreakdown(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertFalse("Language breakdown vannot be null or empty.", (languageBreakdown == null || languageBreakdown.isEmpty())); + } + + /** + * Test get pushable repositories. + */ + @Test + public void testGetPushableRepositories() { + List repositories = service.getPushableRepositories(); + assertNotNullOrEmpty("Pushable repositories cannot be null or empty.", repositories); + } + + /** + * Test get repositories. + */ + @Test + public void testGetRepositories() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + List repositories = service.getRepositories(TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); + } + + /** + * Test get repository. + */ + @Test + public void testGetRepository() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + Repository repository = service.getRepository(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertNotNull("Repository cannot be null.", repository); + } + + /** + * Test get tags. + */ + @Test + public void testGetTags() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + Map tags = service.getTags(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertFalse("Tags cannot be null or empty.", tags == null || tags.isEmpty()); + } + + /** + * Test get watchers. + */ + @Test + public void testGetWatchers() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + List watchers = service.getWatchers(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty("Watchers cannot be null or empty.", watchers); + } + + /** + * Test remove collaborator. + */ + @Test + public void testRemoveCollaborator() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + service.removeCollaborator(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_USER_NAME); + } + + /** + * Test remove key. + */ + @Test + public void testRemoveKey() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Key Id."), TestConstants.TEST_KEY_ID); + service.removeDeployKey(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_KEY_ID); + } + + /** + * Test search repositories string. + */ + @Test + public void testSearchRepositoriesString() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); + List repositories = service.searchRepositories(TestConstants.TEST_QUERY); + assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); + } + + /** + * Test search repositories string string. + */ + @Test + public void testSearchRepositoriesStringString() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); + List repositories = service.searchRepositories(TestConstants.TEST_QUERY, Language.Java); + assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); + } + + /** + * Test search repositories string int. + */ + @Test + public void testSearchRepositoriesStringInt() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); + List repositories = service.searchRepositories(TestConstants.TEST_QUERY, 1); + assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); + } + + /** + * Test search repositories string string int. + */ + @Test + public void testSearchRepositoriesStringStringInt() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); + List repositories = service.searchRepositories(TestConstants.TEST_QUERY, Language.Java, 1); + assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); + } + + /** + * Test unwatch repository. + */ + @Test + public void testUnwatchRepository() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + service.unwatchRepository(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + } + + /** + * Test update repository. + */ + @Test + public void testUpdateRepository() { +// service.updateRepository(repository); + } + + /** + * Test watch repository. + */ + @Test + public void testWatchRepository() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + service.watchRepository(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + } + + /** + * Test delete repository. + */ + @Test + public void testDeleteRepository() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); +// service.deleteRepository(TestConstants.TEST_REPOSITORY_NAME); + } +} diff --git a/src/test/java/com/github/api/v2/services/UserServiceTest.java b/src/test/java/com/github/api/v2/services/UserServiceTest.java new file mode 100644 index 0000000..dd8fb64 --- /dev/null +++ b/src/test/java/com/github/api/v2/services/UserServiceTest.java @@ -0,0 +1,206 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.util.List; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.api.v2.schema.Key; +import com.github.api.v2.schema.Repository; +import com.github.api.v2.schema.User; +import com.github.api.v2.services.constant.TestConstants; + +/** + * The Class UserServiceTest. + */ +public class UserServiceTest extends BaseGitHubServiceTest { + + /** The service. */ + private UserService service; + + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() + */ + @Before + public void setUp() throws Exception { + super.setUp(); + service = factory.createUserService(); + service.setAuthentication(authentication); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() + */ + @After + public void tearDown() throws Exception { + super.tearDown(); + service = null; + } + + /** + * Test add email. + */ + @Test + public void testAddEmail() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Email."), TestConstants.TEST_EMAIL); + service.addEmail(TestConstants.TEST_EMAIL); + } + + /** + * Test add key. + */ + @Test + public void testAddKey() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Key Title."), TestConstants.TEST_KEY_TITLE); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Key."), TestConstants.TEST_KEY); + service.addKey(TestConstants.TEST_KEY_TITLE, TestConstants.TEST_KEY); + } + + /** + * Test follow user. + */ + @Test + public void testFollowUser() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + service.followUser(TestConstants.TEST_USER_NAME); + } + + /** + * Test get current user. + */ + @Test + public void testGetCurrentUser() { + User user = service.getCurrentUser(); + assertNotNull("User cannot be null.", user); + } + + /** + * Test get emails. + */ + @Test + public void testGetEmails() { + List emails = service.getEmails(); + assertNotNullOrEmpty("Emails cannot be null or empty.", emails); + } + + /** + * Test get keys. + */ + @Test + public void testGetKeys() { + List keys = service.getKeys(); + assertNotNullOrEmpty("Keys cannot be null or empty.", keys); + } + + /** + * Test get user by username. + */ + @Test + public void testGetUserByUsername() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + User user = service.getUserByUsername(TestConstants.TEST_USER_NAME); + assertNotNull("User cannot be null.", user); + } + + /** + * Test get user followers. + */ + @Test + public void testGetUserFollowers() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + List userFollowers = service.getUserFollowers(TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty("User followers cannot be null or empty.", userFollowers); + } + + /** + * Test get user following. + */ + @Test + public void testGetUserFollowing() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + List userFollowing = service.getUserFollowing(TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty("User followering cannot be null or empty.", userFollowing); + } + + /** + * Test get watched repositories. + */ + @Test + public void testGetWatchedRepositories() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + List repositories = service.getWatchedRepositories(TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); + } + + /** + * Test remove email. + */ + @Test + public void testRemoveEmail() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Email."), TestConstants.TEST_EMAIL); + service.removeEmail(TestConstants.TEST_EMAIL); + } + + /** + * Test remove key. + */ + @Test + public void testRemoveKey() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Key Id."), TestConstants.TEST_KEY_ID); + service.removeKey(TestConstants.TEST_KEY_ID); + } + + /** + * Test get user by email. + */ + @Test + public void testGetUserByEmail() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Email."), TestConstants.TEST_EMAIL); + User user = service.getUserByEmail(TestConstants.TEST_EMAIL); + assertNotNull("User cannot be null or empty.", user); + } + + /** + * Test search users by name. + */ + @Test + public void testSearchUsersByName() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + List users = service.searchUsersByName(TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty("Users cannot be null or empty.", users); + } + + /** + * Test unfollow user. + */ + @Test + public void testUnfollowUser() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + service.unfollowUser(TestConstants.TEST_USER_NAME); + } + + /** + * Test update user. + */ + @Test + public void testUpdateUser() { +// service.updateUser(user); + } +} diff --git a/src/test/java/com/github/api/v2/services/constant/TestConstants.java b/src/test/java/com/github/api/v2/services/constant/TestConstants.java new file mode 100644 index 0000000..eb28517 --- /dev/null +++ b/src/test/java/com/github/api/v2/services/constant/TestConstants.java @@ -0,0 +1,147 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.constant; +import java.io.IOException; +import java.util.Properties; + +/** + * The Class TestConstants. + */ +public final class TestConstants { + + /** The Constant TEST_CONSTANTS_FILE. */ + public static final String TEST_CONSTANTS_FILE = "TestConstants.properties"; + + /** The Constant testConstants. */ + private static final Properties testConstants = new Properties(); + + static { + try { + testConstants.load(TestConstants.class.getResourceAsStream(TEST_CONSTANTS_FILE)); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** The Constant TEST_CLIENT_ID. */ + public static final String TEST_CLIENT_ID = testConstants.getProperty("com.github.api.v2.services.clientId"); + + /** The Constant TEST_CLIENT_SECRET. */ + public static final String TEST_CLIENT_SECRET = testConstants.getProperty("com.github.api.v2.services.clientSecret"); + + /** The Constant TEST_CODE. */ + public static final String TEST_CODE = testConstants.getProperty("com.github.api.v2.services.code"); + + /** The Constant TEST_ACCESS_TOKEN. */ + public static final String TEST_ACCESS_TOKEN = testConstants.getProperty("com.github.api.v2.services.accessToken"); + + /** The Constant TEST_CALLBACK_URL. */ + public static final String TEST_CALLBACK_URL = testConstants.getProperty("com.github.api.v2.services.callbackUrl"); + + /** The Constant TEST_API_KEY. */ + public static final String TEST_API_KEY = + testConstants.getProperty("com.github.api.v2.services.apiKey"); + + /** The Constant TEST_REFERRER. */ + public static final String TEST_REFERRER = + testConstants.getProperty("com.github.api.v2.services.referrer"); + + /** The Constant TEST_QUERY. */ + public static final String TEST_QUERY = + testConstants.getProperty("com.github.api.v2.services.testQuery"); + + /** The Constant TEST_USER_NAME. */ + public static final String TEST_USER_NAME = + testConstants.getProperty("com.github.api.v2.services.testUserName"); + + /** The Constant TEST_REPOSITORY_NAME. */ + public static final String TEST_REPOSITORY_NAME = + testConstants.getProperty("com.github.api.v2.services.testRepositoryName"); + + /** The Constant TEST_EMAIL. */ + public static final String TEST_EMAIL = + testConstants.getProperty("com.github.api.v2.services.testEmail"); + + /** The Constant TEST_ISSUE_NUMBER. */ + public static final String TEST_ISSUE_NUMBER = + testConstants.getProperty("com.github.api.v2.services.testIssueNo"); + + /** The Constant TEST_COMMIT_HASH. */ + public static final String TEST_COMMIT_HASH = + testConstants.getProperty("com.github.api.v2.services.testCommitHash"); + + /** The Constant TEST_GIST_ID. */ + public static final String TEST_GIST_ID = + testConstants.getProperty("com.github.api.v2.services.testGistId"); + + /** The Constant TEST_GIST_FILE. */ + public static final String TEST_GIST_FILE = + testConstants.getProperty("com.github.api.v2.services.testGistFile"); + + /** The Constant TEST_ISSUE_COMMENT. */ + public static final String TEST_ISSUE_COMMENT = + testConstants.getProperty("com.github.api.v2.services.testIssueComment"); + + /** The Constant TEST_ISSUE_LABEL. */ + public static final String TEST_ISSUE_LABEL = + testConstants.getProperty("com.github.api.v2.services.testIssueLabel"); + + /** The Constant TEST_ISSUE_TITLE. */ + public static final String TEST_ISSUE_TITLE = + testConstants.getProperty("com.github.api.v2.services.testIssueTitle"); + + /** The Constant TEST_ISSUE_BODY. */ + public static final String TEST_ISSUE_BODY = + testConstants.getProperty("com.github.api.v2.services.testIssueBody"); + + /** The Constant TEST_NETWORK_HASH. */ + public static final String TEST_NETWORK_HASH = + testConstants.getProperty("com.github.api.v2.services.testNetworkHash"); + + /** The Constant TEST_TREE_SHA. */ + public static final String TEST_TREE_SHA = + testConstants.getProperty("com.github.api.v2.services.testTreeHash"); + + /** The Constant TEST_FILE_PATH. */ + public static final String TEST_FILE_PATH = + testConstants.getProperty("com.github.api.v2.services.testFilePath"); + + /** The Constant TEST_KEY_TITLE. */ + public static final String TEST_KEY_TITLE = + testConstants.getProperty("com.github.api.v2.services.testKeyTitle"); + + /** The Constant TEST_KEY. */ + public static final String TEST_KEY = + testConstants.getProperty("com.github.api.v2.services.testKey"); + + /** The Constant TEST_REPOSITORY_DESC. */ + public static final String TEST_REPOSITORY_DESC = + testConstants.getProperty("com.github.api.v2.services.testRepositoryDesc"); + + /** The Constant TEST_REPOSITORY_PAGE. */ + public static final String TEST_REPOSITORY_PAGE = + testConstants.getProperty("com.github.api.v2.services.testRepositoryPage"); + + /** The Constant TEST_KEY_ID. */ + public static final String TEST_KEY_ID = + testConstants.getProperty("com.github.api.v2.services.testKeyId"); + + /** + * Instantiates a new test constants. + */ + private TestConstants() {} +} From d1a9d89b4931407bb36a874a48eafde63839c9f9 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Fri, 21 Jan 2011 18:16:02 +0500 Subject: [PATCH 40/95] Pull Request API --- .../api/v2/services/GitHubServiceFactory.java | 4 + .../github/api/v2/services/OAuthService.java | 12 +- .../api/v2/services/PullRequestService.java | 87 +++++++++ .../v2/services/constant/GitHubApiUrls.java | 15 ++ .../v2/services/impl/BaseGitHubService.java | 16 ++ .../v2/services/impl/OAuthServiceImpl.java | 2 +- .../impl/OrganizationServiceImpl.java | 10 +- .../services/impl/PullRequestServiceImpl.java | 86 +++++++++ .../constant/GitHubApiUrls.properties | 5 + .../api/v2/services/OAuthServiceTest.java | 4 +- .../v2/services/PullRequestServiceTest.java | 99 +++++++++++ .../example/PullRequestApiSample.java | 110 ++++++++++++ pom.xml | 52 +++++- .../github/api/v2/schema/Organization.java | 19 ++ .../com/github/api/v2/schema/PullRequest.java | 167 ++++++++++++++++++ .../java/com/github/api/v2/schema/User.java | 19 +- 16 files changed, 686 insertions(+), 21 deletions(-) create mode 100644 core/src/main/java/com/github/api/v2/services/PullRequestService.java create mode 100644 core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java create mode 100644 core/src/test/java/com/github/api/v2/services/PullRequestServiceTest.java create mode 100644 examples/src/java/com/github/api/v2/services/example/PullRequestApiSample.java create mode 100644 schema/src/main/java/com/github/api/v2/schema/PullRequest.java diff --git a/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java b/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java index 3b0d47b..3ca7224 100644 --- a/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java +++ b/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java @@ -24,6 +24,7 @@ import com.github.api.v2.services.impl.OAuthServiceImpl; import com.github.api.v2.services.impl.ObjectServiceImpl; import com.github.api.v2.services.impl.OrganizationServiceImpl; +import com.github.api.v2.services.impl.PullRequestServiceImpl; import com.github.api.v2.services.impl.RepositoryServiceImpl; import com.github.api.v2.services.impl.UserServiceImpl; @@ -140,4 +141,7 @@ public FeedService createFeedService() { return new FeedServiceImpl(); } + public PullRequestService createPullRequestService() { + return new PullRequestServiceImpl(); + } } diff --git a/core/src/main/java/com/github/api/v2/services/OAuthService.java b/core/src/main/java/com/github/api/v2/services/OAuthService.java index 5b055ff..3b64a19 100644 --- a/core/src/main/java/com/github/api/v2/services/OAuthService.java +++ b/core/src/main/java/com/github/api/v2/services/OAuthService.java @@ -30,7 +30,7 @@ public interface OAuthService extends GitHubService { /** * The Enum Permission. */ - public enum Permission implements ValueEnum { + public enum Scope implements ValueEnum { /** The USER. */ USER("user"), @@ -38,10 +38,10 @@ public enum Permission implements ValueEnum { REPOSITORY("repo"); /** The Constant stringToEnum. */ - private static final Map stringToEnum = new HashMap(); + private static final Map stringToEnum = new HashMap(); static { // Initialize map from constant name to enum constant - for (Permission op : values()) { + for (Scope op : values()) { stringToEnum.put(op.value(), op); } } @@ -55,7 +55,7 @@ public enum Permission implements ValueEnum { * @param value * the value */ - Permission(String value) { + Scope(String value) { this.value = value; } @@ -75,7 +75,7 @@ public String value() { * * @return the permission */ - public static Permission fromValue(String value) { + public static Scope fromValue(String value) { return stringToEnum.get(value); } } @@ -100,7 +100,7 @@ public static Permission fromValue(String value) { * * @return the authorization url */ - public String getAuthorizationUrl(String callBackUrl, Set permissions); + public String getAuthorizationUrl(String callBackUrl, Set permissions); /** * Gets the access token. diff --git a/core/src/main/java/com/github/api/v2/services/PullRequestService.java b/core/src/main/java/com/github/api/v2/services/PullRequestService.java new file mode 100644 index 0000000..aed6b48 --- /dev/null +++ b/core/src/main/java/com/github/api/v2/services/PullRequestService.java @@ -0,0 +1,87 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.io.InputStream; +import java.util.List; + +import com.github.api.v2.schema.Blob; +import com.github.api.v2.schema.Tree; + +/** + * The Interface ObjectService. + */ +public interface PullRequestService extends GitHubService { + + /** + * Gets the tree. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param treeSha + * the tree sha + * + * @return the tree + */ + public List getTree(String userName, String repositoryName, String treeSha); + + /** + * Gets the blob. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param treeSha + * the tree sha + * @param filePath + * the file path + * + * @return the blob + */ + public Blob getBlob(String userName, String repositoryName, String treeSha, String filePath); + + /** + * Gets the blobs. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param treeSha + * the tree sha + * + * @return the blobs + */ + public List getBlobs(String userName, String repositoryName, String treeSha); + + /** + * Gets the object content. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param objectSha + * the object sha + * + * @return the object content + */ + public InputStream getObjectContent(String userName, String repositoryName, String objectSha); +} diff --git a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java index cc54f3d..10c3aad 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java +++ b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java @@ -360,6 +360,21 @@ public static interface OrganizationApiUrls { public static final String REMOVE_TEAM_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.removeTeamRepository"); } + /** + * The Interface PullRequestApiUrls. + */ + public static interface PullRequestApiUrls { + + /** The Constant CREATE_PULL_REQUEST_URL. */ + public static final String CREATE_PULL_REQUEST_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.pullRequestService.createPullRequest"); + + /** The Constant GET_PULL_REQUESTS_URL. */ + public static final String GET_PULL_REQUESTS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.pullRequestService.getPullRequests"); + + /** The Constant GET_PULL_REQUEST_URL. */ + public static final String GET_PULL_REQUEST_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.pullRequestService.getPullRequest"); + } + /** * The Interface ObjectApiUrls. diff --git a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java index b716c29..ec405cc 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java +++ b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java @@ -27,6 +27,8 @@ import com.github.api.v2.schema.Gist; import com.github.api.v2.schema.Issue; import com.github.api.v2.schema.Language; +import com.github.api.v2.schema.Organization; +import com.github.api.v2.schema.Permission; import com.github.api.v2.schema.Repository; import com.github.api.v2.schema.SchemaEntity; import com.github.api.v2.schema.Tree; @@ -176,6 +178,20 @@ public Tree.Type deserialize(JsonElement arg0, Type arg1, return Tree.Type.fromValue(arg0.getAsString()); } }); + builder.registerTypeAdapter(Organization.Type.class, new JsonDeserializer() { + @Override + public Organization.Type deserialize(JsonElement arg0, Type arg1, + JsonDeserializationContext arg2) throws JsonParseException { + return Organization.Type.fromValue(arg0.getAsString()); + } + }); + builder.registerTypeAdapter(Permission.class, new JsonDeserializer() { + @Override + public Permission deserialize(JsonElement arg0, Type arg1, + JsonDeserializationContext arg2) throws JsonParseException { + return Permission.fromValue(arg0.getAsString()); + } + }); return builder; } diff --git a/core/src/main/java/com/github/api/v2/services/impl/OAuthServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/OAuthServiceImpl.java index 1ce6c78..185f740 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/OAuthServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/OAuthServiceImpl.java @@ -65,7 +65,7 @@ public String getAuthorizationUrl(String callBackUrl) { */ @Override public String getAuthorizationUrl(String callBackUrl, - Set permissions) { + Set permissions) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OAuthUrls.AUTHORIZE_URL); builder.withParameter(ParameterNames.CLIENT_ID, clientId).withParameter(ParameterNames.REDIRECT_URI, callBackUrl); builder.withParameterEnumSet(ParameterNames.SCOPE, permissions, ","); diff --git a/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java index cc44242..0f82069 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java @@ -93,9 +93,11 @@ public List getAllOrganizationRepositories() { public Organization getOrganization(String name) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_ORGANIZATION_URL); String apiUrl = builder.withField(ParameterNames.ORGANIZATION_NAME, name).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken(){}, json.get("organization")); + System.out.println(convertStreamToString(callApiGet(apiUrl))); +// JsonObject json = unmarshall(callApiGet(apiUrl)); +// +// return unmarshall(new TypeToken(){}, json.get("organization")); + return new Organization(); } @Override @@ -110,7 +112,7 @@ public List getPublicMembers(String organizationName) { @Override public List getPublicRepositories(String organizationName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_PUBLIC_REPOSITORIES_URL); - String apiUrl = builder.buildUrl(); + String apiUrl = builder.withField(ParameterNames.ORGANIZATION_NAME, organizationName).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); return unmarshall(new TypeToken>(){}, json.get("repositories")); diff --git a/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java new file mode 100644 index 0000000..8524412 --- /dev/null +++ b/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java @@ -0,0 +1,86 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.impl; + +import java.io.InputStream; +import java.util.List; + +import com.github.api.v2.schema.Blob; +import com.github.api.v2.schema.Tree; +import com.github.api.v2.services.PullRequestService; +import com.github.api.v2.services.constant.GitHubApiUrls; +import com.github.api.v2.services.constant.ParameterNames; +import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; + +/** + * The Class ObjectServiceImpl. + */ +public class PullRequestServiceImpl extends BaseGitHubService implements + PullRequestService { + + /* (non-Javadoc) + * @see com.github.api.v2.services.ObjectService#getBlob(java.lang.String, java.lang.String, java.lang.String, java.lang.String) + */ + @Override + public Blob getBlob(String userName, String repositoryName, String treeSha, + String filePath) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.ObjectApiUrls.GET_BLOBS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.SHA, treeSha).withField(ParameterNames.FILE_PATH, filePath).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken(){}, json.get("blob")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.ObjectService#getBlobs(java.lang.String, java.lang.String, java.lang.String) + */ + @Override + public List getBlobs(String userName, String repositoryName, + String treeSha) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.ObjectApiUrls.GET_BLOBS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.SHA, treeSha).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("blobs")); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.ObjectService#getObjectContent(java.lang.String, java.lang.String, java.lang.String) + */ + @Override + public InputStream getObjectContent(String userName, String repositoryName, + String objectSha) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.ObjectApiUrls.GET_OBJECT_CONTENT_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.SHA, objectSha).buildUrl(); + return callApiGet(apiUrl); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.ObjectService#getTree(java.lang.String, java.lang.String, java.lang.String) + */ + @Override + public List getTree(String userName, String repositoryName, + String treeSha) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.ObjectApiUrls.GET_TREE_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.SHA, treeSha).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("tree")); + } +} diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index b02642e..18b391f 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -105,6 +105,11 @@ com.github.api.v2.services.organizationService.getTeamRepositories=http://github com.github.api.v2.services.organizationService.addTeamRepository=http://github.com/api/{version}/{format}/teams/{teamId}/repositories?name={userName} com.github.api.v2.services.organizationService.removeTeamRepository=http://github.com/api/{version}/{format}/teams/{teamId}/repositories?name={userRepositoryPair} +# Pull Request API +com.github.api.v2.services.pullRequestService.createPullRequest=http://github.com/api/{version}/{format}/pulls/{userName}/{repositoryName} +com.github.api.v2.services.pullRequestService.getPullRequest=http://github.com/api/{version}/{format}/pulls/{userName}/{repositoryName}/{requestNumber} +com.github.api.v2.services.pullRequestService.getPullRequests=http://github.com/api/{version}/{format}/pulls/{userName}/{repositoryName}/{state} + # Feed com.github.api.v2.services.feedService.getPublicUserFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg com.github.api.v2.services.feedService.getPrivateUserFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg diff --git a/core/src/test/java/com/github/api/v2/services/OAuthServiceTest.java b/core/src/test/java/com/github/api/v2/services/OAuthServiceTest.java index d53d6b6..fe70578 100644 --- a/core/src/test/java/com/github/api/v2/services/OAuthServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/OAuthServiceTest.java @@ -20,7 +20,7 @@ import java.net.URL; import java.util.EnumSet; -import com.github.api.v2.services.OAuthService.Permission; +import com.github.api.v2.services.OAuthService.Scope; import com.github.api.v2.services.constant.TestConstants; /** @@ -73,7 +73,7 @@ public void testGetAuthorizationUrl() { */ public void testGetAuthorizationUrlSet() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test callback URL."), TestConstants.TEST_CALLBACK_URL); - String authorizationUrl = service.getAuthorizationUrl(TestConstants.TEST_CALLBACK_URL, EnumSet.of(Permission.USER, Permission.REPOSITORY)); + String authorizationUrl = service.getAuthorizationUrl(TestConstants.TEST_CALLBACK_URL, EnumSet.of(Scope.USER, Scope.REPOSITORY)); assertNotNullOrEmpty("Authorization URL should not be null.", authorizationUrl); try { URL url = new URL(authorizationUrl); diff --git a/core/src/test/java/com/github/api/v2/services/PullRequestServiceTest.java b/core/src/test/java/com/github/api/v2/services/PullRequestServiceTest.java new file mode 100644 index 0000000..d0fdd10 --- /dev/null +++ b/core/src/test/java/com/github/api/v2/services/PullRequestServiceTest.java @@ -0,0 +1,99 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.io.InputStream; +import java.util.List; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.api.v2.schema.Blob; +import com.github.api.v2.schema.Tree; +import com.github.api.v2.services.constant.TestConstants; + +/** + * The Class ObjectServiceTest. + */ +public class PullRequestServiceTest extends BaseGitHubServiceTest { + + /** The service. */ + private PullRequestService service; + + @Before + public void setUp() throws Exception { + super.setUp(); + service = factory.createPullRequestService(); + service.setAuthentication(authentication); + } + + @After + public void tearDown() throws Exception { + super.tearDown(); + service = null; + } + + /** + * Test get blob. + */ + @Test + public void testGetBlob() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Tree SHA."), TestConstants.TEST_TREE_SHA); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test File Path."), TestConstants.TEST_FILE_PATH); + Blob blob = service.getBlob(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_TREE_SHA, TestConstants.TEST_FILE_PATH); + assertNotNull("Blob cannot be null or empty", blob); + } + + /** + * Test get blobs. + */ + @Test + public void testGetBlobs() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Tree SHA."), TestConstants.TEST_TREE_SHA); + List blobs = service.getBlobs(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_TREE_SHA); + assertNotNullOrEmpty("Blobs cannot be null or empty", blobs); + } + + /** + * Test get object content. + */ + @Test + public void testGetObjectContent() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Tree SHA."), TestConstants.TEST_TREE_SHA); + InputStream objectContent = service.getObjectContent(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_TREE_SHA); + assertNotNullOrEmpty("Object content cannot be null or empty", convertStreamToString(objectContent)); + } + + /** + * Test get tree. + */ + @Test + public void testGetTree() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Tree SHA."), TestConstants.TEST_TREE_SHA); + List trees = service.getTree(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_TREE_SHA); + assertNotNullOrEmpty("Tree cannot be null or empty", trees); + } +} diff --git a/examples/src/java/com/github/api/v2/services/example/PullRequestApiSample.java b/examples/src/java/com/github/api/v2/services/example/PullRequestApiSample.java new file mode 100644 index 0000000..018a825 --- /dev/null +++ b/examples/src/java/com/github/api/v2/services/example/PullRequestApiSample.java @@ -0,0 +1,110 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.example; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.List; + +import com.github.api.v2.schema.Blob; +import com.github.api.v2.schema.Tree; +import com.github.api.v2.services.GitHubServiceFactory; +import com.github.api.v2.services.PullRequestService; + +/** + * The Class ObjectApiSample. + */ +public class PullRequestApiSample { + + /** + * The main method. + * + * @param args + * the arguments + */ + public static void main(String[] args) { + GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); + PullRequestService service = factory.createPullRequestService(); + List trees = service.getTree("facebook", "tornado", "7b80c2f4db226d6fa3a7"); + for (Tree tree : trees) { + printResult(tree); + } + List blobs = service.getBlobs("facebook", "tornado", "7b80c2f4db226d6fa3a7"); + for (Blob blob : blobs) { + printResult(blob); + } + System.out.println(convertStreamToString(service.getObjectContent("facebook", "tornado", "7b80c2f4db226d6fa3a7f3dfa59277da1d642f91"))); + } + + /** + * Prints the result. + * + * @param blob + * the blob + */ + private static void printResult(Blob blob) { + System.out.println(blob); + } + + /** + * Prints the result. + * + * @param tree + * the tree + */ + private static void printResult(Tree tree) { + System.out.println(tree); + } + + /** + * Convert stream to string. + * + * @param is + * the is + * + * @return the string + */ + private static String convertStreamToString(InputStream is) { + /* + * To convert the InputStream to String we use the BufferedReader.readLine() + * method. We iterate until the BufferedReader return null which means + * there's no more data to read. Each line will appended to a StringBuilder + * and returned as String. + */ + BufferedReader reader = new BufferedReader(new InputStreamReader(is)); + StringBuilder sb = new StringBuilder(); + + String line = null; + try { + while ((line = reader.readLine()) != null) { + sb.append(line + "\n"); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + return sb.toString(); + } +} diff --git a/pom.xml b/pom.xml index f66491d..079b739 100644 --- a/pom.xml +++ b/pom.xml @@ -1,10 +1,48 @@ 4.0.0 - - com.github.api.v2 - github-java-sdk - 0.1 - - github-java-schema - jar + com.github.api.v2 + github-java-sdk + pom + 0.1 + GitHub API Java SDK + 2010 + A Java wrapper for GitHub API. + http://github.com/nabeelmukhtar/github-java-sdk + + + github + http://github.com/nabeelmukhtar/github-java-sdk/issues + + + + scm:git:git://github.com/nabeelmukhtar/github-java-sdk.git + scm:git:git@github.com:nabeelmukhtar/github-java-sdk.git + https://nabeelmukhtar@github.com/nabeelmukhtar/github-java-sdk.git + + + + + Nabeel Mukhtar + nabeelmukhtar + + + + + schema + core + dist + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.1 + + 1.6 + 1.6 + + + + \ No newline at end of file diff --git a/schema/src/main/java/com/github/api/v2/schema/Organization.java b/schema/src/main/java/com/github/api/v2/schema/Organization.java index ffa97c3..e95669d 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Organization.java +++ b/schema/src/main/java/com/github/api/v2/schema/Organization.java @@ -481,4 +481,23 @@ public String getGravatarId() { public void setGravatarId(String gravatarId) { this.gravatarId = gravatarId; } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Organization [billingEmail=" + billingEmail + ", blog=" + blog + + ", company=" + company + ", createdAt=" + createdAt + + ", email=" + email + ", followersCount=" + followersCount + + ", followingCount=" + followingCount + ", gravatarId=" + + gravatarId + ", id=" + id + ", location=" + location + + ", login=" + login + ", name=" + name + + ", ownedPrivateRepoCount=" + ownedPrivateRepoCount + + ", permission=" + permission + ", privateGistCount=" + + privateGistCount + ", publicGistCount=" + publicGistCount + + ", publicRepoCount=" + publicRepoCount + + ", totalPrivateRepoCount=" + totalPrivateRepoCount + + ", type=" + type + "]"; + } } diff --git a/schema/src/main/java/com/github/api/v2/schema/PullRequest.java b/schema/src/main/java/com/github/api/v2/schema/PullRequest.java new file mode 100644 index 0000000..fbe2d16 --- /dev/null +++ b/schema/src/main/java/com/github/api/v2/schema/PullRequest.java @@ -0,0 +1,167 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +/** + * The Class Blob. + */ +public class PullRequest extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** The name. */ + private String name; + + /** The size. */ + private int size; + + /** The sha. */ + private String sha; + + /** The mode. */ + private String mode; + + /** The mime type. */ + private String mimeType; + + /** The data. */ + private String data; + + /** + * Gets the name. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Sets the name. + * + * @param name + * the new name + */ + public void setName(String name) { + this.name = name; + } + + /** + * Gets the size. + * + * @return the size + */ + public int getSize() { + return size; + } + + /** + * Sets the size. + * + * @param size + * the new size + */ + public void setSize(int size) { + this.size = size; + } + + /** + * Gets the sha. + * + * @return the sha + */ + public String getSha() { + return sha; + } + + /** + * Sets the sha. + * + * @param sha + * the new sha + */ + public void setSha(String sha) { + this.sha = sha; + } + + /** + * Gets the mode. + * + * @return the mode + */ + public String getMode() { + return mode; + } + + /** + * Sets the mode. + * + * @param mode + * the new mode + */ + public void setMode(String mode) { + this.mode = mode; + } + + /** + * Gets the mime type. + * + * @return the mime type + */ + public String getMimeType() { + return mimeType; + } + + /** + * Sets the mime type. + * + * @param mimeType + * the new mime type + */ + public void setMimeType(String mimeType) { + this.mimeType = mimeType; + } + + /** + * Gets the data. + * + * @return the data + */ + public String getData() { + return data; + } + + /** + * Sets the data. + * + * @param data + * the new data + */ + public void setData(String data) { + this.data = data; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Blob [data=" + data + ", mimeType=" + mimeType + ", mode=" + + mode + ", name=" + name + ", sha=" + sha + ", size=" + size + + "]"; + } +} diff --git a/schema/src/main/java/com/github/api/v2/schema/User.java b/schema/src/main/java/com/github/api/v2/schema/User.java index 450056e..714cb15 100644 --- a/schema/src/main/java/com/github/api/v2/schema/User.java +++ b/schema/src/main/java/com/github/api/v2/schema/User.java @@ -89,8 +89,25 @@ public class User extends SchemaEntity { /** The plan. */ private Plan plan; - private Permission permission; + private Permission permission; + /** The score. */ + private double score; + + /** + * @return the score + */ + public double getScore() { + return score; + } + + /** + * @param score the score to set + */ + public void setScore(double score) { + this.score = score; + } + /** * Gets the name. * From 6bcb26f4dc64bd14559892c9ff8a8c2c6e987d12 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Fri, 21 Jan 2011 20:40:04 +0500 Subject: [PATCH 41/95] Deleted src directory --- .../java/com/github/api/v2/schema/Blob.java | 167 -- .../java/com/github/api/v2/schema/Block.java | 75 - .../com/github/api/v2/schema/Comment.java | 169 -- .../java/com/github/api/v2/schema/Commit.java | 417 ---- .../java/com/github/api/v2/schema/Delta.java | 77 - .../java/com/github/api/v2/schema/Feed.java | 94 - .../com/github/api/v2/schema/FeedEntry.java | 118 -- .../java/com/github/api/v2/schema/Gist.java | 220 -- .../java/com/github/api/v2/schema/Head.java | 72 - .../java/com/github/api/v2/schema/Id.java | 55 - .../java/com/github/api/v2/schema/Issue.java | 337 ---- .../java/com/github/api/v2/schema/Key.java | 99 - .../com/github/api/v2/schema/Language.java | 230 --- .../github/api/v2/schema/NetworkCommit.java | 238 --- .../com/github/api/v2/schema/NetworkMeta.java | 136 -- .../com/github/api/v2/schema/NetworkUser.java | 77 - .../github/api/v2/schema/Organization.java | 503 ----- .../com/github/api/v2/schema/Permission.java | 60 - .../java/com/github/api/v2/schema/Plan.java | 122 -- .../com/github/api/v2/schema/Repository.java | 686 ------- .../github/api/v2/schema/SchemaEntity.java | 33 - .../java/com/github/api/v2/schema/Team.java | 100 - .../java/com/github/api/v2/schema/Tree.java | 179 -- .../java/com/github/api/v2/schema/User.java | 525 ----- .../com/github/api/v2/schema/ValueEnum.java | 30 - .../api/v2/services/AsyncResponseHandler.java | 56 - .../github/api/v2/services/CommitService.java | 71 - .../github/api/v2/services/FeedService.java | 38 - .../github/api/v2/services/GistService.java | 60 - .../api/v2/services/GitHubAuthenticator.java | 50 - .../api/v2/services/GitHubCommunicator.java | 58 - .../api/v2/services/GitHubException.java | 63 - .../github/api/v2/services/GitHubService.java | 24 - .../api/v2/services/GitHubServiceFactory.java | 143 -- .../github/api/v2/services/IssueService.java | 216 -- .../api/v2/services/NetworkService.java | 72 - .../github/api/v2/services/OAuthService.java | 116 -- .../github/api/v2/services/ObjectService.java | 87 - .../api/v2/services/OrganizationService.java | 47 - .../api/v2/services/RepositoryService.java | 322 --- .../github/api/v2/services/UserService.java | 171 -- .../api/v2/services/auth/Authentication.java | 24 - .../auth/HeaderBasedAuthentication.java | 32 - .../auth/LoginPasswordAuthentication.java | 103 - .../auth/LoginTokenAuthentication.java | 97 - .../v2/services/auth/OAuthAuthentication.java | 71 - .../auth/ParameterBasedAuthentication.java | 32 - .../constant/ApplicationConstants.java | 190 -- .../v2/services/constant/GitHubApiUrls.java | 653 ------ .../v2/services/constant/ParameterNames.java | 167 -- .../v2/services/impl/BaseGitHubService.java | 232 --- .../v2/services/impl/CommitServiceImpl.java | 83 - .../api/v2/services/impl/FeedServiceImpl.java | 175 -- .../api/v2/services/impl/GistServiceImpl.java | 70 - .../v2/services/impl/GitHubApiGateway.java | 545 ----- .../v2/services/impl/IssueServiceImpl.java | 201 -- .../v2/services/impl/NetworkServiceImpl.java | 85 - .../v2/services/impl/OAuthServiceImpl.java | 98 - .../v2/services/impl/ObjectServiceImpl.java | 86 - .../impl/OrganizationServiceImpl.java | 199 -- .../services/impl/RepositoryServiceImpl.java | 382 ---- .../api/v2/services/impl/UserServiceImpl.java | 243 --- .../github/api/v2/services/util/Base64.java | 1797 ----------------- .../constant/ApplicationConstants.properties | 10 - .../constant/GitHubApiUrls.properties | 118 -- .../com/github/api/v2/services/AllTests.java | 48 - .../v2/services/BaseGitHubServiceTest.java | 131 -- .../api/v2/services/CommitServiceTest.java | 91 - .../api/v2/services/FeedServiceTest.java | 120 -- .../api/v2/services/GistServiceTest.java | 86 - .../api/v2/services/IssueServiceTest.java | 206 -- .../api/v2/services/NetworkServiceTest.java | 91 - .../api/v2/services/OAuthServiceTest.java | 99 - .../api/v2/services/ObjectServiceTest.java | 99 - .../v2/services/OrganizationServiceTest.java | 139 -- .../v2/services/RepositoryServiceTest.java | 324 --- .../api/v2/services/UserServiceTest.java | 206 -- .../v2/services/constant/TestConstants.java | 147 -- 78 files changed, 13893 deletions(-) delete mode 100644 src/main/java/com/github/api/v2/schema/Blob.java delete mode 100644 src/main/java/com/github/api/v2/schema/Block.java delete mode 100644 src/main/java/com/github/api/v2/schema/Comment.java delete mode 100644 src/main/java/com/github/api/v2/schema/Commit.java delete mode 100644 src/main/java/com/github/api/v2/schema/Delta.java delete mode 100644 src/main/java/com/github/api/v2/schema/Feed.java delete mode 100644 src/main/java/com/github/api/v2/schema/FeedEntry.java delete mode 100644 src/main/java/com/github/api/v2/schema/Gist.java delete mode 100644 src/main/java/com/github/api/v2/schema/Head.java delete mode 100644 src/main/java/com/github/api/v2/schema/Id.java delete mode 100644 src/main/java/com/github/api/v2/schema/Issue.java delete mode 100644 src/main/java/com/github/api/v2/schema/Key.java delete mode 100644 src/main/java/com/github/api/v2/schema/Language.java delete mode 100644 src/main/java/com/github/api/v2/schema/NetworkCommit.java delete mode 100644 src/main/java/com/github/api/v2/schema/NetworkMeta.java delete mode 100644 src/main/java/com/github/api/v2/schema/NetworkUser.java delete mode 100644 src/main/java/com/github/api/v2/schema/Organization.java delete mode 100644 src/main/java/com/github/api/v2/schema/Permission.java delete mode 100644 src/main/java/com/github/api/v2/schema/Plan.java delete mode 100644 src/main/java/com/github/api/v2/schema/Repository.java delete mode 100644 src/main/java/com/github/api/v2/schema/SchemaEntity.java delete mode 100644 src/main/java/com/github/api/v2/schema/Team.java delete mode 100644 src/main/java/com/github/api/v2/schema/Tree.java delete mode 100644 src/main/java/com/github/api/v2/schema/User.java delete mode 100644 src/main/java/com/github/api/v2/schema/ValueEnum.java delete mode 100644 src/main/java/com/github/api/v2/services/AsyncResponseHandler.java delete mode 100644 src/main/java/com/github/api/v2/services/CommitService.java delete mode 100644 src/main/java/com/github/api/v2/services/FeedService.java delete mode 100644 src/main/java/com/github/api/v2/services/GistService.java delete mode 100644 src/main/java/com/github/api/v2/services/GitHubAuthenticator.java delete mode 100644 src/main/java/com/github/api/v2/services/GitHubCommunicator.java delete mode 100644 src/main/java/com/github/api/v2/services/GitHubException.java delete mode 100644 src/main/java/com/github/api/v2/services/GitHubService.java delete mode 100644 src/main/java/com/github/api/v2/services/GitHubServiceFactory.java delete mode 100644 src/main/java/com/github/api/v2/services/IssueService.java delete mode 100644 src/main/java/com/github/api/v2/services/NetworkService.java delete mode 100644 src/main/java/com/github/api/v2/services/OAuthService.java delete mode 100644 src/main/java/com/github/api/v2/services/ObjectService.java delete mode 100644 src/main/java/com/github/api/v2/services/OrganizationService.java delete mode 100644 src/main/java/com/github/api/v2/services/RepositoryService.java delete mode 100644 src/main/java/com/github/api/v2/services/UserService.java delete mode 100644 src/main/java/com/github/api/v2/services/auth/Authentication.java delete mode 100644 src/main/java/com/github/api/v2/services/auth/HeaderBasedAuthentication.java delete mode 100644 src/main/java/com/github/api/v2/services/auth/LoginPasswordAuthentication.java delete mode 100644 src/main/java/com/github/api/v2/services/auth/LoginTokenAuthentication.java delete mode 100644 src/main/java/com/github/api/v2/services/auth/OAuthAuthentication.java delete mode 100644 src/main/java/com/github/api/v2/services/auth/ParameterBasedAuthentication.java delete mode 100644 src/main/java/com/github/api/v2/services/constant/ApplicationConstants.java delete mode 100644 src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java delete mode 100644 src/main/java/com/github/api/v2/services/constant/ParameterNames.java delete mode 100644 src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java delete mode 100644 src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java delete mode 100644 src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java delete mode 100644 src/main/java/com/github/api/v2/services/impl/GistServiceImpl.java delete mode 100644 src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java delete mode 100644 src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java delete mode 100644 src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java delete mode 100644 src/main/java/com/github/api/v2/services/impl/OAuthServiceImpl.java delete mode 100644 src/main/java/com/github/api/v2/services/impl/ObjectServiceImpl.java delete mode 100644 src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java delete mode 100644 src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java delete mode 100644 src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java delete mode 100644 src/main/java/com/github/api/v2/services/util/Base64.java delete mode 100644 src/main/resources/com/github/api/v2/services/constant/ApplicationConstants.properties delete mode 100644 src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties delete mode 100644 src/test/java/com/github/api/v2/services/AllTests.java delete mode 100644 src/test/java/com/github/api/v2/services/BaseGitHubServiceTest.java delete mode 100644 src/test/java/com/github/api/v2/services/CommitServiceTest.java delete mode 100644 src/test/java/com/github/api/v2/services/FeedServiceTest.java delete mode 100644 src/test/java/com/github/api/v2/services/GistServiceTest.java delete mode 100644 src/test/java/com/github/api/v2/services/IssueServiceTest.java delete mode 100644 src/test/java/com/github/api/v2/services/NetworkServiceTest.java delete mode 100644 src/test/java/com/github/api/v2/services/OAuthServiceTest.java delete mode 100644 src/test/java/com/github/api/v2/services/ObjectServiceTest.java delete mode 100644 src/test/java/com/github/api/v2/services/OrganizationServiceTest.java delete mode 100644 src/test/java/com/github/api/v2/services/RepositoryServiceTest.java delete mode 100644 src/test/java/com/github/api/v2/services/UserServiceTest.java delete mode 100644 src/test/java/com/github/api/v2/services/constant/TestConstants.java diff --git a/src/main/java/com/github/api/v2/schema/Blob.java b/src/main/java/com/github/api/v2/schema/Blob.java deleted file mode 100644 index 7908fc2..0000000 --- a/src/main/java/com/github/api/v2/schema/Blob.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.schema; - -/** - * The Class Blob. - */ -public class Blob extends SchemaEntity { - - /** The Constant serialVersionUID. */ - private static final long serialVersionUID = 9155892708485181542L; - - /** The name. */ - private String name; - - /** The size. */ - private int size; - - /** The sha. */ - private String sha; - - /** The mode. */ - private String mode; - - /** The mime type. */ - private String mimeType; - - /** The data. */ - private String data; - - /** - * Gets the name. - * - * @return the name - */ - public String getName() { - return name; - } - - /** - * Sets the name. - * - * @param name - * the new name - */ - public void setName(String name) { - this.name = name; - } - - /** - * Gets the size. - * - * @return the size - */ - public int getSize() { - return size; - } - - /** - * Sets the size. - * - * @param size - * the new size - */ - public void setSize(int size) { - this.size = size; - } - - /** - * Gets the sha. - * - * @return the sha - */ - public String getSha() { - return sha; - } - - /** - * Sets the sha. - * - * @param sha - * the new sha - */ - public void setSha(String sha) { - this.sha = sha; - } - - /** - * Gets the mode. - * - * @return the mode - */ - public String getMode() { - return mode; - } - - /** - * Sets the mode. - * - * @param mode - * the new mode - */ - public void setMode(String mode) { - this.mode = mode; - } - - /** - * Gets the mime type. - * - * @return the mime type - */ - public String getMimeType() { - return mimeType; - } - - /** - * Sets the mime type. - * - * @param mimeType - * the new mime type - */ - public void setMimeType(String mimeType) { - this.mimeType = mimeType; - } - - /** - * Gets the data. - * - * @return the data - */ - public String getData() { - return data; - } - - /** - * Sets the data. - * - * @param data - * the new data - */ - public void setData(String data) { - this.data = data; - } - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - return "Blob [data=" + data + ", mimeType=" + mimeType + ", mode=" - + mode + ", name=" + name + ", sha=" + sha + ", size=" + size - + "]"; - } -} diff --git a/src/main/java/com/github/api/v2/schema/Block.java b/src/main/java/com/github/api/v2/schema/Block.java deleted file mode 100644 index 6d3e33d..0000000 --- a/src/main/java/com/github/api/v2/schema/Block.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.schema; - -/** - * The Class Id. - */ -public class Block extends SchemaEntity { - - /** The Constant serialVersionUID. */ - private static final long serialVersionUID = 9155892708485181542L; - - /** The id. */ - private String name; - private int start; - private int count; - /** - * @return the name - */ - public String getName() { - return name; - } - /** - * @param name the name to set - */ - public void setName(String name) { - this.name = name; - } - /** - * @return the start - */ - public int getStart() { - return start; - } - /** - * @param start the start to set - */ - public void setStart(int start) { - this.start = start; - } - /** - * @return the count - */ - public int getCount() { - return count; - } - /** - * @param count the count to set - */ - public void setCount(int count) { - this.count = count; - } - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - return "Block [count=" + count + ", name=" + name + ", start=" + start - + "]"; - } -} diff --git a/src/main/java/com/github/api/v2/schema/Comment.java b/src/main/java/com/github/api/v2/schema/Comment.java deleted file mode 100644 index 465dff0..0000000 --- a/src/main/java/com/github/api/v2/schema/Comment.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.schema; - -import java.util.Date; - -/** - * The Class Comment. - */ -public class Comment extends SchemaEntity { - - /** The Constant serialVersionUID. */ - private static final long serialVersionUID = 9155892708485181542L; - - /** The created at. */ - private Date createdAt; - - /** The body. */ - private String body; - - /** The updated at. */ - private Date updatedAt; - - /** The id. */ - private long id; - - /** The user. */ - private String user; - - /** The gravatar id. */ - private String gravatarId; - - /** - * Gets the created at. - * - * @return the created at - */ - public Date getCreatedAt() { - return createdAt; - } - - /** - * Sets the created at. - * - * @param createdAt - * the new created at - */ - public void setCreatedAt(Date createdAt) { - this.createdAt = createdAt; - } - - /** - * Gets the body. - * - * @return the body - */ - public String getBody() { - return body; - } - - /** - * Sets the body. - * - * @param body - * the new body - */ - public void setBody(String body) { - this.body = body; - } - - /** - * Gets the updated at. - * - * @return the updated at - */ - public Date getUpdatedAt() { - return updatedAt; - } - - /** - * Sets the updated at. - * - * @param updatedAt - * the new updated at - */ - public void setUpdatedAt(Date updatedAt) { - this.updatedAt = updatedAt; - } - - /** - * Gets the id. - * - * @return the id - */ - public long getId() { - return id; - } - - /** - * Sets the id. - * - * @param id - * the new id - */ - public void setId(long id) { - this.id = id; - } - - /** - * Gets the user. - * - * @return the user - */ - public String getUser() { - return user; - } - - /** - * Sets the user. - * - * @param user - * the new user - */ - public void setUser(String user) { - this.user = user; - } - - /** - * Gets the gravatar id. - * - * @return the gravatar id - */ - public String getGravatarId() { - return gravatarId; - } - - /** - * Sets the gravatar id. - * - * @param gravatarId - * the new gravatar id - */ - public void setGravatarId(String gravatarId) { - this.gravatarId = gravatarId; - } - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - return "Comment [body=" + body + ", createdAt=" + createdAt - + ", gravatarId=" + gravatarId + ", id=" + id + ", updatedAt=" - + updatedAt + ", user=" + user + "]"; - } -} diff --git a/src/main/java/com/github/api/v2/schema/Commit.java b/src/main/java/com/github/api/v2/schema/Commit.java deleted file mode 100644 index 1b58854..0000000 --- a/src/main/java/com/github/api/v2/schema/Commit.java +++ /dev/null @@ -1,417 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.schema; - -import java.util.Date; -import java.util.List; - -/** - * The Class Commit. - */ -public class Commit extends SchemaEntity { - - /** The Constant serialVersionUID. */ - private static final long serialVersionUID = 9155892708485181542L; - - /** The message. */ - private String message; - - /** The time. */ - private long time; - - /** The parents. */ - private List parents; - - /** The date. */ - private Date date; - - /** The author. */ - private User author; - - /** The id. */ - private String id; - - /** The space. */ - private int space; - - /** The gravatar. */ - private String gravatar; - - /** The login. */ - private String login; - - /** The url. */ - private String url; - - /** The committed date. */ - private Date committedDate; - - /** The authored date. */ - private Date authoredDate; - - /** The tree. */ - private String tree; - - /** The committer. */ - private User committer; - - /** The added. */ - private List added; - - /** The removed. */ - private List removed; - - /** The modified. */ - private List modified; - - /** - * Gets the message. - * - * @return the message - */ - public String getMessage() { - return message; - } - - /** - * Sets the message. - * - * @param message - * the new message - */ - public void setMessage(String message) { - this.message = message; - } - - /** - * Gets the time. - * - * @return the time - */ - public long getTime() { - return time; - } - - /** - * Sets the time. - * - * @param time - * the new time - */ - public void setTime(long time) { - this.time = time; - } - - /** - * Gets the parents. - * - * @return the parents - */ - public List getParents() { - return parents; - } - - /** - * Sets the parents. - * - * @param parents - * the new parents - */ - public void setParents(List parents) { - this.parents = parents; - } - - /** - * Gets the date. - * - * @return the date - */ - public Date getDate() { - return date; - } - - /** - * Sets the date. - * - * @param date - * the new date - */ - public void setDate(Date date) { - this.date = date; - } - - /** - * Gets the author. - * - * @return the author - */ - public User getAuthor() { - return author; - } - - /** - * Sets the author. - * - * @param author - * the new author - */ - public void setAuthor(User author) { - this.author = author; - } - - /** - * Gets the id. - * - * @return the id - */ - public String getId() { - return id; - } - - /** - * Sets the id. - * - * @param id - * the new id - */ - public void setId(String id) { - this.id = id; - } - - /** - * Gets the space. - * - * @return the space - */ - public int getSpace() { - return space; - } - - /** - * Sets the space. - * - * @param space - * the new space - */ - public void setSpace(int space) { - this.space = space; - } - - /** - * Gets the gravatar. - * - * @return the gravatar - */ - public String getGravatar() { - return gravatar; - } - - /** - * Sets the gravatar. - * - * @param gravatar - * the new gravatar - */ - public void setGravatar(String gravatar) { - this.gravatar = gravatar; - } - - /** - * Gets the login. - * - * @return the login - */ - public String getLogin() { - return login; - } - - /** - * Sets the login. - * - * @param login - * the new login - */ - public void setLogin(String login) { - this.login = login; - } - - /** - * Gets the url. - * - * @return the url - */ - public String getUrl() { - return url; - } - - /** - * Sets the url. - * - * @param url - * the new url - */ - public void setUrl(String url) { - this.url = url; - } - - /** - * Gets the committed date. - * - * @return the committed date - */ - public Date getCommittedDate() { - return committedDate; - } - - /** - * Sets the committed date. - * - * @param committedDate - * the new committed date - */ - public void setCommittedDate(Date committedDate) { - this.committedDate = committedDate; - } - - /** - * Gets the authored date. - * - * @return the authored date - */ - public Date getAuthoredDate() { - return authoredDate; - } - - /** - * Sets the authored date. - * - * @param authoredDate - * the new authored date - */ - public void setAuthoredDate(Date authoredDate) { - this.authoredDate = authoredDate; - } - - /** - * Gets the tree. - * - * @return the tree - */ - public String getTree() { - return tree; - } - - /** - * Sets the tree. - * - * @param tree - * the new tree - */ - public void setTree(String tree) { - this.tree = tree; - } - - /** - * Gets the committer. - * - * @return the committer - */ - public User getCommitter() { - return committer; - } - - /** - * Sets the committer. - * - * @param committer - * the new committer - */ - public void setCommitter(User committer) { - this.committer = committer; - } - - /** - * Gets the added. - * - * @return the added - */ - public List getAdded() { - return added; - } - - /** - * Sets the added. - * - * @param added - * the new added - */ - public void setAdded(List added) { - this.added = added; - } - - /** - * Gets the removed. - * - * @return the removed - */ - public List getRemoved() { - return removed; - } - - /** - * Sets the removed. - * - * @param removed - * the new removed - */ - public void setRemoved(List removed) { - this.removed = removed; - } - - /** - * Gets the modified. - * - * @return the modified - */ - public List getModified() { - return modified; - } - - /** - * Sets the modified. - * - * @param modified - * the new modified - */ - public void setModified(List modified) { - this.modified = modified; - } - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - return "Commit [added=" + added + ", author=" + author - + ", authoredDate=" + authoredDate + ", committedDate=" - + committedDate + ", committer=" + committer + ", date=" + date - + ", gravatar=" + gravatar + ", id=" + id + ", login=" + login - + ", message=" + message + ", modified=" + modified - + ", parents=" + parents + ", removed=" + removed + ", space=" - + space + ", time=" + time + ", tree=" + tree + ", url=" + url - + "]"; - } -} diff --git a/src/main/java/com/github/api/v2/schema/Delta.java b/src/main/java/com/github/api/v2/schema/Delta.java deleted file mode 100644 index 1fb83d2..0000000 --- a/src/main/java/com/github/api/v2/schema/Delta.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.schema; - -/** - * The Class Delta. - */ -public class Delta extends SchemaEntity { - - /** The Constant serialVersionUID. */ - private static final long serialVersionUID = -1779660351774171098L; - - /** The diff. */ - private String diff; - - /** The filename. */ - private String filename; - - /** - * Gets the diff. - * - * @return the diff - */ - public String getDiff() { - return diff; - } - - /** - * Sets the diff. - * - * @param diff - * the new diff - */ - public void setDiff(String diff) { - this.diff = diff; - } - - /** - * Gets the filename. - * - * @return the filename - */ - public String getFilename() { - return filename; - } - - /** - * Sets the filename. - * - * @param filename - * the new filename - */ - public void setFilename(String filename) { - this.filename = filename; - } - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - return "Delta [diff=" + diff + ", filename=" + filename + "]"; - } -} diff --git a/src/main/java/com/github/api/v2/schema/Feed.java b/src/main/java/com/github/api/v2/schema/Feed.java deleted file mode 100644 index 728f7cc..0000000 --- a/src/main/java/com/github/api/v2/schema/Feed.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.schema; - -import java.util.List; - -/** - * The Class Feed. - */ -public class Feed extends SchemaEntity { - - /** The Constant serialVersionUID. */ - private static final long serialVersionUID = 9155892708485181542L; - - private String title; - private String link; - private String author; - private String description; - private List entries; - /** - * @return the title - */ - public String getTitle() { - return title; - } - /** - * @param title the title to set - */ - public void setTitle(String title) { - this.title = title; - } - /** - * @return the link - */ - public String getLink() { - return link; - } - /** - * @param link the link to set - */ - public void setLink(String link) { - this.link = link; - } - /** - * @return the author - */ - public String getAuthor() { - return author; - } - /** - * @param author the author to set - */ - public void setAuthor(String author) { - this.author = author; - } - /** - * @return the description - */ - public String getDescription() { - return description; - } - /** - * @param description the description to set - */ - public void setDescription(String description) { - this.description = description; - } - /** - * @return the entries - */ - public List getEntries() { - return entries; - } - /** - * @param entries the entries to set - */ - public void setEntries(List entries) { - this.entries = entries; - } -} diff --git a/src/main/java/com/github/api/v2/schema/FeedEntry.java b/src/main/java/com/github/api/v2/schema/FeedEntry.java deleted file mode 100644 index 4a81900..0000000 --- a/src/main/java/com/github/api/v2/schema/FeedEntry.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.schema; - -import java.util.Date; -import java.util.List; - -/** - * The Class FeedEntry. - */ -public class FeedEntry extends SchemaEntity { - - /** The Constant serialVersionUID. */ - private static final long serialVersionUID = 9155892708485181542L; - - private String title; - private String link; - private String author; - private Date publishedDate; - private String content; - private List categories; - /** - * @return the title - */ - public String getTitle() { - return title; - } - /** - * @param title the title to set - */ - public void setTitle(String title) { - this.title = title; - } - /** - * @return the link - */ - public String getLink() { - return link; - } - /** - * @param link the link to set - */ - public void setLink(String link) { - this.link = link; - } - /** - * @return the author - */ - public String getAuthor() { - return author; - } - /** - * @param author the author to set - */ - public void setAuthor(String author) { - this.author = author; - } - /** - * @return the publishedDate - */ - public Date getPublishedDate() { - return publishedDate; - } - /** - * @param publishedDate the publishedDate to set - */ - public void setPublishedDate(Date publishedDate) { - this.publishedDate = publishedDate; - } - /** - * @return the content - */ - public String getContent() { - return content; - } - /** - * @param content the content to set - */ - public void setContent(String content) { - this.content = content; - } - /** - * @return the categories - */ - public List getCategories() { - return categories; - } - /** - * @param categories the categories to set - */ - public void setCategories(List categories) { - this.categories = categories; - } - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - return "FeedEntry [author=" + author + ", categories=" + categories - + ", content=" + content - + ", link=" + link + ", publishedDate=" + publishedDate - + ", title=" + title + "]"; - } -} diff --git a/src/main/java/com/github/api/v2/schema/Gist.java b/src/main/java/com/github/api/v2/schema/Gist.java deleted file mode 100644 index a4bba5c..0000000 --- a/src/main/java/com/github/api/v2/schema/Gist.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.schema; - -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * The Class Gist. - */ -public class Gist extends SchemaEntity { - - /** - * The Enum Visibility. - */ - public enum Visibility implements ValueEnum { - - /** The PUBLIC. */ - PUBLIC("public"), - /** The PRIVATE. */ - PRIVATE("private"); - - /** The Constant stringToEnum. */ - private static final Map stringToEnum = new HashMap(); - - static { // Initialize map from constant name to enum constant - for (Visibility op : values()) { - stringToEnum.put(op.value(), op); - } - } - - /** The value. */ - private final String value; - - /** - * Instantiates a new visibility. - * - * @param value - * the value - */ - Visibility(String value) { - this.value = value; - } - - /* (non-Javadoc) - * @see com.github.api.v2.schema.ValueEnum#value() - */ - @Override - public String value() { - return value; - } - - /** - * From value. - * - * @param value - * the value - * - * @return the visibility - */ - public static Visibility fromValue(String value) { - return stringToEnum.get(value); - } - } - - /** The Constant serialVersionUID. */ - private static final long serialVersionUID = 9155892708485181542L; - - /** The description. */ - private String description; - - /** The repo. */ - private String repo; - - /** The visibility. */ - private Visibility visibility; - - /** The created at. */ - private Date createdAt; - - /** The files. */ - private List files; - - private String owner; - - /** - * Gets the description. - * - * @return the description - */ - public String getDescription() { - return description; - } - - /** - * Sets the description. - * - * @param description - * the new description - */ - public void setDescription(String description) { - this.description = description; - } - - /** - * Gets the repo. - * - * @return the repo - */ - public String getRepo() { - return repo; - } - - /** - * Sets the repo. - * - * @param repo - * the new repo - */ - public void setRepo(String repo) { - this.repo = repo; - } - - /** - * Gets the visibility. - * - * @return the visibility - */ - public Visibility getVisibility() { - return visibility; - } - - /** - * Sets the visibility. - * - * @param visibility - * the new visibility - */ - public void setVisibility(Visibility visibility) { - this.visibility = visibility; - } - - /** - * Gets the created at. - * - * @return the created at - */ - public Date getCreatedAt() { - return createdAt; - } - - /** - * Sets the created at. - * - * @param createdAt - * the new created at - */ - public void setCreatedAt(Date createdAt) { - this.createdAt = createdAt; - } - - /** - * Gets the files. - * - * @return the files - */ - public List getFiles() { - return files; - } - - /** - * Sets the files. - * - * @param files - * the new files - */ - public void setFiles(List files) { - this.files = files; - } - - /** - * @return the owner - */ - public String getOwner() { - return owner; - } - - /** - * @param owner the owner to set - */ - public void setOwner(String owner) { - this.owner = owner; - } - - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - return "Gist [createdAt=" + createdAt + ", description=" + description - + ", files=" + files + ", repo=" + repo + ", visibility=" - + visibility + ", owner=" + owner + "]"; - } -} diff --git a/src/main/java/com/github/api/v2/schema/Head.java b/src/main/java/com/github/api/v2/schema/Head.java deleted file mode 100644 index db85d1a..0000000 --- a/src/main/java/com/github/api/v2/schema/Head.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.schema; - -/** - * The Class Id. - */ -public class Head extends SchemaEntity { - - /** The Constant serialVersionUID. */ - private static final long serialVersionUID = 9155892708485181542L; - - /** The id. */ - private String id; - - private String name; - - - /** - * @return the name - */ - public String getName() { - return name; - } - - /** - * @param name the name to set - */ - public void setName(String name) { - this.name = name; - } - - /** - * Gets the id. - * - * @return the id - */ - public String getId() { - return id; - } - - /** - * Sets the id. - * - * @param id - * the new id - */ - public void setId(String id) { - this.id = id; - } - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - return "Id [id=" + id + "][name=" + name + "]"; - } -} diff --git a/src/main/java/com/github/api/v2/schema/Id.java b/src/main/java/com/github/api/v2/schema/Id.java deleted file mode 100644 index 93730d0..0000000 --- a/src/main/java/com/github/api/v2/schema/Id.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.schema; - -/** - * The Class Id. - */ -public class Id extends SchemaEntity { - - /** The Constant serialVersionUID. */ - private static final long serialVersionUID = 9155892708485181542L; - - /** The id. */ - private String id; - - /** - * Gets the id. - * - * @return the id - */ - public String getId() { - return id; - } - - /** - * Sets the id. - * - * @param id - * the new id - */ - public void setId(String id) { - this.id = id; - } - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - return "Id [id=" + id + "]"; - } -} diff --git a/src/main/java/com/github/api/v2/schema/Issue.java b/src/main/java/com/github/api/v2/schema/Issue.java deleted file mode 100644 index 3635538..0000000 --- a/src/main/java/com/github/api/v2/schema/Issue.java +++ /dev/null @@ -1,337 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.schema; - -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -/** - * The Class Issue. - */ -public class Issue extends SchemaEntity { - - /** - * The Enum State. - */ - public enum State implements ValueEnum { - - /** The OPEN. */ - OPEN("open"), - - /** The CLOSED. */ - CLOSED("closed"); - - /** The Constant stringToEnum. */ - private static final Map stringToEnum = new HashMap(); - - static { // Initialize map from constant name to enum constant - for (State op : values()) { - stringToEnum.put(op.value(), op); - } - } - - /** The value. */ - private final String value; - - /** - * Instantiates a new state. - * - * @param value - * the value - */ - State(String value) { - this.value = value; - } - - /* (non-Javadoc) - * @see com.github.api.v2.schema.ValueEnum#value() - */ - @Override - public String value() { - return value; - } - - /** - * From value. - * - * @param value - * the value - * - * @return the state - */ - public static State fromValue(String value) { - return stringToEnum.get(value); - } - } - - /** The Constant serialVersionUID. */ - private static final long serialVersionUID = 9155892708485181542L; - - /** The user. */ - private String user; - - /** The gravatar id. */ - private String gravatarId; - - /** The updated at. */ - private Date updatedAt; - - /** The votes. */ - private int votes; - - /** The number. */ - private int number; - - /** The comments. */ - private int comments; - - /** The position. */ - private double position; - - /** The title. */ - private String title; - - /** The body. */ - private String body; - - /** The state. */ - private State state; - - /** The created at. */ - private Date createdAt; - - /** - * Gets the user. - * - * @return the user - */ - public String getUser() { - return user; - } - - /** - * Sets the user. - * - * @param user - * the new user - */ - public void setUser(String user) { - this.user = user; - } - - /** - * Gets the gravatar id. - * - * @return the gravatar id - */ - public String getGravatarId() { - return gravatarId; - } - - /** - * Sets the gravatar id. - * - * @param gravatarId - * the new gravatar id - */ - public void setGravatarId(String gravatarId) { - this.gravatarId = gravatarId; - } - - /** - * Gets the updated at. - * - * @return the updated at - */ - public Date getUpdatedAt() { - return updatedAt; - } - - /** - * Sets the updated at. - * - * @param updatedAt - * the new updated at - */ - public void setUpdatedAt(Date updatedAt) { - this.updatedAt = updatedAt; - } - - /** - * Gets the votes. - * - * @return the votes - */ - public int getVotes() { - return votes; - } - - /** - * Sets the votes. - * - * @param votes - * the new votes - */ - public void setVotes(int votes) { - this.votes = votes; - } - - /** - * Gets the number. - * - * @return the number - */ - public int getNumber() { - return number; - } - - /** - * Sets the number. - * - * @param number - * the new number - */ - public void setNumber(int number) { - this.number = number; - } - - /** - * Gets the position. - * - * @return the position - */ - public double getPosition() { - return position; - } - - /** - * Sets the position. - * - * @param position - * the new position - */ - public void setPosition(double position) { - this.position = position; - } - - /** - * Gets the title. - * - * @return the title - */ - public String getTitle() { - return title; - } - - /** - * Sets the title. - * - * @param title - * the new title - */ - public void setTitle(String title) { - this.title = title; - } - - /** - * Gets the body. - * - * @return the body - */ - public String getBody() { - return body; - } - - /** - * Sets the body. - * - * @param body - * the new body - */ - public void setBody(String body) { - this.body = body; - } - - /** - * Gets the state. - * - * @return the state - */ - public State getState() { - return state; - } - - /** - * Sets the state. - * - * @param state - * the new state - */ - public void setState(State state) { - this.state = state; - } - - /** - * Gets the created at. - * - * @return the created at - */ - public Date getCreatedAt() { - return createdAt; - } - - /** - * Sets the created at. - * - * @param createdAt - * the new created at - */ - public void setCreatedAt(Date createdAt) { - this.createdAt = createdAt; - } - - /** - * Gets the comments. - * - * @return the comments - */ - public int getComments() { - return comments; - } - - /** - * Sets the comments. - * - * @param comments - * the new comments - */ - public void setComments(int comments) { - this.comments = comments; - } - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - return "Issue [body=" + body + ", comments=" + comments - + ", createdAt=" + createdAt + ", gravatarId=" + gravatarId - + ", number=" + number + ", position=" + position + ", state=" - + state + ", title=" + title + ", updatedAt=" + updatedAt - + ", user=" + user + ", votes=" + votes + "]"; - } -} diff --git a/src/main/java/com/github/api/v2/schema/Key.java b/src/main/java/com/github/api/v2/schema/Key.java deleted file mode 100644 index e0b731a..0000000 --- a/src/main/java/com/github/api/v2/schema/Key.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.schema; - -/** - * The Class Key. - */ -public class Key extends SchemaEntity { - - /** The Constant serialVersionUID. */ - private static final long serialVersionUID = 9155892708485181542L; - - /** The id. */ - private String id; - - /** The title. */ - private String title; - - /** The key. */ - private String key; - - /** - * Gets the id. - * - * @return the id - */ - public String getId() { - return id; - } - - /** - * Sets the id. - * - * @param id - * the new id - */ - public void setId(String id) { - this.id = id; - } - - /** - * Gets the title. - * - * @return the title - */ - public String getTitle() { - return title; - } - - /** - * Sets the title. - * - * @param title - * the new title - */ - public void setTitle(String title) { - this.title = title; - } - - /** - * Gets the key. - * - * @return the key - */ - public String getKey() { - return key; - } - - /** - * Sets the key. - * - * @param key - * the new key - */ - public void setKey(String key) { - this.key = key; - } - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - return "Key [id=" + id + ", key=" + key + ", title=" + title + "]"; - } -} diff --git a/src/main/java/com/github/api/v2/schema/Language.java b/src/main/java/com/github/api/v2/schema/Language.java deleted file mode 100644 index aa089e8..0000000 --- a/src/main/java/com/github/api/v2/schema/Language.java +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.schema; - -import java.util.HashMap; -import java.util.Map; - -/** - * The Enum Language. - */ -public enum Language implements ValueEnum { - - /** The Action script. */ - ActionScript("ActionScript"), - - /** The Arc. */ - Arc("Arc"), - - /** The ASP. */ - ASP("ASP"), - - /** The Assembly. */ - Assembly("Assembly"), - - /** The Boo. */ - Boo("Boo"), - - /** The C. */ - C("C"), - - /** The C_ sharp. */ - C_SHARP("C#"), - - /** The CPP. */ - CPP("C++"), - - /** The Clojure. */ - Clojure("Clojure"), - - /** The Coffee script. */ - CoffeeScript("CoffeeScript"), - - /** The Cold fusion. */ - ColdFusion("ColdFusion"), - - /** The Common lisp. */ - CommonLisp("Common Lisp"), - - /** The D. */ - D("D"), - - /** The Delphi. */ - Delphi("Delphi"), - - /** The Duby. */ - Duby("Duby"), - - /** The Eiffel. */ - Eiffel("Eiffel"), - - /** The Emacs lisp. */ - EmacsLisp("Emacs Lisp"), - - /** The Erlang. */ - Erlang("Erlang"), - - /** The F_ sharp. */ - F_SHARP("F#"), - - /** The FORTRAN. */ - FORTRAN("FORTRAN"), - - /** The Go. */ - Go("Go"), - - /** The Groovy. */ - Groovy("Groovy"), - - /** The Haskell. */ - Haskell("Haskell"), - - /** The Ha xe. */ - HaXe("HaXe"), - - /** The Io. */ - Io("Io"), - - /** The Java. */ - Java("Java"), - - /** The Java script. */ - JavaScript("JavaScript"), - - /** The Lua. */ - Lua("Lua"), - - /** The Max_ msp. */ - Max_MSP("Max/MSP"), - - /** The Nu. */ - Nu("Nu"), - - /** The Objective_ c. */ - Objective_C("Objective-C"), - - /** The Objective_ j. */ - Objective_J("Objective-J"), - - /** The O caml. */ - OCaml("OCaml"), - - /** The ooc. */ - ooc("ooc"), - - /** The Perl. */ - Perl("Perl"), - - /** The PHP. */ - PHP("PHP"), - - /** The Pure_ data. */ - Pure_Data("Pure Data"), - - /** The Python. */ - Python("Python"), - - /** The R. */ - R("R"), - - /** The Racket. */ - Racket("Racket"), - - /** The Ruby. */ - Ruby("Ruby"), - - /** The Scala. */ - Scala("Scala"), - - /** The Scheme. */ - Scheme("Scheme"), - - /** The sclang. */ - sclang("sclang"), - - /** The Self. */ - Self("Self"), - - /** The Shell. */ - Shell("Shell"), - - /** The Smalltalk. */ - Smalltalk("Smalltalk"), - - /** The Super collider. */ - SuperCollider("SuperCollider"), - - /** The Tcl. */ - Tcl("Tcl"), - - /** The Vala. */ - Vala("Vala"), - - /** The Verilog. */ - Verilog("Verilog"), - - /** The VHDL. */ - VHDL("VHDL"), - - /** The Vim l. */ - VimL("VimL"), - - /** The Visual basic. */ - VisualBasic("Visual Basic"); - - /** The Constant stringToEnum. */ - private static final Map stringToEnum = new HashMap(); - - static { // Initialize map from constant name to enum constant - for (Language op : values()) { - stringToEnum.put(op.value(), op); - } - } - - /** The value. */ - private final String value; - - /** - * Instantiates a new language. - * - * @param value - * the value - */ - Language(String value) { - this.value = value; - } - - /* (non-Javadoc) - * @see com.github.api.v2.schema.ValueEnum#value() - */ - @Override - public String value() { - return value; - } - - /** - * From value. - * - * @param value - * the value - * - * @return the language - */ - public static Language fromValue(String value) { - return stringToEnum.get(value); - } -} diff --git a/src/main/java/com/github/api/v2/schema/NetworkCommit.java b/src/main/java/com/github/api/v2/schema/NetworkCommit.java deleted file mode 100644 index 184f811..0000000 --- a/src/main/java/com/github/api/v2/schema/NetworkCommit.java +++ /dev/null @@ -1,238 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.schema; - -import java.util.Date; -import java.util.List; - -/** - * The Class Commit. - */ -public class NetworkCommit extends SchemaEntity { - - /** The Constant serialVersionUID. */ - private static final long serialVersionUID = 9155892708485181542L; - - /** The message. */ - private String message; - - /** The time. */ - private long time; - - /** The parents. */ - private List> parents; - - /** The date. */ - private Date date; - - /** The author. */ - private String author; - - /** The id. */ - private String id; - - /** The space. */ - private int space; - - /** The gravatar. */ - private String gravatar; - - /** The login. */ - private String login; - - /** - * Gets the message. - * - * @return the message - */ - public String getMessage() { - return message; - } - - /** - * Sets the message. - * - * @param message - * the new message - */ - public void setMessage(String message) { - this.message = message; - } - - /** - * Gets the time. - * - * @return the time - */ - public long getTime() { - return time; - } - - /** - * Sets the time. - * - * @param time - * the new time - */ - public void setTime(long time) { - this.time = time; - } - - /** - * Gets the parents. - * - * @return the parents - */ - public List> getParents() { - return parents; - } - - /** - * Sets the parents. - * - * @param parents - * the new parents - */ - public void setParents(List> parents) { - this.parents = parents; - } - - /** - * Gets the date. - * - * @return the date - */ - public Date getDate() { - return date; - } - - /** - * Sets the date. - * - * @param date - * the new date - */ - public void setDate(Date date) { - this.date = date; - } - - /** - * Gets the author. - * - * @return the author - */ - public String getAuthor() { - return author; - } - - /** - * Sets the author. - * - * @param author - * the new author - */ - public void setAuthor(String author) { - this.author = author; - } - - /** - * Gets the id. - * - * @return the id - */ - public String getId() { - return id; - } - - /** - * Sets the id. - * - * @param id - * the new id - */ - public void setId(String id) { - this.id = id; - } - - /** - * Gets the space. - * - * @return the space - */ - public int getSpace() { - return space; - } - - /** - * Sets the space. - * - * @param space - * the new space - */ - public void setSpace(int space) { - this.space = space; - } - - /** - * Gets the gravatar. - * - * @return the gravatar - */ - public String getGravatar() { - return gravatar; - } - - /** - * Sets the gravatar. - * - * @param gravatar - * the new gravatar - */ - public void setGravatar(String gravatar) { - this.gravatar = gravatar; - } - - /** - * Gets the login. - * - * @return the login - */ - public String getLogin() { - return login; - } - - /** - * Sets the login. - * - * @param login - * the new login - */ - public void setLogin(String login) { - this.login = login; - } - - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - return "NetworkCommit [author=" + author + ", date=" + date - + ", gravatar=" + gravatar + ", id=" + id + ", login=" + login - + ", message=" + message + ", parents=" + parents + ", space=" - + space + ", time=" + time + "]"; - } -} diff --git a/src/main/java/com/github/api/v2/schema/NetworkMeta.java b/src/main/java/com/github/api/v2/schema/NetworkMeta.java deleted file mode 100644 index d2b4974..0000000 --- a/src/main/java/com/github/api/v2/schema/NetworkMeta.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.schema; - -import java.util.Date; -import java.util.List; - -/** - * The Class Network. - */ -public class NetworkMeta extends SchemaEntity { - - /** The Constant serialVersionUID. */ - private static final long serialVersionUID = 9155892708485181542L; - - /** The focus. */ - private int focus; - - /** The nethash. */ - private String nethash; - - /** The dates. */ - private List dates; - - private List users; - private List blocks; - - /** - * Gets the focus. - * - * @return the focus - */ - public int getFocus() { - return focus; - } - - /** - * Sets the focus. - * - * @param focus - * the new focus - */ - public void setFocus(int focus) { - this.focus = focus; - } - - /** - * Gets the nethash. - * - * @return the nethash - */ - public String getNethash() { - return nethash; - } - - /** - * Sets the nethash. - * - * @param nethash - * the new nethash - */ - public void setNethash(String nethash) { - this.nethash = nethash; - } - - /** - * Gets the dates. - * - * @return the dates - */ - public List getDates() { - return dates; - } - - /** - * Sets the dates. - * - * @param dates - * the new dates - */ - public void setDates(List dates) { - this.dates = dates; - } - - /** - * @return the users - */ - public List getUsers() { - return users; - } - - /** - * @param users the users to set - */ - public void setUsers(List users) { - this.users = users; - } - - /** - * @return the blocks - */ - public List getBlocks() { - return blocks; - } - - /** - * @param blocks the blocks to set - */ - public void setBlocks(List blocks) { - this.blocks = blocks; - } - - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - return "NetworkMeta [blocks=" + blocks + ", dates=" + dates - + ", focus=" + focus + ", nethash=" + nethash + ", users=" - + users + "]"; - } -} diff --git a/src/main/java/com/github/api/v2/schema/NetworkUser.java b/src/main/java/com/github/api/v2/schema/NetworkUser.java deleted file mode 100644 index 0eacd2a..0000000 --- a/src/main/java/com/github/api/v2/schema/NetworkUser.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.schema; - -import java.util.List; - - -/** - * The Class Commit. - */ -public class NetworkUser extends SchemaEntity { - - /** The Constant serialVersionUID. */ - private static final long serialVersionUID = 9155892708485181542L; - - private String name; - private String repo; - private List heads; - /** - * @return the name - */ - public String getName() { - return name; - } - /** - * @param name the name to set - */ - public void setName(String name) { - this.name = name; - } - /** - * @return the repo - */ - public String getRepo() { - return repo; - } - /** - * @param repo the repo to set - */ - public void setRepo(String repo) { - this.repo = repo; - } - /** - * @return the heads - */ - public List getHeads() { - return heads; - } - /** - * @param heads the heads to set - */ - public void setHeads(List heads) { - this.heads = heads; - } - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - return "NetworkUser [heads=" + heads + ", name=" + name + ", repo=" - + repo + "]"; - } -} diff --git a/src/main/java/com/github/api/v2/schema/Organization.java b/src/main/java/com/github/api/v2/schema/Organization.java deleted file mode 100644 index e95669d..0000000 --- a/src/main/java/com/github/api/v2/schema/Organization.java +++ /dev/null @@ -1,503 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.schema; - -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -/** - * The Class Organization. - */ -public class Organization extends SchemaEntity { - - /** - * The Enum Type. - */ - public enum Type implements ValueEnum { - - /** The ORGANIZATION. */ - ORGANIZATION("Organization"); - - - /** The Constant stringToEnum. */ - private static final Map stringToEnum = new HashMap(); - - static { // Initialize map from constant name to enum constant - for (Type op : values()) { - stringToEnum.put(op.value(), op); - } - } - - /** The value. */ - private final String value; - - /** - * Instantiates a new type. - * - * @param value - * the value - */ - Type(String value) { - this.value = value; - } - - /* (non-Javadoc) - * @see com.github.api.v2.schema.ValueEnum#value() - */ - @Override - public String value() { - return value; - } - - /** - * From value. - * - * @param value - * the value - * - * @return the type - */ - public static Type fromValue(String value) { - return stringToEnum.get(value); - } - } - - /** - * - */ - private static final long serialVersionUID = 2665103321482505351L; - - /** The id. */ - private String id; - - /** The gravatar id. */ - private String gravatarId; - - /** The login. */ - private String login; - - /** The name. */ - private String name; - - /** The email. */ - private String email; - - /** The location. */ - private String location; - - /** The blog. */ - private String blog; - - /** The company. */ - private String company; - - /** The following count. */ - private int followingCount; - - /** The followers count. */ - private int followersCount; - - /** The public gist count. */ - private int publicGistCount; - - /** The public repo count. */ - private int publicRepoCount; - - /** The total private repo count. */ - private int totalPrivateRepoCount; - - /** The owned private repo count. */ - private int ownedPrivateRepoCount; - - /** The private gist count. */ - private int privateGistCount; - - /** The created at. */ - private Date createdAt; - - private Permission permission; - - private String billingEmail; - - private Type type; - - /** - * @return the permission - */ - public Permission getPermission() { - return permission; - } - - /** - * @param permission the permission to set - */ - public void setPermission(Permission permission) { - this.permission = permission; - } - - /** - * @return the billingEmail - */ - public String getBillingEmail() { - return billingEmail; - } - - /** - * @param billingEmail the billingEmail to set - */ - public void setBillingEmail(String billingEmail) { - this.billingEmail = billingEmail; - } - - /** - * @return the type - */ - public Type getType() { - return type; - } - - /** - * @param type the type to set - */ - public void setType(Type type) { - this.type = type; - } - - /** - * Gets the name. - * - * @return the name - */ - public String getName() { - return name; - } - - /** - * Sets the name. - * - * @param name - * the new name - */ - public void setName(String name) { - this.name = name; - } - - /** - * Gets the location. - * - * @return the location - */ - public String getLocation() { - return location; - } - - /** - * Sets the location. - * - * @param location - * the new location - */ - public void setLocation(String location) { - this.location = location; - } - - /** - * Gets the email. - * - * @return the email - */ - public String getEmail() { - return email; - } - - /** - * Sets the email. - * - * @param email - * the new email - */ - public void setEmail(String email) { - this.email = email; - } - - /** - * Gets the blog. - * - * @return the blog - */ - public String getBlog() { - return blog; - } - - /** - * Sets the blog. - * - * @param blog - * the new blog - */ - public void setBlog(String blog) { - this.blog = blog; - } - - /** - * Gets the company. - * - * @return the company - */ - public String getCompany() { - return company; - } - - /** - * Sets the company. - * - * @param company - * the new company - */ - public void setCompany(String company) { - this.company = company; - } - - /** - * Gets the id. - * - * @return the id - */ - public String getId() { - return id; - } - - /** - * Sets the id. - * - * @param id - * the new id - */ - public void setId(String id) { - this.id = id; - } - - /** - * Gets the login. - * - * @return the login - */ - public String getLogin() { - return login; - } - - /** - * Sets the login. - * - * @param login - * the new login - */ - public void setLogin(String login) { - this.login = login; - } - - /** - * Gets the following count. - * - * @return the following count - */ - public int getFollowingCount() { - return followingCount; - } - - /** - * Sets the following count. - * - * @param followingCount - * the new following count - */ - public void setFollowingCount(int followingCount) { - this.followingCount = followingCount; - } - - /** - * Gets the followers count. - * - * @return the followers count - */ - public int getFollowersCount() { - return followersCount; - } - - /** - * Sets the followers count. - * - * @param followersCount - * the new followers count - */ - public void setFollowersCount(int followersCount) { - this.followersCount = followersCount; - } - - /** - * Gets the public gist count. - * - * @return the public gist count - */ - public int getPublicGistCount() { - return publicGistCount; - } - - /** - * Sets the public gist count. - * - * @param publicGistCount - * the new public gist count - */ - public void setPublicGistCount(int publicGistCount) { - this.publicGistCount = publicGistCount; - } - - /** - * Gets the public repo count. - * - * @return the public repo count - */ - public int getPublicRepoCount() { - return publicRepoCount; - } - - /** - * Sets the public repo count. - * - * @param publicRepoCount - * the new public repo count - */ - public void setPublicRepoCount(int publicRepoCount) { - this.publicRepoCount = publicRepoCount; - } - - /** - * Gets the total private repo count. - * - * @return the total private repo count - */ - public int getTotalPrivateRepoCount() { - return totalPrivateRepoCount; - } - - /** - * Sets the total private repo count. - * - * @param totalPrivateRepoCount - * the new total private repo count - */ - public void setTotalPrivateRepoCount(int totalPrivateRepoCount) { - this.totalPrivateRepoCount = totalPrivateRepoCount; - } - - /** - * Gets the owned private repo count. - * - * @return the owned private repo count - */ - public int getOwnedPrivateRepoCount() { - return ownedPrivateRepoCount; - } - - /** - * Sets the owned private repo count. - * - * @param ownedPrivateRepoCount - * the new owned private repo count - */ - public void setOwnedPrivateRepoCount(int ownedPrivateRepoCount) { - this.ownedPrivateRepoCount = ownedPrivateRepoCount; - } - - /** - * Gets the private gist count. - * - * @return the private gist count - */ - public int getPrivateGistCount() { - return privateGistCount; - } - - /** - * Sets the private gist count. - * - * @param privateGistCount - * the new private gist count - */ - public void setPrivateGistCount(int privateGistCount) { - this.privateGistCount = privateGistCount; - } - - /** - * Gets the created at. - * - * @return the created at - */ - public Date getCreatedAt() { - return createdAt; - } - - /** - * Sets the created at. - * - * @param createdAt - * the new created at - */ - public void setCreatedAt(Date createdAt) { - this.createdAt = createdAt; - } - - /** - * Gets the gravatar id. - * - * @return the gravatar id - */ - public String getGravatarId() { - return gravatarId; - } - - /** - * Sets the gravatar id. - * - * @param gravatarId - * the new gravatar id - */ - public void setGravatarId(String gravatarId) { - this.gravatarId = gravatarId; - } - - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - return "Organization [billingEmail=" + billingEmail + ", blog=" + blog - + ", company=" + company + ", createdAt=" + createdAt - + ", email=" + email + ", followersCount=" + followersCount - + ", followingCount=" + followingCount + ", gravatarId=" - + gravatarId + ", id=" + id + ", location=" + location - + ", login=" + login + ", name=" + name - + ", ownedPrivateRepoCount=" + ownedPrivateRepoCount - + ", permission=" + permission + ", privateGistCount=" - + privateGistCount + ", publicGistCount=" + publicGistCount - + ", publicRepoCount=" + publicRepoCount - + ", totalPrivateRepoCount=" + totalPrivateRepoCount - + ", type=" + type + "]"; - } -} diff --git a/src/main/java/com/github/api/v2/schema/Permission.java b/src/main/java/com/github/api/v2/schema/Permission.java deleted file mode 100644 index aabdba0..0000000 --- a/src/main/java/com/github/api/v2/schema/Permission.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.github.api.v2.schema; - -import java.util.HashMap; -import java.util.Map; - - -/** - * The Enum Permission. - */ - public enum Permission implements ValueEnum { - - /** The ADMIN. */ - ADMIN("admin"), - /** The PULL. */ - PULL("pull"), - /** The PUSH. */ - PUSH("push"); - - /** The Constant stringToEnum. */ - private static final Map stringToEnum = new HashMap(); - - static { // Initialize map from constant name to enum constant - for (Permission op : values()) { - stringToEnum.put(op.value(), op); - } - } - - /** The value. */ - private final String value; - - /** - * Instantiates a new permission. - * - * @param value - * the value - */ - Permission(String value) { - this.value = value; - } - - /* (non-Javadoc) - * @see com.github.api.v2.schema.ValueEnum#value() - */ - @Override - public String value() { - return value; - } - - /** - * From value. - * - * @param value - * the value - * - * @return the permission - */ - public static Permission fromValue(String value) { - return stringToEnum.get(value); - } - } \ No newline at end of file diff --git a/src/main/java/com/github/api/v2/schema/Plan.java b/src/main/java/com/github/api/v2/schema/Plan.java deleted file mode 100644 index 76bce67..0000000 --- a/src/main/java/com/github/api/v2/schema/Plan.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.schema; - -/** - * The Class Plan. - */ -public class Plan extends SchemaEntity { - - /** The Constant serialVersionUID. */ - private static final long serialVersionUID = -716103936969784665L; - - /** The name. */ - private String name; - - /** The collaborators. */ - private int collaborators; - - /** The space. */ - private long space; - - /** The private repos. */ - private int privateRepos; - - /** - * Gets the name. - * - * @return the name - */ - public String getName() { - return name; - } - - /** - * Sets the name. - * - * @param name - * the new name - */ - public void setName(String name) { - this.name = name; - } - - /** - * Gets the collaborators. - * - * @return the collaborators - */ - public int getCollaborators() { - return collaborators; - } - - /** - * Sets the collaborators. - * - * @param collaborators - * the new collaborators - */ - public void setCollaborators(int collaborators) { - this.collaborators = collaborators; - } - - /** - * Gets the space. - * - * @return the space - */ - public long getSpace() { - return space; - } - - /** - * Sets the space. - * - * @param space - * the new space - */ - public void setSpace(long space) { - this.space = space; - } - - /** - * Gets the private repos. - * - * @return the private repos - */ - public int getPrivateRepos() { - return privateRepos; - } - - /** - * Sets the private repos. - * - * @param privateRepos - * the new private repos - */ - public void setPrivateRepos(int privateRepos) { - this.privateRepos = privateRepos; - } - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - return "Plan [collaborators=" + collaborators + ", name=" + name - + ", privateRepos=" + privateRepos + ", space=" + space + "]"; - } -} diff --git a/src/main/java/com/github/api/v2/schema/Repository.java b/src/main/java/com/github/api/v2/schema/Repository.java deleted file mode 100644 index 7fea3b5..0000000 --- a/src/main/java/com/github/api/v2/schema/Repository.java +++ /dev/null @@ -1,686 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.schema; - -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -/** - * The Class Repository. - */ -public class Repository extends SchemaEntity { - - /** - * The Enum Visibility. - */ - public enum Visibility implements ValueEnum { - - /** The PUBLIC. */ - PUBLIC("public"), - /** The PRIVATE. */ - PRIVATE("private"); - - /** The Constant stringToEnum. */ - private static final Map stringToEnum = new HashMap(); - - static { // Initialize map from constant name to enum constant - for (Visibility op : values()) { - stringToEnum.put(op.value(), op); - } - } - - /** The value. */ - private final String value; - - /** - * Instantiates a new visibility. - * - * @param value - * the value - */ - Visibility(String value) { - this.value = value; - } - - /* (non-Javadoc) - * @see com.github.api.v2.schema.ValueEnum#value() - */ - @Override - public String value() { - return value; - } - - /** - * From value. - * - * @param value - * the value - * - * @return the visibility - */ - public static Visibility fromValue(String value) { - return stringToEnum.get(value); - } - } - - /** The Constant MASTER. */ - public static final String MASTER = "master"; - - /** The Constant serialVersionUID. */ - private static final long serialVersionUID = 9155892708485181542L; - - /** The watchers. */ - private int watchers; - - /** The owner. */ - private String owner; - - /** The name. */ - private String name; - - /** The description. */ - private String description; - - /** The visibility. */ - private Visibility visibility; - - /** The url. */ - private String url; - - /** The open issues. */ - private int openIssues; - - /** The fork. */ - private boolean fork; - - /** The homepage. */ - private String homepage; - - /** The forks. */ - private int forks; - - /** The score. */ - private double score; - - /** The actions. */ - private int actions; - - /** The size. */ - private long size; - - /** The language. */ - private Language language; - - /** The followers. */ - private int followers; - - /** The username. */ - private String username; - - /** The type. */ - private String type; - - /** The id. */ - private String id; - - /** The pushed. */ - private Date pushed; - - /** The created. */ - private Date created; - - /** The source. */ - private String source; - - /** The parent. */ - private String parent; - - /** The has wiki. */ - private boolean hasWiki; - - /** The has issues. */ - private boolean hasIssues; - - /** The has downloads. */ - private boolean hasDownloads; - - private String organization; - - private Permission permission; - - /** - * Gets the watchers. - * - * @return the watchers - */ - public int getWatchers() { - return watchers; - } - - /** - * Sets the watchers. - * - * @param watchers - * the new watchers - */ - public void setWatchers(int watchers) { - this.watchers = watchers; - } - - /** - * Gets the owner. - * - * @return the owner - */ - public String getOwner() { - return owner; - } - - /** - * Sets the owner. - * - * @param owner - * the new owner - */ - public void setOwner(String owner) { - this.owner = owner; - } - - /** - * Gets the name. - * - * @return the name - */ - public String getName() { - return name; - } - - /** - * Sets the name. - * - * @param name - * the new name - */ - public void setName(String name) { - this.name = name; - } - - /** - * Gets the description. - * - * @return the description - */ - public String getDescription() { - return description; - } - - /** - * Sets the description. - * - * @param description - * the new description - */ - public void setDescription(String description) { - this.description = description; - } - - /** - * Gets the visibility. - * - * @return the visibility - */ - public Visibility getVisibility() { - return visibility; - } - - /** - * Sets the visibility. - * - * @param visibility - * the new visibility - */ - public void setVisibility(Visibility visibility) { - this.visibility = visibility; - } - - /** - * Gets the url. - * - * @return the url - */ - public String getUrl() { - return url; - } - - /** - * Sets the url. - * - * @param url - * the new url - */ - public void setUrl(String url) { - this.url = url; - } - - /** - * Gets the open issues. - * - * @return the open issues - */ - public int getOpenIssues() { - return openIssues; - } - - /** - * Sets the open issues. - * - * @param openIssues - * the new open issues - */ - public void setOpenIssues(int openIssues) { - this.openIssues = openIssues; - } - - /** - * Checks if is fork. - * - * @return true, if is fork - */ - public boolean isFork() { - return fork; - } - - /** - * Sets the fork. - * - * @param fork - * the new fork - */ - public void setFork(boolean fork) { - this.fork = fork; - } - - /** - * Gets the homepage. - * - * @return the homepage - */ - public String getHomepage() { - return homepage; - } - - /** - * Sets the homepage. - * - * @param homepage - * the new homepage - */ - public void setHomepage(String homepage) { - this.homepage = homepage; - } - - /** - * Gets the forks. - * - * @return the forks - */ - public int getForks() { - return forks; - } - - /** - * Sets the forks. - * - * @param forks - * the new forks - */ - public void setForks(int forks) { - this.forks = forks; - } - - /** - * Gets the score. - * - * @return the score - */ - public double getScore() { - return score; - } - - /** - * Sets the score. - * - * @param score - * the new score - */ - public void setScore(double score) { - this.score = score; - } - - /** - * Gets the actions. - * - * @return the actions - */ - public int getActions() { - return actions; - } - - /** - * Sets the actions. - * - * @param actions - * the new actions - */ - public void setActions(int actions) { - this.actions = actions; - } - - /** - * Gets the size. - * - * @return the size - */ - public long getSize() { - return size; - } - - /** - * Sets the size. - * - * @param size - * the new size - */ - public void setSize(long size) { - this.size = size; - } - - /** - * Gets the language. - * - * @return the language - */ - public Language getLanguage() { - return language; - } - - /** - * Sets the language. - * - * @param language - * the new language - */ - public void setLanguage(Language language) { - this.language = language; - } - - /** - * Gets the followers. - * - * @return the followers - */ - public int getFollowers() { - return followers; - } - - /** - * Sets the followers. - * - * @param followers - * the new followers - */ - public void setFollowers(int followers) { - this.followers = followers; - } - - /** - * Gets the username. - * - * @return the username - */ - public String getUsername() { - return username; - } - - /** - * Sets the username. - * - * @param username - * the new username - */ - public void setUsername(String username) { - this.username = username; - } - - /** - * Gets the type. - * - * @return the type - */ - public String getType() { - return type; - } - - /** - * Sets the type. - * - * @param type - * the new type - */ - public void setType(String type) { - this.type = type; - } - - /** - * Gets the id. - * - * @return the id - */ - public String getId() { - return id; - } - - /** - * Sets the id. - * - * @param id - * the new id - */ - public void setId(String id) { - this.id = id; - } - - /** - * Gets the pushed. - * - * @return the pushed - */ - public Date getPushed() { - return pushed; - } - - /** - * Sets the pushed. - * - * @param pushed - * the new pushed - */ - public void setPushed(Date pushed) { - this.pushed = pushed; - } - - /** - * Gets the created. - * - * @return the created - */ - public Date getCreated() { - return created; - } - - /** - * Sets the created. - * - * @param created - * the new created - */ - public void setCreated(Date created) { - this.created = created; - } - - /** - * Gets the source. - * - * @return the source - */ - public String getSource() { - return source; - } - - /** - * Sets the source. - * - * @param source - * the new source - */ - public void setSource(String source) { - this.source = source; - } - - /** - * Gets the parent. - * - * @return the parent - */ - public String getParent() { - return parent; - } - - /** - * Sets the parent. - * - * @param parent - * the new parent - */ - public void setParent(String parent) { - this.parent = parent; - } - - /** - * Checks if is checks for wiki. - * - * @return true, if is checks for wiki - */ - public boolean isHasWiki() { - return hasWiki; - } - - /** - * Sets the checks for wiki. - * - * @param hasWiki - * the new checks for wiki - */ - public void setHasWiki(boolean hasWiki) { - this.hasWiki = hasWiki; - } - - /** - * Checks if is checks for issues. - * - * @return true, if is checks for issues - */ - public boolean isHasIssues() { - return hasIssues; - } - - /** - * Sets the checks for issues. - * - * @param hasIssues - * the new checks for issues - */ - public void setHasIssues(boolean hasIssues) { - this.hasIssues = hasIssues; - } - - /** - * Checks if is checks for downloads. - * - * @return true, if is checks for downloads - */ - public boolean isHasDownloads() { - return hasDownloads; - } - - /** - * Sets the checks for downloads. - * - * @param hasDownloads - * the new checks for downloads - */ - public void setHasDownloads(boolean hasDownloads) { - this.hasDownloads = hasDownloads; - } - - /** - * @return the organization - */ - public String getOrganization() { - return organization; - } - - /** - * @param organization the organization to set - */ - public void setOrganization(String organization) { - this.organization = organization; - } - - /** - * @return the permission - */ - public Permission getPermission() { - return permission; - } - - /** - * @param permission the permission to set - */ - public void setPermission(Permission permission) { - this.permission = permission; - } - - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - return "Repository [actions=" + actions + ", created=" + created - + ", description=" + description + ", followers=" + followers - + ", fork=" + fork + ", forks=" + forks + ", hasDownloads=" - + hasDownloads + ", hasIssues=" + hasIssues + ", hasWiki=" - + hasWiki + ", homepage=" + homepage + ", id=" + id - + ", language=" + language + ", name=" + name + ", openIssues=" - + openIssues + ", owner=" + owner + ", parent=" + parent - + ", pushed=" + pushed + ", score=" + score + ", size=" + size - + ", source=" + source + ", type=" + type + ", url=" + url - + ", username=" + username + ", visibiity=" + visibility - + ", watchers=" + watchers + "]"; - } -} diff --git a/src/main/java/com/github/api/v2/schema/SchemaEntity.java b/src/main/java/com/github/api/v2/schema/SchemaEntity.java deleted file mode 100644 index 4a8a58c..0000000 --- a/src/main/java/com/github/api/v2/schema/SchemaEntity.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.schema; - -import java.io.Serializable; -import java.util.logging.Logger; - - -/** - * The Class SchemaEntity. - */ -public abstract class SchemaEntity implements Serializable { - - /** The logger. */ - protected final Logger logger = Logger.getLogger(getClass().getCanonicalName()); - - /** The Constant serialVersionUID. */ - private static final long serialVersionUID = 250056223059654638L; -} diff --git a/src/main/java/com/github/api/v2/schema/Team.java b/src/main/java/com/github/api/v2/schema/Team.java deleted file mode 100644 index 9a8df34..0000000 --- a/src/main/java/com/github/api/v2/schema/Team.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.schema; - -import java.util.List; - -/** - * The Class Team. - */ -public class Team extends SchemaEntity { - - /** The Constant serialVersionUID. */ - private static final long serialVersionUID = 9155892708485181542L; - - /** The id. */ - private String id; - - /** The name. */ - private String name; - - /** The permission. */ - private Permission permission; - - private List repoNames; - - /** - * Gets the id. - * - * @return the id - */ - public String getId() { - return id; - } - - /** - * Sets the id. - * - * @param id - * the new id - */ - public void setId(String id) { - this.id = id; - } - - /** - * @return the name - */ - public String getName() { - return name; - } - - /** - * @param name the name to set - */ - public void setName(String name) { - this.name = name; - } - - /** - * @return the permission - */ - public Permission getPermission() { - return permission; - } - - /** - * @param permission the permission to set - */ - public void setPermission(Permission permission) { - this.permission = permission; - } - - /** - * @return the repoNames - */ - public List getRepoNames() { - return repoNames; - } - - /** - * @param repoNames the repoNames to set - */ - public void setRepoNames(List repoNames) { - this.repoNames = repoNames; - } -} diff --git a/src/main/java/com/github/api/v2/schema/Tree.java b/src/main/java/com/github/api/v2/schema/Tree.java deleted file mode 100644 index f38f770..0000000 --- a/src/main/java/com/github/api/v2/schema/Tree.java +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.schema; - -import java.util.HashMap; -import java.util.Map; - -/** - * The Class Tree. - */ -public class Tree extends SchemaEntity { - - /** - * The Enum Type. - */ - public enum Type implements ValueEnum { - - /** The TREE. */ - TREE("tree"), - - /** The BLOB. */ - BLOB("blob"); - - /** The Constant stringToEnum. */ - private static final Map stringToEnum = new HashMap(); - - static { // Initialize map from constant name to enum constant - for (Type op : values()) { - stringToEnum.put(op.value(), op); - } - } - - /** The value. */ - private final String value; - - /** - * Instantiates a new type. - * - * @param value - * the value - */ - Type(String value) { - this.value = value; - } - - /* (non-Javadoc) - * @see com.github.api.v2.schema.ValueEnum#value() - */ - @Override - public String value() { - return value; - } - - /** - * From value. - * - * @param value - * the value - * - * @return the type - */ - public static Type fromValue(String value) { - return stringToEnum.get(value); - } - } - - /** The Constant serialVersionUID. */ - private static final long serialVersionUID = 9155892708485181542L; - - /** The name. */ - private String name; - - /** The sha. */ - private String sha; - - /** The mode. */ - private String mode; - - /** The type. */ - private Type type; - - /** - * Gets the name. - * - * @return the name - */ - public String getName() { - return name; - } - - /** - * Sets the name. - * - * @param name - * the new name - */ - public void setName(String name) { - this.name = name; - } - - /** - * Gets the sha. - * - * @return the sha - */ - public String getSha() { - return sha; - } - - /** - * Sets the sha. - * - * @param sha - * the new sha - */ - public void setSha(String sha) { - this.sha = sha; - } - - /** - * Gets the mode. - * - * @return the mode - */ - public String getMode() { - return mode; - } - - /** - * Sets the mode. - * - * @param mode - * the new mode - */ - public void setMode(String mode) { - this.mode = mode; - } - - /** - * Gets the type. - * - * @return the type - */ - public Type getType() { - return type; - } - - /** - * Sets the type. - * - * @param type - * the new type - */ - public void setType(Type type) { - this.type = type; - } - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - return "Tree [mode=" + mode + ", name=" + name + ", sha=" + sha - + ", type=" + type + "]"; - } -} diff --git a/src/main/java/com/github/api/v2/schema/User.java b/src/main/java/com/github/api/v2/schema/User.java deleted file mode 100644 index 450056e..0000000 --- a/src/main/java/com/github/api/v2/schema/User.java +++ /dev/null @@ -1,525 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.schema; - -import java.util.Date; - -/** - * The Class User. - */ -public class User extends SchemaEntity { - - /** The Constant serialVersionUID. */ - private static final long serialVersionUID = 9155892708485181542L; - - /** The id. */ - private String id; - - /** The gravatar id. */ - private String gravatarId; - - /** The login. */ - private String login; - - /** The name. */ - private String name; - - /** The email. */ - private String email; - - /** The location. */ - private String location; - - /** The fullname. */ - private String fullname; - - /** The username. */ - private String username; - - /** The blog. */ - private String blog; - - /** The company. */ - private String company; - - /** The following count. */ - private int followingCount; - - /** The followers count. */ - private int followersCount; - - /** The public gist count. */ - private int publicGistCount; - - /** The public repo count. */ - private int publicRepoCount; - - /** The total private repo count. */ - private int totalPrivateRepoCount; - - /** The collaborators. */ - private int collaborators; - - /** The disk usage. */ - private int diskUsage; - - /** The owned private repo count. */ - private int ownedPrivateRepoCount; - - /** The private gist count. */ - private int privateGistCount; - - /** The created at. */ - private Date createdAt; - - /** The plan. */ - private Plan plan; - - private Permission permission; - - /** - * Gets the name. - * - * @return the name - */ - public String getName() { - return name; - } - - /** - * Sets the name. - * - * @param name - * the new name - */ - public void setName(String name) { - this.name = name; - } - - /** - * Gets the location. - * - * @return the location - */ - public String getLocation() { - return location; - } - - /** - * Sets the location. - * - * @param location - * the new location - */ - public void setLocation(String location) { - this.location = location; - } - - /** - * Gets the fullname. - * - * @return the fullname - */ - public String getFullname() { - return fullname; - } - - /** - * Sets the fullname. - * - * @param fullname - * the new fullname - */ - public void setFullname(String fullname) { - this.fullname = fullname; - } - - /** - * Gets the username. - * - * @return the username - */ - public String getUsername() { - return username; - } - - /** - * Sets the username. - * - * @param username - * the new username - */ - public void setUsername(String username) { - this.username = username; - } - - /** - * Gets the email. - * - * @return the email - */ - public String getEmail() { - return email; - } - - /** - * Sets the email. - * - * @param email - * the new email - */ - public void setEmail(String email) { - this.email = email; - } - - /** - * Gets the blog. - * - * @return the blog - */ - public String getBlog() { - return blog; - } - - /** - * Sets the blog. - * - * @param blog - * the new blog - */ - public void setBlog(String blog) { - this.blog = blog; - } - - /** - * Gets the company. - * - * @return the company - */ - public String getCompany() { - return company; - } - - /** - * Sets the company. - * - * @param company - * the new company - */ - public void setCompany(String company) { - this.company = company; - } - - /** - * Gets the id. - * - * @return the id - */ - public String getId() { - return id; - } - - /** - * Sets the id. - * - * @param id - * the new id - */ - public void setId(String id) { - this.id = id; - } - - /** - * Gets the login. - * - * @return the login - */ - public String getLogin() { - return login; - } - - /** - * Sets the login. - * - * @param login - * the new login - */ - public void setLogin(String login) { - this.login = login; - } - - /** - * Gets the following count. - * - * @return the following count - */ - public int getFollowingCount() { - return followingCount; - } - - /** - * Sets the following count. - * - * @param followingCount - * the new following count - */ - public void setFollowingCount(int followingCount) { - this.followingCount = followingCount; - } - - /** - * Gets the followers count. - * - * @return the followers count - */ - public int getFollowersCount() { - return followersCount; - } - - /** - * Sets the followers count. - * - * @param followersCount - * the new followers count - */ - public void setFollowersCount(int followersCount) { - this.followersCount = followersCount; - } - - /** - * Gets the public gist count. - * - * @return the public gist count - */ - public int getPublicGistCount() { - return publicGistCount; - } - - /** - * Sets the public gist count. - * - * @param publicGistCount - * the new public gist count - */ - public void setPublicGistCount(int publicGistCount) { - this.publicGistCount = publicGistCount; - } - - /** - * Gets the public repo count. - * - * @return the public repo count - */ - public int getPublicRepoCount() { - return publicRepoCount; - } - - /** - * Sets the public repo count. - * - * @param publicRepoCount - * the new public repo count - */ - public void setPublicRepoCount(int publicRepoCount) { - this.publicRepoCount = publicRepoCount; - } - - /** - * Gets the total private repo count. - * - * @return the total private repo count - */ - public int getTotalPrivateRepoCount() { - return totalPrivateRepoCount; - } - - /** - * Sets the total private repo count. - * - * @param totalPrivateRepoCount - * the new total private repo count - */ - public void setTotalPrivateRepoCount(int totalPrivateRepoCount) { - this.totalPrivateRepoCount = totalPrivateRepoCount; - } - - /** - * Gets the collaborators. - * - * @return the collaborators - */ - public int getCollaborators() { - return collaborators; - } - - /** - * Sets the collaborators. - * - * @param collaborators - * the new collaborators - */ - public void setCollaborators(int collaborators) { - this.collaborators = collaborators; - } - - /** - * Gets the disk usage. - * - * @return the disk usage - */ - public int getDiskUsage() { - return diskUsage; - } - - /** - * Sets the disk usage. - * - * @param diskUsage - * the new disk usage - */ - public void setDiskUsage(int diskUsage) { - this.diskUsage = diskUsage; - } - - /** - * Gets the owned private repo count. - * - * @return the owned private repo count - */ - public int getOwnedPrivateRepoCount() { - return ownedPrivateRepoCount; - } - - /** - * Sets the owned private repo count. - * - * @param ownedPrivateRepoCount - * the new owned private repo count - */ - public void setOwnedPrivateRepoCount(int ownedPrivateRepoCount) { - this.ownedPrivateRepoCount = ownedPrivateRepoCount; - } - - /** - * Gets the private gist count. - * - * @return the private gist count - */ - public int getPrivateGistCount() { - return privateGistCount; - } - - /** - * Sets the private gist count. - * - * @param privateGistCount - * the new private gist count - */ - public void setPrivateGistCount(int privateGistCount) { - this.privateGistCount = privateGistCount; - } - - /** - * Gets the plan. - * - * @return the plan - */ - public Plan getPlan() { - return plan; - } - - /** - * Sets the plan. - * - * @param plan - * the new plan - */ - public void setPlan(Plan plan) { - this.plan = plan; - } - - /** - * Gets the created at. - * - * @return the created at - */ - public Date getCreatedAt() { - return createdAt; - } - - /** - * Sets the created at. - * - * @param createdAt - * the new created at - */ - public void setCreatedAt(Date createdAt) { - this.createdAt = createdAt; - } - - /** - * Gets the gravatar id. - * - * @return the gravatar id - */ - public String getGravatarId() { - return gravatarId; - } - - /** - * Sets the gravatar id. - * - * @param gravatarId - * the new gravatar id - */ - public void setGravatarId(String gravatarId) { - this.gravatarId = gravatarId; - } - - /** - * @return the permission - */ - public Permission getPermission() { - return permission; - } - - /** - * @param permission the permission to set - */ - public void setPermission(Permission permission) { - this.permission = permission; - } - - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - return "User [blog=" + blog + ", collaborators=" + collaborators - + ", company=" + company + ", createdAt=" + createdAt - + ", diskUsage=" + diskUsage + ", email=" + email - + ", followersCount=" + followersCount + ", followingCount=" - + followingCount + ", fullname=" + fullname + ", gravatarId=" - + gravatarId + ", id=" + id + ", location=" + location - + ", login=" + login + ", name=" + name - + ", ownedPrivateRepoCount=" + ownedPrivateRepoCount - + ", plan=" + plan + ", privateGistCount=" + privateGistCount - + ", publicGistCount=" + publicGistCount + ", publicRepoCount=" - + publicRepoCount + ", totalPrivateRepoCount=" - + totalPrivateRepoCount + ", username=" + username + "]"; - } -} diff --git a/src/main/java/com/github/api/v2/schema/ValueEnum.java b/src/main/java/com/github/api/v2/schema/ValueEnum.java deleted file mode 100644 index 6e6d28b..0000000 --- a/src/main/java/com/github/api/v2/schema/ValueEnum.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.schema; - -/** - * The Interface ValueEnum. - */ -public interface ValueEnum { - - /** - * Value. - * - * @return the string - */ - public abstract String value(); -} \ No newline at end of file diff --git a/src/main/java/com/github/api/v2/services/AsyncResponseHandler.java b/src/main/java/com/github/api/v2/services/AsyncResponseHandler.java deleted file mode 100644 index d3bc72b..0000000 --- a/src/main/java/com/github/api/v2/services/AsyncResponseHandler.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import java.util.concurrent.Future; - - -/** - * The Class AsyncResponseHandler. - */ -public abstract class AsyncResponseHandler { - - /** The future. */ - private Future future; - - /** - * Sets the future. - * - * @param future - * the new future - */ - public void setFuture(Future future) { - this.future = future; - } - - /** - * Gets the future. - * - * @return the future - */ - public Future getFuture() { - return future; - } - - /** - * Handle response. - * - * @param response - * the response - */ - public abstract void handleResponse(T response); -} diff --git a/src/main/java/com/github/api/v2/services/CommitService.java b/src/main/java/com/github/api/v2/services/CommitService.java deleted file mode 100644 index d3d88c4..0000000 --- a/src/main/java/com/github/api/v2/services/CommitService.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import java.util.List; - -import com.github.api.v2.schema.Commit; - -/** - * The Interface CommitService. - */ -public interface CommitService extends GitHubService { - - /** - * Gets the commits. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * @param branch - * the branch - * - * @return the commits - */ - public List getCommits(String userName, String repositoryName, String branch); - - /** - * Gets the commits. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * @param branch - * the branch - * @param filePath - * the file path - * - * @return the commits - */ - public List getCommits(String userName, String repositoryName, String branch, String filePath); - - /** - * Gets the commit. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * @param sha - * the sha - * - * @return the commit - */ - public Commit getCommit(String userName, String repositoryName, String sha); -} diff --git a/src/main/java/com/github/api/v2/services/FeedService.java b/src/main/java/com/github/api/v2/services/FeedService.java deleted file mode 100644 index 07fb94f..0000000 --- a/src/main/java/com/github/api/v2/services/FeedService.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import com.github.api.v2.schema.Feed; - - -/** - * The Interface FeedService. - */ -public interface FeedService extends GitHubService { - - public Feed getPublicUserFeed(String userName, int count); - public Feed getPrivateUserFeed(String userName, int count); - public Feed getCommitFeed(String userName, String repositoryName, String branchName, int count); - public Feed getNetworkFeed(String userName, String repositoryName, int count); - public Feed getWikiFeed(String userName, String repositoryName, int count); - public Feed getPublicTimelineFeed(int count); - - public Feed getDiscussionsFeed(int count); - public Feed getDiscussionsFeed(String topic, int count); - public Feed getJobPositionsFeed(int count); - public Feed getBlogFeed(int count); -} diff --git a/src/main/java/com/github/api/v2/services/GistService.java b/src/main/java/com/github/api/v2/services/GistService.java deleted file mode 100644 index 36dfa76..0000000 --- a/src/main/java/com/github/api/v2/services/GistService.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import java.io.InputStream; -import java.util.List; - -import com.github.api.v2.schema.Gist; - -/** - * The Interface GistService. - */ -public interface GistService extends GitHubService { - - /** - * Gets the gist. - * - * @param gistId - * the gist id - * - * @return the gist - */ - public Gist getGist(String gistId); - - /** - * Gets the gist content. - * - * @param gistId - * the gist id - * @param fileName - * the file name - * - * @return the gist content - */ - public InputStream getGistContent(String gistId, String fileName); - - /** - * Gets the user gists. - * - * @param userName - * the user name - * - * @return the user gists - */ - public List getUserGists(String userName); -} diff --git a/src/main/java/com/github/api/v2/services/GitHubAuthenticator.java b/src/main/java/com/github/api/v2/services/GitHubAuthenticator.java deleted file mode 100644 index c576026..0000000 --- a/src/main/java/com/github/api/v2/services/GitHubAuthenticator.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import com.github.api.v2.services.auth.Authentication; - - -/** - * The Interface GitHubAuthenticator. - */ -public interface GitHubAuthenticator extends GitHubCommunicator { - - /** - * Sets the authentication. - * - * @param authentication - * the new authentication - */ - public void setAuthentication(Authentication authentication); - - /** - * Sets the user ip address. - * - * @param userIpAddress - * the new user ip address - */ - public void setUserIpAddress(String userIpAddress); - - /** - * Sets the referrer. - * - * @param referrer - * the new referrer - */ - public void setReferrer(String referrer); -} diff --git a/src/main/java/com/github/api/v2/services/GitHubCommunicator.java b/src/main/java/com/github/api/v2/services/GitHubCommunicator.java deleted file mode 100644 index f9b6ec4..0000000 --- a/src/main/java/com/github/api/v2/services/GitHubCommunicator.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import java.util.Map; - -/** - * The Interface GitHubCommunicator. - */ -public interface GitHubCommunicator { - - /** - * Sets the request headers. - * - * @param requestHeaders - * the request headers - */ - public void setRequestHeaders(Map requestHeaders); - - /** - * Gets the request headers. - * - * @return the request headers - */ - public Map getRequestHeaders(); - - /** - * Adds the request header. - * - * @param headerName - * the header name - * @param headerValue - * the header value - */ - public void addRequestHeader(String headerName, String headerValue); - - /** - * Removes the request header. - * - * @param headerName - * the header name - */ - public void removeRequestHeader(String headerName); -} diff --git a/src/main/java/com/github/api/v2/services/GitHubException.java b/src/main/java/com/github/api/v2/services/GitHubException.java deleted file mode 100644 index 39332dd..0000000 --- a/src/main/java/com/github/api/v2/services/GitHubException.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -/** - * The Class GitHubException. - */ -public class GitHubException extends RuntimeException { - - /** The Constant serialVersionUID. */ - private static final long serialVersionUID = -2392119987027760999L; - - /** - * Instantiates a new git hub exception. - */ - public GitHubException() {} - - /** - * Instantiates a new git hub exception. - * - * @param message - * the message - */ - public GitHubException(String message) { - super(message); - } - - /** - * Instantiates a new git hub exception. - * - * @param cause - * the cause - */ - public GitHubException(Throwable cause) { - super(cause); - } - - /** - * Instantiates a new git hub exception. - * - * @param message - * the message - * @param cause - * the cause - */ - public GitHubException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/src/main/java/com/github/api/v2/services/GitHubService.java b/src/main/java/com/github/api/v2/services/GitHubService.java deleted file mode 100644 index 36a84d2..0000000 --- a/src/main/java/com/github/api/v2/services/GitHubService.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -/** - * The Interface GitHubService. - */ -public interface GitHubService extends GitHubAuthenticator { - -} diff --git a/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java b/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java deleted file mode 100644 index 3b0d47b..0000000 --- a/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import com.github.api.v2.services.impl.CommitServiceImpl; -import com.github.api.v2.services.impl.FeedServiceImpl; -import com.github.api.v2.services.impl.GistServiceImpl; -import com.github.api.v2.services.impl.IssueServiceImpl; -import com.github.api.v2.services.impl.NetworkServiceImpl; -import com.github.api.v2.services.impl.OAuthServiceImpl; -import com.github.api.v2.services.impl.ObjectServiceImpl; -import com.github.api.v2.services.impl.OrganizationServiceImpl; -import com.github.api.v2.services.impl.RepositoryServiceImpl; -import com.github.api.v2.services.impl.UserServiceImpl; - - - - -/** - * A factory for creating GitHubService objects. - */ -public class GitHubServiceFactory { - - /** - * Instantiates a new git hub service factory. - */ - private GitHubServiceFactory() { - } - - /** - * New instance. - * - * @return the git hub service factory - */ - public static GitHubServiceFactory newInstance() { - return new GitHubServiceFactory(); - } - - /** - * Creates a new GitHubService object. - * - * @return the commit service - */ - public CommitService createCommitService() { - return new CommitServiceImpl(); - } - - /** - * Creates a new GitHubService object. - * - * @return the gist service - */ - public GistService createGistService() { - return new GistServiceImpl(); - } - - /** - * Creates a new GitHubService object. - * - * @return the issue service - */ - public IssueService createIssueService() { - return new IssueServiceImpl(); - } - - /** - * Creates a new GitHubService object. - * - * @return the network service - */ - public NetworkService createNetworkService() { - return new NetworkServiceImpl(); - } - - /** - * Creates a new GitHubService object. - * - * @return the object service - */ - public ObjectService createObjectService() { - return new ObjectServiceImpl(); - } - - /** - * Creates a new GitHubService object. - * - * @return the repository service - */ - public RepositoryService createRepositoryService() { - return new RepositoryServiceImpl(); - } - - /** - * Creates a new GitHubService object. - * - * @return the repository service - */ - public OrganizationService createOrganizationService() { - return new OrganizationServiceImpl(); - } - - /** - * Creates a new GitHubService object. - * - * @return the user service - */ - public UserService createUserService() { - return new UserServiceImpl(); - } - - /** - * Creates a new GitHubService object. - * - * @param clientId - * the client id - * @param secret - * the secret - * - * @return the o auth service - */ - public OAuthService createOAuthService(String clientId, String secret) { - return new OAuthServiceImpl(clientId, secret); - } - - public FeedService createFeedService() { - return new FeedServiceImpl(); - } - -} diff --git a/src/main/java/com/github/api/v2/services/IssueService.java b/src/main/java/com/github/api/v2/services/IssueService.java deleted file mode 100644 index 20108a0..0000000 --- a/src/main/java/com/github/api/v2/services/IssueService.java +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import java.util.List; - -import com.github.api.v2.schema.Comment; -import com.github.api.v2.schema.Issue; -import com.github.api.v2.schema.Issue.State; - -/** - * The Interface IssueService. - */ -public interface IssueService extends GitHubService { - - /** - * Search issues. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * @param state - * the state - * @param keyword - * the keyword - * - * @return the list< issue> - */ - public List searchIssues(String userName, String repositoryName, State state, String keyword); - - /** - * Search issues. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * @param state - * the state - * @param keyword - * the keyword - * - * @return the list< issue> - */ - public List getIssues(String userName, String repositoryName, String label); - - /** - * Gets the issues. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * @param state - * the state - * - * @return the issues - */ - public List getIssues(String userName, String repositoryName, State state); - - /** - * Gets the issue. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * @param issueNumber - * the issue number - * - * @return the issue - */ - public Issue getIssue(String userName, String repositoryName, int issueNumber); - - /** - * Gets the issue comments. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * @param issueNumber - * the issue number - * - * @return the issue comments - */ - public List getIssueComments(String userName, String repositoryName, int issueNumber); - - /** - * Creates the issue. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * @param title - * the title - * @param body - * the body - */ - public void createIssue(String userName, String repositoryName, String title, String body); - - /** - * Close issue. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * @param issueNumber - * the issue number - */ - public void closeIssue(String userName, String repositoryName, int issueNumber); - - /** - * Reopen issue. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * @param issueNumber - * the issue number - */ - public void reopenIssue(String userName, String repositoryName, int issueNumber); - - /** - * Update issue. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * @param issueNumber - * the issue number - * @param title - * the title - * @param body - * the body - */ - public void updateIssue(String userName, String repositoryName, int issueNumber, String title, String body); - - /** - * Gets the issue labels. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * - * @return the issue labels - */ - public List getIssueLabels(String userName, String repositoryName); - - /** - * Adds the label. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * @param issueNumber - * the issue number - * @param label - * the label - * - * @return the list< string> - */ - public List addLabel(String userName, String repositoryName, int issueNumber, String label); - - /** - * Removes the label. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * @param issueNumber - * the issue number - * @param label - * the label - * - * @return the list< string> - */ - public List removeLabel(String userName, String repositoryName, int issueNumber, String label); - - /** - * Adds the comment. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * @param issueNumber - * the issue number - * @param comment - * the comment - */ - public void addComment(String userName, String repositoryName, int issueNumber, String comment); - -} diff --git a/src/main/java/com/github/api/v2/services/NetworkService.java b/src/main/java/com/github/api/v2/services/NetworkService.java deleted file mode 100644 index a9c0d60..0000000 --- a/src/main/java/com/github/api/v2/services/NetworkService.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import java.util.List; - -import com.github.api.v2.schema.NetworkCommit; -import com.github.api.v2.schema.NetworkMeta; - -/** - * The Interface NetworkService. - */ -public interface NetworkService extends GitHubService { - - /** - * Gets the network meta. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * - * @return the network meta - */ - public NetworkMeta getNetworkMeta(String userName, String repositoryName); - - /** - * Gets the network data. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * @param networkHash - * the network hash - * - * @return the network data - */ - public List getNetworkData(String userName, String repositoryName, String networkHash); - - /** - * Gets the network data. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * @param networkHash - * the network hash - * @param startIndex - * the start index - * @param endIndex - * the end index - * - * @return the network data - */ - public List getNetworkData(String userName, String repositoryName, String networkHash, int startIndex, int endIndex); -} diff --git a/src/main/java/com/github/api/v2/services/OAuthService.java b/src/main/java/com/github/api/v2/services/OAuthService.java deleted file mode 100644 index 3b64a19..0000000 --- a/src/main/java/com/github/api/v2/services/OAuthService.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - -import com.github.api.v2.schema.ValueEnum; - -/** - * The Interface OAuthService. - */ -public interface OAuthService extends GitHubService { - - /** - * The Enum Permission. - */ - public enum Scope implements ValueEnum { - - /** The USER. */ - USER("user"), - /** The REPOSITORY. */ - REPOSITORY("repo"); - - /** The Constant stringToEnum. */ - private static final Map stringToEnum = new HashMap(); - - static { // Initialize map from constant name to enum constant - for (Scope op : values()) { - stringToEnum.put(op.value(), op); - } - } - - /** The value. */ - private final String value; - - /** - * Instantiates a new permission. - * - * @param value - * the value - */ - Scope(String value) { - this.value = value; - } - - /* (non-Javadoc) - * @see com.github.api.v2.schema.ValueEnum#value() - */ - @Override - public String value() { - return value; - } - - /** - * From value. - * - * @param value - * the value - * - * @return the permission - */ - public static Scope fromValue(String value) { - return stringToEnum.get(value); - } - } - - /** - * Gets the authorization url. - * - * @param callBackUrl - * the call back url - * - * @return the authorization url - */ - public String getAuthorizationUrl(String callBackUrl); - - /** - * Gets the authorization url. - * - * @param callBackUrl - * the call back url - * @param permissions - * the permissions - * - * @return the authorization url - */ - public String getAuthorizationUrl(String callBackUrl, Set permissions); - - /** - * Gets the access token. - * - * @param callBackUrl - * the call back url - * @param code - * the code - * - * @return the access token - */ - public String getAccessToken(String callBackUrl, String code); -} diff --git a/src/main/java/com/github/api/v2/services/ObjectService.java b/src/main/java/com/github/api/v2/services/ObjectService.java deleted file mode 100644 index 941919a..0000000 --- a/src/main/java/com/github/api/v2/services/ObjectService.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import java.io.InputStream; -import java.util.List; - -import com.github.api.v2.schema.Blob; -import com.github.api.v2.schema.Tree; - -/** - * The Interface ObjectService. - */ -public interface ObjectService extends GitHubService { - - /** - * Gets the tree. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * @param treeSha - * the tree sha - * - * @return the tree - */ - public List getTree(String userName, String repositoryName, String treeSha); - - /** - * Gets the blob. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * @param treeSha - * the tree sha - * @param filePath - * the file path - * - * @return the blob - */ - public Blob getBlob(String userName, String repositoryName, String treeSha, String filePath); - - /** - * Gets the blobs. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * @param treeSha - * the tree sha - * - * @return the blobs - */ - public List getBlobs(String userName, String repositoryName, String treeSha); - - /** - * Gets the object content. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * @param objectSha - * the object sha - * - * @return the object content - */ - public InputStream getObjectContent(String userName, String repositoryName, String objectSha); -} diff --git a/src/main/java/com/github/api/v2/services/OrganizationService.java b/src/main/java/com/github/api/v2/services/OrganizationService.java deleted file mode 100644 index 583f2f2..0000000 --- a/src/main/java/com/github/api/v2/services/OrganizationService.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import java.util.List; - -import com.github.api.v2.schema.Organization; -import com.github.api.v2.schema.Repository; -import com.github.api.v2.schema.Team; -import com.github.api.v2.schema.User; - -/** - * The Interface OrganizationService. - */ -public interface OrganizationService extends GitHubService { - public Organization getOrganization(String name); - public List getUserOrganizations(); - public void updateOrganization(Organization organization); - public List getAllOrganizationRepositories(); - public List getPublicRepositories(String organizationName); - public List getPublicMembers(String organizationName); - public List getTeams(String organizationName); - public void createTeam(Team team); - public Team getTeam(String teamId); - public void updateTeam(Team team); - public void deleteTeam(String teamId); - public List getTeamMembers(String teamId); - public void addTeamMember(String teamId, String userName); - public void removeTeamMember(String teamId, String userName); - public List getTeamRepositories(String teamId); - public void addTeamRepository(String userName, String repositoryName); - public void removeTeamRepository(String teamId, String userName, String repositoryName); -} diff --git a/src/main/java/com/github/api/v2/services/RepositoryService.java b/src/main/java/com/github/api/v2/services/RepositoryService.java deleted file mode 100644 index a085f54..0000000 --- a/src/main/java/com/github/api/v2/services/RepositoryService.java +++ /dev/null @@ -1,322 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import java.util.List; -import java.util.Map; -import java.util.zip.ZipInputStream; - -import com.github.api.v2.schema.Key; -import com.github.api.v2.schema.Language; -import com.github.api.v2.schema.Repository; -import com.github.api.v2.schema.User; -import com.github.api.v2.schema.Repository.Visibility; - -/** - * The Interface RepositoryService. - */ -public interface RepositoryService extends GitHubService { - - /** - * Search repositories. - * - * @param query - * the query - * - * @return the list< repository> - */ - public List searchRepositories(String query); - - /** - * Search repositories. - * - * @param query - * the query - * @param language - * the language - * - * @return the list< repository> - */ - public List searchRepositories(String query, Language language); - - /** - * Search repositories. - * - * @param query - * the query - * @param pageNumber - * the page number - * - * @return the list< repository> - */ - public List searchRepositories(String query, int pageNumber); - - /** - * Search repositories. - * - * @param query - * the query - * @param language - * the language - * @param pageNumber - * the page number - * - * @return the list< repository> - */ - public List searchRepositories(String query, Language language, int pageNumber); - - /** - * Gets the repository. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * - * @return the repository - */ - public Repository getRepository(String userName, String repositoryName); - - /** - * Update repository. - * - * @param repository - * the repository - */ - public void updateRepository(Repository repository); - - /** - * Gets the repositories. - * - * @param userName - * the user name - * - * @return the repositories - */ - public List getRepositories(String userName); - - /** - * Watch repository. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - */ - public void watchRepository(String userName, String repositoryName); - - /** - * Unwatch repository. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - */ - public void unwatchRepository(String userName, String repositoryName); - - /** - * Fork repository. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * - * @return the repository - */ - public Repository forkRepository(String userName, String repositoryName); - - /** - * Creates the repository. - * - * @param name - * the name - * @param description - * the description - * @param homePage - * the home page - * @param visibility - * the visibility - */ - public void createRepository(String name, String description, String homePage, Visibility visibility); - - /** - * Delete repository. - * - * @param repositoryName - * the repository name - */ - public void deleteRepository(String repositoryName); - - /** - * Change visibility. - * - * @param repositoryName - * the repository name - * @param visibility - * the visibility - */ - public void changeVisibility(String repositoryName, Visibility visibility); - - /** - * Gets the deploy keys. - * - * @param repositoryName - * the repository name - * - * @return the deploy keys - */ - public List getDeployKeys(String repositoryName); - - /** - * Adds the deploy key. - * - * @param repositoryName - * the repository name - * @param title - * the title - * @param key - * the key - * - * @return the string - */ - public List addDeployKey(String repositoryName, String title, String key); - - /** - * Removes the deploy key. - * - * @param repository - * the repository - * @param id - * the id - */ - public void removeDeployKey(String repository, String id); - - /** - * Gets the collaborators. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * - * @return the collaborators - */ - public List getCollaborators(String userName, String repositoryName); - - /** - * Adds the collaborator. - * - * @param repositoryName - * the repository name - * @param collaboratorName - * the collaborator name - */ - public void addCollaborator(String repositoryName, String collaboratorName); - - /** - * Removes the collaborator. - * - * @param repositoryName - * the repository name - * @param collaboratorName - * the collaborator name - */ - public void removeCollaborator(String repositoryName, String collaboratorName); - - /** - * Gets the pushable repositories. - * - * @return the pushable repositories - */ - public List getPushableRepositories(); - - /** - * Gets the contributors. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * - * @return the contributors - */ - public List getContributors(String userName, String repositoryName); - - /** - * Gets the watchers. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * - * @return the watchers - */ - public List getWatchers(String userName, String repositoryName); - - /** - * Gets the forks. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * - * @return the forks - */ - public List getForks(String userName, String repositoryName); - - /** - * Gets the language breakdown. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * - * @return the language breakdown - */ - public Map getLanguageBreakdown(String userName, String repositoryName); - - /** - * Gets the tags. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * - * @return the tags - */ - public Map getTags(String userName, String repositoryName); - - /** - * Gets the branches. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * - * @return the branches - */ - public Map getBranches(String userName, String repositoryName); - - public ZipInputStream getRepositoryArchive(String userName, String repositoryName, String branchName); -} diff --git a/src/main/java/com/github/api/v2/services/UserService.java b/src/main/java/com/github/api/v2/services/UserService.java deleted file mode 100644 index f2223d1..0000000 --- a/src/main/java/com/github/api/v2/services/UserService.java +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import java.util.List; - -import com.github.api.v2.schema.Key; -import com.github.api.v2.schema.Organization; -import com.github.api.v2.schema.Repository; -import com.github.api.v2.schema.User; - -/** - * The Interface UserService. - */ -public interface UserService extends GitHubService { - - /** - * Search users by name. - * - * @param name - * the name - * - * @return the list< user> - */ - public List searchUsersByName(String name); - - /** - * Gets the user by email. - * - * @param email - * the email - * - * @return the user by email - */ - public User getUserByEmail(String email); - - /** - * Gets the user by username. - * - * @param userName - * the user name - * - * @return the user by username - */ - public User getUserByUsername(String userName); - - /** - * Gets the current user. - * - * @return the current user - */ - public User getCurrentUser(); - - /** - * Update user. - * - * @param user - * the user - */ - public void updateUser(User user); - - /** - * Gets the user followers. - * - * @param userName - * the user name - * - * @return the user followers - */ - public List getUserFollowers(String userName); - - /** - * Gets the user following. - * - * @param userName - * the user name - * - * @return the user following - */ - public List getUserFollowing(String userName); - - /** - * Follow user. - * - * @param userName - * the user name - */ - public void followUser(String userName); - - /** - * Unfollow user. - * - * @param userName - * the user name - */ - public void unfollowUser(String userName); - - /** - * Gets the watched repositories. - * - * @param userName - * the user name - * - * @return the watched repositories - */ - public List getWatchedRepositories(String userName); - - /** - * Gets the keys. - * - * @return the keys - */ - public List getKeys(); - - /** - * Adds the key. - * - * @param title - * the title - * @param key - * the key - */ - public void addKey(String title, String key); - - /** - * Removes the key. - * - * @param id - * the id - */ - public void removeKey(String id); - - /** - * Gets the emails. - * - * @return the emails - */ - public List getEmails(); - - /** - * Adds the email. - * - * @param email - * the email - */ - public void addEmail(String email); - - /** - * Removes the email. - * - * @param email - * the email - */ - public void removeEmail(String email); - - public List getUserOrganizations(String userName); -} diff --git a/src/main/java/com/github/api/v2/services/auth/Authentication.java b/src/main/java/com/github/api/v2/services/auth/Authentication.java deleted file mode 100644 index 05afe8a..0000000 --- a/src/main/java/com/github/api/v2/services/auth/Authentication.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services.auth; - -/** - * The Interface Authentication. - */ -public interface Authentication { - -} diff --git a/src/main/java/com/github/api/v2/services/auth/HeaderBasedAuthentication.java b/src/main/java/com/github/api/v2/services/auth/HeaderBasedAuthentication.java deleted file mode 100644 index 6f321f6..0000000 --- a/src/main/java/com/github/api/v2/services/auth/HeaderBasedAuthentication.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services.auth; - -import java.util.Map; - -/** - * The Interface HeaderBasedAuthentication. - */ -public interface HeaderBasedAuthentication extends Authentication { - - /** - * Gets the headers. - * - * @return the headers - */ - public Map getHeaders(); -} diff --git a/src/main/java/com/github/api/v2/services/auth/LoginPasswordAuthentication.java b/src/main/java/com/github/api/v2/services/auth/LoginPasswordAuthentication.java deleted file mode 100644 index 1217479..0000000 --- a/src/main/java/com/github/api/v2/services/auth/LoginPasswordAuthentication.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services.auth; - -import java.util.HashMap; -import java.util.Map; - -import com.github.api.v2.services.util.Base64; - - -/** - * The Class LoginPasswordAuthentication. - */ -public class LoginPasswordAuthentication implements HeaderBasedAuthentication { - - /** The Constant AUTHORIZATION. */ - private static final String AUTHORIZATION = "Authorization"; - - /** The Constant BASIC. */ - private static final String BASIC = "Basic "; - - /** The login. */ - public String login; - - /** The password. */ - public String password; - - /** - * Instantiates a new login password authentication. - * - * @param login - * the login - * @param password - * the password - */ - public LoginPasswordAuthentication(String login, String password) { - this.login = login; - this.password = password; - } - - /** - * Gets the login. - * - * @return the login - */ - public String getLogin() { - return login; - } - - /** - * Sets the login. - * - * @param login - * the new login - */ - public void setLogin(String login) { - this.login = login; - } - - /** - * Gets the password. - * - * @return the password - */ - public String getPassword() { - return password; - } - - /** - * Sets the password. - * - * @param password - * the new password - */ - public void setPassword(String password) { - this.password = password; - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.auth.HeaderBasedAuthentication#getHeaders() - */ - @Override - public Map getHeaders() { - Map headers = new HashMap(); - String credentials = login + ":" + password; - headers.put(AUTHORIZATION, BASIC + Base64.encodeBytes(credentials.getBytes())); - return headers; - } -} diff --git a/src/main/java/com/github/api/v2/services/auth/LoginTokenAuthentication.java b/src/main/java/com/github/api/v2/services/auth/LoginTokenAuthentication.java deleted file mode 100644 index 3b1fd25..0000000 --- a/src/main/java/com/github/api/v2/services/auth/LoginTokenAuthentication.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services.auth; - -import java.util.HashMap; -import java.util.Map; - -import com.github.api.v2.services.constant.ParameterNames; - - -/** - * The Class LoginTokenAuthentication. - */ -public class LoginTokenAuthentication implements ParameterBasedAuthentication { - - /** The login. */ - private String login; - - /** The token. */ - private String token; - - /** - * Instantiates a new login token authentication. - * - * @param login - * the login - * @param token - * the token - */ - public LoginTokenAuthentication(String login, String token) { - this.login = login; - this.token = token; - } - - /** - * Gets the login. - * - * @return the login - */ - public String getLogin() { - return login; - } - - /** - * Sets the login. - * - * @param login - * the new login - */ - public void setLogin(String login) { - this.login = login; - } - - /** - * Gets the token. - * - * @return the token - */ - public String getToken() { - return token; - } - - /** - * Sets the token. - * - * @param token - * the new token - */ - public void setToken(String token) { - this.token = token; - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.auth.ParameterBasedAuthentication#getParameters() - */ - @Override - public Map getParameters() { - Map parameters = new HashMap(); - parameters.put(ParameterNames.LOGIN, login); - parameters.put(ParameterNames.TOKEN, token); - return parameters; - } -} diff --git a/src/main/java/com/github/api/v2/services/auth/OAuthAuthentication.java b/src/main/java/com/github/api/v2/services/auth/OAuthAuthentication.java deleted file mode 100644 index 7aaa723..0000000 --- a/src/main/java/com/github/api/v2/services/auth/OAuthAuthentication.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services.auth; - -import java.util.HashMap; -import java.util.Map; - -import com.github.api.v2.services.constant.ParameterNames; - - -/** - * The Class OAuthAuthentication. - */ -public class OAuthAuthentication implements ParameterBasedAuthentication { - - /** The access token. */ - private String accessToken; - - /** - * Instantiates a new o auth authentication. - * - * @param accessToken - * the access token - */ - public OAuthAuthentication(String accessToken) { - this.accessToken = accessToken; - } - - /** - * Gets the access token. - * - * @return the access token - */ - public String getAccessToken() { - return accessToken; - } - - /** - * Sets the access token. - * - * @param accessToken - * the new access token - */ - public void setAccessToken(String accessToken) { - this.accessToken = accessToken; - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.auth.ParameterBasedAuthentication#getParameters() - */ - @Override - public Map getParameters() { - Map parameters = new HashMap(); - parameters.put(ParameterNames.ACCESS_TOKEN, accessToken); - return parameters; - } -} diff --git a/src/main/java/com/github/api/v2/services/auth/ParameterBasedAuthentication.java b/src/main/java/com/github/api/v2/services/auth/ParameterBasedAuthentication.java deleted file mode 100644 index ce8d497..0000000 --- a/src/main/java/com/github/api/v2/services/auth/ParameterBasedAuthentication.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services.auth; - -import java.util.Map; - -/** - * The Interface ParameterBasedAuthentication. - */ -public interface ParameterBasedAuthentication extends Authentication { - - /** - * Gets the parameters. - * - * @return the parameters - */ - public Map getParameters(); -} diff --git a/src/main/java/com/github/api/v2/services/constant/ApplicationConstants.java b/src/main/java/com/github/api/v2/services/constant/ApplicationConstants.java deleted file mode 100644 index f867b00..0000000 --- a/src/main/java/com/github/api/v2/services/constant/ApplicationConstants.java +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services.constant; - -import java.io.IOException; -import java.util.Properties; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.regex.Pattern; - -/** - * The Class ApplicationConstants. - */ -public final class ApplicationConstants { - - /** The Constant APP_CONSTANTS_FILE. */ - public static final String APP_CONSTANTS_FILE = "ApplicationConstants.properties"; - - /** The Constant LOG. */ - private static final Logger LOG = Logger.getLogger(ApplicationConstants.class.getCanonicalName()); - - /** The Constant applicationConstants. */ - private static final Properties applicationConstants = new Properties(); - - static { - try { - applicationConstants.load( - ApplicationConstants.class.getResourceAsStream(APP_CONSTANTS_FILE)); - } catch (IOException e) { - LOG.log(Level.SEVERE, "An error occurred while loading properties.", e); - } - } - - /** The Constant CONTENT_ENCODING. */ - public static final String CONTENT_ENCODING = getProperty("com.github.api.v2.services.encoding"); - - /** The Constant DEFAULT_API_VERSION. */ - public static final String DEFAULT_API_VERSION = getProperty("com.github.api.v2.services.defaultApiVersion"); - - /** The Constant DEFAULT_FORMAT. */ - public static final String DEFAULT_FORMAT = getProperty("com.github.api.v2.services.defaultFormat"); - - /** The Constant DATE_FORMAT. */ - public static final String DATE_FORMAT = getProperty("com.github.api.v2.services.dateFormat"); - - /** The Constant CONNECT_TIMEOUT. */ - public static final int CONNECT_TIMEOUT = getIntProperty("com.github.api.v2.services.connectTimeout"); - - /** The Constant READ_TIMEOUT. */ - public static final int READ_TIMEOUT = getIntProperty("com.github.api.v2.services.readTimeout"); - - /** The Constant ACCESS_TOKEN_PATTERN. */ - public static final Pattern ACCESS_TOKEN_PATTERN = getPatternProperty("com.github.api.v2.services.accessTokenPattern"); - - /** The Constant ACCESS_DENIED_PATTERN. */ - public static final Pattern ACCESS_DENIED_PATTERN = getPatternProperty("com.github.api.v2.services.accessDeniedPattern"); - - /** - * Instantiates a new application constants. - */ - private ApplicationConstants() {} - - /** - * Gets the property. - * - * @param key - * the key - * - * @return the property - */ - public static String getProperty(String key) { - return applicationConstants.getProperty(key); - } - - /** - * Gets the int property. - * - * @param key - * the key - * - * @return the int property - */ - public static int getIntProperty(String key) { - String property = applicationConstants.getProperty(key); - - if (isNullOrEmpty(property)) { - return 0; - } else { - return Integer.parseInt(property); - } - } - - /** - * Gets the boolean property. - * - * @param key - * the key - * - * @return the boolean property - */ - public static boolean getBooleanProperty(String key) { - String property = applicationConstants.getProperty(key); - - if (isNullOrEmpty(property)) { - return false; - } else { - return Boolean.parseBoolean(property); - } - } - - /** - * Gets the double property. - * - * @param key - * the key - * - * @return the double property - */ - public static double getDoubleProperty(String key) { - String property = applicationConstants.getProperty(key); - - if (isNullOrEmpty(property)) { - return 0; - } else { - return Double.parseDouble(property); - } - } - - /** - * Gets the long property. - * - * @param key - * the key - * - * @return the long property - */ - public static long getLongProperty(String key) { - String property = applicationConstants.getProperty(key); - - if (isNullOrEmpty(property)) { - return 0; - } else { - return Long.parseLong(property); - } - } - - /** - * Gets the pattern property. - * - * @param key - * the key - * - * @return the pattern property - */ - public static Pattern getPatternProperty(String key) { - String property = applicationConstants.getProperty(key); - - if (isNullOrEmpty(property)) { - return null; - } else { - return Pattern.compile(property); - } - } - - /** - * Checks if is null or empty. - * - * @param s - * the s - * - * @return true, if is null or empty - */ - private static boolean isNullOrEmpty(String s) { - return ((s == null) || s.length() == 0); - } -} diff --git a/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java b/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java deleted file mode 100644 index cc54f3d..0000000 --- a/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java +++ /dev/null @@ -1,653 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services.constant; - -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Properties; -import java.util.Set; -import java.util.logging.Level; -import java.util.logging.Logger; - -import com.github.api.v2.schema.ValueEnum; - -/** - * The Class GitHubApiUrls. - */ -public final class GitHubApiUrls { - - /** The Constant API_URLS_FILE. */ - public static final String API_URLS_FILE = "GitHubApiUrls.properties"; - - /** The Constant logger. */ - private static final Logger logger = Logger.getLogger(GitHubApiUrls.class.getCanonicalName()); - - /** The Constant gitHubApiUrls. */ - private static final Properties gitHubApiUrls = new Properties(); - - static { - try { - gitHubApiUrls.load(GitHubApiUrls.class.getResourceAsStream(API_URLS_FILE)); - } catch (IOException e) { - logger.log(Level.SEVERE, "An error occurred while loading urls.", e); - } - } - - /** - * The Interface OAuthUrls. - */ - public static interface OAuthUrls { - - /** The Constant AUTHORIZE_URL. */ - public static final String AUTHORIZE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.oauthService.authorize"); - - /** The Constant ACCESS_TOKEN_URL. */ - public static final String ACCESS_TOKEN_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.oauthService.accessToken"); - } - - /** - * The Interface UserApiUrls. - */ - public static interface UserApiUrls { - - /** The Constant SEARCH_USERS_BY_NAME_URL. */ - public static final String SEARCH_USERS_BY_NAME_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.searchUsersByName"); - - /** The Constant SEARCH_USERS_BY_EMAIL_URL. */ - public static final String SEARCH_USERS_BY_EMAIL_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.searchUsersByEmail"); - - /** The Constant GET_USER_URL. */ - public static final String GET_USER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getUser"); - - /** The Constant GET_CURRENT_USER_URL. */ - public static final String GET_CURRENT_USER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getCurrentUser"); - - /** The Constant UPDATE_USER_URL. */ - public static final String UPDATE_USER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.updateUser"); - - /** The Constant GET_USER_FOLLOWERS_URL. */ - public static final String GET_USER_FOLLOWERS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getUserFollowers"); - - /** The Constant GET_USER_FOLLOWING_URL. */ - public static final String GET_USER_FOLLOWING_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getUserFollowing"); - - /** The Constant FOLLOW_USER_URL. */ - public static final String FOLLOW_USER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.followUser"); - - /** The Constant UNFOLLOW_USER_URL. */ - public static final String UNFOLLOW_USER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.unfollowUser"); - - /** The Constant GET_WATCHED_REPOSITORIES_URL. */ - public static final String GET_WATCHED_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getWatchedRepositories"); - - /** The Constant GET_KEYS_URL. */ - public static final String GET_KEYS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getKeys"); - - /** The Constant ADD_KEY_URL. */ - public static final String ADD_KEY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.addKey"); - - /** The Constant REMOVE_KEY_URL. */ - public static final String REMOVE_KEY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.removeKey"); - - /** The Constant GET_EMAILS_URL. */ - public static final String GET_EMAILS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getEmails"); - - /** The Constant ADD_EMAIL_URL. */ - public static final String ADD_EMAIL_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.addEmail"); - - /** The Constant REMOVE_EMAIL_URL. */ - public static final String REMOVE_EMAIL_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.removeEmail"); - - /** The Constant GET_USER_ORGANIZATIONS. */ - public static final String GET_USER_ORGANIZATIONS = gitHubApiUrls.getProperty("com.github.api.v2.services.userService.getUserOrganizations"); - - } - - /** - * The Interface IssueApiUrls. - */ - public static interface IssueApiUrls { - - /** The Constant SEARCH_ISSUES_URL. */ - public static final String SEARCH_ISSUES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.searchIssues"); - - /** The Constant GET_ISSUES_URL. */ - public static final String GET_ISSUES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.getIssues"); - - /** The Constant GET_ISSUE_URL. */ - public static final String GET_ISSUE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.getIssue"); - - /** The Constant GET_ISSUE_COMMENTS_URL. */ - public static final String GET_ISSUE_COMMENTS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.getIssueComments"); - - /** The Constant CREATE_ISSUE_URL. */ - public static final String CREATE_ISSUE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.createIssue"); - - /** The Constant CLOSE_ISSUE_URL. */ - public static final String CLOSE_ISSUE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.closeIssue"); - - /** The Constant REOPEN_ISSUE_URL. */ - public static final String REOPEN_ISSUE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.reopenIssue"); - - /** The Constant UPDATE_ISSUE_URL. */ - public static final String UPDATE_ISSUE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.updateIssue"); - - /** The Constant GET_ISSUE_LABELS_URL. */ - public static final String GET_ISSUE_LABELS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.getIssueLabels"); - - /** The Constant ADD_LABEL_URL. */ - public static final String ADD_LABEL_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.addLabel"); - - /** The Constant REMOVE_LABEL_URL. */ - public static final String REMOVE_LABEL_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.removeLabel"); - - /** The Constant ADD_COMMENT_URL. */ - public static final String ADD_COMMENT_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.addComment"); - - public static final String GET_ISSUES_BY_LABEL_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.getIssuesByLabel"); - } - - /** - * The Interface GistApiUrls. - */ - public static interface GistApiUrls { - - /** The Constant GET_GIST_URL. */ - public static final String GET_GIST_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.gistService.getGist"); - - /** The Constant GET_GIST_CONTENT_URL. */ - public static final String GET_GIST_CONTENT_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.gistService.getGistContent"); - - /** The Constant GET_USER_GISTS_URL. */ - public static final String GET_USER_GISTS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.gistService.getUserGists"); - } - - /** - * The Interface NetworkApiUrls. - */ - public static interface NetworkApiUrls { - - /** The Constant GET_NETWORK_META_URL. */ - public static final String GET_NETWORK_META_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.networkService.getNetworkMeta"); - - /** The Constant GET_NETWORK_DATA_URL. */ - public static final String GET_NETWORK_DATA_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.networkService.getNetworkData"); - } - - /** - * The Interface RepositoryApiUrls. - */ - public static interface RepositoryApiUrls { - - /** The Constant SEARCH_REPOSITORIES_URL. */ - public static final String SEARCH_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.searchRepositories"); - - /** The Constant GET_REPOSITORY_URL. */ - public static final String GET_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getRepository"); - - /** The Constant UPDATE_REPOSITORY_URL. */ - public static final String UPDATE_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.updateRepository"); - - /** The Constant GET_REPOSITORIES_URL. */ - public static final String GET_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getRepositories"); - - /** The Constant WATCH_REPOSITORY_URL. */ - public static final String WATCH_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.watchRepository"); - - /** The Constant UNWATCH_REPOSITORY_URL. */ - public static final String UNWATCH_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.unwatchRepository"); - - /** The Constant FORK_REPOSITORY_URL. */ - public static final String FORK_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.forkRepository"); - - /** The Constant CREATE_REPOSITORY_URL. */ - public static final String CREATE_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.createRepository"); - - /** The Constant DELETE_REPOSITORY_URL. */ - public static final String DELETE_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.deleteRepository"); - - /** The Constant CHANGE_VISIBILITY_URL. */ - public static final String CHANGE_VISIBILITY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.changeVisibility"); - - /** The Constant GET_DEPLOY_KEYS_URL. */ - public static final String GET_DEPLOY_KEYS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getKeys"); - - /** The Constant ADD_DEPLOY_KEY_URL. */ - public static final String ADD_DEPLOY_KEY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.addKey"); - - /** The Constant REMOVE_DEPLOY_KEY_URL. */ - public static final String REMOVE_DEPLOY_KEY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.removeKey"); - - /** The Constant GET_COLLABORATORS_URL. */ - public static final String GET_COLLABORATORS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getCollaborators"); - - /** The Constant ADD_COLLABORATOR_URL. */ - public static final String ADD_COLLABORATOR_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.addCollaborator"); - - /** The Constant REMOVE_COLLABORATOR_URL. */ - public static final String REMOVE_COLLABORATOR_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.removeCollaborator"); - - /** The Constant GET_PUSHABLE_REPOSITORIES_URL. */ - public static final String GET_PUSHABLE_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getPushableRepositories"); - - /** The Constant GET_CONTRIBUTORS_URL. */ - public static final String GET_CONTRIBUTORS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getContributors"); - - /** The Constant GET_WATCHERS_URL. */ - public static final String GET_WATCHERS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getWatchers"); - - /** The Constant GET_FORKS_URL. */ - public static final String GET_FORKS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getForks"); - - /** The Constant GET_LANGUAGE_BREAKDOWN_URL. */ - public static final String GET_LANGUAGE_BREAKDOWN_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getLanguageBreakdown"); - - /** The Constant GET_TAGS_URL. */ - public static final String GET_TAGS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getTags"); - - /** The Constant GET_BRANCHES_URL. */ - public static final String GET_BRANCHES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getBranches"); - - /** The Constant GET_REPOSITORY_ARCHIVE_URL. */ - public static final String GET_REPOSITORY_ARCHIVE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getRepositoryArchive"); - } - - /** - * The Interface CommitApiUrls. - */ - public static interface CommitApiUrls { - - /** The Constant GET_COMMITS_URL. */ - public static final String GET_COMMITS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.commitService.getCommits"); - - /** The Constant GET_COMMITS_FILE_URL. */ - public static final String GET_COMMITS_FILE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.commitService.getCommitsFile"); - - /** The Constant GET_COMMIT_URL. */ - public static final String GET_COMMIT_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.commitService.getCommit"); - } - - /** - * The Interface ObjectApiUrls. - */ - public static interface ObjectApiUrls { - - /** The Constant GET_TREE_URL. */ - public static final String GET_TREE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.objectService.getTree"); - - /** The Constant GET_BLOB_URL. */ - public static final String GET_BLOB_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.objectService.getBlob"); - - /** The Constant GET_BLOBS_URL. */ - public static final String GET_BLOBS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.objectService.getBlobs"); - - /** The Constant GET_OBJECT_CONTENT_URL. */ - public static final String GET_OBJECT_CONTENT_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.objectService.getObjectContent"); - } - - /** - * The Interface OrganizationApiUrls. - */ - public static interface OrganizationApiUrls { - - /** The Constant GET_ORGANIZATION_URL. */ - public static final String GET_ORGANIZATION_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getOrganization"); - - /** The Constant GET_ORGANIZATION_URL. */ - public static final String GET_ORGANIZATIONS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getOrganizations"); - - /** The Constant UPDATE_ORGANIZATION_URL. */ - public static final String UPDATE_ORGANIZATION_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.updateOrganization"); - - /** The Constant GET_ALL_REPOSITORIES_URL. */ - public static final String GET_ALL_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getAllRepositories"); - - /** The Constant GET_PUBLIC_REPOSITORIES_URL. */ - public static final String GET_PUBLIC_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getPublicRepositories"); - - /** The Constant GET_PUBLIC_MEMBERS_URL. */ - public static final String GET_PUBLIC_MEMBERS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getPublicMembers"); - - /** The Constant GET_TEAMS_URL. */ - public static final String GET_TEAMS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getTeams"); - - /** The Constant CREATE_TEAM_URL. */ - public static final String CREATE_TEAM_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.createTeam"); - - /** The Constant GET_TEAM_URL. */ - public static final String GET_TEAM_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getTeam"); - - /** The Constant UPDATE_TEAM_URL. */ - public static final String UPDATE_TEAM_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.updateTeam"); - - /** The Constant DELETE_TEAM_URL. */ - public static final String DELETE_TEAM_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.deleteTeam"); - - /** The Constant GET_TEAM_MEMBERS_URL. */ - public static final String GET_TEAM_MEMBERS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getTeamMembers"); - - /** The Constant ADD_TEAM_MEMBER_URL. */ - public static final String ADD_TEAM_MEMBER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.addTeamMember"); - - /** The Constant REMOVE_TEAM_MEMBER_URL. */ - public static final String REMOVE_TEAM_MEMBER_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.removeTeamMember"); - - /** The Constant GET_TEAM_REPOSITORIES_URL. */ - public static final String GET_TEAM_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getTeamRepositories"); - - /** The Constant ADD_TEAM_REPOSITORY_URL. */ - public static final String ADD_TEAM_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.addTeamRepository"); - - /** The Constant REMOVE_TEAM_REPOSITORY_URL. */ - public static final String REMOVE_TEAM_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.removeTeamRepository"); - } - - - /** - * The Interface ObjectApiUrls. - */ - public static interface FeedUrls { - /** The Constant GET_PUBLIC_USER_FEED_URL. */ - public static final String GET_PUBLIC_USER_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getPublicUserFeed"); - - /** The Constant GET_PRIVATE_USER_FEED_URL. */ - public static final String GET_PRIVATE_USER_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getPrivateUserFeed"); - - /** The Constant GET_COMMIT_FEED_URL. */ - public static final String GET_COMMIT_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getCommitFeed"); - - /** The Constant GET_NETWORK_FEED_URL. */ - public static final String GET_NETWORK_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getNetworkFeed"); - - /** The Constant GET_WIKI_FEED_URL. */ - public static final String GET_WIKI_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getWikiFeed"); - - /** The Constant GET_PUBLIC_TIMELINE_FEED_URL. */ - public static final String GET_PUBLIC_TIMELINE_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getPublicTimelineFeed"); - - /** The Constant GET_DISCUSSIONS_FEED_URL. */ - public static final String GET_DISCUSSIONS_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getDiscussionsFeed"); - - /** The Constant GET_DISCUSSIONS_FEED_BY_TOPIC_URL. */ - public static final String GET_DISCUSSIONS_FEED_BY_TOPIC_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getDiscussionsFeedByTopic"); - - /** The Constant GET_JOB_POSITIONS_FEED_URL. */ - public static final String GET_JOB_POSITIONS_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getJobPositionsFeed"); - - /** The Constant GET_BLOG_FEED_URL. */ - public static final String GET_BLOG_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getBlogFeed"); - } - - /** - * Instantiates a new git hub api urls. - */ - private GitHubApiUrls() {} - - /** - * The Class GitHubApiUrlBuilder. - */ - public static class GitHubApiUrlBuilder { - - /** The Constant API_URLS_PLACEHOLDER_START. */ - private static final char API_URLS_PLACEHOLDER_START = '{'; - - /** The Constant API_URLS_PLACEHOLDER_END. */ - private static final char API_URLS_PLACEHOLDER_END = '}'; - - /** The url format. */ - private String urlFormat; - - /** The parameters map. */ - private Map parametersMap = new HashMap(); - - /** The fields map. */ - private Map fieldsMap = new HashMap(); - - /** - * Instantiates a new git hub api url builder. - * - * @param urlFormat - * the url format - */ - public GitHubApiUrlBuilder(String urlFormat) { - this(urlFormat, ApplicationConstants.DEFAULT_API_VERSION, ApplicationConstants.DEFAULT_FORMAT); - } - - /** - * Instantiates a new git hub api url builder. - * - * @param urlFormat - * the url format - * @param apiVersion - * the api version - * @param format - * the format - */ - public GitHubApiUrlBuilder(String urlFormat, String apiVersion, String format) { - this.urlFormat = urlFormat; - fieldsMap.put(ParameterNames.VERSION, apiVersion); - fieldsMap.put(ParameterNames.FORMAT, format); - } - - /** - * With parameter. - * - * @param name - * the name - * @param value - * the value - * - * @return the git hub api url builder - */ - public GitHubApiUrlBuilder withParameter(String name, String value) { - if (value != null && value.length() > 0) { - parametersMap.put(name, encodeUrl(value)); - } - - return this; - } - - /** - * With parameter enum. - * - * @param name - * the name - * @param value - * the value - * - * @return the git hub api url builder - */ - public GitHubApiUrlBuilder withParameterEnum(String name, ValueEnum value) { - withParameter(name, value.value()); - - return this; - } - - /** - * With parameter enum set. - * - * @param name - * the name - * @param enumSet - * the enum set - * @param separator - * the separator - * - * @return the git hub api url builder - */ - public GitHubApiUrlBuilder withParameterEnumSet(String name, Set enumSet, String separator) { - StringBuilder builder = new StringBuilder(); - - for (Iterator iterator = enumSet.iterator(); iterator.hasNext();) { - builder.append(encodeUrl(iterator.next().value())); - if (iterator.hasNext()) { - builder.append(separator); - } - } - - parametersMap.put(name, builder.toString()); - - return this; - } - - /** - * With empty field. - * - * @param name - * the name - * - * @return the git hub api url builder - */ - public GitHubApiUrlBuilder withEmptyField(String name) { - fieldsMap.put(name, ""); - - return this; - } - - /** - * With field. - * - * @param name - * the name - * @param value - * the value - * - * @return the git hub api url builder - */ - public GitHubApiUrlBuilder withField(String name, String value) { - withField(name, value, false); - - return this; - } - - /** - * With field. - * - * @param name - * the name - * @param value - * the value - * @param escape - * the escape - * - * @return the git hub api url builder - */ - public GitHubApiUrlBuilder withField(String name, String value, - boolean escape) { - if (escape) { - fieldsMap.put(name, encodeUrl(value)); - } else { - fieldsMap.put(name, value); - } - - return this; - } - - /** - * With field enum. - * - * @param name - * the name - * @param value - * the value - * - * @return the git hub api url builder - */ - public GitHubApiUrlBuilder withFieldEnum(String name, ValueEnum value) { - if (value.value() == null || value.value().length() == 0) { - fieldsMap.put(name, ""); - } else { - fieldsMap.put(name, value.value()); - } - - return this; - } - - - /** - * Builds the url. - * - * @return the string - */ - public String buildUrl() { - StringBuilder urlBuilder = new StringBuilder(); - StringBuilder placeHolderBuilder = new StringBuilder(); - boolean placeHolderFlag = false; - boolean firstParameter = true; - for (int i = 0; i < urlFormat.length(); i++) { - if (urlFormat.charAt(i) == API_URLS_PLACEHOLDER_START) { - placeHolderBuilder = new StringBuilder(); - placeHolderFlag = true; - } else if (placeHolderFlag - && urlFormat.charAt(i) == API_URLS_PLACEHOLDER_END) { - String placeHolder = placeHolderBuilder.toString(); - if (fieldsMap.containsKey(placeHolder)) { - urlBuilder.append(fieldsMap.get(placeHolder)); - } else if (parametersMap.containsKey(placeHolder)) { - StringBuilder builder = new StringBuilder(); - if (firstParameter) { - firstParameter = false; - } else { - builder.append("&"); - } - builder.append(placeHolder); - builder.append("="); - builder.append(parametersMap.get(placeHolder)); - urlBuilder.append(builder.toString()); - } else { - // we did not find a binding for the placeholder. - // skip it. - // urlBuilder.append(API_URLS_PLACEHOLDER_START); - // urlBuilder.append(placeHolder); - // urlBuilder.append(API_URLS_PLACEHOLDER_END); - } - placeHolderFlag = false; - } else if (placeHolderFlag) { - placeHolderBuilder.append(urlFormat.charAt(i)); - } else { - urlBuilder.append(urlFormat.charAt(i)); - } - } - - - logger.log(Level.FINE, "URL generated: " + urlBuilder.toString()); - - return urlBuilder.toString(); - } - - /** - * Encode url. - * - * @param original - * the original - * - * @return the string - */ - private static String encodeUrl(String original) { - try { - return URLEncoder.encode(original, ApplicationConstants.CONTENT_ENCODING); - } catch (UnsupportedEncodingException e) { - // should never be here.. - return original; - } - } - } -} diff --git a/src/main/java/com/github/api/v2/services/constant/ParameterNames.java b/src/main/java/com/github/api/v2/services/constant/ParameterNames.java deleted file mode 100644 index 49790be..0000000 --- a/src/main/java/com/github/api/v2/services/constant/ParameterNames.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services.constant; - -/** - * The Interface ParameterNames. - */ -public interface ParameterNames { - - /** The Constant VERSION. */ - public static final String VERSION = "version"; - - /** The Constant USER_NAME. */ - public static final String USER_NAME = "userName"; - - /** The Constant EMAIL. */ - public static final String EMAIL = "email"; - - /** The Constant REPOSITORY_NAME. */ - public static final String REPOSITORY_NAME = "repositoryName"; - - /** The Constant KEYWORD. */ - public static final String KEYWORD = "keyword"; - - /** The Constant STATE. */ - public static final String STATE = "state"; - - /** The Constant ISSUE_NUMBER. */ - public static final String ISSUE_NUMBER = "issueNumber"; - - /** The Constant LABEL. */ - public static final String LABEL = "label"; - - /** The Constant GIST_ID. */ - public static final String GIST_ID = "gistId"; - - /** The Constant FILE_NAME. */ - public static final String FILE_NAME = "fileName"; - - /** The Constant NET_HASH. */ - public static final String NET_HASH = "netHash"; - - /** The Constant START_INDEX. */ - public static final String START_INDEX = "startIndex"; - - /** The Constant END_INDEX. */ - public static final String END_INDEX = "endIndex"; - - /** The Constant LANGUAGE. */ - public static final String LANGUAGE = "language"; - - /** The Constant START_PAGE. */ - public static final String START_PAGE = "startPage"; - - /** The Constant VISIBILITY. */ - public static final String VISIBILITY = "visibility"; - - /** The Constant BRANCH. */ - public static final String BRANCH = "branch"; - - /** The Constant FILE_PATH. */ - public static final String FILE_PATH = "filePath"; - - /** The Constant SHA. */ - public static final String SHA = "sha"; - - /** The Constant FORMAT. */ - public static final String FORMAT = "format"; - - /** The Constant NAME. */ - public static final String NAME = "name"; - - /** The Constant BLOG. */ - public static final String BLOG = "blog"; - - /** The Constant COMPANY. */ - public static final String COMPANY = "company"; - - /** The Constant LOCATION. */ - public static final String LOCATION = "location"; - - /** The Constant ID. */ - public static final String ID = "id"; - - /** The Constant TITLE. */ - public static final String TITLE = "title"; - - /** The Constant KEY. */ - public static final String KEY = "key"; - - /** The Constant BODY. */ - public static final String BODY = "body"; - - /** The Constant COMMENT. */ - public static final String COMMENT = "comment"; - - /** The Constant DESCRIPTION. */ - public static final String DESCRIPTION = "description"; - - /** The Constant HOME_PAGE. */ - public static final String HOME_PAGE = "homepage"; - - /** The Constant HAS_WIKI. */ - public static final String HAS_WIKI = "has_wiki"; - - /** The Constant HAS_ISSUES. */ - public static final String HAS_ISSUES = "has_issues"; - - /** The Constant HAS_DOWNLOADS. */ - public static final String HAS_DOWNLOADS = "has_downloads"; - - /** The Constant LOGIN. */ - public static final String LOGIN = "login"; - - /** The Constant TOKEN. */ - public static final String TOKEN = "token"; - - /** The Constant ACCESS_TOKEN. */ - public static final String ACCESS_TOKEN = "access_token"; - - /** The Constant CLIENT_ID. */ - public static final String CLIENT_ID = "client_id"; - - /** The Constant CLIENT_SECRET. */ - public static final String CLIENT_SECRET = "client_secret"; - - /** The Constant REDIRECT_URI. */ - public static final String REDIRECT_URI = "redirect_uri"; - - /** The Constant CODE. */ - public static final String CODE = "code"; - - /** The Constant SCOPE. */ - public static final String SCOPE = "scope"; - - /** The Constant PUBLIC. */ - public static final String PUBLIC = "public"; - - /** The Constant DELETE_TOKEN. */ - public static final String DELETE_TOKEN = "delete_token"; - - public static final String NUM = "num"; - - public static final String USER_REPOSITORY_PAIR = "userRepositoryPair"; - - public static final String ORGANIZATION_NAME = "organizationName"; - - public static final String TEAM_ID = "teamId"; - public static final String PERMISSION = "permission"; - public static final String REPO_NAMES = "repo_names"; - public static final String BILLING_EMAIL = "billing_email"; - -} diff --git a/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java b/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java deleted file mode 100644 index ec405cc..0000000 --- a/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services.impl; - -import java.io.InputStream; -import java.io.InputStreamReader; -import java.lang.reflect.Field; -import java.lang.reflect.Type; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.List; - -import com.github.api.v2.schema.Gist; -import com.github.api.v2.schema.Issue; -import com.github.api.v2.schema.Language; -import com.github.api.v2.schema.Organization; -import com.github.api.v2.schema.Permission; -import com.github.api.v2.schema.Repository; -import com.github.api.v2.schema.SchemaEntity; -import com.github.api.v2.schema.Tree; -import com.github.api.v2.services.AsyncResponseHandler; -import com.github.api.v2.services.GitHubException; -import com.github.api.v2.services.GitHubService; -import com.github.api.v2.services.constant.ApplicationConstants; -import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; -import com.google.gson.FieldNamingPolicy; -import com.google.gson.FieldNamingStrategy; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.JsonParser; -import com.google.gson.reflect.TypeToken; - -/** - * The Class BaseGitHubService. - */ -public abstract class BaseGitHubService extends GitHubApiGateway implements GitHubService { - - protected static final Charset UTF_8_CHAR_SET = Charset.forName(ApplicationConstants.CONTENT_ENCODING); - - /** The parser. */ - private final JsonParser parser = new JsonParser(); - - /** The handlers. */ - private List>> handlers = new ArrayList>>(); - - /** - * Instantiates a new base git hub service. - */ - public BaseGitHubService() { - // by default we compress contents - requestHeaders.put("Accept-Encoding", "gzip, deflate"); - } - - /** - * Instantiates a new base git hub service. - * - * @param apiVersion - * the api version - */ - public BaseGitHubService(String apiVersion) { - setApiVersion(apiVersion); - } - - /** - * Unmarshall. - * - * @param typeToken - * the type token - * @param response - * the response - * - * @return the t - */ - @SuppressWarnings("unchecked") - protected T unmarshall(TypeToken typeToken, JsonElement response) { - Gson gson = getGsonBuilder().create(); - return (T) gson.fromJson(response, typeToken.getType()); - } - - /** - * Notify observers. - * - * @param response - * the response - */ - protected void notifyObservers(List response) { - for(AsyncResponseHandler> handler : handlers) { - handler.handleResponse(response); - } - } - - /* (non-Javadoc) - * @see com.google.code.stackexchange.client.query.StackExchangeApiQuery#addResonseHandler(com.google.code.stackexchange.client.AsyncResponseHandler) - */ - /** - * Adds the resonse handler. - * - * @param handler - * the handler - */ - public void addResonseHandler(AsyncResponseHandler> handler) { - handlers.add(handler); - } - - /** - * Gets the gson builder. - * - * @return the gson builder - */ - protected GsonBuilder getGsonBuilder() { - GsonBuilder builder = new GsonBuilder(); - builder.setDateFormat(ApplicationConstants.DATE_FORMAT); - builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); - builder.setFieldNamingStrategy(new FieldNamingStrategy() { - @Override - public String translateName(Field field) { - if (field.getType().equals(Repository.Visibility.class)) { - return "private"; - } else if (field.getType().equals(Gist.Visibility.class)) { - return "public"; - } else { - return field.getName(); - } - } - - }); - builder.registerTypeAdapter(Issue.State.class, new JsonDeserializer() { - @Override - public Issue.State deserialize(JsonElement arg0, Type arg1, - JsonDeserializationContext arg2) throws JsonParseException { - return Issue.State.fromValue(arg0.getAsString()); - } - }); - builder.registerTypeAdapter(Repository.Visibility.class, new JsonDeserializer() { - @Override - public Repository.Visibility deserialize(JsonElement arg0, Type arg1, - JsonDeserializationContext arg2) throws JsonParseException { - return (arg0.getAsBoolean())? Repository.Visibility.PRIVATE : Repository.Visibility.PUBLIC; - } - }); - builder.registerTypeAdapter(Gist.Visibility.class, new JsonDeserializer() { - @Override - public Gist.Visibility deserialize(JsonElement arg0, Type arg1, - JsonDeserializationContext arg2) throws JsonParseException { - return (arg0.getAsBoolean())? Gist.Visibility.PUBLIC : Gist.Visibility.PRIVATE; - } - }); - builder.registerTypeAdapter(Language.class, new JsonDeserializer() { - @Override - public Language deserialize(JsonElement arg0, Type arg1, - JsonDeserializationContext arg2) throws JsonParseException { - return Language.fromValue(arg0.getAsString()); - } - }); - builder.registerTypeAdapter(Tree.Type.class, new JsonDeserializer() { - @Override - public Tree.Type deserialize(JsonElement arg0, Type arg1, - JsonDeserializationContext arg2) throws JsonParseException { - return Tree.Type.fromValue(arg0.getAsString()); - } - }); - builder.registerTypeAdapter(Organization.Type.class, new JsonDeserializer() { - @Override - public Organization.Type deserialize(JsonElement arg0, Type arg1, - JsonDeserializationContext arg2) throws JsonParseException { - return Organization.Type.fromValue(arg0.getAsString()); - } - }); - builder.registerTypeAdapter(Permission.class, new JsonDeserializer() { - @Override - public Permission deserialize(JsonElement arg0, Type arg1, - JsonDeserializationContext arg2) throws JsonParseException { - return Permission.fromValue(arg0.getAsString()); - } - }); - return builder; - } - - /** - * Unmarshall. - * - * @param jsonContent - * the json content - * - * @return the json object - */ - protected JsonObject unmarshall(InputStream jsonContent) { - try { - JsonElement element = parser.parse(new InputStreamReader(jsonContent, UTF_8_CHAR_SET)); - if (element.isJsonObject()) { - return element.getAsJsonObject(); - } else { - throw new GitHubException("Unknown content found in response." + element); - } - } catch (Exception e) { - throw new GitHubException(e); - } finally { - closeStream(jsonContent); - } - } - - /** - * Creates the git hub api url builder. - * - * @param urlFormat - * the url format - * - * @return the git hub api url builder - */ - protected GitHubApiUrlBuilder createGitHubApiUrlBuilder(String urlFormat) { - return new GitHubApiUrlBuilder(urlFormat); - } -} diff --git a/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java b/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java deleted file mode 100644 index dfedeb5..0000000 --- a/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services.impl; - -import java.util.List; - -import com.github.api.v2.schema.Commit; -import com.github.api.v2.services.CommitService; -import com.github.api.v2.services.constant.GitHubApiUrls; -import com.github.api.v2.services.constant.ParameterNames; -import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonObject; -import com.google.gson.reflect.TypeToken; - -/** - * The Class CommitServiceImpl. - */ -public class CommitServiceImpl extends BaseGitHubService implements - CommitService { - - /* (non-Javadoc) - * @see com.github.api.v2.services.CommitService#getCommit(java.lang.String, java.lang.String, java.lang.String) - */ - @Override - public Commit getCommit(String userName, String repositoryName, String sha) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.CommitApiUrls.GET_COMMIT_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.SHA, sha).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken(){}, json.get("commit")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.CommitService#getCommits(java.lang.String, java.lang.String, java.lang.String) - */ - @Override - public List getCommits(String userName, String repositoryName, - String branch) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.CommitApiUrls.GET_COMMITS_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, branch).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("commits")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.CommitService#getCommits(java.lang.String, java.lang.String, java.lang.String, java.lang.String) - */ - @Override - public List getCommits(String userName, String repositoryName, - String branch, String filePath) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.CommitApiUrls.GET_COMMITS_FILE_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, branch).withField(ParameterNames.FILE_PATH, filePath).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("commits")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.impl.BaseGitHubService#getGsonBuilder() - */ - @Override - protected GsonBuilder getGsonBuilder() { - GsonBuilder gson = super.getGsonBuilder(); - gson.setDateFormat("yyyy-MM-dd'T'HH:mm:ss"); - return gson; - } -} diff --git a/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java b/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java deleted file mode 100644 index 9eb863f..0000000 --- a/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services.impl; - -import com.github.api.v2.schema.Feed; -import com.github.api.v2.services.FeedService; -import com.github.api.v2.services.GitHubException; -import com.github.api.v2.services.constant.GitHubApiUrls; -import com.github.api.v2.services.constant.ParameterNames; -import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.reflect.TypeToken; - -/** - * The Class NetworkServiceImpl. - */ -public class FeedServiceImpl extends BaseGitHubService implements - FeedService { - - public FeedServiceImpl() { - // by default we compress contents - requestHeaders.put("Accept-Encoding", "gzip, deflate"); - } - - @Override - public Feed getCommitFeed(String userName, String repositoryName, String branchName, int count) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_COMMIT_FEED_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, branchName).withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); - return unmarshall(apiUrl); - } - - @Override - public Feed getNetworkFeed(String userName, String repositoryName, int count) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_NETWORK_FEED_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); - return unmarshall(apiUrl); - } - - @Override - public Feed getPrivateUserFeed(String userName, int count) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_PRIVATE_USER_FEED_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); - return unmarshall(apiUrl); - } - - @Override - public Feed getPublicTimelineFeed(int count) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_PUBLIC_TIMELINE_FEED_URL); - String apiUrl = builder.withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); - return unmarshall(apiUrl); - } - - @Override - public Feed getPublicUserFeed(String userName, int count) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_PUBLIC_USER_FEED_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); - return unmarshall(apiUrl); - } - - @Override - public Feed getWikiFeed(String userName, String repositoryName, int count) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_WIKI_FEED_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); - return unmarshall(apiUrl); - } - - @Override - public Feed getBlogFeed(int count) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_BLOG_FEED_URL); - String apiUrl = builder.withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); - return unmarshall(apiUrl); - } - - @Override - public Feed getDiscussionsFeed(int count) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_DISCUSSIONS_FEED_URL); - String apiUrl = builder.withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); - return unmarshall(apiUrl); - } - - @Override - public Feed getDiscussionsFeed(String topic, int count) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_DISCUSSIONS_FEED_BY_TOPIC_URL); - String apiUrl = builder.withField(ParameterNames.KEYWORD, topic).withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); - return unmarshall(apiUrl); - } - - @Override - public Feed getJobPositionsFeed(int count) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_JOB_POSITIONS_FEED_URL); - String apiUrl = builder.withParameter(ParameterNames.NUM, String.valueOf(count)).buildUrl(); - return unmarshall(apiUrl); - } - - - protected Feed unmarshall(String apiUrl) { - JsonObject response = unmarshall(callApiGet(apiUrl)); - if (response.isJsonObject()) { - JsonObject json = response.getAsJsonObject(); - int status = json.get("responseStatus").getAsInt(); - if (status != 200) { - throw new GitHubException(json.get("responseDetails").getAsString()); - } - JsonElement data = json.get("responseData"); - if (data != null) { - return unmarshall(new TypeToken(){}, data.getAsJsonObject().get("feed")); - } - } - return null; - } - - protected GsonBuilder getGsonBuilder() { - GsonBuilder gson = super.getGsonBuilder(); - gson.setDateFormat("EEE', 'dd' 'MMM' 'yyyy' 'HH:mm:ss' 'Z"); - return gson; - } - -// @SuppressWarnings("unchecked") -// private Feed populateFeed(SyndFeed feed) { -// Feed retVal = new Feed(); -// retVal.setAuthor(feed.getAuthor()); -// retVal.setDescription(feed.getDescription()); -// retVal.setLink(feed.getLink()); -// retVal.setTitle(feed.getTitle()); -// List entries = new ArrayList(feed.getEntries().size()); -// retVal.setEntries(entries); -// -// for (SyndEntry entry : (List) feed.getEntries()) { -// FeedEntry feedEntry = new FeedEntry(); -// feedEntry.setAuthor(entry.getAuthor()); -//// feedEntry.setCategories(entry.getCategories()); -// if (entry.getContents() != null) { -// StringBuilder builder = new StringBuilder(); -// for (SyndContent content : (List) entry.getContents()) { -// builder.append(content.getValue()); -// } -// feedEntry.setContent(builder.toString()); -// } -// feedEntry.setLink(entry.getLink()); -// feedEntry.setPublishedDate(entry.getPublishedDate()); -// feedEntry.setTitle(entry.getTitle()); -// -// entries.add(feedEntry); -// } -// return retVal; -// } -// -// /** -// * Creates the git hub api url builder. -// * -// * @param urlFormat -// * the url format -// * -// * @return the git hub api url builder -// */ -// protected GitHubApiUrlBuilder createGitHubApiUrlBuilder(String urlFormat) { -// return new GitHubApiUrlBuilder(urlFormat); -// } -} diff --git a/src/main/java/com/github/api/v2/services/impl/GistServiceImpl.java b/src/main/java/com/github/api/v2/services/impl/GistServiceImpl.java deleted file mode 100644 index d8bb3b1..0000000 --- a/src/main/java/com/github/api/v2/services/impl/GistServiceImpl.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services.impl; - -import java.io.InputStream; -import java.util.List; - -import com.github.api.v2.schema.Gist; -import com.github.api.v2.services.GistService; -import com.github.api.v2.services.constant.GitHubApiUrls; -import com.github.api.v2.services.constant.ParameterNames; -import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; -import com.google.gson.JsonObject; -import com.google.gson.reflect.TypeToken; - -/** - * The Class GistServiceImpl. - */ -public class GistServiceImpl extends BaseGitHubService implements - GistService { - - /* (non-Javadoc) - * @see com.github.api.v2.services.GistService#getGist(java.lang.String) - */ - @Override - public Gist getGist(String gistId) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.GistApiUrls.GET_GIST_URL); - String apiUrl = builder.withField(ParameterNames.GIST_ID, gistId).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - List gists = unmarshall(new TypeToken>(){}, json.get("gists")); - return (gists.isEmpty())? null : gists.get(0); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.GistService#getGistContent(java.lang.String, java.lang.String) - */ - @Override - public InputStream getGistContent(String gistId, String fileName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.GistApiUrls.GET_GIST_CONTENT_URL); - String apiUrl = builder.withField(ParameterNames.GIST_ID, gistId).withField(ParameterNames.FILE_NAME, fileName).buildUrl(); - return callApiGet(apiUrl); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.GistService#getUserGists(java.lang.String) - */ - @Override - public List getUserGists(String userName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.GistApiUrls.GET_USER_GISTS_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("gists")); - } -} diff --git a/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java b/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java deleted file mode 100644 index 2875849..0000000 --- a/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java +++ /dev/null @@ -1,545 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services.impl; - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.PrintStream; -import java.io.UnsupportedEncodingException; -import java.net.HttpURLConnection; -import java.net.URL; -import java.net.URLEncoder; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.zip.GZIPInputStream; - -import com.github.api.v2.services.GitHubException; -import com.github.api.v2.services.auth.Authentication; -import com.github.api.v2.services.auth.HeaderBasedAuthentication; -import com.github.api.v2.services.auth.ParameterBasedAuthentication; -import com.github.api.v2.services.constant.ApplicationConstants; - -/** - * The Class GitHubApiGateway. - */ -public abstract class GitHubApiGateway { - - /** The logger. */ - protected final Logger logger = Logger.getLogger(getClass().getCanonicalName()); - - /** The Constant GZIP_ENCODING. */ - private static final String GZIP_ENCODING = "gzip"; - - /** The Constant REFERRER. */ - private static final String REFERRER = "Referer"; - - /** The request headers. */ - protected Map requestHeaders = new HashMap(); - - /** The request parameters. */ - protected Map requestParameters = new HashMap(); - - /** The user ip address. */ - protected String userIpAddress; - - /** The api version. */ - protected String apiVersion = ApplicationConstants.DEFAULT_API_VERSION; - - /** - * Gets the api version. - * - * @return the api version - */ - public String getApiVersion() { - return apiVersion; - } - - /** - * Sets the api version. - * - * @param apiVersion - * the new api version - */ - public void setApiVersion(String apiVersion) { - this.apiVersion = apiVersion; - } - - /** - * Sets the request headers. - * - * @param requestHeaders - * the request headers - */ - public void setRequestHeaders(Map requestHeaders) { - this.requestHeaders = requestHeaders; - } - - /** - * Gets the request headers. - * - * @return the request headers - */ - public Map getRequestHeaders() { - return requestHeaders; - } - - /** - * Adds the request header. - * - * @param headerName - * the header name - * @param headerValue - * the header value - */ - public void addRequestHeader(String headerName, String headerValue) { - requestHeaders.put(headerName, headerValue); - } - - /** - * Removes the request header. - * - * @param headerName - * the header name - */ - public void removeRequestHeader(String headerName) { - requestHeaders.remove(headerName); - } - - /** - * Sets the referrer. - * - * @param referrer - * the new referrer - */ - public void setReferrer(String referrer) { - requestHeaders.put(REFERRER, referrer); - } - - /** - * Sets the user ip address. - * - * @param userIpAddress - * the new user ip address - */ - public void setUserIpAddress(String userIpAddress) { - this.userIpAddress = userIpAddress; - } - - /** - * Sets the authentication. - * - * @param authentication - * the new authentication - */ - public void setAuthentication(Authentication authentication) { - if (authentication != null) { - if (authentication instanceof ParameterBasedAuthentication) { - requestParameters.putAll(((ParameterBasedAuthentication) authentication).getParameters()); - } else if (authentication instanceof HeaderBasedAuthentication) { - requestHeaders.putAll(((HeaderBasedAuthentication) authentication).getHeaders()); - } - } - } - - /** - * Convert stream to string. - * - * @param is - * the is - * - * @return the string - */ - protected static String convertStreamToString(InputStream is) { - /* - * To convert the InputStream to String we use the BufferedReader.readLine() - * method. We iterate until the BufferedReader return null which means - * there's no more data to read. Each line will appended to a StringBuilder - * and returned as String. - */ - BufferedReader reader = new BufferedReader(new InputStreamReader(is)); - StringBuilder sb = new StringBuilder(); - - String line = null; - try { - while ((line = reader.readLine()) != null) { - sb.append(line + "\n"); - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - is.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - return sb.toString(); - } - - /** - * Call api get. - * - * @param apiUrl - * the api url - * - * @return the input stream - */ - protected InputStream callApiGet(String apiUrl) { - return callApiGet(apiUrl, HttpURLConnection.HTTP_OK); - } - - /** - * Call api get. - * - * @param apiUrl - * the api url - * @param expected - * the expected - * - * @return the input stream - */ - protected InputStream callApiGet(String apiUrl, int expected) { - try { - URL url = new URL(apiUrl); - if (!requestParameters.isEmpty()) { - if (url.getQuery() == null) { - url = new URL(apiUrl + "?" + getParametersString(requestParameters)); - } else { - url = new URL(apiUrl + "&" + getParametersString(requestParameters)); - } - } - - HttpURLConnection request = (HttpURLConnection) url.openConnection(); - - if (ApplicationConstants.CONNECT_TIMEOUT > -1) { - request.setConnectTimeout(ApplicationConstants.CONNECT_TIMEOUT); - } - - if (ApplicationConstants.READ_TIMEOUT > -1) { - request.setReadTimeout(ApplicationConstants.READ_TIMEOUT); - } - - for (String headerName : requestHeaders.keySet()) { - request.setRequestProperty(headerName, requestHeaders.get(headerName)); - } - - request.connect(); - - if (request.getResponseCode() != expected) { - throw new GitHubException(convertStreamToString(getWrappedInputStream(request.getErrorStream(), - GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())))); - } else { - return getWrappedInputStream(request.getInputStream(), - GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())); - } - } catch (IOException e) { - throw new GitHubException(e); - } - } - - /** - * Call api post. - * - * @param apiUrl - * the api url - * @param parameters - * the parameters - * - * @return the input stream - */ - protected InputStream callApiPost(String apiUrl, Map parameters) { - return callApiPost(apiUrl, parameters, HttpURLConnection.HTTP_OK); - } - - /** - * Call api post. - * - * @param apiUrl - * the api url - * @param parameters - * the parameters - * @param expected - * the expected - * - * @return the input stream - */ - protected InputStream callApiPost(String apiUrl, Map parameters, int expected) { - try { - URL url = new URL(apiUrl); - HttpURLConnection request = (HttpURLConnection) url.openConnection(); - - if (ApplicationConstants.CONNECT_TIMEOUT > -1) { - request.setConnectTimeout(ApplicationConstants.CONNECT_TIMEOUT); - } - - if (ApplicationConstants.READ_TIMEOUT > -1) { - request.setReadTimeout(ApplicationConstants.READ_TIMEOUT); - } - - for (String headerName : requestHeaders.keySet()) { - request.setRequestProperty(headerName, requestHeaders.get(headerName)); - } - - parameters.putAll(requestParameters); - - request.setRequestMethod("POST"); - request.setDoOutput(true); - - PrintStream out = new PrintStream(new BufferedOutputStream(request.getOutputStream())); - - out.print(getParametersString(parameters)); - out.flush(); - out.close(); - - request.connect(); - - if (request.getResponseCode() != expected) { - return getWrappedInputStream(request.getErrorStream(), - GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())); - } else { - return getWrappedInputStream(request.getInputStream(), - GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())); - } - } catch (IOException e) { - throw new GitHubException(e); - } finally { - } - } - - - /** - * Call api get. - * - * @param apiUrl - * the api url - * - * @return the input stream - */ - protected InputStream callApiDelete(String apiUrl) { - return callApiDelete(apiUrl, HttpURLConnection.HTTP_OK); - } - - /** - * Call api get. - * - * @param apiUrl - * the api url - * @param expected - * the expected - * - * @return the input stream - */ - protected InputStream callApiDelete(String apiUrl, int expected) { - try { - URL url = new URL(apiUrl); - - HttpURLConnection request = (HttpURLConnection) url.openConnection(); - - if (ApplicationConstants.CONNECT_TIMEOUT > -1) { - request.setConnectTimeout(ApplicationConstants.CONNECT_TIMEOUT); - } - - if (ApplicationConstants.READ_TIMEOUT > -1) { - request.setReadTimeout(ApplicationConstants.READ_TIMEOUT); - } - - for (String headerName : requestHeaders.keySet()) { - request.setRequestProperty(headerName, requestHeaders.get(headerName)); - } - - request.setRequestMethod("DELETE"); - - request.connect(); - - if (request.getResponseCode() != expected) { - throw new GitHubException(convertStreamToString(getWrappedInputStream(request.getErrorStream(), - GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())))); - } else { - return getWrappedInputStream(request.getInputStream(), - GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())); - } - } catch (IOException e) { - throw new GitHubException(e); - } - } - - - /** - * Gets the parameters string. - * - * @param parameters - * the parameters - * - * @return the parameters string - */ - protected String getParametersString(Map parameters) { - StringBuilder builder = new StringBuilder(); - for (Iterator> iterator = parameters.entrySet().iterator(); iterator.hasNext();) { - Map.Entry entry = iterator.next(); - builder.append(entry.getKey()); - builder.append("="); - builder.append(encodeUrl(entry.getValue())); - if (iterator.hasNext()) { - builder.append("&"); - } - } - - return builder.toString(); - } - - /** - * Call api method. - * - * @param apiUrl - * the api url - * @param xmlContent - * the xml content - * @param contentType - * the content type - * @param method - * the method - * @param expected - * the expected - * - * @return the input stream - */ - protected InputStream callApiMethod(String apiUrl, String xmlContent, String contentType, - String method, int expected) { - try { - URL url = new URL(apiUrl); - HttpURLConnection request = (HttpURLConnection) url.openConnection(); - - if (ApplicationConstants.CONNECT_TIMEOUT > -1) { - request.setConnectTimeout(ApplicationConstants.CONNECT_TIMEOUT); - } - - if (ApplicationConstants.READ_TIMEOUT > -1) { - request.setReadTimeout(ApplicationConstants.READ_TIMEOUT); - } - - for (String headerName : requestHeaders.keySet()) { - request.setRequestProperty(headerName, requestHeaders.get(headerName)); - } - - request.setRequestMethod(method); - request.setDoOutput(true); - - if (contentType != null) { - request.setRequestProperty("Content-Type", contentType); - } - - if (xmlContent != null) { - PrintStream out = new PrintStream(new BufferedOutputStream(request.getOutputStream())); - - out.print(xmlContent); - out.flush(); - out.close(); - } - - request.connect(); - - if (request.getResponseCode() != expected) { - throw new GitHubException(convertStreamToString(getWrappedInputStream(request.getErrorStream(), - GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())))); - } else { - return getWrappedInputStream(request.getInputStream(), - GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())); - } - } catch (IOException e) { - throw new GitHubException(e); - } - } - - /** - * Close stream. - * - * @param is - * the is - */ - protected void closeStream(InputStream is) { - try { - if (is != null) { - is.close(); - } - } catch (IOException e) { - logger.log(Level.SEVERE, "An error occurred while closing stream.", e); - } - } - - /** - * Close connection. - * - * @param connection - * the connection - */ - protected void closeConnection(HttpURLConnection connection) { - try { - if (connection != null) { - connection.disconnect(); - } - } catch (Exception e) { - logger.log(Level.SEVERE, "An error occurred while disconnecting connection.", e); - } - } - - /** - * Gets the wrapped input stream. - * - * @param is - * the is - * @param gzip - * the gzip - * - * @return the wrapped input stream - * - * @throws IOException - * Signals that an I/O exception has occurred. - */ - protected InputStream getWrappedInputStream(InputStream is, boolean gzip) - throws IOException { - if (gzip) { - return new BufferedInputStream(new GZIPInputStream(is)); - } else { - return new BufferedInputStream(is); - } - } - - /** - * Encode url. - * - * @param original - * the original - * - * @return the string - */ - private static String encodeUrl(String original) { - try { - return URLEncoder.encode(original, ApplicationConstants.CONTENT_ENCODING); - } catch (UnsupportedEncodingException e) { - // should never be here.. - return original; - } - } -} diff --git a/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java b/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java deleted file mode 100644 index 0a30c3d..0000000 --- a/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services.impl; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import com.github.api.v2.schema.Comment; -import com.github.api.v2.schema.Issue; -import com.github.api.v2.schema.Issue.State; -import com.github.api.v2.services.IssueService; -import com.github.api.v2.services.constant.GitHubApiUrls; -import com.github.api.v2.services.constant.ParameterNames; -import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; -import com.google.gson.JsonObject; -import com.google.gson.reflect.TypeToken; - -/** - * The Class IssueServiceImpl. - */ -public class IssueServiceImpl extends BaseGitHubService implements - IssueService { - - /* (non-Javadoc) - * @see com.github.api.v2.services.IssueService#addComment(java.lang.String, java.lang.String, int, java.lang.String) - */ - @Override - public void addComment(String userName, String repositoryName, - int issueNumber, String comment) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.ADD_COMMENT_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.ISSUE_NUMBER, String.valueOf(issueNumber)).buildUrl(); - Map parameters = new HashMap(); - parameters.put(ParameterNames.COMMENT, comment); - callApiPost(apiUrl, parameters); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.IssueService#addLabel(java.lang.String, java.lang.String, int, java.lang.String) - */ - @Override - public List addLabel(String userName, String repositoryName, - int issueNumber, String label) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.ADD_LABEL_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.LABEL, label).withField(ParameterNames.ISSUE_NUMBER, String.valueOf(issueNumber)).buildUrl(); - JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); - - return unmarshall(new TypeToken>(){}, json.get("labels")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.IssueService#closeIssue(java.lang.String, java.lang.String, int) - */ - @Override - public void closeIssue(String userName, String repositoryName, - int issueNumber) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.CLOSE_ISSUE_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.ISSUE_NUMBER, String.valueOf(issueNumber)).buildUrl(); - callApiPost(apiUrl, new HashMap()); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.IssueService#createIssue(java.lang.String, java.lang.String, java.lang.String, java.lang.String) - */ - @Override - public void createIssue(String userName, String repositoryName, - String title, String body) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.CREATE_ISSUE_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - Map parameters = new HashMap(); - parameters.put(ParameterNames.TITLE, title); - parameters.put(ParameterNames.BODY, body); - callApiPost(apiUrl, parameters); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.IssueService#getIssue(java.lang.String, java.lang.String, int) - */ - @Override - public Issue getIssue(String userName, String repositoryName, - int issueNumber) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.GET_ISSUE_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.ISSUE_NUMBER, String.valueOf(issueNumber)).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken(){}, json.get("issue")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.IssueService#getIssueComments(java.lang.String, java.lang.String, int) - */ - @Override - public List getIssueComments(String userName, - String repositoryName, int issueNumber) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.GET_ISSUE_COMMENTS_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.ISSUE_NUMBER, String.valueOf(issueNumber)).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("comments")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.IssueService#getIssueLabels(java.lang.String, java.lang.String) - */ - @Override - public List getIssueLabels(String userName, String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.GET_ISSUE_LABELS_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("labels")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.IssueService#getIssues(java.lang.String, java.lang.String, com.github.api.v2.schema.Issue.State) - */ - @Override - public List getIssues(String userName, String repositoryName, - State state) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.GET_ISSUES_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withFieldEnum(ParameterNames.STATE, state).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("issues")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.IssueService#removeLabel(java.lang.String, java.lang.String, int, java.lang.String) - */ - @Override - public List removeLabel(String userName, String repositoryName, - int issueNumber, String label) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.REMOVE_LABEL_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.LABEL, label).withField(ParameterNames.ISSUE_NUMBER, String.valueOf(issueNumber)).buildUrl(); - JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); - - return unmarshall(new TypeToken>(){}, json.get("labels")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.IssueService#reopenIssue(java.lang.String, java.lang.String, int) - */ - @Override - public void reopenIssue(String userName, String repositoryName, - int issueNumber) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.REOPEN_ISSUE_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.ISSUE_NUMBER, String.valueOf(issueNumber)).buildUrl(); - callApiPost(apiUrl, new HashMap()); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.IssueService#searchIssues(java.lang.String, java.lang.String, com.github.api.v2.schema.Issue.State, java.lang.String) - */ - @Override - public List searchIssues(String userName, String repositoryName, - State state, String keyword) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.SEARCH_ISSUES_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withFieldEnum(ParameterNames.STATE, state).withField(ParameterNames.KEYWORD, keyword).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("issues")); - } - - @Override - public List getIssues(String userName, String repositoryName, - String label) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.GET_ISSUES_BY_LABEL_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.LABEL, label).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("issues")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.IssueService#updateIssue(java.lang.String, java.lang.String, int, java.lang.String, java.lang.String) - */ - @Override - public void updateIssue(String userName, String repositoryName, - int issueNumber, String title, String body) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.UPDATE_ISSUE_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.ISSUE_NUMBER, String.valueOf(issueNumber)).buildUrl(); - Map parameters = new HashMap(); - parameters.put(ParameterNames.TITLE, title); - parameters.put(ParameterNames.BODY, body); - callApiPost(apiUrl, parameters); - } -} diff --git a/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java b/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java deleted file mode 100644 index 1018bd6..0000000 --- a/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services.impl; - -import java.util.List; - -import com.github.api.v2.schema.NetworkCommit; -import com.github.api.v2.schema.NetworkMeta; -import com.github.api.v2.services.NetworkService; -import com.github.api.v2.services.constant.GitHubApiUrls; -import com.github.api.v2.services.constant.ParameterNames; -import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonObject; -import com.google.gson.reflect.TypeToken; - -/** - * The Class NetworkServiceImpl. - */ -public class NetworkServiceImpl extends BaseGitHubService implements - NetworkService { - - /* (non-Javadoc) - * @see com.github.api.v2.services.NetworkService#getNetworkData(java.lang.String, java.lang.String, java.lang.String) - */ - @Override - public List getNetworkData(String userName, String repositoryName, - String networkHash) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.NetworkApiUrls.GET_NETWORK_DATA_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withParameter(ParameterNames.NET_HASH, networkHash).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("commits")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.NetworkService#getNetworkData(java.lang.String, java.lang.String, java.lang.String, int, int) - */ - @Override - public List getNetworkData(String userName, String repositoryName, - String networkHash, int startIndex, int endIndex) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.NetworkApiUrls.GET_NETWORK_DATA_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withParameter(ParameterNames.NET_HASH, networkHash).withParameter(ParameterNames.START_INDEX, String.valueOf(startIndex)).withParameter(ParameterNames.END_INDEX, String.valueOf(endIndex)).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("commits")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.NetworkService#getNetworkMeta(java.lang.String, java.lang.String) - */ - @Override - public NetworkMeta getNetworkMeta(String userName, String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.NetworkApiUrls.GET_NETWORK_META_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - Gson gson = getGsonBuilder().setDateFormat("yyyy-MM-dd").create(); - return gson.fromJson(json, NetworkMeta.class); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.impl.BaseGitHubService#getGsonBuilder() - */ - protected GsonBuilder getGsonBuilder() { - GsonBuilder gson = super.getGsonBuilder(); - gson.setDateFormat("yyyy-MM-dd HH:mm:ss"); - return gson; - } -} diff --git a/src/main/java/com/github/api/v2/services/impl/OAuthServiceImpl.java b/src/main/java/com/github/api/v2/services/impl/OAuthServiceImpl.java deleted file mode 100644 index 185f740..0000000 --- a/src/main/java/com/github/api/v2/services/impl/OAuthServiceImpl.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services.impl; - -import java.util.Set; -import java.util.regex.Matcher; - -import com.github.api.v2.services.GitHubException; -import com.github.api.v2.services.OAuthService; -import com.github.api.v2.services.constant.ApplicationConstants; -import com.github.api.v2.services.constant.GitHubApiUrls; -import com.github.api.v2.services.constant.ParameterNames; -import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; - -/** - * The Class OAuthServiceImpl. - */ -public class OAuthServiceImpl extends BaseGitHubService implements OAuthService { - - /** The client id. */ - private final String clientId; - - /** The secret. */ - private final String secret; - - /** - * Instantiates a new o auth service impl. - * - * @param clientId - * the client id - * @param secret - * the secret - */ - public OAuthServiceImpl(String clientId, String secret) { - this.clientId = clientId; - this.secret = secret; - } - - /* (non-Javadoc) - * @see com.google.code.facebook.graph.client.oauth.FacebookOAuthService#getAuthorizationUrl(java.lang.String) - */ - @Override - public String getAuthorizationUrl(String callBackUrl) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OAuthUrls.AUTHORIZE_URL); - builder.withParameter(ParameterNames.CLIENT_ID, clientId).withParameter(ParameterNames.REDIRECT_URI, callBackUrl); - return builder.buildUrl(); - } - - /* (non-Javadoc) - * @see com.google.code.facebook.graph.client.oauth.FacebookOAuthService#getAuthorizationUrl(java.lang.String, java.util.Set) - */ - @Override - public String getAuthorizationUrl(String callBackUrl, - Set permissions) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OAuthUrls.AUTHORIZE_URL); - builder.withParameter(ParameterNames.CLIENT_ID, clientId).withParameter(ParameterNames.REDIRECT_URI, callBackUrl); - builder.withParameterEnumSet(ParameterNames.SCOPE, permissions, ","); - return builder.buildUrl(); - } - - /* (non-Javadoc) - * @see com.google.code.facebook.graph.client.oauth.FacebookOAuthService#getAccessToken(java.lang.String, java.lang.String) - */ - @Override - public String getAccessToken(String callBackUrl, String code) { - try { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OAuthUrls.ACCESS_TOKEN_URL); - builder.withParameter(ParameterNames.CLIENT_ID, clientId); - builder.withParameter(ParameterNames.CLIENT_SECRET, secret); - builder.withParameter(ParameterNames.REDIRECT_URI, callBackUrl); - builder.withParameter(ParameterNames.CODE, code); - - String response = convertStreamToString(callApiGet(builder.buildUrl())); - Matcher matcher = ApplicationConstants.ACCESS_TOKEN_PATTERN.matcher(response); - if (matcher.find()) { - return matcher.group(1); - } else { - throw new GitHubException(response); - } - } catch (Exception e) { - throw new GitHubException(e); - } - } -} diff --git a/src/main/java/com/github/api/v2/services/impl/ObjectServiceImpl.java b/src/main/java/com/github/api/v2/services/impl/ObjectServiceImpl.java deleted file mode 100644 index e3fd543..0000000 --- a/src/main/java/com/github/api/v2/services/impl/ObjectServiceImpl.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services.impl; - -import java.io.InputStream; -import java.util.List; - -import com.github.api.v2.schema.Blob; -import com.github.api.v2.schema.Tree; -import com.github.api.v2.services.ObjectService; -import com.github.api.v2.services.constant.GitHubApiUrls; -import com.github.api.v2.services.constant.ParameterNames; -import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; -import com.google.gson.JsonObject; -import com.google.gson.reflect.TypeToken; - -/** - * The Class ObjectServiceImpl. - */ -public class ObjectServiceImpl extends BaseGitHubService implements - ObjectService { - - /* (non-Javadoc) - * @see com.github.api.v2.services.ObjectService#getBlob(java.lang.String, java.lang.String, java.lang.String, java.lang.String) - */ - @Override - public Blob getBlob(String userName, String repositoryName, String treeSha, - String filePath) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.ObjectApiUrls.GET_BLOBS_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.SHA, treeSha).withField(ParameterNames.FILE_PATH, filePath).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken(){}, json.get("blob")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.ObjectService#getBlobs(java.lang.String, java.lang.String, java.lang.String) - */ - @Override - public List getBlobs(String userName, String repositoryName, - String treeSha) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.ObjectApiUrls.GET_BLOBS_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.SHA, treeSha).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("blobs")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.ObjectService#getObjectContent(java.lang.String, java.lang.String, java.lang.String) - */ - @Override - public InputStream getObjectContent(String userName, String repositoryName, - String objectSha) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.ObjectApiUrls.GET_OBJECT_CONTENT_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.SHA, objectSha).buildUrl(); - return callApiGet(apiUrl); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.ObjectService#getTree(java.lang.String, java.lang.String, java.lang.String) - */ - @Override - public List getTree(String userName, String repositoryName, - String treeSha) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.ObjectApiUrls.GET_TREE_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.SHA, treeSha).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("tree")); - } -} diff --git a/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java b/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java deleted file mode 100644 index 52acc7f..0000000 --- a/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services.impl; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import com.github.api.v2.schema.Organization; -import com.github.api.v2.schema.Repository; -import com.github.api.v2.schema.Team; -import com.github.api.v2.schema.User; -import com.github.api.v2.services.OrganizationService; -import com.github.api.v2.services.constant.GitHubApiUrls; -import com.github.api.v2.services.constant.ParameterNames; -import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonObject; -import com.google.gson.reflect.TypeToken; - -/** - * The Class OrganizationServiceImpl. - */ -public class OrganizationServiceImpl extends BaseGitHubService implements - OrganizationService { - - - /* (non-Javadoc) - * @see com.github.api.v2.services.impl.BaseGitHubService#getGsonBuilder() - */ - protected GsonBuilder getGsonBuilder() { - GsonBuilder gson = super.getGsonBuilder(); - gson.setDateFormat("yyyy-MM-dd'T'HH:mm:ss"); - return gson; - } - - @Override - public void addTeamMember(String teamId, String userName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.ADD_TEAM_MEMBER_URL); - String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).withParameter(ParameterNames.NAME, userName).buildUrl(); - unmarshall(callApiPost(apiUrl, new HashMap())); - } - - @Override - public void addTeamRepository(String userName, String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.ADD_TEAM_REPOSITORY_URL); - String apiUrl = builder.withParameter(ParameterNames.USER_REPOSITORY_PAIR, userName + "/" + repositoryName).buildUrl(); - unmarshall(callApiPost(apiUrl, new HashMap())); - } - - @Override - public void createTeam(Team team) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.CREATE_TEAM_URL); - String apiUrl = builder.buildUrl(); - Map parameters = new HashMap(); - parameters.put("team[" + ParameterNames.NAME + "]", team.getName()); - parameters.put("team[" + ParameterNames.PERMISSION + "]", team.getPermission().value()); - parameters.put("team[" + ParameterNames.REPO_NAMES + "]", team.getRepoNames().toString()); - callApiPost(apiUrl, parameters); - } - - @Override - public void deleteTeam(String teamId) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.DELETE_TEAM_URL); - String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).buildUrl(); - callApiDelete(apiUrl); - } - - @Override - public List getAllOrganizationRepositories() { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_ALL_REPOSITORIES_URL); - String apiUrl = builder.buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("repositories")); - } - - @Override - public Organization getOrganization(String name) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_ORGANIZATION_URL); - String apiUrl = builder.withField(ParameterNames.ORGANIZATION_NAME, name).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken(){}, json.get("organization")); - } - - @Override - public List getPublicMembers(String organizationName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_PUBLIC_MEMBERS_URL); - String apiUrl = builder.withField(ParameterNames.ORGANIZATION_NAME, organizationName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("users")); - } - - @Override - public List getPublicRepositories(String organizationName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_PUBLIC_REPOSITORIES_URL); - String apiUrl = builder.withField(ParameterNames.ORGANIZATION_NAME, organizationName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("repositories")); - } - - @Override - public Team getTeam(String teamId) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_TEAM_URL); - String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken(){}, json.get("team")); - } - - @Override - public List getTeamMembers(String teamId) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_TEAM_MEMBERS_URL); - String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("users")); - } - - @Override - public List getTeamRepositories(String teamId) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_TEAM_REPOSITORIES_URL); - String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("repositories")); - } - - @Override - public List getTeams(String organizationName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_TEAMS_URL); - String apiUrl = builder.withField(ParameterNames.ORGANIZATION_NAME, organizationName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("teams")); - } - - @Override - public List getUserOrganizations() { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_ORGANIZATIONS_URL); - String apiUrl = builder.buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("organizations")); - } - - @Override - public void removeTeamMember(String teamId, String userName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.REMOVE_TEAM_MEMBER_URL); - String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).withParameter(ParameterNames.NAME, userName).buildUrl(); - callApiDelete(apiUrl); - } - - @Override - public void removeTeamRepository(String teamId, String userName, String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.REMOVE_TEAM_REPOSITORY_URL); - String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).withParameter(ParameterNames.NAME, userName + "/" + repositoryName).buildUrl(); - callApiDelete(apiUrl); - } - - @Override - public void updateOrganization(Organization organization) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.UPDATE_ORGANIZATION_URL); - String apiUrl = builder.withField(ParameterNames.ORGANIZATION_NAME, organization.getName()).buildUrl(); - Map parameters = new HashMap(); - parameters.put("organization[" + ParameterNames.NAME + "]", organization.getName()); - parameters.put("organization[" + ParameterNames.EMAIL + "]", organization.getEmail()); - parameters.put("organization[" + ParameterNames.BLOG + "]", organization.getBlog()); - parameters.put("organization[" + ParameterNames.COMPANY + "]", organization.getCompany()); - parameters.put("organization[" + ParameterNames.LOCATION + "]", organization.getLocation()); - parameters.put("organization[" + ParameterNames.BILLING_EMAIL + "]", organization.getBillingEmail()); - callApiPost(apiUrl, parameters); - } - - @Override - public void updateTeam(Team team) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.UPDATE_TEAM_URL); - String apiUrl = builder.withField(ParameterNames.TEAM_ID, team.getId()).buildUrl(); - - callApiMethod(apiUrl, getGsonBuilder().create().toJson(team), "application/json", "PUT", 200); - } -} diff --git a/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java b/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java deleted file mode 100644 index cc5d484..0000000 --- a/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java +++ /dev/null @@ -1,382 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services.impl; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.zip.ZipInputStream; - -import com.github.api.v2.schema.Key; -import com.github.api.v2.schema.Language; -import com.github.api.v2.schema.Repository; -import com.github.api.v2.schema.User; -import com.github.api.v2.schema.Repository.Visibility; -import com.github.api.v2.services.RepositoryService; -import com.github.api.v2.services.constant.GitHubApiUrls; -import com.github.api.v2.services.constant.ParameterNames; -import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonObject; -import com.google.gson.reflect.TypeToken; - -/** - * The Class RepositoryServiceImpl. - */ -public class RepositoryServiceImpl extends BaseGitHubService implements - RepositoryService { - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#addCollaborator(java.lang.String, java.lang.String) - */ - @Override - public void addCollaborator(String repositoryName, String collaboratorName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.ADD_COLLABORATOR_URL); - String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.USER_NAME, collaboratorName).buildUrl(); - unmarshall(callApiPost(apiUrl, new HashMap())); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#addDeployKey(java.lang.String, java.lang.String, java.lang.String) - */ - @Override - public List addDeployKey(String repositoryName, String title, String key) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.ADD_DEPLOY_KEY_URL); - String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - Map parameters = new HashMap(); - parameters.put(ParameterNames.TITLE, title); - parameters.put(ParameterNames.KEY, key); - JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); - - return unmarshall(new TypeToken>(){}, json.get("public_keys")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#changeVisibility(java.lang.String, com.github.api.v2.schema.Repository.Visibility) - */ - @Override - public void changeVisibility(String repositoryName, Visibility visibility) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.CHANGE_VISIBILITY_URL); - String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).withFieldEnum(ParameterNames.VISIBILITY, visibility).buildUrl(); - JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); - - unmarshall(new TypeToken(){}, json.get("repository")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#createRepository(java.lang.String, java.lang.String, java.lang.String, com.github.api.v2.schema.Repository.Visibility) - */ - @Override - public void createRepository(String name, String description, - String homePage, Visibility visibility) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.CREATE_REPOSITORY_URL); - String apiUrl = builder.buildUrl(); - Map parameters = new HashMap(); - parameters.put(ParameterNames.NAME, name); - parameters.put(ParameterNames.DESCRIPTION, description); - parameters.put(ParameterNames.HOME_PAGE, homePage); - parameters.put(ParameterNames.PUBLIC, ((visibility == Visibility.PUBLIC)? "1" : "0")); - JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); - - unmarshall(new TypeToken(){}, json.get("repository")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#deleteRepository(java.lang.String) - */ - @Override - public void deleteRepository(String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.DELETE_REPOSITORY_URL); - String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); - if (json.has("delete_token")) { - Map parameters = new HashMap(); - parameters.put(ParameterNames.DELETE_TOKEN, json.get("delete_token").getAsString()); - callApiPost(apiUrl, parameters); - } - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#forkRepository(java.lang.String, java.lang.String) - */ - @Override - public Repository forkRepository(String userName, String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.FORK_REPOSITORY_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); - return unmarshall(new TypeToken(){}, json.get("repository")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#getBranches(java.lang.String, java.lang.String) - */ - @Override - public Map getBranches(String userName, String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_BRANCHES_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("branches")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#getCollaborators(java.lang.String, java.lang.String) - */ - @Override - public List getCollaborators(String userName, String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_COLLABORATORS_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("collaborators")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#getContributors(java.lang.String, java.lang.String) - */ - @Override - public List getContributors(String userName, String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_CONTRIBUTORS_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("contributors")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#getForks(java.lang.String, java.lang.String) - */ - @Override - public List getForks(String userName, String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_FORKS_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("network")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#getDeployKeys(java.lang.String) - */ - @Override - public List getDeployKeys(String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_DEPLOY_KEYS_URL); - String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("public_keys")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#getLanguageBreakdown(java.lang.String, java.lang.String) - */ - @Override - public Map getLanguageBreakdown(String userName, - String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_LANGUAGE_BREAKDOWN_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("languages")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#getPushableRepositories() - */ - @Override - public List getPushableRepositories() { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_PUSHABLE_REPOSITORIES_URL); - String apiUrl = builder.buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("repositories")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#getRepositories(java.lang.String) - */ - @Override - public List getRepositories(String userName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_REPOSITORIES_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("repositories")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#getRepository(java.lang.String, java.lang.String) - */ - @Override - public Repository getRepository(String userName, String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_REPOSITORY_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken(){}, json.get("repository")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#getTags(java.lang.String, java.lang.String) - */ - @Override - public Map getTags(String userName, String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_TAGS_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("tags")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#getWatchers(java.lang.String, java.lang.String) - */ - @Override - public List getWatchers(String userName, String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_WATCHERS_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("watchers")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#removeCollaborator(java.lang.String, java.lang.String) - */ - @Override - public void removeCollaborator(String repositoryName, - String collaboratorName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.REMOVE_COLLABORATOR_URL); - String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.USER_NAME, collaboratorName).buildUrl(); - unmarshall(callApiPost(apiUrl, new HashMap())); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#removeDeployKey(java.lang.String, java.lang.String) - */ - @Override - public void removeDeployKey(String repositoryName, String id) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.REMOVE_DEPLOY_KEY_URL); - String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - Map parameters = new HashMap(); - parameters.put(ParameterNames.ID, id); - unmarshall(callApiPost(apiUrl, parameters)); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#searchRepositories(java.lang.String) - */ - @Override - public List searchRepositories(String query) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); - String apiUrl = builder.withField(ParameterNames.KEYWORD, query).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("repositories")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#searchRepositories(java.lang.String, com.github.api.v2.schema.Language) - */ - @Override - public List searchRepositories(String query, Language language) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); - String apiUrl = builder.withField(ParameterNames.KEYWORD, query).withParameterEnum(ParameterNames.LANGUAGE, language).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("repositories")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#searchRepositories(java.lang.String, int) - */ - @Override - public List searchRepositories(String query, int pageNumber) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); - String apiUrl = builder.withField(ParameterNames.KEYWORD, query).withParameter(ParameterNames.START_PAGE, String.valueOf(pageNumber)).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("repositories")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#searchRepositories(java.lang.String, com.github.api.v2.schema.Language, int) - */ - @Override - public List searchRepositories(String query, Language language, - int pageNumber) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); - String apiUrl = builder.withField(ParameterNames.KEYWORD, query).withParameterEnum(ParameterNames.LANGUAGE, language).withParameter(ParameterNames.START_PAGE, String.valueOf(pageNumber)).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("repositories")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#unwatchRepository(java.lang.String, java.lang.String) - */ - @Override - public void unwatchRepository(String userName, String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.UNWATCH_REPOSITORY_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - unmarshall(callApiPost(apiUrl, new HashMap())); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#updateRepository(com.github.api.v2.schema.Repository) - */ - @Override - public void updateRepository(Repository repository) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.UPDATE_REPOSITORY_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, repository.getOwner()).withField(ParameterNames.REPOSITORY_NAME, repository.getName()).buildUrl(); - Map parameters = new HashMap(); - parameters.put("values[" + ParameterNames.DESCRIPTION + "]", repository.getDescription()); - parameters.put("values[" + ParameterNames.HOME_PAGE + "]", repository.getHomepage()); - parameters.put("values[" + ParameterNames.HAS_WIKI + "]", String.valueOf(repository.isHasWiki())); - parameters.put("values[" + ParameterNames.HAS_ISSUES + "]", String.valueOf(repository.isHasIssues())); - parameters.put("values[" + ParameterNames.HAS_DOWNLOADS + "]", String.valueOf(repository.isHasDownloads())); - JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); - - unmarshall(new TypeToken(){}, json.get("repository")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.RepositoryService#watchRepository(java.lang.String, java.lang.String) - */ - @Override - public void watchRepository(String userName, String repositoryName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.WATCH_REPOSITORY_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); - unmarshall(callApiPost(apiUrl, new HashMap())); - } - - @Override - public ZipInputStream getRepositoryArchive(String userName, String repositoryName, String branchName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_REPOSITORY_ARCHIVE_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, branchName).buildUrl(); - return new ZipInputStream(callApiGet(apiUrl)); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.impl.BaseGitHubService#getGsonBuilder() - */ - protected GsonBuilder getGsonBuilder() { - GsonBuilder gson = super.getGsonBuilder(); - gson.setDateFormat("yyyy-MM-dd'T'HH:mm:ss"); - return gson; - } -} diff --git a/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java b/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java deleted file mode 100644 index b6c28a1..0000000 --- a/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java +++ /dev/null @@ -1,243 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services.impl; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import com.github.api.v2.schema.Key; -import com.github.api.v2.schema.Organization; -import com.github.api.v2.schema.Repository; -import com.github.api.v2.schema.User; -import com.github.api.v2.services.UserService; -import com.github.api.v2.services.constant.GitHubApiUrls; -import com.github.api.v2.services.constant.ParameterNames; -import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; -import com.google.gson.JsonObject; -import com.google.gson.reflect.TypeToken; - -/** - * The Class UserServiceImpl. - */ -public class UserServiceImpl extends BaseGitHubService implements - UserService { - - /* (non-Javadoc) - * @see com.github.api.v2.services.UserService#addEmail(java.lang.String) - */ - @Override - public void addEmail(String email) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.ADD_EMAIL_URL); - String apiUrl = builder.buildUrl(); - Map parameters = new HashMap(); - parameters.put(ParameterNames.EMAIL, email); - callApiPost(apiUrl, parameters); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.UserService#addKey(java.lang.String, java.lang.String) - */ - @Override - public void addKey(String title, String key) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.ADD_KEY_URL); - String apiUrl = builder.buildUrl(); - Map parameters = new HashMap(); - parameters.put(ParameterNames.TITLE, title); - parameters.put(ParameterNames.KEY, key); - callApiPost(apiUrl, parameters); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.UserService#followUser(java.lang.String) - */ - @Override - public void followUser(String userName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.FOLLOW_USER_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); - callApiPost(apiUrl, new HashMap()); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.UserService#getCurrentUser() - */ - @Override - public User getCurrentUser() { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_CURRENT_USER_URL); - String apiUrl = builder.buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken(){}, json.get("user")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.UserService#getEmails() - */ - @Override - public List getEmails() { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_EMAILS_URL); - String apiUrl = builder.buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("emails")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.UserService#getKeys() - */ - @Override - public List getKeys() { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_KEYS_URL); - String apiUrl = builder.buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("keys")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.UserService#getUserByUsername(java.lang.String) - */ - @Override - public User getUserByUsername(String userName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_USER_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken(){}, json.get("user")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.UserService#getUserFollowers(java.lang.String) - */ - @Override - public List getUserFollowers(String userName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_USER_FOLLOWERS_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("users")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.UserService#getUserFollowing(java.lang.String) - */ - @Override - public List getUserFollowing(String userName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_USER_FOLLOWING_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("users")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.UserService#getWatchedRepositories(java.lang.String) - */ - @Override - public List getWatchedRepositories(String userName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_WATCHED_REPOSITORIES_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("repositories")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.UserService#removeEmail(java.lang.String) - */ - @Override - public void removeEmail(String email) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.REMOVE_EMAIL_URL); - String apiUrl = builder.buildUrl(); - Map parameters = new HashMap(); - parameters.put(ParameterNames.EMAIL, email); - callApiPost(apiUrl, parameters); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.UserService#removeKey(java.lang.String) - */ - @Override - public void removeKey(String id) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.REMOVE_KEY_URL); - String apiUrl = builder.buildUrl(); - Map parameters = new HashMap(); - parameters.put(ParameterNames.ID, id); - callApiPost(apiUrl, parameters); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.UserService#getUserByEmail(java.lang.String) - */ - @Override - public User getUserByEmail(String email) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.SEARCH_USERS_BY_EMAIL_URL); - String apiUrl = builder.withField(ParameterNames.EMAIL, email).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken(){}, json.get("user")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.UserService#searchUsersByName(java.lang.String) - */ - @Override - public List searchUsersByName(String name) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.SEARCH_USERS_BY_NAME_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, name).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("users")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.UserService#unfollowUser(java.lang.String) - */ - @Override - public void unfollowUser(String userName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.UNFOLLOW_USER_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); - callApiPost(apiUrl, new HashMap()); - } - - @Override - public List getUserOrganizations(String userName) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_USER_ORGANIZATIONS); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("organizations")); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.UserService#updateUser(com.github.api.v2.schema.User) - */ - @Override - public void updateUser(User user) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.UPDATE_USER_URL); - String userName = (user.getUsername() == null) ? user.getLogin() : user.getUsername(); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); - Map parameters = new HashMap(); - parameters.put("values[" + ParameterNames.NAME + "]", user.getName()); - parameters.put("values[" + ParameterNames.EMAIL + "]", user.getEmail()); - parameters.put("values[" + ParameterNames.BLOG + "]", user.getBlog()); - parameters.put("values[" + ParameterNames.COMPANY + "]", user.getCompany()); - parameters.put("values[" + ParameterNames.LOCATION + "]", user.getLocation()); - callApiPost(apiUrl, parameters); - } - -} diff --git a/src/main/java/com/github/api/v2/services/util/Base64.java b/src/main/java/com/github/api/v2/services/util/Base64.java deleted file mode 100644 index 2aaaf31..0000000 --- a/src/main/java/com/github/api/v2/services/util/Base64.java +++ /dev/null @@ -1,1797 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services.util; - -/** - * The Class Base64. - */ -public class Base64 -{ - -/* ******** P U B L I C F I E L D S ******** */ - - - /** The Constant NO_OPTIONS. */ - public final static int NO_OPTIONS = 0; - - /** The Constant ENCODE. */ - public final static int ENCODE = 1; - - - /** The Constant DECODE. */ - public final static int DECODE = 0; - - - /** The Constant GZIP. */ - public final static int GZIP = 2; - - /** The Constant DONT_GUNZIP. */ - public final static int DONT_GUNZIP = 4; - - - /** The Constant DO_BREAK_LINES. */ - public final static int DO_BREAK_LINES = 8; - - /** The Constant URL_SAFE. */ - public final static int URL_SAFE = 16; - - - /** The Constant ORDERED. */ - public final static int ORDERED = 32; - - -/* ******** P R I V A T E F I E L D S ******** */ - - - /** The Constant MAX_LINE_LENGTH. */ - private final static int MAX_LINE_LENGTH = 76; - - - /** The Constant EQUALS_SIGN. */ - private final static byte EQUALS_SIGN = (byte)'='; - - - /** The Constant NEW_LINE. */ - private final static byte NEW_LINE = (byte)'\n'; - - - /** The Constant PREFERRED_ENCODING. */ - private final static String PREFERRED_ENCODING = "US-ASCII"; - - - /** The Constant WHITE_SPACE_ENC. */ - private final static byte WHITE_SPACE_ENC = -5; // Indicates white space in encoding - - /** The Constant EQUALS_SIGN_ENC. */ - private final static byte EQUALS_SIGN_ENC = -1; // Indicates equals sign in encoding - - -/* ******** S T A N D A R D B A S E 6 4 A L P H A B E T ******** */ - - /** The Constant _STANDARD_ALPHABET. */ - /* Host platform me be something funny like EBCDIC, so we hardcode these values. */ - private final static byte[] _STANDARD_ALPHABET = { - (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G', - (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N', - (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U', - (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z', - (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', - (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n', - (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u', - (byte)'v', (byte)'w', (byte)'x', (byte)'y', (byte)'z', - (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', - (byte)'6', (byte)'7', (byte)'8', (byte)'9', (byte)'+', (byte)'/' - }; - - - /** The Constant _STANDARD_DECODABET. */ - private final static byte[] _STANDARD_DECODABET = { - -9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 0 - 8 - -5,-5, // Whitespace: Tab and Linefeed - -9,-9, // Decimal 11 - 12 - -5, // Whitespace: Carriage Return - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 14 - 26 - -9,-9,-9,-9,-9, // Decimal 27 - 31 - -5, // Whitespace: Space - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 33 - 42 - 62, // Plus sign at decimal 43 - -9,-9,-9, // Decimal 44 - 46 - 63, // Slash at decimal 47 - 52,53,54,55,56,57,58,59,60,61, // Numbers zero through nine - -9,-9,-9, // Decimal 58 - 60 - -1, // Equals sign at decimal 61 - -9,-9,-9, // Decimal 62 - 64 - 0,1,2,3,4,5,6,7,8,9,10,11,12,13, // Letters 'A' through 'N' - 14,15,16,17,18,19,20,21,22,23,24,25, // Letters 'O' through 'Z' - -9,-9,-9,-9,-9,-9, // Decimal 91 - 96 - 26,27,28,29,30,31,32,33,34,35,36,37,38, // Letters 'a' through 'm' - 39,40,41,42,43,44,45,46,47,48,49,50,51, // Letters 'n' through 'z' - -9,-9,-9,-9,-9 // Decimal 123 - 127 - ,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 128 - 139 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 - }; - - -/* ******** U R L S A F E B A S E 6 4 A L P H A B E T ******** */ - - /** The Constant _URL_SAFE_ALPHABET. */ - private final static byte[] _URL_SAFE_ALPHABET = { - (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G', - (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N', - (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U', - (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z', - (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', - (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n', - (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u', - (byte)'v', (byte)'w', (byte)'x', (byte)'y', (byte)'z', - (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', - (byte)'6', (byte)'7', (byte)'8', (byte)'9', (byte)'-', (byte)'_' - }; - - /** The Constant _URL_SAFE_DECODABET. */ - private final static byte[] _URL_SAFE_DECODABET = { - -9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 0 - 8 - -5,-5, // Whitespace: Tab and Linefeed - -9,-9, // Decimal 11 - 12 - -5, // Whitespace: Carriage Return - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 14 - 26 - -9,-9,-9,-9,-9, // Decimal 27 - 31 - -5, // Whitespace: Space - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 33 - 42 - -9, // Plus sign at decimal 43 - -9, // Decimal 44 - 62, // Minus sign at decimal 45 - -9, // Decimal 46 - -9, // Slash at decimal 47 - 52,53,54,55,56,57,58,59,60,61, // Numbers zero through nine - -9,-9,-9, // Decimal 58 - 60 - -1, // Equals sign at decimal 61 - -9,-9,-9, // Decimal 62 - 64 - 0,1,2,3,4,5,6,7,8,9,10,11,12,13, // Letters 'A' through 'N' - 14,15,16,17,18,19,20,21,22,23,24,25, // Letters 'O' through 'Z' - -9,-9,-9,-9, // Decimal 91 - 94 - 63, // Underscore at decimal 95 - -9, // Decimal 96 - 26,27,28,29,30,31,32,33,34,35,36,37,38, // Letters 'a' through 'm' - 39,40,41,42,43,44,45,46,47,48,49,50,51, // Letters 'n' through 'z' - -9,-9,-9,-9,-9 // Decimal 123 - 127 - ,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 128 - 139 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 - }; - - - -/* ******** O R D E R E D B A S E 6 4 A L P H A B E T ******** */ - - /** The Constant _ORDERED_ALPHABET. */ - private final static byte[] _ORDERED_ALPHABET = { - (byte)'-', - (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', - (byte)'5', (byte)'6', (byte)'7', (byte)'8', (byte)'9', - (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G', - (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N', - (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U', - (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z', - (byte)'_', - (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', - (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n', - (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u', - (byte)'v', (byte)'w', (byte)'x', (byte)'y', (byte)'z' - }; - - /** The Constant _ORDERED_DECODABET. */ - private final static byte[] _ORDERED_DECODABET = { - -9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 0 - 8 - -5,-5, // Whitespace: Tab and Linefeed - -9,-9, // Decimal 11 - 12 - -5, // Whitespace: Carriage Return - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 14 - 26 - -9,-9,-9,-9,-9, // Decimal 27 - 31 - -5, // Whitespace: Space - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 33 - 42 - -9, // Plus sign at decimal 43 - -9, // Decimal 44 - 0, // Minus sign at decimal 45 - -9, // Decimal 46 - -9, // Slash at decimal 47 - 1,2,3,4,5,6,7,8,9,10, // Numbers zero through nine - -9,-9,-9, // Decimal 58 - 60 - -1, // Equals sign at decimal 61 - -9,-9,-9, // Decimal 62 - 64 - 11,12,13,14,15,16,17,18,19,20,21,22,23, // Letters 'A' through 'M' - 24,25,26,27,28,29,30,31,32,33,34,35,36, // Letters 'N' through 'Z' - -9,-9,-9,-9, // Decimal 91 - 94 - 37, // Underscore at decimal 95 - -9, // Decimal 96 - 38,39,40,41,42,43,44,45,46,47,48,49,50, // Letters 'a' through 'm' - 51,52,53,54,55,56,57,58,59,60,61,62,63, // Letters 'n' through 'z' - -9,-9,-9,-9,-9 // Decimal 123 - 127 - ,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 128 - 139 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243 - -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 - }; - - -/* ******** D E T E R M I N E W H I C H A L H A B E T ******** */ - - - /** - * Gets the alphabet. - * - * @param options - * the options - * - * @return the alphabet - */ - private final static byte[] getAlphabet( int options ) { - if ((options & URL_SAFE) == URL_SAFE) { - return _URL_SAFE_ALPHABET; - } else if ((options & ORDERED) == ORDERED) { - return _ORDERED_ALPHABET; - } else { - return _STANDARD_ALPHABET; - } - } // end getAlphabet - - - /** - * Gets the decodabet. - * - * @param options - * the options - * - * @return the decodabet - */ - private final static byte[] getDecodabet( int options ) { - if( (options & URL_SAFE) == URL_SAFE) { - return _URL_SAFE_DECODABET; - } else if ((options & ORDERED) == ORDERED) { - return _ORDERED_DECODABET; - } else { - return _STANDARD_DECODABET; - } - } // end getAlphabet - - - - /** - * Instantiates a new base64. - */ - private Base64(){} - - - - -/* ******** E N C O D I N G M E T H O D S ******** */ - - - /** - * Encode3to4. - * - * @param b4 - * the b4 - * @param threeBytes - * the three bytes - * @param numSigBytes - * the num sig bytes - * @param options - * the options - * - * @return the byte[] - */ - private static byte[] encode3to4( byte[] b4, byte[] threeBytes, int numSigBytes, int options ) { - encode3to4( threeBytes, 0, numSigBytes, b4, 0, options ); - return b4; - } // end encode3to4 - - - /** - * Encode3to4. - * - * @param source - * the source - * @param srcOffset - * the src offset - * @param numSigBytes - * the num sig bytes - * @param destination - * the destination - * @param destOffset - * the dest offset - * @param options - * the options - * - * @return the byte[] - */ - private static byte[] encode3to4( - byte[] source, int srcOffset, int numSigBytes, - byte[] destination, int destOffset, int options ) { - - byte[] ALPHABET = getAlphabet( options ); - - // 1 2 3 - // 01234567890123456789012345678901 Bit position - // --------000000001111111122222222 Array position from threeBytes - // --------| || || || | Six bit groups to index ALPHABET - // >>18 >>12 >> 6 >> 0 Right shift necessary - // 0x3f 0x3f 0x3f Additional AND - - // Create buffer with zero-padding if there are only one or two - // significant bytes passed in the array. - // We have to shift left 24 in order to flush out the 1's that appear - // when Java treats a value as negative that is cast from a byte to an int. - int inBuff = ( numSigBytes > 0 ? ((source[ srcOffset ] << 24) >>> 8) : 0 ) - | ( numSigBytes > 1 ? ((source[ srcOffset + 1 ] << 24) >>> 16) : 0 ) - | ( numSigBytes > 2 ? ((source[ srcOffset + 2 ] << 24) >>> 24) : 0 ); - - switch( numSigBytes ) - { - case 3: - destination[ destOffset ] = ALPHABET[ (inBuff >>> 18) ]; - destination[ destOffset + 1 ] = ALPHABET[ (inBuff >>> 12) & 0x3f ]; - destination[ destOffset + 2 ] = ALPHABET[ (inBuff >>> 6) & 0x3f ]; - destination[ destOffset + 3 ] = ALPHABET[ (inBuff ) & 0x3f ]; - return destination; - - case 2: - destination[ destOffset ] = ALPHABET[ (inBuff >>> 18) ]; - destination[ destOffset + 1 ] = ALPHABET[ (inBuff >>> 12) & 0x3f ]; - destination[ destOffset + 2 ] = ALPHABET[ (inBuff >>> 6) & 0x3f ]; - destination[ destOffset + 3 ] = EQUALS_SIGN; - return destination; - - case 1: - destination[ destOffset ] = ALPHABET[ (inBuff >>> 18) ]; - destination[ destOffset + 1 ] = ALPHABET[ (inBuff >>> 12) & 0x3f ]; - destination[ destOffset + 2 ] = EQUALS_SIGN; - destination[ destOffset + 3 ] = EQUALS_SIGN; - return destination; - - default: - return destination; - } // end switch - } // end encode3to4 - - - - /** - * Encode. - * - * @param raw - * the raw - * @param encoded - * the encoded - */ - public static void encode( java.nio.ByteBuffer raw, java.nio.ByteBuffer encoded ){ - byte[] raw3 = new byte[3]; - byte[] enc4 = new byte[4]; - - while( raw.hasRemaining() ){ - int rem = Math.min(3,raw.remaining()); - raw.get(raw3,0,rem); - Base64.encode3to4(enc4, raw3, rem, Base64.NO_OPTIONS ); - encoded.put(enc4); - } // end input remaining - } - - - /** - * Encode. - * - * @param raw - * the raw - * @param encoded - * the encoded - */ - public static void encode( java.nio.ByteBuffer raw, java.nio.CharBuffer encoded ){ - byte[] raw3 = new byte[3]; - byte[] enc4 = new byte[4]; - - while( raw.hasRemaining() ){ - int rem = Math.min(3,raw.remaining()); - raw.get(raw3,0,rem); - Base64.encode3to4(enc4, raw3, rem, Base64.NO_OPTIONS ); - for( int i = 0; i < 4; i++ ){ - encoded.put( (char)(enc4[i] & 0xFF) ); - } - } // end input remaining - } - - - - - /** - * Encode object. - * - * @param serializableObject - * the serializable object - * - * @return the string - * - * @throws IOException - * Signals that an I/O exception has occurred. - */ - public static String encodeObject( java.io.Serializable serializableObject ) - throws java.io.IOException { - return encodeObject( serializableObject, NO_OPTIONS ); - } // end encodeObject - - - - /** - * Encode object. - * - * @param serializableObject - * the serializable object - * @param options - * the options - * - * @return the string - * - * @throws IOException - * Signals that an I/O exception has occurred. - */ - public static String encodeObject( java.io.Serializable serializableObject, int options ) - throws java.io.IOException { - - if( serializableObject == null ){ - throw new NullPointerException( "Cannot serialize a null object." ); - } // end if: null - - // Streams - java.io.ByteArrayOutputStream baos = null; - java.io.OutputStream b64os = null; - java.util.zip.GZIPOutputStream gzos = null; - java.io.ObjectOutputStream oos = null; - - - try { - // ObjectOutputStream -> (GZIP) -> Base64 -> ByteArrayOutputStream - baos = new java.io.ByteArrayOutputStream(); - b64os = new Base64.OutputStream( baos, ENCODE | options ); - if( (options & GZIP) != 0 ){ - // Gzip - gzos = new java.util.zip.GZIPOutputStream(b64os); - oos = new java.io.ObjectOutputStream( gzos ); - } else { - // Not gzipped - oos = new java.io.ObjectOutputStream( b64os ); - } - oos.writeObject( serializableObject ); - } // end try - catch( java.io.IOException e ) { - // Catch it and then throw it immediately so that - // the finally{} block is called for cleanup. - throw e; - } // end catch - finally { - try{ oos.close(); } catch( Exception e ){} - try{ gzos.close(); } catch( Exception e ){} - try{ b64os.close(); } catch( Exception e ){} - try{ baos.close(); } catch( Exception e ){} - } // end finally - - // Return value according to relevant encoding. - try { - return new String( baos.toByteArray(), PREFERRED_ENCODING ); - } // end try - catch (java.io.UnsupportedEncodingException uue){ - // Fall back to some Java default - return new String( baos.toByteArray() ); - } // end catch - - } // end encode - - - - /** - * Encode bytes. - * - * @param source - * the source - * - * @return the string - */ - public static String encodeBytes( byte[] source ) { - // Since we're not going to have the GZIP encoding turned on, - // we're not going to have an java.io.IOException thrown, so - // we should not force the user to have to catch it. - String encoded = null; - try { - encoded = encodeBytes(source, 0, source.length, NO_OPTIONS); - } catch (java.io.IOException ex) { - assert false : ex.getMessage(); - } // end catch - assert encoded != null; - return encoded; - } // end encodeBytes - - - - /** - * Encode bytes. - * - * @param source - * the source - * @param options - * the options - * - * @return the string - * - * @throws IOException - * Signals that an I/O exception has occurred. - */ - public static String encodeBytes( byte[] source, int options ) throws java.io.IOException { - return encodeBytes( source, 0, source.length, options ); - } // end encodeBytes - - - /** - * Encode bytes. - * - * @param source - * the source - * @param off - * the off - * @param len - * the len - * - * @return the string - */ - public static String encodeBytes( byte[] source, int off, int len ) { - // Since we're not going to have the GZIP encoding turned on, - // we're not going to have an java.io.IOException thrown, so - // we should not force the user to have to catch it. - String encoded = null; - try { - encoded = encodeBytes( source, off, len, NO_OPTIONS ); - } catch (java.io.IOException ex) { - assert false : ex.getMessage(); - } // end catch - assert encoded != null; - return encoded; - } // end encodeBytes - - - - /** - * Encode bytes. - * - * @param source - * the source - * @param off - * the off - * @param len - * the len - * @param options - * the options - * - * @return the string - * - * @throws IOException - * Signals that an I/O exception has occurred. - */ - public static String encodeBytes( byte[] source, int off, int len, int options ) throws java.io.IOException { - byte[] encoded = encodeBytesToBytes( source, off, len, options ); - - // Return value according to relevant encoding. - try { - return new String( encoded, PREFERRED_ENCODING ); - } // end try - catch (java.io.UnsupportedEncodingException uue) { - return new String( encoded ); - } // end catch - - } // end encodeBytes - - - - - /** - * Encode bytes to bytes. - * - * @param source - * the source - * - * @return the byte[] - */ - public static byte[] encodeBytesToBytes( byte[] source ) { - byte[] encoded = null; - try { - encoded = encodeBytesToBytes( source, 0, source.length, Base64.NO_OPTIONS ); - } catch( java.io.IOException ex ) { - assert false : "IOExceptions only come from GZipping, which is turned off: " + ex.getMessage(); - } - return encoded; - } - - - /** - * Encode bytes to bytes. - * - * @param source - * the source - * @param off - * the off - * @param len - * the len - * @param options - * the options - * - * @return the byte[] - * - * @throws IOException - * Signals that an I/O exception has occurred. - */ - public static byte[] encodeBytesToBytes( byte[] source, int off, int len, int options ) throws java.io.IOException { - - if( source == null ){ - throw new NullPointerException( "Cannot serialize a null array." ); - } // end if: null - - if( off < 0 ){ - throw new IllegalArgumentException( "Cannot have negative offset: " + off ); - } // end if: off < 0 - - if( len < 0 ){ - throw new IllegalArgumentException( "Cannot have length offset: " + len ); - } // end if: len < 0 - - if( off + len > source.length ){ - throw new IllegalArgumentException( - String.format( "Cannot have offset of %d and length of %d with array of length %d", off,len,source.length)); - } // end if: off < 0 - - - - // Compress? - if( (options & GZIP) != 0 ) { - java.io.ByteArrayOutputStream baos = null; - java.util.zip.GZIPOutputStream gzos = null; - Base64.OutputStream b64os = null; - - try { - // GZip -> Base64 -> ByteArray - baos = new java.io.ByteArrayOutputStream(); - b64os = new Base64.OutputStream( baos, ENCODE | options ); - gzos = new java.util.zip.GZIPOutputStream( b64os ); - - gzos.write( source, off, len ); - gzos.close(); - } // end try - catch( java.io.IOException e ) { - // Catch it and then throw it immediately so that - // the finally{} block is called for cleanup. - throw e; - } // end catch - finally { - try{ gzos.close(); } catch( Exception e ){} - try{ b64os.close(); } catch( Exception e ){} - try{ baos.close(); } catch( Exception e ){} - } // end finally - - return baos.toByteArray(); - } // end if: compress - - // Else, don't compress. Better not to use streams at all then. - else { - boolean breakLines = (options & DO_BREAK_LINES) != 0; - - //int len43 = len * 4 / 3; - //byte[] outBuff = new byte[ ( len43 ) // Main 4:3 - // + ( (len % 3) > 0 ? 4 : 0 ) // Account for padding - // + (breakLines ? ( len43 / MAX_LINE_LENGTH ) : 0) ]; // New lines - // Try to determine more precisely how big the array needs to be. - // If we get it right, we don't have to do an array copy, and - // we save a bunch of memory. - int encLen = ( len / 3 ) * 4 + ( len % 3 > 0 ? 4 : 0 ); // Bytes needed for actual encoding - if( breakLines ){ - encLen += encLen / MAX_LINE_LENGTH; // Plus extra newline characters - } - byte[] outBuff = new byte[ encLen ]; - - - int d = 0; - int e = 0; - int len2 = len - 2; - int lineLength = 0; - for( ; d < len2; d+=3, e+=4 ) { - encode3to4( source, d+off, 3, outBuff, e, options ); - - lineLength += 4; - if( breakLines && lineLength >= MAX_LINE_LENGTH ) - { - outBuff[e+4] = NEW_LINE; - e++; - lineLength = 0; - } // end if: end of line - } // en dfor: each piece of array - - if( d < len ) { - encode3to4( source, d+off, len - d, outBuff, e, options ); - e += 4; - } // end if: some padding needed - - - // Only resize array if we didn't guess it right. - if( e <= outBuff.length - 1 ){ - // If breaking lines and the last byte falls right at - // the line length (76 bytes per line), there will be - // one extra byte, and the array will need to be resized. - // Not too bad of an estimate on array size, I'd say. - byte[] finalOut = new byte[e]; - System.arraycopy(outBuff,0, finalOut,0,e); - //System.err.println("Having to resize array from " + outBuff.length + " to " + e ); - return finalOut; - } else { - //System.err.println("No need to resize array."); - return outBuff; - } - - } // end else: don't compress - - } // end encodeBytesToBytes - - - - - -/* ******** D E C O D I N G M E T H O D S ******** */ - - - /** - * Decode4to3. - * - * @param source - * the source - * @param srcOffset - * the src offset - * @param destination - * the destination - * @param destOffset - * the dest offset - * @param options - * the options - * - * @return the int - */ - private static int decode4to3( - byte[] source, int srcOffset, - byte[] destination, int destOffset, int options ) { - - // Lots of error checking and exception throwing - if( source == null ){ - throw new NullPointerException( "Source array was null." ); - } // end if - if( destination == null ){ - throw new NullPointerException( "Destination array was null." ); - } // end if - if( srcOffset < 0 || srcOffset + 3 >= source.length ){ - throw new IllegalArgumentException( String.format( - "Source array with length %d cannot have offset of %d and still process four bytes.", source.length, srcOffset ) ); - } // end if - if( destOffset < 0 || destOffset +2 >= destination.length ){ - throw new IllegalArgumentException( String.format( - "Destination array with length %d cannot have offset of %d and still store three bytes.", destination.length, destOffset ) ); - } // end if - - - byte[] DECODABET = getDecodabet( options ); - - // Example: Dk== - if( source[ srcOffset + 2] == EQUALS_SIGN ) { - // Two ways to do the same thing. Don't know which way I like best. - //int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 ) - // | ( ( DECODABET[ source[ srcOffset + 1] ] << 24 ) >>> 12 ); - int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 ) - | ( ( DECODABET[ source[ srcOffset + 1] ] & 0xFF ) << 12 ); - - destination[ destOffset ] = (byte)( outBuff >>> 16 ); - return 1; - } - - // Example: DkL= - else if( source[ srcOffset + 3 ] == EQUALS_SIGN ) { - // Two ways to do the same thing. Don't know which way I like best. - //int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 ) - // | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 ) - // | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 ); - int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 ) - | ( ( DECODABET[ source[ srcOffset + 1 ] ] & 0xFF ) << 12 ) - | ( ( DECODABET[ source[ srcOffset + 2 ] ] & 0xFF ) << 6 ); - - destination[ destOffset ] = (byte)( outBuff >>> 16 ); - destination[ destOffset + 1 ] = (byte)( outBuff >>> 8 ); - return 2; - } - - // Example: DkLE - else { - // Two ways to do the same thing. Don't know which way I like best. - //int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 ) - // | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 ) - // | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 ) - // | ( ( DECODABET[ source[ srcOffset + 3 ] ] << 24 ) >>> 24 ); - int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 ) - | ( ( DECODABET[ source[ srcOffset + 1 ] ] & 0xFF ) << 12 ) - | ( ( DECODABET[ source[ srcOffset + 2 ] ] & 0xFF ) << 6) - | ( ( DECODABET[ source[ srcOffset + 3 ] ] & 0xFF ) ); - - - destination[ destOffset ] = (byte)( outBuff >> 16 ); - destination[ destOffset + 1 ] = (byte)( outBuff >> 8 ); - destination[ destOffset + 2 ] = (byte)( outBuff ); - - return 3; - } - } // end decodeToBytes - - - - - - /** - * Decode. - * - * @param source - * the source - * - * @return the byte[] - * - * @throws IOException - * Signals that an I/O exception has occurred. - */ - public static byte[] decode( byte[] source ) - throws java.io.IOException { - byte[] decoded = null; -// try { - decoded = decode( source, 0, source.length, Base64.NO_OPTIONS ); -// } catch( java.io.IOException ex ) { -// assert false : "IOExceptions only come from GZipping, which is turned off: " + ex.getMessage(); -// } - return decoded; - } - - - - /** - * Decode. - * - * @param source - * the source - * @param off - * the off - * @param len - * the len - * @param options - * the options - * - * @return the byte[] - * - * @throws IOException - * Signals that an I/O exception has occurred. - */ - public static byte[] decode( byte[] source, int off, int len, int options ) - throws java.io.IOException { - - // Lots of error checking and exception throwing - if( source == null ){ - throw new NullPointerException( "Cannot decode null source array." ); - } // end if - if( off < 0 || off + len > source.length ){ - throw new IllegalArgumentException( String.format( - "Source array with length %d cannot have offset of %d and process %d bytes.", source.length, off, len ) ); - } // end if - - if( len == 0 ){ - return new byte[0]; - }else if( len < 4 ){ - throw new IllegalArgumentException( - "Base64-encoded string must have at least four characters, but length specified was " + len ); - } // end if - - byte[] DECODABET = getDecodabet( options ); - - int len34 = len * 3 / 4; // Estimate on array size - byte[] outBuff = new byte[ len34 ]; // Upper limit on size of output - int outBuffPosn = 0; // Keep track of where we're writing - - byte[] b4 = new byte[4]; // Four byte buffer from source, eliminating white space - int b4Posn = 0; // Keep track of four byte input buffer - int i = 0; // Source array counter - byte sbiDecode = 0; // Special value from DECODABET - - for( i = off; i < off+len; i++ ) { // Loop through source - - sbiDecode = DECODABET[ source[i]&0xFF ]; - - // White space, Equals sign, or legit Base64 character - // Note the values such as -5 and -9 in the - // DECODABETs at the top of the file. - if( sbiDecode >= WHITE_SPACE_ENC ) { - if( sbiDecode >= EQUALS_SIGN_ENC ) { - b4[ b4Posn++ ] = source[i]; // Save non-whitespace - if( b4Posn > 3 ) { // Time to decode? - outBuffPosn += decode4to3( b4, 0, outBuff, outBuffPosn, options ); - b4Posn = 0; - - // If that was the equals sign, break out of 'for' loop - if( source[i] == EQUALS_SIGN ) { - break; - } // end if: equals sign - } // end if: quartet built - } // end if: equals sign or better - } // end if: white space, equals sign or better - else { - // There's a bad input character in the Base64 stream. - throw new java.io.IOException( String.format( - "Bad Base64 input character decimal %d in array position %d", ((int)source[i])&0xFF, i ) ); - } // end else: - } // each input character - - byte[] out = new byte[ outBuffPosn ]; - System.arraycopy( outBuff, 0, out, 0, outBuffPosn ); - return out; - } // end decode - - - - - /** - * Decode. - * - * @param s - * the s - * - * @return the byte[] - * - * @throws IOException - * Signals that an I/O exception has occurred. - */ - public static byte[] decode( String s ) throws java.io.IOException { - return decode( s, NO_OPTIONS ); - } - - - - /** - * Decode. - * - * @param s - * the s - * @param options - * the options - * - * @return the byte[] - * - * @throws IOException - * Signals that an I/O exception has occurred. - */ - public static byte[] decode( String s, int options ) throws java.io.IOException { - - if( s == null ){ - throw new NullPointerException( "Input string was null." ); - } // end if - - byte[] bytes; - try { - bytes = s.getBytes( PREFERRED_ENCODING ); - } // end try - catch( java.io.UnsupportedEncodingException uee ) { - bytes = s.getBytes(); - } // end catch - // - - // Decode - bytes = decode( bytes, 0, bytes.length, options ); - - // Check to see if it's gzip-compressed - // GZIP Magic Two-Byte Number: 0x8b1f (35615) - boolean dontGunzip = (options & DONT_GUNZIP) != 0; - if( (bytes != null) && (bytes.length >= 4) && (!dontGunzip) ) { - - int head = ((int)bytes[0] & 0xff) | ((bytes[1] << 8) & 0xff00); - if( java.util.zip.GZIPInputStream.GZIP_MAGIC == head ) { - java.io.ByteArrayInputStream bais = null; - java.util.zip.GZIPInputStream gzis = null; - java.io.ByteArrayOutputStream baos = null; - byte[] buffer = new byte[2048]; - int length = 0; - - try { - baos = new java.io.ByteArrayOutputStream(); - bais = new java.io.ByteArrayInputStream( bytes ); - gzis = new java.util.zip.GZIPInputStream( bais ); - - while( ( length = gzis.read( buffer ) ) >= 0 ) { - baos.write(buffer,0,length); - } // end while: reading input - - // No error? Get new bytes. - bytes = baos.toByteArray(); - - } // end try - catch( java.io.IOException e ) { - e.printStackTrace(); - // Just return originally-decoded bytes - } // end catch - finally { - try{ baos.close(); } catch( Exception e ){} - try{ gzis.close(); } catch( Exception e ){} - try{ bais.close(); } catch( Exception e ){} - } // end finally - - } // end if: gzipped - } // end if: bytes.length >= 2 - - return bytes; - } // end decode - - - - /** - * Decode to object. - * - * @param encodedObject - * the encoded object - * - * @return the object - * - * @throws IOException - * Signals that an I/O exception has occurred. - * @throws ClassNotFoundException - * the class not found exception - */ - public static Object decodeToObject( String encodedObject ) - throws java.io.IOException, java.lang.ClassNotFoundException { - return decodeToObject(encodedObject,NO_OPTIONS,null); - } - - - /** - * Decode to object. - * - * @param encodedObject - * the encoded object - * @param options - * the options - * @param loader - * the loader - * - * @return the object - * - * @throws IOException - * Signals that an I/O exception has occurred. - * @throws ClassNotFoundException - * the class not found exception - */ - public static Object decodeToObject( - String encodedObject, int options, final ClassLoader loader ) - throws java.io.IOException, java.lang.ClassNotFoundException { - - // Decode and gunzip if necessary - byte[] objBytes = decode( encodedObject, options ); - - java.io.ByteArrayInputStream bais = null; - java.io.ObjectInputStream ois = null; - Object obj = null; - - try { - bais = new java.io.ByteArrayInputStream( objBytes ); - - // If no custom class loader is provided, use Java's builtin OIS. - if( loader == null ){ - ois = new java.io.ObjectInputStream( bais ); - } // end if: no loader provided - - // Else make a customized object input stream that uses - // the provided class loader. - else { - ois = new java.io.ObjectInputStream(bais){ - @Override - public Class resolveClass(java.io.ObjectStreamClass streamClass) - throws java.io.IOException, ClassNotFoundException { - Class c = Class.forName(streamClass.getName(), false, loader); - if( c == null ){ - return super.resolveClass(streamClass); - } else { - return c; // Class loader knows of this class. - } // end else: not null - } // end resolveClass - }; // end ois - } // end else: no custom class loader - - obj = ois.readObject(); - } // end try - catch( java.io.IOException e ) { - throw e; // Catch and throw in order to execute finally{} - } // end catch - catch( java.lang.ClassNotFoundException e ) { - throw e; // Catch and throw in order to execute finally{} - } // end catch - finally { - try{ bais.close(); } catch( Exception e ){} - try{ ois.close(); } catch( Exception e ){} - } // end finally - - return obj; - } // end decodeObject - - - - /** - * Encode to file. - * - * @param dataToEncode - * the data to encode - * @param filename - * the filename - * - * @throws IOException - * Signals that an I/O exception has occurred. - */ - public static void encodeToFile( byte[] dataToEncode, String filename ) - throws java.io.IOException { - - if( dataToEncode == null ){ - throw new NullPointerException( "Data to encode was null." ); - } // end iff - - Base64.OutputStream bos = null; - try { - bos = new Base64.OutputStream( - new java.io.FileOutputStream( filename ), Base64.ENCODE ); - bos.write( dataToEncode ); - } // end try - catch( java.io.IOException e ) { - throw e; // Catch and throw to execute finally{} block - } // end catch: java.io.IOException - finally { - try{ bos.close(); } catch( Exception e ){} - } // end finally - - } // end encodeToFile - - - /** - * Decode to file. - * - * @param dataToDecode - * the data to decode - * @param filename - * the filename - * - * @throws IOException - * Signals that an I/O exception has occurred. - */ - public static void decodeToFile( String dataToDecode, String filename ) - throws java.io.IOException { - - Base64.OutputStream bos = null; - try{ - bos = new Base64.OutputStream( - new java.io.FileOutputStream( filename ), Base64.DECODE ); - bos.write( dataToDecode.getBytes( PREFERRED_ENCODING ) ); - } // end try - catch( java.io.IOException e ) { - throw e; // Catch and throw to execute finally{} block - } // end catch: java.io.IOException - finally { - try{ bos.close(); } catch( Exception e ){} - } // end finally - - } // end decodeToFile - - - - - /** - * Decode from file. - * - * @param filename - * the filename - * - * @return the byte[] - * - * @throws IOException - * Signals that an I/O exception has occurred. - */ - public static byte[] decodeFromFile( String filename ) - throws java.io.IOException { - - byte[] decodedData = null; - Base64.InputStream bis = null; - try - { - // Set up some useful variables - java.io.File file = new java.io.File( filename ); - byte[] buffer = null; - int length = 0; - int numBytes = 0; - - // Check for size of file - if( file.length() > Integer.MAX_VALUE ) - { - throw new java.io.IOException( "File is too big for this convenience method (" + file.length() + " bytes)." ); - } // end if: file too big for int index - buffer = new byte[ (int)file.length() ]; - - // Open a stream - bis = new Base64.InputStream( - new java.io.BufferedInputStream( - new java.io.FileInputStream( file ) ), Base64.DECODE ); - - // Read until done - while( ( numBytes = bis.read( buffer, length, 4096 ) ) >= 0 ) { - length += numBytes; - } // end while - - // Save in a variable to return - decodedData = new byte[ length ]; - System.arraycopy( buffer, 0, decodedData, 0, length ); - - } // end try - catch( java.io.IOException e ) { - throw e; // Catch and release to execute finally{} - } // end catch: java.io.IOException - finally { - try{ bis.close(); } catch( Exception e) {} - } // end finally - - return decodedData; - } // end decodeFromFile - - - - /** - * Encode from file. - * - * @param filename - * the filename - * - * @return the string - * - * @throws IOException - * Signals that an I/O exception has occurred. - */ - public static String encodeFromFile( String filename ) - throws java.io.IOException { - - String encodedData = null; - Base64.InputStream bis = null; - try - { - // Set up some useful variables - java.io.File file = new java.io.File( filename ); - byte[] buffer = new byte[ Math.max((int)(file.length() * 1.4+1),40) ]; // Need max() for math on small files (v2.2.1); Need +1 for a few corner cases (v2.3.5) - int length = 0; - int numBytes = 0; - - // Open a stream - bis = new Base64.InputStream( - new java.io.BufferedInputStream( - new java.io.FileInputStream( file ) ), Base64.ENCODE ); - - // Read until done - while( ( numBytes = bis.read( buffer, length, 4096 ) ) >= 0 ) { - length += numBytes; - } // end while - - // Save in a variable to return - encodedData = new String( buffer, 0, length, Base64.PREFERRED_ENCODING ); - - } // end try - catch( java.io.IOException e ) { - throw e; // Catch and release to execute finally{} - } // end catch: java.io.IOException - finally { - try{ bis.close(); } catch( Exception e) {} - } // end finally - - return encodedData; - } // end encodeFromFile - - /** - * Encode file to file. - * - * @param infile - * the infile - * @param outfile - * the outfile - * - * @throws IOException - * Signals that an I/O exception has occurred. - */ - public static void encodeFileToFile( String infile, String outfile ) - throws java.io.IOException { - - String encoded = Base64.encodeFromFile( infile ); - java.io.OutputStream out = null; - try{ - out = new java.io.BufferedOutputStream( - new java.io.FileOutputStream( outfile ) ); - out.write( encoded.getBytes("US-ASCII") ); // Strict, 7-bit output. - } // end try - catch( java.io.IOException e ) { - throw e; // Catch and release to execute finally{} - } // end catch - finally { - try { out.close(); } - catch( Exception ex ){} - } // end finally - } // end encodeFileToFile - - - /** - * Decode file to file. - * - * @param infile - * the infile - * @param outfile - * the outfile - * - * @throws IOException - * Signals that an I/O exception has occurred. - */ - public static void decodeFileToFile( String infile, String outfile ) - throws java.io.IOException { - - byte[] decoded = Base64.decodeFromFile( infile ); - java.io.OutputStream out = null; - try{ - out = new java.io.BufferedOutputStream( - new java.io.FileOutputStream( outfile ) ); - out.write( decoded ); - } // end try - catch( java.io.IOException e ) { - throw e; // Catch and release to execute finally{} - } // end catch - finally { - try { out.close(); } - catch( Exception ex ){} - } // end finally - } // end decodeFileToFile - - - /* ******** I N N E R C L A S S I N P U T S T R E A M ******** */ - - - - /** - * The Class InputStream. - */ - public static class InputStream extends java.io.FilterInputStream { - - /** The encode. */ - private boolean encode; // Encoding or decoding - - /** The position. */ - private int position; // Current position in the buffer - - /** The buffer. */ - private byte[] buffer; // Small buffer holding converted data - - /** The buffer length. */ - private int bufferLength; // Length of buffer (3 or 4) - - /** The num sig bytes. */ - private int numSigBytes; // Number of meaningful bytes in the buffer - - /** The line length. */ - private int lineLength; - - /** The break lines. */ - private boolean breakLines; // Break lines at less than 80 characters - - /** The options. */ - private int options; // Record options used to create the stream. - - /** The decodabet. */ - private byte[] decodabet; // Local copies to avoid extra method calls - - - /** - * Instantiates a new input stream. - * - * @param in - * the in - */ - public InputStream( java.io.InputStream in ) { - this( in, DECODE ); - } // end constructor - - - /** - * Instantiates a new input stream. - * - * @param in - * the in - * @param options - * the options - */ - public InputStream( java.io.InputStream in, int options ) { - - super( in ); - this.options = options; // Record for later - this.breakLines = (options & DO_BREAK_LINES) > 0; - this.encode = (options & ENCODE) > 0; - this.bufferLength = encode ? 4 : 3; - this.buffer = new byte[ bufferLength ]; - this.position = -1; - this.lineLength = 0; - this.decodabet = getDecodabet(options); - } // end constructor - - /* (non-Javadoc) - * @see java.io.FilterInputStream#read() - */ - @Override - public int read() throws java.io.IOException { - - // Do we need to get data? - if( position < 0 ) { - if( encode ) { - byte[] b3 = new byte[3]; - int numBinaryBytes = 0; - for( int i = 0; i < 3; i++ ) { - int b = in.read(); - - // If end of stream, b is -1. - if( b >= 0 ) { - b3[i] = (byte)b; - numBinaryBytes++; - } else { - break; // out of for loop - } // end else: end of stream - - } // end for: each needed input byte - - if( numBinaryBytes > 0 ) { - encode3to4( b3, 0, numBinaryBytes, buffer, 0, options ); - position = 0; - numSigBytes = 4; - } // end if: got data - else { - return -1; // Must be end of stream - } // end else - } // end if: encoding - - // Else decoding - else { - byte[] b4 = new byte[4]; - int i = 0; - for( i = 0; i < 4; i++ ) { - // Read four "meaningful" bytes: - int b = 0; - do{ b = in.read(); } - while( b >= 0 && decodabet[ b & 0x7f ] <= WHITE_SPACE_ENC ); - - if( b < 0 ) { - break; // Reads a -1 if end of stream - } // end if: end of stream - - b4[i] = (byte)b; - } // end for: each needed input byte - - if( i == 4 ) { - numSigBytes = decode4to3( b4, 0, buffer, 0, options ); - position = 0; - } // end if: got four characters - else if( i == 0 ){ - return -1; - } // end else if: also padded correctly - else { - // Must have broken out from above. - throw new java.io.IOException( "Improperly padded Base64 input." ); - } // end - - } // end else: decode - } // end else: get data - - // Got data? - if( position >= 0 ) { - // End of relevant data? - if( /*!encode &&*/ position >= numSigBytes ){ - return -1; - } // end if: got data - - if( encode && breakLines && lineLength >= MAX_LINE_LENGTH ) { - lineLength = 0; - return '\n'; - } // end if - else { - lineLength++; // This isn't important when decoding - // but throwing an extra "if" seems - // just as wasteful. - - int b = buffer[ position++ ]; - - if( position >= bufferLength ) { - position = -1; - } // end if: end - - return b & 0xFF; // This is how you "cast" a byte that's - // intended to be unsigned. - } // end else - } // end if: position >= 0 - - // Else error - else { - throw new java.io.IOException( "Error in Base64 code reading stream." ); - } // end else - } // end read - - - /* (non-Javadoc) - * @see java.io.FilterInputStream#read(byte[], int, int) - */ - @Override - public int read( byte[] dest, int off, int len ) - throws java.io.IOException { - int i; - int b; - for( i = 0; i < len; i++ ) { - b = read(); - - if( b >= 0 ) { - dest[off + i] = (byte) b; - } - else if( i == 0 ) { - return -1; - } - else { - break; // Out of 'for' loop - } // Out of 'for' loop - } // end for: each byte read - return i; - } // end read - - } // end inner class InputStream - - - - - - - /* ******** I N N E R C L A S S O U T P U T S T R E A M ******** */ - - - - /** - * The Class OutputStream. - */ - public static class OutputStream extends java.io.FilterOutputStream { - - /** The encode. */ - private boolean encode; - - /** The position. */ - private int position; - - /** The buffer. */ - private byte[] buffer; - - /** The buffer length. */ - private int bufferLength; - - /** The line length. */ - private int lineLength; - - /** The break lines. */ - private boolean breakLines; - - /** The b4. */ - private byte[] b4; // Scratch used in a few places - - /** The suspend encoding. */ - private boolean suspendEncoding; - - /** The options. */ - private int options; // Record for later - - /** The decodabet. */ - private byte[] decodabet; // Local copies to avoid extra method calls - - /** - * Instantiates a new output stream. - * - * @param out - * the out - */ - public OutputStream( java.io.OutputStream out ) { - this( out, ENCODE ); - } // end constructor - - - /** - * Instantiates a new output stream. - * - * @param out - * the out - * @param options - * the options - */ - public OutputStream( java.io.OutputStream out, int options ) { - super( out ); - this.breakLines = (options & DO_BREAK_LINES) != 0; - this.encode = (options & ENCODE) != 0; - this.bufferLength = encode ? 3 : 4; - this.buffer = new byte[ bufferLength ]; - this.position = 0; - this.lineLength = 0; - this.suspendEncoding = false; - this.b4 = new byte[4]; - this.options = options; - this.decodabet = getDecodabet(options); - } // end constructor - - - /* (non-Javadoc) - * @see java.io.FilterOutputStream#write(int) - */ - @Override - public void write(int theByte) - throws java.io.IOException { - // Encoding suspended? - if( suspendEncoding ) { - this.out.write( theByte ); - return; - } // end if: supsended - - // Encode? - if( encode ) { - buffer[ position++ ] = (byte)theByte; - if( position >= bufferLength ) { // Enough to encode. - - this.out.write( encode3to4( b4, buffer, bufferLength, options ) ); - - lineLength += 4; - if( breakLines && lineLength >= MAX_LINE_LENGTH ) { - this.out.write( NEW_LINE ); - lineLength = 0; - } // end if: end of line - - position = 0; - } // end if: enough to output - } // end if: encoding - - // Else, Decoding - else { - // Meaningful Base64 character? - if( decodabet[ theByte & 0x7f ] > WHITE_SPACE_ENC ) { - buffer[ position++ ] = (byte)theByte; - if( position >= bufferLength ) { // Enough to output. - - int len = Base64.decode4to3( buffer, 0, b4, 0, options ); - out.write( b4, 0, len ); - position = 0; - } // end if: enough to output - } // end if: meaningful base64 character - else if( decodabet[ theByte & 0x7f ] != WHITE_SPACE_ENC ) { - throw new java.io.IOException( "Invalid character in Base64 data." ); - } // end else: not white space either - } // end else: decoding - } // end write - - - - /* (non-Javadoc) - * @see java.io.FilterOutputStream#write(byte[], int, int) - */ - @Override - public void write( byte[] theBytes, int off, int len ) - throws java.io.IOException { - // Encoding suspended? - if( suspendEncoding ) { - this.out.write( theBytes, off, len ); - return; - } // end if: supsended - - for( int i = 0; i < len; i++ ) { - write( theBytes[ off + i ] ); - } // end for: each byte written - - } // end write - - - - /** - * Flush base64. - * - * @throws IOException - * Signals that an I/O exception has occurred. - */ - public void flushBase64() throws java.io.IOException { - if( position > 0 ) { - if( encode ) { - out.write( encode3to4( b4, buffer, position, options ) ); - position = 0; - } // end if: encoding - else { - throw new java.io.IOException( "Base64 input not properly padded." ); - } // end else: decoding - } // end if: buffer partially full - - } // end flush - - - /* (non-Javadoc) - * @see java.io.FilterOutputStream#close() - */ - @Override - public void close() throws java.io.IOException { - // 1. Ensure that pending characters are written - flushBase64(); - - // 2. Actually close the stream - // Base class both flushes and closes. - super.close(); - - buffer = null; - out = null; - } // end close - - - - /** - * Suspend encoding. - * - * @throws IOException - * Signals that an I/O exception has occurred. - */ - public void suspendEncoding() throws java.io.IOException { - flushBase64(); - this.suspendEncoding = true; - } // end suspendEncoding - - - /** - * Resume encoding. - */ - public void resumeEncoding() { - this.suspendEncoding = false; - } // end resumeEncoding - - - - } // end inner class OutputStream - - -} // end class Base64 diff --git a/src/main/resources/com/github/api/v2/services/constant/ApplicationConstants.properties b/src/main/resources/com/github/api/v2/services/constant/ApplicationConstants.properties deleted file mode 100644 index f65ca29..0000000 --- a/src/main/resources/com/github/api/v2/services/constant/ApplicationConstants.properties +++ /dev/null @@ -1,10 +0,0 @@ -com.github.api.v2.services.encoding=UTF-8 -com.github.api.v2.services.connectTimeout=-1 -com.github.api.v2.services.readTimeout=-1 -com.github.api.v2.services.defaultApiVersion=v2 -com.github.api.v2.services.defaultFormat=json -com.github.api.v2.services.requestHeaders.Accept-Encoding=gzip, deflate -com.github.api.v2.services.dateFormat=yyyy/MM/dd HH:mm:ss Z -com.github.api.v2.services.accessTokenPattern=access_token=([^&]+)(&expires=(\\d+))? -com.github.api.v2.services.accessDeniedPattern=false - diff --git a/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties deleted file mode 100644 index b02642e..0000000 --- a/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ /dev/null @@ -1,118 +0,0 @@ -# API URLs -########## - -#OAuth URLs -########### -com.github.api.v2.services.oauthService.authorize=https://github.com/login/oauth/authorize?{client_id}{redirect_uri}{scope} -com.github.api.v2.services.oauthService.accessToken=https://github.com/login/oauth/access_token?{client_id}{client_secret}{redirect_uri}{code} - -# User API -com.github.api.v2.services.userService.searchUsersByName=http://github.com/api/{version}/{format}/user/search/{userName} -com.github.api.v2.services.userService.searchUsersByEmail=http://github.com/api/{version}/{format}/user/email/{email} -com.github.api.v2.services.userService.getUser=http://github.com/api/{version}/{format}/user/show/{userName} -com.github.api.v2.services.userService.getCurrentUser=http://github.com/api/{version}/{format}/user/show -com.github.api.v2.services.userService.updateUser=http://github.com/api/{version}/{format}/user/show/{userName} -com.github.api.v2.services.userService.getUserFollowers=http://github.com/api/{version}/{format}/user/show/{userName}/followers -com.github.api.v2.services.userService.getUserFollowing=http://github.com/api/{version}/{format}/user/show/{userName}/following -com.github.api.v2.services.userService.followUser=http://github.com/api/{version}/{format}/user/follow/{userName} -com.github.api.v2.services.userService.unfollowUser=http://github.com/api/{version}/{format}/user/unfollow/{userName} -com.github.api.v2.services.userService.getWatchedRepositories=http://github.com/api/{version}/{format}/repos/watched/{userName} -com.github.api.v2.services.userService.getKeys=http://github.com/api/{version}/{format}/user/keys -com.github.api.v2.services.userService.addKey=http://github.com/api/{version}/{format}/user/key/add -com.github.api.v2.services.userService.removeKey=http://github.com/api/{version}/{format}/user/key/remove -com.github.api.v2.services.userService.getEmails=http://github.com/api/{version}/{format}/user/emails -com.github.api.v2.services.userService.addEmail=http://github.com/api/{version}/{format}/user/email/add -com.github.api.v2.services.userService.removeEmail=http://github.com/api/{version}/{format}/user/email/remove -com.github.api.v2.services.userService.getUserOrganizations=http://github.com/api/{version}/{format}/user/show/{userName}/organizations - -# Issue API -com.github.api.v2.services.issueService.searchIssues=http://github.com/api/{version}/{format}/issues/search/{userName}/{repositoryName}/{state}/{keyword} -com.github.api.v2.services.issueService.getIssues=http://github.com/api/{version}/{format}/issues/list/{userName}/{repositoryName}/{state} -com.github.api.v2.services.issueService.getIssue=http://github.com/api/{version}/{format}/issues/show/{userName}/{repositoryName}/{issueNumber} -com.github.api.v2.services.issueService.getIssueComments=http://github.com/api/{version}/{format}/issues/comments/{userName}/{repositoryName}/{issueNumber} -com.github.api.v2.services.issueService.createIssue=http://github.com/api/{version}/{format}/issues/open/{userName}/{repositoryName} -com.github.api.v2.services.issueService.closeIssue=http://github.com/api/{version}/{format}/issues/close/{userName}/{repositoryName}/{issueNumber} -com.github.api.v2.services.issueService.reopenIssue=http://github.com/api/{version}/{format}/issues/reopen/{userName}/{repositoryName}/{issueNumber} -com.github.api.v2.services.issueService.updateIssue=http://github.com/api/{version}/{format}/issues/edit/{userName}/{repositoryName}/{issueNumber} -com.github.api.v2.services.issueService.getIssueLabels=http://github.com/api/{version}/{format}/issues/labels/{userName}/{repositoryName} -com.github.api.v2.services.issueService.addLabel=http://github.com/api/{version}/{format}/issues/label/add/{userName}/{repositoryName}/{label}/{issueNumber} -com.github.api.v2.services.issueService.removeLabel=http://github.com/api/{version}/{format}/issues/label/remove/{userName}/{repositoryName}/{label}/{issueNumber} -com.github.api.v2.services.issueService.addComment=http://github.com/api/{version}/{format}/issues/comment/{userName}/{repositoryName}/{issueNumber} -com.github.api.v2.services.issueService.getIssuesByLabel=http://github.com/api/{version}/{format}/issues/list/{userName}/{repositoryName}/label/{label} - -# Gist API -com.github.api.v2.services.gistService.getGist=http://gist.github.com/api/v1/{format}/{gistId} -com.github.api.v2.services.gistService.getGistContent=http://gist.github.com/raw/{gistId}/{fileName} -com.github.api.v2.services.gistService.getUserGists=http://gist.github.com/api/v1/{format}/gists/{userName} - -# Network API -com.github.api.v2.services.networkService.getNetworkMeta=http://github.com/{userName}/{repositoryName}/network_meta -com.github.api.v2.services.networkService.getNetworkData=http://github.com/{userName}/{repositoryName}/network_data_chunk?{netHash}{startIndex}{endIndex} - -# Repository API -com.github.api.v2.services.repositoryService.searchRepositories=http://github.com/api/{version}/{format}/repos/search/{keyword}?{language}{startPage} -com.github.api.v2.services.repositoryService.getRepository=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName} -com.github.api.v2.services.repositoryService.updateRepository=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName} -com.github.api.v2.services.repositoryService.getRepositories=http://github.com/api/{version}/{format}/repos/show/{userName} -com.github.api.v2.services.repositoryService.watchRepository=http://github.com/api/{version}/{format}/repos/watch/{userName}/{repositoryName} -com.github.api.v2.services.repositoryService.unwatchRepository=http://github.com/api/{version}/{format}/repos/unwatch/{userName}/{repositoryName} -com.github.api.v2.services.repositoryService.forkRepository=http://github.com/api/{version}/{format}/repos/fork/{userName}/{repositoryName} -com.github.api.v2.services.repositoryService.createRepository=http://github.com/api/{version}/{format}/repos/create -com.github.api.v2.services.repositoryService.deleteRepository=http://github.com/api/{version}/{format}/repos/delete/{repositoryName} -com.github.api.v2.services.repositoryService.changeVisibility=http://github.com/api/{version}/{format}/repos/set/{visibility}/{repositoryName} -com.github.api.v2.services.repositoryService.getKeys=http://github.com/api/{version}/{format}/repos/keys/{repositoryName} -com.github.api.v2.services.repositoryService.addKey=http://github.com/api/{version}/{format}/repos/key/{repositoryName}/add -com.github.api.v2.services.repositoryService.removeKey=http://github.com/api/{version}/{format}/repos/key/{repositoryName}/remove -com.github.api.v2.services.repositoryService.getCollaborators=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/collaborators -com.github.api.v2.services.repositoryService.addCollaborator=http://github.com/api/{version}/{format}/repos/collaborators/{repositoryName}/add/{userName} -com.github.api.v2.services.repositoryService.removeCollaborator=http://github.com/api/{version}/{format}/repos/collaborators/{repositoryName}/remove/{userName} -com.github.api.v2.services.repositoryService.getPushableRepositories=http://github.com/api/{version}/{format}/repos/pushable -com.github.api.v2.services.repositoryService.getContributors=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/contributors -com.github.api.v2.services.repositoryService.getWatchers=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/watchers -com.github.api.v2.services.repositoryService.getForks=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/network -com.github.api.v2.services.repositoryService.getLanguageBreakdown=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/languages -com.github.api.v2.services.repositoryService.getTags=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/tags -com.github.api.v2.services.repositoryService.getBranches=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/branches -com.github.api.v2.services.repositoryService.getRepositoryArchive=http://github.com/{userName}/{repositoryName}/zipball/{branch} - -# Commit API -com.github.api.v2.services.commitService.getCommits=http://github.com/api/{version}/{format}/commits/list/{userName}/{repositoryName}/{branch} -com.github.api.v2.services.commitService.getCommitsFile=http://github.com/api/{version}/{format}/commits/list/{userName}/{repositoryName}/{branch}/{filePath} -com.github.api.v2.services.commitService.getCommit=http://github.com/api/{version}/{format}/commits/show/{userName}/{repositoryName}/{sha} - -# Object API -com.github.api.v2.services.objectService.getTree=http://github.com/api/{version}/{format}/tree/full/{userName}/{repositoryName}/{sha} -com.github.api.v2.services.objectService.getBlob=http://github.com/api/{version}/{format}/blob/show/{userName}/{repositoryName}/{sha}/{filePath} -com.github.api.v2.services.objectService.getBlobs=http://github.com/api/{version}/{format}/blob/full/{userName}/{repositoryName}/{sha} -com.github.api.v2.services.objectService.getObjectContent=http://github.com/api/{version}/{format}/blob/show/{userName}/{repositoryName}/{sha} - -# Organization API -com.github.api.v2.services.organizationService.getOrganizations=http://github.com/api/{version}/{format}/organizations -com.github.api.v2.services.organizationService.getOrganization=http://github.com/api/{version}/{format}/organizations/{organizationName} -com.github.api.v2.services.organizationService.updateOrganization=http://github.com/api/{version}/{format}/organizations/{organizationName} -com.github.api.v2.services.organizationService.getAllRepositories=http://github.com/api/{version}/{format}/organizations/repositories -com.github.api.v2.services.organizationService.getPublicRepositories=http://github.com/api/{version}/{format}/organizations/{organizationName}/public_repositories -com.github.api.v2.services.organizationService.getPublicMembers=http://github.com/api/{version}/{format}/organizations/{organizationName}/public_members -com.github.api.v2.services.organizationService.getTeams=http://github.com/api/{version}/{format}/organizations/{organizationName}/teams -com.github.api.v2.services.organizationService.createTeam=http://github.com/api/{version}/{format}/organizations/{organizationName}/teams -com.github.api.v2.services.organizationService.getTeam=http://github.com/api/{version}/{format}/teams/{teamId} -com.github.api.v2.services.organizationService.updateTeam=http://github.com/api/{version}/{format}/teams/{teamId} -com.github.api.v2.services.organizationService.deleteTeam=http://github.com/api/{version}/{format}/teams/{teamId} -com.github.api.v2.services.organizationService.getTeamMembers=http://github.com/api/{version}/{format}/teams/{teamId}/members -com.github.api.v2.services.organizationService.addTeamMember=http://github.com/api/{version}/{format}/teams/{teamId}/members -com.github.api.v2.services.organizationService.removeTeamMember=http://github.com/api/{version}/{format}/teams/{teamId}/members?name={userName} -com.github.api.v2.services.organizationService.getTeamRepositories=http://github.com/api/{version}/{format}/teams/{teamId}/repositories -com.github.api.v2.services.organizationService.addTeamRepository=http://github.com/api/{version}/{format}/teams/{teamId}/repositories?name={userName} -com.github.api.v2.services.organizationService.removeTeamRepository=http://github.com/api/{version}/{format}/teams/{teamId}/repositories?name={userRepositoryPair} - -# Feed -com.github.api.v2.services.feedService.getPublicUserFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg -com.github.api.v2.services.feedService.getPrivateUserFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg -com.github.api.v2.services.feedService.getCommitFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}%2F{repositoryName}%2Fcommits%2F{branch}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg -com.github.api.v2.services.feedService.getNetworkFeed=http://github.com/{userName}/{repositoryName}/network/feed -com.github.api.v2.services.feedService.getWikiFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fwiki.github.com%2F{userName}%2F{repositoryName}%2Fwikis.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg -com.github.api.v2.services.feedService.getPublicTimelineFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2Ftimeline.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg -com.github.api.v2.services.feedService.getDiscussionsFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fsupport.github.com%2Fdiscussions.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg -com.github.api.v2.services.feedService.getDiscussionsFeedByTopic=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fsupport.github.com%2Fdiscussions%2F{keyword}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg -com.github.api.v2.services.feedService.getJobPositionsFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fjobs.github.com%2Fpositions.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg -com.github.api.v2.services.feedService.getBlogFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Ffeeds.feedburner.com%2Fgithub%3Fformat%3Drss&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg diff --git a/src/test/java/com/github/api/v2/services/AllTests.java b/src/test/java/com/github/api/v2/services/AllTests.java deleted file mode 100644 index 0a08302..0000000 --- a/src/test/java/com/github/api/v2/services/AllTests.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import junit.framework.Test; -import junit.framework.TestSuite; - -/** - * The Class AllTests. - */ -public class AllTests { - - /** - * Suite. - * - * @return the test - */ - public static Test suite() { - TestSuite suite = new TestSuite("Test for com.github.api.v2.services"); - //$JUnit-BEGIN$ -// suite.addTestSuite(OAuthServiceTest.class); - suite.addTestSuite(CommitServiceTest.class); - suite.addTestSuite(RepositoryServiceTest.class); - suite.addTestSuite(IssueServiceTest.class); - suite.addTestSuite(ObjectServiceTest.class); - suite.addTestSuite(NetworkServiceTest.class); - suite.addTestSuite(UserServiceTest.class); - suite.addTestSuite(GistServiceTest.class); - suite.addTestSuite(FeedServiceTest.class); - //$JUnit-END$ - return suite; - } - -} diff --git a/src/test/java/com/github/api/v2/services/BaseGitHubServiceTest.java b/src/test/java/com/github/api/v2/services/BaseGitHubServiceTest.java deleted file mode 100644 index 9dc0e7a..0000000 --- a/src/test/java/com/github/api/v2/services/BaseGitHubServiceTest.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.Collection; - -import junit.framework.TestCase; - -import org.junit.After; -import org.junit.Before; - -import com.github.api.v2.services.auth.Authentication; -import com.github.api.v2.services.auth.LoginTokenAuthentication; -import com.github.api.v2.services.constant.TestConstants; - -/** - * The Class BaseGitHubServiceTest. - */ -public class BaseGitHubServiceTest extends TestCase { - - /** The Constant RESOURCE_MISSING_MESSAGE. */ - protected static final String RESOURCE_MISSING_MESSAGE = "Please define a test %s in TestConstants.properties file."; - - /** The factory. */ - protected GitHubServiceFactory factory; - - /** The authentication. */ - protected Authentication authentication; - - /* (non-Javadoc) - * @see junit.framework.TestCase#setUp() - */ - @Before - public void setUp() throws Exception { - super.setUp(); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test API Key."), TestConstants.TEST_API_KEY); - authentication = new LoginTokenAuthentication(TestConstants.TEST_USER_NAME, TestConstants.TEST_API_KEY); - factory = GitHubServiceFactory.newInstance(); - - } - - /* (non-Javadoc) - * @see junit.framework.TestCase#tearDown() - */ - @After - public void tearDown() throws Exception { - super.tearDown(); - factory = null; - } - - /** - * Assert not null or empty. - * - * @param message - * the message - * @param value - * the value - */ - protected static void assertNotNullOrEmpty(String message, String value) { - assertNotNull(message, value); - assertFalse(message, "".equals(value)); - } - - /** - * Assert not null or empty. - * - * @param message - * the message - * @param value - * the value - */ - protected static void assertNotNullOrEmpty(String message, Collection value) { - assertNotNull(message, value); - assertFalse(message, value.isEmpty()); - } - - /** - * Convert stream to string. - * - * @param is - * the is - * - * @return the string - */ - protected static String convertStreamToString(InputStream is) { - /* - * To convert the InputStream to String we use the BufferedReader.readLine() - * method. We iterate until the BufferedReader return null which means - * there's no more data to read. Each line will appended to a StringBuilder - * and returned as String. - */ - BufferedReader reader = new BufferedReader(new InputStreamReader(is)); - StringBuilder sb = new StringBuilder(); - - String line = null; - try { - while ((line = reader.readLine()) != null) { - sb.append(line + "\n"); - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - is.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - return sb.toString(); - } -} diff --git a/src/test/java/com/github/api/v2/services/CommitServiceTest.java b/src/test/java/com/github/api/v2/services/CommitServiceTest.java deleted file mode 100644 index 65a14ec..0000000 --- a/src/test/java/com/github/api/v2/services/CommitServiceTest.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import java.util.List; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.github.api.v2.schema.Commit; -import com.github.api.v2.schema.Repository; -import com.github.api.v2.services.constant.TestConstants; - -/** - * The Class CommitServiceTest. - */ -public class CommitServiceTest extends BaseGitHubServiceTest { - - /** The service. */ - private CommitService service; - - /* (non-Javadoc) - * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() - */ - @Before - public void setUp() throws Exception { - super.setUp(); - service = factory.createCommitService(); - service.setAuthentication(authentication); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() - */ - @After - public void tearDown() throws Exception { - super.tearDown(); - service = null; - } - - /** - * Test get commit. - */ - @Test - public void testGetCommit() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test SHA."), TestConstants.TEST_COMMIT_HASH); - Commit commit = service.getCommit(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_COMMIT_HASH); - assertNotNull("Commit cannot be null", commit); - } - - /** - * Test get commits string string string. - */ - @Test - public void testGetCommitsStringStringString() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test SHA."), TestConstants.TEST_COMMIT_HASH); - List commits = service.getCommits(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Repository.MASTER); - assertNotNullOrEmpty("Commits cannot be null or empty", commits); - } - - /** - * Test get commits string string string string. - */ - @Test - public void testGetCommitsStringStringStringString() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test SHA."), TestConstants.TEST_COMMIT_HASH); - List commits = service.getCommits(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Repository.MASTER); - assertNotNullOrEmpty("Commits cannot be null or empty", commits); - } -} diff --git a/src/test/java/com/github/api/v2/services/FeedServiceTest.java b/src/test/java/com/github/api/v2/services/FeedServiceTest.java deleted file mode 100644 index 84aafa8..0000000 --- a/src/test/java/com/github/api/v2/services/FeedServiceTest.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.github.api.v2.schema.Feed; -import com.github.api.v2.schema.Repository; -import com.github.api.v2.services.constant.TestConstants; - -public class FeedServiceTest extends BaseGitHubServiceTest { - private FeedService service; - - @Before - public void setUp() throws Exception { - super.setUp(); - service = factory.createFeedService(); - service.setAuthentication(authentication); - } - - @After - public void tearDown() throws Exception { - super.tearDown(); - service = null; - } - - @Test - public void testGetCommitFeed() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - Feed feed = service.getCommitFeed(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Repository.MASTER, 10); - assertNotNull("Feed cannot be null.", feed); - assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); - } - - @Test - public void testGetNetworkFeed() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - Feed feed = service.getNetworkFeed(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, 10); - assertNotNull("Feed cannot be null.", feed); - assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); - } - - @Test - public void testGetPrivateUserFeed() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - Feed feed = service.getPrivateUserFeed(TestConstants.TEST_USER_NAME, 10); - assertNotNull("Feed cannot be null.", feed); - assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); - } - - @Test - public void testGetPublicTimelineFeed() { - Feed feed = service.getPublicTimelineFeed(10); - assertNotNull("Feed cannot be null.", feed); - assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); - } - - @Test - public void testGetPublicUserFeed() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - Feed feed = service.getPublicUserFeed(TestConstants.TEST_USER_NAME, 10); - assertNotNull("Feed cannot be null.", feed); - assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); - } - - @Test - public void testGetWikiFeed() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - Feed feed = service.getWikiFeed(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, 10); - assertNotNull("Feed cannot be null.", feed); - assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); - } - - @Test - public void testGetBlogFeed() { - Feed feed = service.getBlogFeed(10); - assertNotNull("Feed cannot be null.", feed); - assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); - } - - @Test - public void testGetDiscussionsFeed() { - Feed feed = service.getDiscussionsFeed(10); - assertNotNull("Feed cannot be null.", feed); - assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); - } - - @Test - public void testGetDiscussionsFeedString() { - Feed feed = service.getDiscussionsFeed("api", 10); - assertNotNull("Feed cannot be null.", feed); - assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); - } - - @Test - public void testGetJobPositionsFeed() { - Feed feed = service.getJobPositionsFeed(10); - assertNotNull("Feed cannot be null.", feed); - assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); - } -} diff --git a/src/test/java/com/github/api/v2/services/GistServiceTest.java b/src/test/java/com/github/api/v2/services/GistServiceTest.java deleted file mode 100644 index ae70488..0000000 --- a/src/test/java/com/github/api/v2/services/GistServiceTest.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import java.io.InputStream; -import java.util.List; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.github.api.v2.schema.Gist; -import com.github.api.v2.services.constant.TestConstants; - -/** - * The Class GistServiceTest. - */ -public class GistServiceTest extends BaseGitHubServiceTest { - - /** The service. */ - private GistService service; - - /* (non-Javadoc) - * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() - */ - @Before - public void setUp() throws Exception { - super.setUp(); - service = factory.createGistService(); - service.setAuthentication(authentication); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() - */ - @After - public void tearDown() throws Exception { - super.tearDown(); - service = null; - } - - /** - * Test get gist. - */ - @Test - public void testGetGist() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Gist Id."), TestConstants.TEST_GIST_ID); - Gist gist = service.getGist(TestConstants.TEST_GIST_ID); - assertNotNull("Gist cannot be null", gist); - } - - /** - * Test get gist content. - */ - @Test - public void testGetGistContent() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Gist Id."), TestConstants.TEST_GIST_ID); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Gist File."), TestConstants.TEST_GIST_FILE); - InputStream gistContent = service.getGistContent(TestConstants.TEST_GIST_ID, TestConstants.TEST_GIST_FILE); - assertNotNullOrEmpty("Gist content cannot be null or empty", convertStreamToString(gistContent)); - } - - /** - * Test get user gists. - */ - @Test - public void testGetUserGists() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - List gists = service.getUserGists(TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty("Gists cannot be null or empty.", gists); - } -} diff --git a/src/test/java/com/github/api/v2/services/IssueServiceTest.java b/src/test/java/com/github/api/v2/services/IssueServiceTest.java deleted file mode 100644 index f5d5231..0000000 --- a/src/test/java/com/github/api/v2/services/IssueServiceTest.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import java.util.List; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.github.api.v2.schema.Comment; -import com.github.api.v2.schema.Issue; -import com.github.api.v2.services.constant.TestConstants; - -/** - * The Class IssueServiceTest. - */ -public class IssueServiceTest extends BaseGitHubServiceTest { - - /** The service. */ - private IssueService service; - - /* (non-Javadoc) - * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() - */ - @Before - public void setUp() throws Exception { - super.setUp(); - service = factory.createIssueService(); - service.setAuthentication(authentication); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() - */ - @After - public void tearDown() throws Exception { - super.tearDown(); - service = null; - } - - /** - * Test add comment. - */ - @Test - public void testAddComment() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Issue No."), TestConstants.TEST_ISSUE_NUMBER); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Comment."), TestConstants.TEST_ISSUE_COMMENT); - service.addComment(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Integer.parseInt(TestConstants.TEST_ISSUE_NUMBER), TestConstants.TEST_ISSUE_COMMENT); - } - - /** - * Test add label. - */ - @Test - public void testAddLabel() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Issue No."), TestConstants.TEST_ISSUE_NUMBER); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Label."), TestConstants.TEST_ISSUE_LABEL); - service.addLabel(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Integer.parseInt(TestConstants.TEST_ISSUE_NUMBER), TestConstants.TEST_ISSUE_LABEL); - } - - /** - * Test close issue. - */ - @Test - public void testCloseIssue() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Issue No."), TestConstants.TEST_ISSUE_NUMBER); - service.closeIssue(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Integer.parseInt(TestConstants.TEST_ISSUE_NUMBER)); - } - - /** - * Test create issue. - */ - @Test - public void testCreateIssue() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Issue Title."), TestConstants.TEST_ISSUE_TITLE); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Issue Body."), TestConstants.TEST_ISSUE_BODY); - service.createIssue(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_ISSUE_TITLE, TestConstants.TEST_ISSUE_BODY); - } - - /** - * Test get issue. - */ - @Test - public void testGetIssue() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Issue No."), TestConstants.TEST_ISSUE_NUMBER); - Issue issue = service.getIssue(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Integer.parseInt(TestConstants.TEST_ISSUE_NUMBER)); - assertNotNull("Issue cannot be null.", issue); - } - - /** - * Test get issue comments. - */ - @Test - public void testGetIssueComments() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Issue No."), TestConstants.TEST_ISSUE_NUMBER); - List issueComments = service.getIssueComments(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Integer.parseInt(TestConstants.TEST_ISSUE_NUMBER)); - assertNotNullOrEmpty("Issue comments cannot be null or empty.", issueComments); - } - - /** - * Test get issue labels. - */ - @Test - public void testGetIssueLabels() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - List issueLabels = service.getIssueLabels(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty("Issue labels should not be null or empty.", issueLabels); - } - - /** - * Test get issues. - */ - @Test - public void testGetIssues() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - List issues = service.getIssues(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Issue.State.OPEN); - assertNotNullOrEmpty("Issues cannot be null or empty.", issues); - } - - /** - * Test remove label. - */ - @Test - public void testRemoveLabel() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Issue No."), TestConstants.TEST_ISSUE_NUMBER); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Label."), TestConstants.TEST_ISSUE_LABEL); - List labels = service.removeLabel(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Integer.parseInt(TestConstants.TEST_ISSUE_NUMBER), TestConstants.TEST_ISSUE_LABEL); - assertFalse("Label should not be in the list.", labels.contains(TestConstants.TEST_ISSUE_LABEL)); - } - - /** - * Test reopen issue. - */ - @Test - public void testReopenIssue() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Issue No."), TestConstants.TEST_ISSUE_NUMBER); - service.reopenIssue(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Integer.parseInt(TestConstants.TEST_ISSUE_NUMBER)); - } - - /** - * Test search issues. - */ - @Test - public void testSearchIssues() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); - List issues = service.searchIssues(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Issue.State.OPEN, TestConstants.TEST_QUERY); - assertNotNullOrEmpty("Issues cannot be null or empty.", issues); - } - - @Test - public void testGetIssuesByLabel() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Label."), TestConstants.TEST_ISSUE_LABEL); - List issues = service.getIssues(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_ISSUE_LABEL); - assertNotNullOrEmpty("Issues cannot be null or empty.", issues); - } - - /** - * Test update issue. - */ - @Test - public void testUpdateIssue() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Issue No."), TestConstants.TEST_ISSUE_NUMBER); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Issue Title."), TestConstants.TEST_ISSUE_TITLE); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Issue Body."), TestConstants.TEST_ISSUE_BODY); - service.updateIssue(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Integer.parseInt(TestConstants.TEST_ISSUE_NUMBER), TestConstants.TEST_ISSUE_TITLE, TestConstants.TEST_ISSUE_BODY); - } -} diff --git a/src/test/java/com/github/api/v2/services/NetworkServiceTest.java b/src/test/java/com/github/api/v2/services/NetworkServiceTest.java deleted file mode 100644 index a9794f3..0000000 --- a/src/test/java/com/github/api/v2/services/NetworkServiceTest.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import java.util.List; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.github.api.v2.schema.NetworkCommit; -import com.github.api.v2.schema.NetworkMeta; -import com.github.api.v2.services.constant.TestConstants; - -/** - * The Class NetworkServiceTest. - */ -public class NetworkServiceTest extends BaseGitHubServiceTest { - - /** The service. */ - private NetworkService service; - - /* (non-Javadoc) - * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() - */ - @Before - public void setUp() throws Exception { - super.setUp(); - service = factory.createNetworkService(); - service.setAuthentication(authentication); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() - */ - @After - public void tearDown() throws Exception { - super.tearDown(); - service = null; - } - - /** - * Test get network data string string string. - */ - @Test - public void testGetNetworkDataStringStringString() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Network Hash."), TestConstants.TEST_NETWORK_HASH); - List commits = service.getNetworkData(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_NETWORK_HASH); - assertNotNullOrEmpty("Commits should not be null or empty.", commits); - } - - /** - * Test get network data string string string int int. - */ - @Test - public void testGetNetworkDataStringStringStringIntInt() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Network Hash."), TestConstants.TEST_NETWORK_HASH); - List commits = service.getNetworkData(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_NETWORK_HASH, 1, 5); - assertNotNullOrEmpty("Commits should not be null or empty.", commits); - } - - /** - * Test get network meta. - */ - @Test - public void testGetNetworkMeta() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - NetworkMeta networkMeta = service.getNetworkMeta(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); - assertNotNull("Network cannot be null", networkMeta); - } - -} diff --git a/src/test/java/com/github/api/v2/services/OAuthServiceTest.java b/src/test/java/com/github/api/v2/services/OAuthServiceTest.java deleted file mode 100644 index fe70578..0000000 --- a/src/test/java/com/github/api/v2/services/OAuthServiceTest.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import java.net.HttpURLConnection; -import java.net.URL; -import java.util.EnumSet; - -import com.github.api.v2.services.OAuthService.Scope; -import com.github.api.v2.services.constant.TestConstants; - -/** - * The Class OAuthServiceTest. - */ -public class OAuthServiceTest extends BaseGitHubServiceTest { - - /** The service. */ - private OAuthService service; - - /* (non-Javadoc) - * @see com.google.code.facebook.graph.client.BaseFacebookGraphApiTestCase#setUp() - */ - public void setUp() throws Exception { - super.setUp(); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test consumer key."), TestConstants.TEST_CLIENT_ID); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test consumer secret."), TestConstants.TEST_CLIENT_SECRET); - service = factory.createOAuthService(TestConstants.TEST_CLIENT_ID, TestConstants.TEST_CLIENT_SECRET); - } - - /* (non-Javadoc) - * @see com.google.code.facebook.graph.client.BaseFacebookGraphApiTestCase#tearDown() - */ - public void tearDown() throws Exception { - super.tearDown(); - service = null; - } - - /** - * Test get authorization url. - */ - public void testGetAuthorizationUrl() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test callback URL."), TestConstants.TEST_CALLBACK_URL); - String authorizationUrl = service.getAuthorizationUrl(TestConstants.TEST_CALLBACK_URL); - assertNotNullOrEmpty("Authorization URL should not be null.", authorizationUrl); - try { - URL url = new URL(authorizationUrl); - HttpURLConnection request = (HttpURLConnection) url.openConnection(); - - if (request.getResponseCode() != HttpURLConnection.HTTP_OK) { - fail(convertStreamToString(request.getErrorStream())); - } - } catch (Exception e) { - fail(e.getMessage()); - } - } - - /** - * Test get authorization url set. - */ - public void testGetAuthorizationUrlSet() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test callback URL."), TestConstants.TEST_CALLBACK_URL); - String authorizationUrl = service.getAuthorizationUrl(TestConstants.TEST_CALLBACK_URL, EnumSet.of(Scope.USER, Scope.REPOSITORY)); - assertNotNullOrEmpty("Authorization URL should not be null.", authorizationUrl); - try { - URL url = new URL(authorizationUrl); - HttpURLConnection request = (HttpURLConnection) url.openConnection(); - - if (request.getResponseCode() != HttpURLConnection.HTTP_OK) { - fail(convertStreamToString(request.getErrorStream())); - } - } catch (Exception e) { - fail(e.getMessage()); - } - } - - /** - * Test get access token. - */ - public void testGetAccessToken() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test callback URL."), TestConstants.TEST_CALLBACK_URL); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test code."), TestConstants.TEST_CODE); - String accessToken = service.getAccessToken(TestConstants.TEST_CALLBACK_URL, TestConstants.TEST_CODE); - assertNotNullOrEmpty("Access token should not be null.", accessToken); - } -} diff --git a/src/test/java/com/github/api/v2/services/ObjectServiceTest.java b/src/test/java/com/github/api/v2/services/ObjectServiceTest.java deleted file mode 100644 index 519984a..0000000 --- a/src/test/java/com/github/api/v2/services/ObjectServiceTest.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import java.io.InputStream; -import java.util.List; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.github.api.v2.schema.Blob; -import com.github.api.v2.schema.Tree; -import com.github.api.v2.services.constant.TestConstants; - -/** - * The Class ObjectServiceTest. - */ -public class ObjectServiceTest extends BaseGitHubServiceTest { - - /** The service. */ - private ObjectService service; - - @Before - public void setUp() throws Exception { - super.setUp(); - service = factory.createObjectService(); - service.setAuthentication(authentication); - } - - @After - public void tearDown() throws Exception { - super.tearDown(); - service = null; - } - - /** - * Test get blob. - */ - @Test - public void testGetBlob() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Tree SHA."), TestConstants.TEST_TREE_SHA); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test File Path."), TestConstants.TEST_FILE_PATH); - Blob blob = service.getBlob(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_TREE_SHA, TestConstants.TEST_FILE_PATH); - assertNotNull("Blob cannot be null or empty", blob); - } - - /** - * Test get blobs. - */ - @Test - public void testGetBlobs() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Tree SHA."), TestConstants.TEST_TREE_SHA); - List blobs = service.getBlobs(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_TREE_SHA); - assertNotNullOrEmpty("Blobs cannot be null or empty", blobs); - } - - /** - * Test get object content. - */ - @Test - public void testGetObjectContent() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Tree SHA."), TestConstants.TEST_TREE_SHA); - InputStream objectContent = service.getObjectContent(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_TREE_SHA); - assertNotNullOrEmpty("Object content cannot be null or empty", convertStreamToString(objectContent)); - } - - /** - * Test get tree. - */ - @Test - public void testGetTree() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Tree SHA."), TestConstants.TEST_TREE_SHA); - List trees = service.getTree(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_TREE_SHA); - assertNotNullOrEmpty("Tree cannot be null or empty", trees); - } -} diff --git a/src/test/java/com/github/api/v2/services/OrganizationServiceTest.java b/src/test/java/com/github/api/v2/services/OrganizationServiceTest.java deleted file mode 100644 index 17e2325..0000000 --- a/src/test/java/com/github/api/v2/services/OrganizationServiceTest.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -/** - * The Class RepositoryServiceTest. - */ -public class OrganizationServiceTest extends BaseGitHubServiceTest { - - /** The service. */ - private OrganizationService service; - - /* (non-Javadoc) - * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() - */ - @Before - public void setUp() throws Exception { - super.setUp(); - service = factory.createOrganizationService(); - service.setAuthentication(authentication); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() - */ - @After - public void tearDown() throws Exception { - super.tearDown(); - service = null; - } - - @Test - public void testAddTeamMember() { - fail("Not yet implemented"); - } - - @Test - public void testAddTeamRepository() { - fail("Not yet implemented"); - } - - @Test - public void testCreateTeam() { - fail("Not yet implemented"); - } - - @Test - public void testDeleteTeam() { - fail("Not yet implemented"); - } - - @Test - public void testGetAllOrganizationRepositories() { - fail("Not yet implemented"); - } - - @Test - public void testGetOrganization() { - fail("Not yet implemented"); - } - - @Test - public void testGetPublicMembers() { - fail("Not yet implemented"); - } - - @Test - public void testGetPublicRepositories() { - fail("Not yet implemented"); - } - - @Test - public void testGetTeam() { - fail("Not yet implemented"); - } - - @Test - public void testGetTeamMembers() { - fail("Not yet implemented"); - } - - @Test - public void testGetTeamRepositories() { - fail("Not yet implemented"); - } - - @Test - public void testGetTeams() { - fail("Not yet implemented"); - } - - @Test - public void testGetUserOrganizationsString() { - fail("Not yet implemented"); - } - - @Test - public void testGetUserOrganizations() { - fail("Not yet implemented"); - } - - @Test - public void testRemoveTeamMember() { - fail("Not yet implemented"); - } - - @Test - public void testRemoveTeamRepository() { - fail("Not yet implemented"); - } - - @Test - public void testUpdateOrganization() { - fail("Not yet implemented"); - } - - @Test - public void testUpdateTeam() { - fail("Not yet implemented"); - } -} diff --git a/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java b/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java deleted file mode 100644 index 04b5323..0000000 --- a/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java +++ /dev/null @@ -1,324 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import java.util.List; -import java.util.Map; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.github.api.v2.schema.Key; -import com.github.api.v2.schema.Language; -import com.github.api.v2.schema.Repository; -import com.github.api.v2.schema.User; -import com.github.api.v2.services.constant.TestConstants; - -/** - * The Class RepositoryServiceTest. - */ -public class RepositoryServiceTest extends BaseGitHubServiceTest { - - /** The service. */ - private RepositoryService service; - - /* (non-Javadoc) - * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() - */ - @Before - public void setUp() throws Exception { - super.setUp(); - service = factory.createRepositoryService(); - service.setAuthentication(authentication); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() - */ - @After - public void tearDown() throws Exception { - super.tearDown(); - service = null; - } - - /** - * Test create repository. - */ - @Test - public void testCreateRepository() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository Description."), TestConstants.TEST_REPOSITORY_DESC); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository Homepage."), TestConstants.TEST_REPOSITORY_PAGE); - service.createRepository(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_REPOSITORY_DESC, TestConstants.TEST_REPOSITORY_PAGE, Repository.Visibility.PUBLIC); - } - - - /** - * Test add collaborator. - */ - @Test - public void testAddCollaborator() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - service.addCollaborator(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_USER_NAME); - } - - /** - * Test add key. - */ - @Test - public void testAddKey() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Key Title."), TestConstants.TEST_KEY_TITLE); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Key."), TestConstants.TEST_KEY); - service.addDeployKey(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_KEY_TITLE, TestConstants.TEST_KEY); - } - - /** - * Test change visibility. - */ - @Test - public void testChangeVisibility() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - service.changeVisibility(TestConstants.TEST_REPOSITORY_NAME, Repository.Visibility.PRIVATE); - } - - /** - * Test fork repository. - */ - @Test - public void testForkRepository() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - service.forkRepository(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); - } - - /** - * Test get branches. - */ - @Test - public void testGetBranches() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - Map branches = service.getBranches(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); - assertFalse("Branches cannot be null or empty.", branches == null || branches.isEmpty()); - } - - /** - * Test get collaborators. - */ - @Test - public void testGetCollaborators() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - List collaborators = service.getCollaborators(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty("Collaborators cannot be null or empty.", collaborators); - } - - /** - * Test get contributors. - */ - @Test - public void testGetContributors() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - List contributors = service.getContributors(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty("Contributors cannot be null or empty.", contributors); - } - - /** - * Test get forks. - */ - @Test - public void testGetForks() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - List forks = service.getForks(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty("Forks cannot be null or empty.", forks); - } - - /** - * Test get keys. - */ - @Test - public void testGetKeys() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - List keys = service.getDeployKeys(TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty("Keys cannot be null or empty.", keys); - } - - /** - * Test get language breakdown. - */ - @Test - public void testGetLanguageBreakdown() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - Map languageBreakdown = service.getLanguageBreakdown(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); - assertFalse("Language breakdown vannot be null or empty.", (languageBreakdown == null || languageBreakdown.isEmpty())); - } - - /** - * Test get pushable repositories. - */ - @Test - public void testGetPushableRepositories() { - List repositories = service.getPushableRepositories(); - assertNotNullOrEmpty("Pushable repositories cannot be null or empty.", repositories); - } - - /** - * Test get repositories. - */ - @Test - public void testGetRepositories() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - List repositories = service.getRepositories(TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); - } - - /** - * Test get repository. - */ - @Test - public void testGetRepository() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - Repository repository = service.getRepository(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); - assertNotNull("Repository cannot be null.", repository); - } - - /** - * Test get tags. - */ - @Test - public void testGetTags() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - Map tags = service.getTags(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); - assertFalse("Tags cannot be null or empty.", tags == null || tags.isEmpty()); - } - - /** - * Test get watchers. - */ - @Test - public void testGetWatchers() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - List watchers = service.getWatchers(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty("Watchers cannot be null or empty.", watchers); - } - - /** - * Test remove collaborator. - */ - @Test - public void testRemoveCollaborator() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - service.removeCollaborator(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_USER_NAME); - } - - /** - * Test remove key. - */ - @Test - public void testRemoveKey() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Key Id."), TestConstants.TEST_KEY_ID); - service.removeDeployKey(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_KEY_ID); - } - - /** - * Test search repositories string. - */ - @Test - public void testSearchRepositoriesString() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); - List repositories = service.searchRepositories(TestConstants.TEST_QUERY); - assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); - } - - /** - * Test search repositories string string. - */ - @Test - public void testSearchRepositoriesStringString() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); - List repositories = service.searchRepositories(TestConstants.TEST_QUERY, Language.Java); - assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); - } - - /** - * Test search repositories string int. - */ - @Test - public void testSearchRepositoriesStringInt() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); - List repositories = service.searchRepositories(TestConstants.TEST_QUERY, 1); - assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); - } - - /** - * Test search repositories string string int. - */ - @Test - public void testSearchRepositoriesStringStringInt() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Query."), TestConstants.TEST_QUERY); - List repositories = service.searchRepositories(TestConstants.TEST_QUERY, Language.Java, 1); - assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); - } - - /** - * Test unwatch repository. - */ - @Test - public void testUnwatchRepository() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - service.unwatchRepository(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); - } - - /** - * Test update repository. - */ - @Test - public void testUpdateRepository() { -// service.updateRepository(repository); - } - - /** - * Test watch repository. - */ - @Test - public void testWatchRepository() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - service.watchRepository(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); - } - - /** - * Test delete repository. - */ - @Test - public void testDeleteRepository() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); -// service.deleteRepository(TestConstants.TEST_REPOSITORY_NAME); - } -} diff --git a/src/test/java/com/github/api/v2/services/UserServiceTest.java b/src/test/java/com/github/api/v2/services/UserServiceTest.java deleted file mode 100644 index dd8fb64..0000000 --- a/src/test/java/com/github/api/v2/services/UserServiceTest.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services; - -import java.util.List; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.github.api.v2.schema.Key; -import com.github.api.v2.schema.Repository; -import com.github.api.v2.schema.User; -import com.github.api.v2.services.constant.TestConstants; - -/** - * The Class UserServiceTest. - */ -public class UserServiceTest extends BaseGitHubServiceTest { - - /** The service. */ - private UserService service; - - /* (non-Javadoc) - * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() - */ - @Before - public void setUp() throws Exception { - super.setUp(); - service = factory.createUserService(); - service.setAuthentication(authentication); - } - - /* (non-Javadoc) - * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() - */ - @After - public void tearDown() throws Exception { - super.tearDown(); - service = null; - } - - /** - * Test add email. - */ - @Test - public void testAddEmail() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Email."), TestConstants.TEST_EMAIL); - service.addEmail(TestConstants.TEST_EMAIL); - } - - /** - * Test add key. - */ - @Test - public void testAddKey() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Key Title."), TestConstants.TEST_KEY_TITLE); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Key."), TestConstants.TEST_KEY); - service.addKey(TestConstants.TEST_KEY_TITLE, TestConstants.TEST_KEY); - } - - /** - * Test follow user. - */ - @Test - public void testFollowUser() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - service.followUser(TestConstants.TEST_USER_NAME); - } - - /** - * Test get current user. - */ - @Test - public void testGetCurrentUser() { - User user = service.getCurrentUser(); - assertNotNull("User cannot be null.", user); - } - - /** - * Test get emails. - */ - @Test - public void testGetEmails() { - List emails = service.getEmails(); - assertNotNullOrEmpty("Emails cannot be null or empty.", emails); - } - - /** - * Test get keys. - */ - @Test - public void testGetKeys() { - List keys = service.getKeys(); - assertNotNullOrEmpty("Keys cannot be null or empty.", keys); - } - - /** - * Test get user by username. - */ - @Test - public void testGetUserByUsername() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - User user = service.getUserByUsername(TestConstants.TEST_USER_NAME); - assertNotNull("User cannot be null.", user); - } - - /** - * Test get user followers. - */ - @Test - public void testGetUserFollowers() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - List userFollowers = service.getUserFollowers(TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty("User followers cannot be null or empty.", userFollowers); - } - - /** - * Test get user following. - */ - @Test - public void testGetUserFollowing() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - List userFollowing = service.getUserFollowing(TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty("User followering cannot be null or empty.", userFollowing); - } - - /** - * Test get watched repositories. - */ - @Test - public void testGetWatchedRepositories() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - List repositories = service.getWatchedRepositories(TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty("Repositories cannot be null or empty.", repositories); - } - - /** - * Test remove email. - */ - @Test - public void testRemoveEmail() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Email."), TestConstants.TEST_EMAIL); - service.removeEmail(TestConstants.TEST_EMAIL); - } - - /** - * Test remove key. - */ - @Test - public void testRemoveKey() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Key Id."), TestConstants.TEST_KEY_ID); - service.removeKey(TestConstants.TEST_KEY_ID); - } - - /** - * Test get user by email. - */ - @Test - public void testGetUserByEmail() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Email."), TestConstants.TEST_EMAIL); - User user = service.getUserByEmail(TestConstants.TEST_EMAIL); - assertNotNull("User cannot be null or empty.", user); - } - - /** - * Test search users by name. - */ - @Test - public void testSearchUsersByName() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - List users = service.searchUsersByName(TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty("Users cannot be null or empty.", users); - } - - /** - * Test unfollow user. - */ - @Test - public void testUnfollowUser() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - service.unfollowUser(TestConstants.TEST_USER_NAME); - } - - /** - * Test update user. - */ - @Test - public void testUpdateUser() { -// service.updateUser(user); - } -} diff --git a/src/test/java/com/github/api/v2/services/constant/TestConstants.java b/src/test/java/com/github/api/v2/services/constant/TestConstants.java deleted file mode 100644 index eb28517..0000000 --- a/src/test/java/com/github/api/v2/services/constant/TestConstants.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright 2010 Nabeel Mukhtar - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.github.api.v2.services.constant; -import java.io.IOException; -import java.util.Properties; - -/** - * The Class TestConstants. - */ -public final class TestConstants { - - /** The Constant TEST_CONSTANTS_FILE. */ - public static final String TEST_CONSTANTS_FILE = "TestConstants.properties"; - - /** The Constant testConstants. */ - private static final Properties testConstants = new Properties(); - - static { - try { - testConstants.load(TestConstants.class.getResourceAsStream(TEST_CONSTANTS_FILE)); - } catch (IOException e) { - e.printStackTrace(); - } - } - - /** The Constant TEST_CLIENT_ID. */ - public static final String TEST_CLIENT_ID = testConstants.getProperty("com.github.api.v2.services.clientId"); - - /** The Constant TEST_CLIENT_SECRET. */ - public static final String TEST_CLIENT_SECRET = testConstants.getProperty("com.github.api.v2.services.clientSecret"); - - /** The Constant TEST_CODE. */ - public static final String TEST_CODE = testConstants.getProperty("com.github.api.v2.services.code"); - - /** The Constant TEST_ACCESS_TOKEN. */ - public static final String TEST_ACCESS_TOKEN = testConstants.getProperty("com.github.api.v2.services.accessToken"); - - /** The Constant TEST_CALLBACK_URL. */ - public static final String TEST_CALLBACK_URL = testConstants.getProperty("com.github.api.v2.services.callbackUrl"); - - /** The Constant TEST_API_KEY. */ - public static final String TEST_API_KEY = - testConstants.getProperty("com.github.api.v2.services.apiKey"); - - /** The Constant TEST_REFERRER. */ - public static final String TEST_REFERRER = - testConstants.getProperty("com.github.api.v2.services.referrer"); - - /** The Constant TEST_QUERY. */ - public static final String TEST_QUERY = - testConstants.getProperty("com.github.api.v2.services.testQuery"); - - /** The Constant TEST_USER_NAME. */ - public static final String TEST_USER_NAME = - testConstants.getProperty("com.github.api.v2.services.testUserName"); - - /** The Constant TEST_REPOSITORY_NAME. */ - public static final String TEST_REPOSITORY_NAME = - testConstants.getProperty("com.github.api.v2.services.testRepositoryName"); - - /** The Constant TEST_EMAIL. */ - public static final String TEST_EMAIL = - testConstants.getProperty("com.github.api.v2.services.testEmail"); - - /** The Constant TEST_ISSUE_NUMBER. */ - public static final String TEST_ISSUE_NUMBER = - testConstants.getProperty("com.github.api.v2.services.testIssueNo"); - - /** The Constant TEST_COMMIT_HASH. */ - public static final String TEST_COMMIT_HASH = - testConstants.getProperty("com.github.api.v2.services.testCommitHash"); - - /** The Constant TEST_GIST_ID. */ - public static final String TEST_GIST_ID = - testConstants.getProperty("com.github.api.v2.services.testGistId"); - - /** The Constant TEST_GIST_FILE. */ - public static final String TEST_GIST_FILE = - testConstants.getProperty("com.github.api.v2.services.testGistFile"); - - /** The Constant TEST_ISSUE_COMMENT. */ - public static final String TEST_ISSUE_COMMENT = - testConstants.getProperty("com.github.api.v2.services.testIssueComment"); - - /** The Constant TEST_ISSUE_LABEL. */ - public static final String TEST_ISSUE_LABEL = - testConstants.getProperty("com.github.api.v2.services.testIssueLabel"); - - /** The Constant TEST_ISSUE_TITLE. */ - public static final String TEST_ISSUE_TITLE = - testConstants.getProperty("com.github.api.v2.services.testIssueTitle"); - - /** The Constant TEST_ISSUE_BODY. */ - public static final String TEST_ISSUE_BODY = - testConstants.getProperty("com.github.api.v2.services.testIssueBody"); - - /** The Constant TEST_NETWORK_HASH. */ - public static final String TEST_NETWORK_HASH = - testConstants.getProperty("com.github.api.v2.services.testNetworkHash"); - - /** The Constant TEST_TREE_SHA. */ - public static final String TEST_TREE_SHA = - testConstants.getProperty("com.github.api.v2.services.testTreeHash"); - - /** The Constant TEST_FILE_PATH. */ - public static final String TEST_FILE_PATH = - testConstants.getProperty("com.github.api.v2.services.testFilePath"); - - /** The Constant TEST_KEY_TITLE. */ - public static final String TEST_KEY_TITLE = - testConstants.getProperty("com.github.api.v2.services.testKeyTitle"); - - /** The Constant TEST_KEY. */ - public static final String TEST_KEY = - testConstants.getProperty("com.github.api.v2.services.testKey"); - - /** The Constant TEST_REPOSITORY_DESC. */ - public static final String TEST_REPOSITORY_DESC = - testConstants.getProperty("com.github.api.v2.services.testRepositoryDesc"); - - /** The Constant TEST_REPOSITORY_PAGE. */ - public static final String TEST_REPOSITORY_PAGE = - testConstants.getProperty("com.github.api.v2.services.testRepositoryPage"); - - /** The Constant TEST_KEY_ID. */ - public static final String TEST_KEY_ID = - testConstants.getProperty("com.github.api.v2.services.testKeyId"); - - /** - * Instantiates a new test constants. - */ - private TestConstants() {} -} From 47d21a20bd0bab566dc48e5047bebd752d8a19b1 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Mon, 24 Jan 2011 17:13:28 +0500 Subject: [PATCH 42/95] Pull Request API. --- .classpath | 1 - .../api/v2/services/PullRequestService.java | 39 +- .../v2/services/constant/ParameterNames.java | 4 + .../v2/services/impl/BaseGitHubService.java | 28 +- .../services/impl/PullRequestServiceImpl.java | 66 +-- .../constant/GitHubApiUrls.properties | 2 +- .../v2/services/PullRequestServiceTest.java | 39 +- .../v2/services/constant/TestConstants.java | 4 + .../example/PullRequestApiSample.java | 72 +--- .../java/com/github/api/v2/schema/Issue.java | 34 ++ .../com/github/api/v2/schema/PullRequest.java | 382 ++++++++++++++---- .../com/github/api/v2/schema/Version.java | 127 ++++++ 12 files changed, 567 insertions(+), 231 deletions(-) create mode 100644 schema/src/main/java/com/github/api/v2/schema/Version.java diff --git a/.classpath b/.classpath index 094e399..ec30d48 100644 --- a/.classpath +++ b/.classpath @@ -5,7 +5,6 @@ - diff --git a/core/src/main/java/com/github/api/v2/services/PullRequestService.java b/core/src/main/java/com/github/api/v2/services/PullRequestService.java index aed6b48..1a1fcad 100644 --- a/core/src/main/java/com/github/api/v2/services/PullRequestService.java +++ b/core/src/main/java/com/github/api/v2/services/PullRequestService.java @@ -16,11 +16,10 @@ */ package com.github.api.v2.services; -import java.io.InputStream; import java.util.List; -import com.github.api.v2.schema.Blob; -import com.github.api.v2.schema.Tree; +import com.github.api.v2.schema.PullRequest; +import com.github.api.v2.schema.Issue.State; /** * The Interface ObjectService. @@ -39,10 +38,10 @@ public interface PullRequestService extends GitHubService { * * @return the tree */ - public List getTree(String userName, String repositoryName, String treeSha); + public List getPullRequests(String userName, String repositoryName); /** - * Gets the blob. + * Gets the tree. * * @param userName * the user name @@ -50,15 +49,13 @@ public interface PullRequestService extends GitHubService { * the repository name * @param treeSha * the tree sha - * @param filePath - * the file path * - * @return the blob + * @return the tree */ - public Blob getBlob(String userName, String repositoryName, String treeSha, String filePath); - + public List getPullRequests(String userName, String repositoryName, State state); + /** - * Gets the blobs. + * Gets the blob. * * @param userName * the user name @@ -66,22 +63,12 @@ public interface PullRequestService extends GitHubService { * the repository name * @param treeSha * the tree sha + * @param filePath + * the file path * - * @return the blobs + * @return the blob */ - public List getBlobs(String userName, String repositoryName, String treeSha); + public PullRequest getPullRequest(String userName, String repositoryName, int issueNumber); - /** - * Gets the object content. - * - * @param userName - * the user name - * @param repositoryName - * the repository name - * @param objectSha - * the object sha - * - * @return the object content - */ - public InputStream getObjectContent(String userName, String repositoryName, String objectSha); + public void createPullRequest(String userName, String repositoryName, String base, String head, String title, String body); } diff --git a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java index 49790be..55f38fe 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java +++ b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java @@ -163,5 +163,9 @@ public interface ParameterNames { public static final String PERMISSION = "permission"; public static final String REPO_NAMES = "repo_names"; public static final String BILLING_EMAIL = "billing_email"; + + public static final String BASE = "base"; + + public static final String HEAD = "head"; } diff --git a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java index ec405cc..dd19201 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java +++ b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java @@ -18,7 +18,6 @@ import java.io.InputStream; import java.io.InputStreamReader; -import java.lang.reflect.Field; import java.lang.reflect.Type; import java.nio.charset.Charset; import java.util.ArrayList; @@ -38,7 +37,6 @@ import com.github.api.v2.services.constant.ApplicationConstants; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; import com.google.gson.FieldNamingPolicy; -import com.google.gson.FieldNamingStrategy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonDeserializationContext; @@ -130,19 +128,19 @@ protected GsonBuilder getGsonBuilder() { GsonBuilder builder = new GsonBuilder(); builder.setDateFormat(ApplicationConstants.DATE_FORMAT); builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); - builder.setFieldNamingStrategy(new FieldNamingStrategy() { - @Override - public String translateName(Field field) { - if (field.getType().equals(Repository.Visibility.class)) { - return "private"; - } else if (field.getType().equals(Gist.Visibility.class)) { - return "public"; - } else { - return field.getName(); - } - } - - }); +// builder.setFieldNamingStrategy(new FieldNamingStrategy() { +// @Override +// public String translateName(Field field) { +// if (field.getType().equals(Repository.Visibility.class)) { +// return "private"; +// } else if (field.getType().equals(Gist.Visibility.class)) { +// return "public"; +// } else { +// return field.getName(); +// } +// } +// +// }); builder.registerTypeAdapter(Issue.State.class, new JsonDeserializer() { @Override public Issue.State deserialize(JsonElement arg0, Type arg1, diff --git a/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java index 8524412..ef9c0da 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java @@ -16,15 +16,17 @@ */ package com.github.api.v2.services.impl; -import java.io.InputStream; +import java.util.HashMap; import java.util.List; +import java.util.Map; -import com.github.api.v2.schema.Blob; -import com.github.api.v2.schema.Tree; +import com.github.api.v2.schema.PullRequest; +import com.github.api.v2.schema.Issue.State; import com.github.api.v2.services.PullRequestService; import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; +import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; @@ -38,49 +40,55 @@ public class PullRequestServiceImpl extends BaseGitHubService implements * @see com.github.api.v2.services.ObjectService#getBlob(java.lang.String, java.lang.String, java.lang.String, java.lang.String) */ @Override - public Blob getBlob(String userName, String repositoryName, String treeSha, - String filePath) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.ObjectApiUrls.GET_BLOBS_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.SHA, treeSha).withField(ParameterNames.FILE_PATH, filePath).buildUrl(); + public PullRequest getPullRequest(String userName, String repositoryName, int issueNumber) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.PullRequestApiUrls.GET_PULL_REQUEST_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.ISSUE_NUMBER, String.valueOf(issueNumber)).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken(){}, json.get("blob")); + return unmarshall(new TypeToken(){}, json.get("pull")); } /* (non-Javadoc) * @see com.github.api.v2.services.ObjectService#getBlobs(java.lang.String, java.lang.String, java.lang.String) */ @Override - public List getBlobs(String userName, String repositoryName, - String treeSha) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.ObjectApiUrls.GET_BLOBS_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.SHA, treeSha).buildUrl(); + public List getPullRequests(String userName, String repositoryName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.PullRequestApiUrls.GET_PULL_REQUESTS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.STATE, "").buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("blobs")); + return unmarshall(new TypeToken>(){}, json.get("pulls")); } /* (non-Javadoc) - * @see com.github.api.v2.services.ObjectService#getObjectContent(java.lang.String, java.lang.String, java.lang.String) + * @see com.github.api.v2.services.ObjectService#getBlobs(java.lang.String, java.lang.String, java.lang.String) */ @Override - public InputStream getObjectContent(String userName, String repositoryName, - String objectSha) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.ObjectApiUrls.GET_OBJECT_CONTENT_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.SHA, objectSha).buildUrl(); - return callApiGet(apiUrl); + public List getPullRequests(String userName, String repositoryName, State state) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.PullRequestApiUrls.GET_PULL_REQUESTS_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.STATE, state.value()).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("pulls")); } - + /* (non-Javadoc) - * @see com.github.api.v2.services.ObjectService#getTree(java.lang.String, java.lang.String, java.lang.String) + * @see com.github.api.v2.services.ObjectService#getObjectContent(java.lang.String, java.lang.String, java.lang.String) */ - @Override - public List getTree(String userName, String repositoryName, - String treeSha) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.ObjectApiUrls.GET_TREE_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.SHA, treeSha).buildUrl(); - JsonObject json = unmarshall(callApiGet(apiUrl)); - - return unmarshall(new TypeToken>(){}, json.get("tree")); + public void createPullRequest(String userName, String repositoryName, String base, String head, String title, String body) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.PullRequestApiUrls.CREATE_PULL_REQUEST_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + Map parameters = new HashMap(); + parameters.put("pull[" + ParameterNames.BASE + "]", base); + parameters.put("pull[" + ParameterNames.HEAD + "]", head); + parameters.put("pull[" + ParameterNames.TITLE + "]", title); + parameters.put("pull[" + ParameterNames.BODY + "]", body); + callApiPost(apiUrl, parameters); + } + + protected GsonBuilder getGsonBuilder() { + GsonBuilder gson = super.getGsonBuilder(); + gson.setDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + return gson; } } diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index 18b391f..63ae83e 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -107,7 +107,7 @@ com.github.api.v2.services.organizationService.removeTeamRepository=http://githu # Pull Request API com.github.api.v2.services.pullRequestService.createPullRequest=http://github.com/api/{version}/{format}/pulls/{userName}/{repositoryName} -com.github.api.v2.services.pullRequestService.getPullRequest=http://github.com/api/{version}/{format}/pulls/{userName}/{repositoryName}/{requestNumber} +com.github.api.v2.services.pullRequestService.getPullRequest=http://github.com/api/{version}/{format}/pulls/{userName}/{repositoryName}/{issueNumber} com.github.api.v2.services.pullRequestService.getPullRequests=http://github.com/api/{version}/{format}/pulls/{userName}/{repositoryName}/{state} # Feed diff --git a/core/src/test/java/com/github/api/v2/services/PullRequestServiceTest.java b/core/src/test/java/com/github/api/v2/services/PullRequestServiceTest.java index d0fdd10..8e3cada 100644 --- a/core/src/test/java/com/github/api/v2/services/PullRequestServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/PullRequestServiceTest.java @@ -16,15 +16,13 @@ */ package com.github.api.v2.services; -import java.io.InputStream; import java.util.List; import org.junit.After; import org.junit.Before; import org.junit.Test; -import com.github.api.v2.schema.Blob; -import com.github.api.v2.schema.Tree; +import com.github.api.v2.schema.PullRequest; import com.github.api.v2.services.constant.TestConstants; /** @@ -52,48 +50,35 @@ public void tearDown() throws Exception { * Test get blob. */ @Test - public void testGetBlob() { + public void testGetPullRequest() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Tree SHA."), TestConstants.TEST_TREE_SHA); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test File Path."), TestConstants.TEST_FILE_PATH); - Blob blob = service.getBlob(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_TREE_SHA, TestConstants.TEST_FILE_PATH); - assertNotNull("Blob cannot be null or empty", blob); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Issue Number."), TestConstants.TEST_ISSUE_NUMBER); + PullRequest pullRequest = service.getPullRequest(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, Integer.parseInt(TestConstants.TEST_ISSUE_NUMBER)); + assertNotNull("Pull request cannot be null or empty", pullRequest); } /** * Test get blobs. */ @Test - public void testGetBlobs() { + public void testGetPullRequests() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Tree SHA."), TestConstants.TEST_TREE_SHA); - List blobs = service.getBlobs(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_TREE_SHA); - assertNotNullOrEmpty("Blobs cannot be null or empty", blobs); + List pullRequests = service.getPullRequests(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + assertNotNullOrEmpty("Pull requests cannot be null or empty", pullRequests); } /** * Test get object content. */ @Test - public void testGetObjectContent() { - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Tree SHA."), TestConstants.TEST_TREE_SHA); - InputStream objectContent = service.getObjectContent(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_TREE_SHA); - assertNotNullOrEmpty("Object content cannot be null or empty", convertStreamToString(objectContent)); - } - - /** - * Test get tree. - */ - @Test - public void testGetTree() { + public void testCreatePullRequest() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Tree SHA."), TestConstants.TEST_TREE_SHA); - List trees = service.getTree(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_TREE_SHA); - assertNotNullOrEmpty("Tree cannot be null or empty", trees); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Base SHA."), TestConstants.TEST_BASE_SHA); + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Head SHA."), TestConstants.TEST_HEAD_SHA); + service.createPullRequest(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_BASE_SHA, TestConstants.TEST_HEAD_SHA, TestConstants.TEST_ISSUE_TITLE, TestConstants.TEST_ISSUE_BODY); } } diff --git a/core/src/test/java/com/github/api/v2/services/constant/TestConstants.java b/core/src/test/java/com/github/api/v2/services/constant/TestConstants.java index eb28517..72c8e0c 100644 --- a/core/src/test/java/com/github/api/v2/services/constant/TestConstants.java +++ b/core/src/test/java/com/github/api/v2/services/constant/TestConstants.java @@ -139,6 +139,10 @@ public final class TestConstants { /** The Constant TEST_KEY_ID. */ public static final String TEST_KEY_ID = testConstants.getProperty("com.github.api.v2.services.testKeyId"); + + public static final String TEST_BASE_SHA = testConstants.getProperty("com.github.api.v2.services.testBaseSha"); + + public static final String TEST_HEAD_SHA = testConstants.getProperty("com.github.api.v2.services.testHeadSha"); /** * Instantiates a new test constants. diff --git a/examples/src/java/com/github/api/v2/services/example/PullRequestApiSample.java b/examples/src/java/com/github/api/v2/services/example/PullRequestApiSample.java index 018a825..0bc3271 100644 --- a/examples/src/java/com/github/api/v2/services/example/PullRequestApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/PullRequestApiSample.java @@ -16,14 +16,9 @@ */ package com.github.api.v2.services.example; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; import java.util.List; -import com.github.api.v2.schema.Blob; -import com.github.api.v2.schema.Tree; +import com.github.api.v2.schema.PullRequest; import com.github.api.v2.services.GitHubServiceFactory; import com.github.api.v2.services.PullRequestService; @@ -41,70 +36,21 @@ public class PullRequestApiSample { public static void main(String[] args) { GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); PullRequestService service = factory.createPullRequestService(); - List trees = service.getTree("facebook", "tornado", "7b80c2f4db226d6fa3a7"); - for (Tree tree : trees) { - printResult(tree); + List pullRequests = service.getPullRequests("technoweenie", "faraday"); + for (PullRequest pullRequest : pullRequests) { + printResult(pullRequest); } - List blobs = service.getBlobs("facebook", "tornado", "7b80c2f4db226d6fa3a7"); - for (Blob blob : blobs) { - printResult(blob); - } - System.out.println(convertStreamToString(service.getObjectContent("facebook", "tornado", "7b80c2f4db226d6fa3a7f3dfa59277da1d642f91"))); + PullRequest pullRequest = service.getPullRequest("technoweenie", "faraday", 15); + printResult(pullRequest); } /** * Prints the result. * - * @param blob + * @param pullRequest * the blob */ - private static void printResult(Blob blob) { - System.out.println(blob); - } - - /** - * Prints the result. - * - * @param tree - * the tree - */ - private static void printResult(Tree tree) { - System.out.println(tree); - } - - /** - * Convert stream to string. - * - * @param is - * the is - * - * @return the string - */ - private static String convertStreamToString(InputStream is) { - /* - * To convert the InputStream to String we use the BufferedReader.readLine() - * method. We iterate until the BufferedReader return null which means - * there's no more data to read. Each line will appended to a StringBuilder - * and returned as String. - */ - BufferedReader reader = new BufferedReader(new InputStreamReader(is)); - StringBuilder sb = new StringBuilder(); - - String line = null; - try { - while ((line = reader.readLine()) != null) { - sb.append(line + "\n"); - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - is.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - return sb.toString(); + private static void printResult(PullRequest pullRequest) { + System.out.println(pullRequest); } } diff --git a/schema/src/main/java/com/github/api/v2/schema/Issue.java b/schema/src/main/java/com/github/api/v2/schema/Issue.java index 3635538..aef6692 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Issue.java +++ b/schema/src/main/java/com/github/api/v2/schema/Issue.java @@ -16,8 +16,10 @@ */ package com.github.api.v2.schema; +import java.util.ArrayList; import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -115,6 +117,38 @@ public static State fromValue(String value) { /** The created at. */ private Date createdAt; + private Date closedAt; + + private List labels = new ArrayList(); + + /** + * @return the closedAt + */ + public Date getClosedAt() { + return closedAt; + } + + /** + * @param closedAt the closedAt to set + */ + public void setClosedAt(Date closedAt) { + this.closedAt = closedAt; + } + + /** + * @return the labels + */ + public List getLabels() { + return labels; + } + + /** + * @param labels the labels to set + */ + public void setLabels(List labels) { + this.labels = labels; + } + /** * Gets the user. * diff --git a/schema/src/main/java/com/github/api/v2/schema/PullRequest.java b/schema/src/main/java/com/github/api/v2/schema/PullRequest.java index fbe2d16..c2fa2e9 100644 --- a/schema/src/main/java/com/github/api/v2/schema/PullRequest.java +++ b/schema/src/main/java/com/github/api/v2/schema/PullRequest.java @@ -16,6 +16,12 @@ */ package com.github.api.v2.schema; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import com.github.api.v2.schema.Issue.State; + /** * The Class Blob. */ @@ -24,144 +30,382 @@ public class PullRequest extends SchemaEntity { /** The Constant serialVersionUID. */ private static final long serialVersionUID = 9155892708485181542L; - /** The name. */ - private String name; + private User user; + + /** The gravatar id. */ + private String gravatarId; + + /** The updated at. */ + private Date issueUpdatedAt; + + /** The votes. */ + private int votes; + + /** The number. */ + private int number; + + /** The comments. */ + private int comments; + + /** The position. */ + private double position; + + /** The title. */ + private String title; + + /** The body. */ + private String body; + + /** The state. */ + private State state; + + /** The created at. */ + private Date createdAt; + + private Date issueCreatedAt; + private String htmlUrl; + private String diffUrl; + private String patchUrl; + private User issueUser; + private Version base; + private Version head; + + private List labels = new ArrayList(); + + /** + * Gets the user. + * + * @return the user + */ + public User getUser() { + return user; + } + + /** + * Sets the user. + * + * @param user + * the new user + */ + public void setUser(User user) { + this.user = user; + } + + /** + * Gets the gravatar id. + * + * @return the gravatar id + */ + public String getGravatarId() { + return gravatarId; + } + + /** + * Sets the gravatar id. + * + * @param gravatarId + * the new gravatar id + */ + public void setGravatarId(String gravatarId) { + this.gravatarId = gravatarId; + } + + /** + * Gets the updated at. + * + * @return the updated at + */ + public Date getIssueUpdatedAt() { + return issueUpdatedAt; + } - /** The size. */ - private int size; + /** + * Sets the updated at. + * + * @param updatedAt + * the new updated at + */ + public void setIssueUpdatedAt(Date updatedAt) { + this.issueUpdatedAt = updatedAt; + } - /** The sha. */ - private String sha; + /** + * Gets the votes. + * + * @return the votes + */ + public int getVotes() { + return votes; + } - /** The mode. */ - private String mode; + /** + * Sets the votes. + * + * @param votes + * the new votes + */ + public void setVotes(int votes) { + this.votes = votes; + } - /** The mime type. */ - private String mimeType; + /** + * Gets the number. + * + * @return the number + */ + public int getNumber() { + return number; + } - /** The data. */ - private String data; + /** + * Sets the number. + * + * @param number + * the new number + */ + public void setNumber(int number) { + this.number = number; + } /** - * Gets the name. + * Gets the position. * - * @return the name + * @return the position */ - public String getName() { - return name; + public double getPosition() { + return position; } /** - * Sets the name. + * Sets the position. * - * @param name - * the new name + * @param position + * the new position */ - public void setName(String name) { - this.name = name; + public void setPosition(double position) { + this.position = position; } /** - * Gets the size. + * Gets the title. * - * @return the size + * @return the title */ - public int getSize() { - return size; + public String getTitle() { + return title; } /** - * Sets the size. + * Sets the title. * - * @param size - * the new size + * @param title + * the new title */ - public void setSize(int size) { - this.size = size; + public void setTitle(String title) { + this.title = title; } /** - * Gets the sha. + * Gets the body. * - * @return the sha + * @return the body */ - public String getSha() { - return sha; + public String getBody() { + return body; } /** - * Sets the sha. + * Sets the body. * - * @param sha - * the new sha + * @param body + * the new body */ - public void setSha(String sha) { - this.sha = sha; + public void setBody(String body) { + this.body = body; } /** - * Gets the mode. + * Gets the state. * - * @return the mode + * @return the state */ - public String getMode() { - return mode; + public State getState() { + return state; } /** - * Sets the mode. + * Sets the state. * - * @param mode - * the new mode + * @param state + * the new state */ - public void setMode(String mode) { - this.mode = mode; + public void setState(State state) { + this.state = state; } /** - * Gets the mime type. + * Gets the created at. * - * @return the mime type + * @return the created at */ - public String getMimeType() { - return mimeType; + public Date getCreatedAt() { + return createdAt; } /** - * Sets the mime type. + * Sets the created at. * - * @param mimeType - * the new mime type + * @param createdAt + * the new created at */ - public void setMimeType(String mimeType) { - this.mimeType = mimeType; + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; } /** - * Gets the data. + * Gets the comments. * - * @return the data + * @return the comments */ - public String getData() { - return data; + public int getComments() { + return comments; } /** - * Sets the data. + * Sets the comments. * - * @param data - * the new data + * @param comments + * the new comments + */ + public void setComments(int comments) { + this.comments = comments; + } + + /** + * @return the issueCreatedAt + */ + public Date getIssueCreatedAt() { + return issueCreatedAt; + } + + /** + * @param issueCreatedAt the issueCreatedAt to set + */ + public void setIssueCreatedAt(Date issueCreatedAt) { + this.issueCreatedAt = issueCreatedAt; + } + + /** + * @return the htmlUrl + */ + public String getHtmlUrl() { + return htmlUrl; + } + + /** + * @param htmlUrl the htmlUrl to set + */ + public void setHtmlUrl(String htmlUrl) { + this.htmlUrl = htmlUrl; + } + + /** + * @return the diffUrl + */ + public String getDiffUrl() { + return diffUrl; + } + + /** + * @param diffUrl the diffUrl to set + */ + public void setDiffUrl(String diffUrl) { + this.diffUrl = diffUrl; + } + + /** + * @return the patchUrl + */ + public String getPatchUrl() { + return patchUrl; + } + + /** + * @param patchUrl the patchUrl to set + */ + public void setPatchUrl(String patchUrl) { + this.patchUrl = patchUrl; + } + + /** + * @return the issueUser + */ + public User getIssueUser() { + return issueUser; + } + + /** + * @param issueUser the issueUser to set + */ + public void setIssueUser(User issueUser) { + this.issueUser = issueUser; + } + + /** + * @return the base + */ + public Version getBase() { + return base; + } + + /** + * @param base the base to set */ - public void setData(String data) { - this.data = data; + public void setBase(Version base) { + this.base = base; } + + /** + * @return the head + */ + public Version getHead() { + return head; + } + + /** + * @param head the head to set + */ + public void setHead(Version head) { + this.head = head; + } + + /** + * @return the labels + */ + public List getLabels() { + return labels; + } + + /** + * @param labels the labels to set + */ + public void setLabels(List labels) { + this.labels = labels; + } + /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { - return "Blob [data=" + data + ", mimeType=" + mimeType + ", mode=" - + mode + ", name=" + name + ", sha=" + sha + ", size=" + size - + "]"; + return "PullRequest [base=" + base + ", body=" + body + ", comments=" + + comments + ", createdAt=" + createdAt + ", diffUrl=" + + diffUrl + ", gravatarId=" + gravatarId + ", head=" + head + + ", htmlUrl=" + htmlUrl + ", issueCreatedAt=" + issueCreatedAt + + ", issueUpdatedAt=" + issueUpdatedAt + ", issueUser=" + + issueUser + ", labels=" + labels + ", number=" + number + + ", patchUrl=" + patchUrl + ", position=" + position + + ", state=" + state + ", title=" + title + ", user=" + user + + ", votes=" + votes + "]"; } } diff --git a/schema/src/main/java/com/github/api/v2/schema/Version.java b/schema/src/main/java/com/github/api/v2/schema/Version.java new file mode 100644 index 0000000..dea9673 --- /dev/null +++ b/schema/src/main/java/com/github/api/v2/schema/Version.java @@ -0,0 +1,127 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + + +/** + * The Class Tree. + */ +public class Version extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** The label. */ + private String label; + + /** The sha. */ + private String sha; + + /** The ref. */ + private String ref; + + /** The repository. */ + private Repository repository; + + /** The user. */ + private User user; + + /** + * Gets the name. + * + * @return the name + */ + public String getLabel() { + return label; + } + + /** + * Sets the name. + * + * @param name + * the new name + */ + public void setLabel(String label) { + this.label = label; + } + + /** + * Gets the sha. + * + * @return the sha + */ + public String getSha() { + return sha; + } + + /** + * Sets the sha. + * + * @param sha + * the new sha + */ + public void setSha(String sha) { + this.sha = sha; + } + + /** + * Gets the mode. + * + * @return the mode + */ + public String getRef() { + return ref; + } + + /** + * Sets the mode. + * + * @param mode + * the new mode + */ + public void setRef(String ref) { + this.ref = ref; + } + + /** + * @return the repository + */ + public Repository getRepository() { + return repository; + } + + /** + * @param repository the repository to set + */ + public void setRepository(Repository repository) { + this.repository = repository; + } + + /** + * @return the user + */ + public User getUser() { + return user; + } + + /** + * @param user the user to set + */ + public void setUser(User user) { + this.user = user; + } +} From e4466421b8c8219522df130ba9f78932352f63cf Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Mon, 24 Jan 2011 17:20:02 +0500 Subject: [PATCH 43/95] JAutoDoc --- .../github/api/v2/services/FeedService.java | 108 ++++++++++++++ .../api/v2/services/GitHubServiceFactory.java | 12 +- .../github/api/v2/services/IssueService.java | 10 +- .../github/api/v2/services/OAuthService.java | 7 +- .../api/v2/services/OrganizationService.java | 141 ++++++++++++++++++ .../api/v2/services/PullRequestService.java | 42 ++++-- .../api/v2/services/RepositoryService.java | 14 +- .../github/api/v2/services/UserService.java | 8 + .../v2/services/constant/GitHubApiUrls.java | 8 +- .../v2/services/constant/ParameterNames.java | 12 ++ .../v2/services/impl/BaseGitHubService.java | 1 + .../api/v2/services/impl/FeedServiceImpl.java | 46 +++++- .../v2/services/impl/GitHubApiGateway.java | 4 +- .../v2/services/impl/IssueServiceImpl.java | 3 + .../impl/OrganizationServiceImpl.java | 51 +++++++ .../services/impl/PullRequestServiceImpl.java | 5 +- .../services/impl/RepositoryServiceImpl.java | 3 + .../api/v2/services/impl/UserServiceImpl.java | 3 + .../api/v2/services/FeedServiceTest.java | 41 +++++ .../api/v2/services/IssueServiceTest.java | 3 + .../api/v2/services/ObjectServiceTest.java | 6 + .../v2/services/OrganizationServiceTest.java | 56 ++++++- .../v2/services/PullRequestServiceTest.java | 14 +- .../v2/services/constant/TestConstants.java | 2 + .../api/v2/services/example/FeedSample.java | 8 +- .../example/OrganizationApiSample.java | 17 ++- .../example/PullRequestApiSample.java | 4 +- .../services/example/RepositoryApiSample.java | 3 + .../java/com/github/api/v2/schema/Block.java | 35 ++++- .../java/com/github/api/v2/schema/Feed.java | 54 ++++++- .../com/github/api/v2/schema/FeedEntry.java | 67 ++++++++- .../java/com/github/api/v2/schema/Gist.java | 9 +- .../java/com/github/api/v2/schema/Head.java | 10 +- .../java/com/github/api/v2/schema/Issue.java | 18 ++- .../github/api/v2/schema/NetworkCommit.java | 2 +- .../com/github/api/v2/schema/NetworkMeta.java | 19 ++- .../com/github/api/v2/schema/NetworkUser.java | 34 ++++- .../github/api/v2/schema/Organization.java | 30 +++- .../com/github/api/v2/schema/Permission.java | 22 ++- .../com/github/api/v2/schema/PullRequest.java | 93 +++++++++--- .../com/github/api/v2/schema/Repository.java | 17 ++- .../java/com/github/api/v2/schema/Team.java | 24 ++- .../java/com/github/api/v2/schema/User.java | 15 +- .../com/github/api/v2/schema/Version.java | 36 +++-- 44 files changed, 995 insertions(+), 122 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/FeedService.java b/core/src/main/java/com/github/api/v2/services/FeedService.java index 07fb94f..aa469d9 100644 --- a/core/src/main/java/com/github/api/v2/services/FeedService.java +++ b/core/src/main/java/com/github/api/v2/services/FeedService.java @@ -24,15 +24,123 @@ */ public interface FeedService extends GitHubService { + /** + * Gets the public user feed. + * + * @param userName + * the user name + * @param count + * the count + * + * @return the public user feed + */ public Feed getPublicUserFeed(String userName, int count); + + /** + * Gets the private user feed. + * + * @param userName + * the user name + * @param count + * the count + * + * @return the private user feed + */ public Feed getPrivateUserFeed(String userName, int count); + + /** + * Gets the commit feed. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param branchName + * the branch name + * @param count + * the count + * + * @return the commit feed + */ public Feed getCommitFeed(String userName, String repositoryName, String branchName, int count); + + /** + * Gets the network feed. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param count + * the count + * + * @return the network feed + */ public Feed getNetworkFeed(String userName, String repositoryName, int count); + + /** + * Gets the wiki feed. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param count + * the count + * + * @return the wiki feed + */ public Feed getWikiFeed(String userName, String repositoryName, int count); + + /** + * Gets the public timeline feed. + * + * @param count + * the count + * + * @return the public timeline feed + */ public Feed getPublicTimelineFeed(int count); + /** + * Gets the discussions feed. + * + * @param count + * the count + * + * @return the discussions feed + */ public Feed getDiscussionsFeed(int count); + + /** + * Gets the discussions feed. + * + * @param topic + * the topic + * @param count + * the count + * + * @return the discussions feed + */ public Feed getDiscussionsFeed(String topic, int count); + + /** + * Gets the job positions feed. + * + * @param count + * the count + * + * @return the job positions feed + */ public Feed getJobPositionsFeed(int count); + + /** + * Gets the blog feed. + * + * @param count + * the count + * + * @return the blog feed + */ public Feed getBlogFeed(int count); } diff --git a/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java b/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java index 3ca7224..00f9fc1 100644 --- a/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java +++ b/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java @@ -108,7 +108,7 @@ public RepositoryService createRepositoryService() { /** * Creates a new GitHubService object. * - * @return the repository service + * @return the organization service */ public OrganizationService createOrganizationService() { return new OrganizationServiceImpl(); @@ -137,10 +137,20 @@ public OAuthService createOAuthService(String clientId, String secret) { return new OAuthServiceImpl(clientId, secret); } + /** + * Creates a new GitHubService object. + * + * @return the feed service + */ public FeedService createFeedService() { return new FeedServiceImpl(); } + /** + * Creates a new GitHubService object. + * + * @return the pull request service + */ public PullRequestService createPullRequestService() { return new PullRequestServiceImpl(); } diff --git a/core/src/main/java/com/github/api/v2/services/IssueService.java b/core/src/main/java/com/github/api/v2/services/IssueService.java index 20108a0..af4a6d3 100644 --- a/core/src/main/java/com/github/api/v2/services/IssueService.java +++ b/core/src/main/java/com/github/api/v2/services/IssueService.java @@ -44,18 +44,16 @@ public interface IssueService extends GitHubService { public List searchIssues(String userName, String repositoryName, State state, String keyword); /** - * Search issues. + * Gets the issues. * * @param userName * the user name * @param repositoryName * the repository name - * @param state - * the state - * @param keyword - * the keyword + * @param label + * the label * - * @return the list< issue> + * @return the issues */ public List getIssues(String userName, String repositoryName, String label); diff --git a/core/src/main/java/com/github/api/v2/services/OAuthService.java b/core/src/main/java/com/github/api/v2/services/OAuthService.java index 3b64a19..c96bced 100644 --- a/core/src/main/java/com/github/api/v2/services/OAuthService.java +++ b/core/src/main/java/com/github/api/v2/services/OAuthService.java @@ -28,12 +28,13 @@ public interface OAuthService extends GitHubService { /** - * The Enum Permission. + * The Enum Scope. */ public enum Scope implements ValueEnum { /** The USER. */ USER("user"), + /** The REPOSITORY. */ REPOSITORY("repo"); @@ -50,7 +51,7 @@ public enum Scope implements ValueEnum { private final String value; /** - * Instantiates a new permission. + * Instantiates a new scope. * * @param value * the value @@ -73,7 +74,7 @@ public String value() { * @param value * the value * - * @return the permission + * @return the scope */ public static Scope fromValue(String value) { return stringToEnum.get(value); diff --git a/core/src/main/java/com/github/api/v2/services/OrganizationService.java b/core/src/main/java/com/github/api/v2/services/OrganizationService.java index 583f2f2..a5993db 100644 --- a/core/src/main/java/com/github/api/v2/services/OrganizationService.java +++ b/core/src/main/java/com/github/api/v2/services/OrganizationService.java @@ -27,21 +27,162 @@ * The Interface OrganizationService. */ public interface OrganizationService extends GitHubService { + + /** + * Gets the organization. + * + * @param name + * the name + * + * @return the organization + */ public Organization getOrganization(String name); + + /** + * Gets the user organizations. + * + * @return the user organizations + */ public List getUserOrganizations(); + + /** + * Update organization. + * + * @param organization + * the organization + */ public void updateOrganization(Organization organization); + + /** + * Gets the all organization repositories. + * + * @return the all organization repositories + */ public List getAllOrganizationRepositories(); + + /** + * Gets the public repositories. + * + * @param organizationName + * the organization name + * + * @return the public repositories + */ public List getPublicRepositories(String organizationName); + + /** + * Gets the public members. + * + * @param organizationName + * the organization name + * + * @return the public members + */ public List getPublicMembers(String organizationName); + + /** + * Gets the teams. + * + * @param organizationName + * the organization name + * + * @return the teams + */ public List getTeams(String organizationName); + + /** + * Creates the team. + * + * @param team + * the team + */ public void createTeam(Team team); + + /** + * Gets the team. + * + * @param teamId + * the team id + * + * @return the team + */ public Team getTeam(String teamId); + + /** + * Update team. + * + * @param team + * the team + */ public void updateTeam(Team team); + + /** + * Delete team. + * + * @param teamId + * the team id + */ public void deleteTeam(String teamId); + + /** + * Gets the team members. + * + * @param teamId + * the team id + * + * @return the team members + */ public List getTeamMembers(String teamId); + + /** + * Adds the team member. + * + * @param teamId + * the team id + * @param userName + * the user name + */ public void addTeamMember(String teamId, String userName); + + /** + * Removes the team member. + * + * @param teamId + * the team id + * @param userName + * the user name + */ public void removeTeamMember(String teamId, String userName); + + /** + * Gets the team repositories. + * + * @param teamId + * the team id + * + * @return the team repositories + */ public List getTeamRepositories(String teamId); + + /** + * Adds the team repository. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + */ public void addTeamRepository(String userName, String repositoryName); + + /** + * Removes the team repository. + * + * @param teamId + * the team id + * @param userName + * the user name + * @param repositoryName + * the repository name + */ public void removeTeamRepository(String teamId, String userName, String repositoryName); } diff --git a/core/src/main/java/com/github/api/v2/services/PullRequestService.java b/core/src/main/java/com/github/api/v2/services/PullRequestService.java index 1a1fcad..0a111ed 100644 --- a/core/src/main/java/com/github/api/v2/services/PullRequestService.java +++ b/core/src/main/java/com/github/api/v2/services/PullRequestService.java @@ -22,53 +22,65 @@ import com.github.api.v2.schema.Issue.State; /** - * The Interface ObjectService. + * The Interface PullRequestService. */ public interface PullRequestService extends GitHubService { /** - * Gets the tree. + * Gets the pull requests. * * @param userName * the user name * @param repositoryName * the repository name - * @param treeSha - * the tree sha * - * @return the tree + * @return the pull requests */ public List getPullRequests(String userName, String repositoryName); /** - * Gets the tree. + * Gets the pull requests. * * @param userName * the user name * @param repositoryName * the repository name - * @param treeSha - * the tree sha + * @param state + * the state * - * @return the tree + * @return the pull requests */ public List getPullRequests(String userName, String repositoryName, State state); /** - * Gets the blob. + * Gets the pull request. * * @param userName * the user name * @param repositoryName * the repository name - * @param treeSha - * the tree sha - * @param filePath - * the file path + * @param issueNumber + * the issue number * - * @return the blob + * @return the pull request */ public PullRequest getPullRequest(String userName, String repositoryName, int issueNumber); + /** + * Creates the pull request. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param base + * the base + * @param head + * the head + * @param title + * the title + * @param body + * the body + */ public void createPullRequest(String userName, String repositoryName, String base, String head, String title, String body); } diff --git a/core/src/main/java/com/github/api/v2/services/RepositoryService.java b/core/src/main/java/com/github/api/v2/services/RepositoryService.java index a085f54..726971c 100644 --- a/core/src/main/java/com/github/api/v2/services/RepositoryService.java +++ b/core/src/main/java/com/github/api/v2/services/RepositoryService.java @@ -193,7 +193,7 @@ public interface RepositoryService extends GitHubService { * @param key * the key * - * @return the string + * @return the list< key> */ public List addDeployKey(String repositoryName, String title, String key); @@ -318,5 +318,17 @@ public interface RepositoryService extends GitHubService { */ public Map getBranches(String userName, String repositoryName); + /** + * Gets the repository archive. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param branchName + * the branch name + * + * @return the repository archive + */ public ZipInputStream getRepositoryArchive(String userName, String repositoryName, String branchName); } diff --git a/core/src/main/java/com/github/api/v2/services/UserService.java b/core/src/main/java/com/github/api/v2/services/UserService.java index f2223d1..80a3343 100644 --- a/core/src/main/java/com/github/api/v2/services/UserService.java +++ b/core/src/main/java/com/github/api/v2/services/UserService.java @@ -167,5 +167,13 @@ public interface UserService extends GitHubService { */ public void removeEmail(String email); + /** + * Gets the user organizations. + * + * @param userName + * the user name + * + * @return the user organizations + */ public List getUserOrganizations(String userName); } diff --git a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java index 10c3aad..bf9d725 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java +++ b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java @@ -162,6 +162,7 @@ public static interface IssueApiUrls { /** The Constant ADD_COMMENT_URL. */ public static final String ADD_COMMENT_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.addComment"); + /** The Constant GET_ISSUES_BY_LABEL_URL. */ public static final String GET_ISSUES_BY_LABEL_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.issueService.getIssuesByLabel"); } @@ -311,7 +312,7 @@ public static interface OrganizationApiUrls { /** The Constant GET_ORGANIZATION_URL. */ public static final String GET_ORGANIZATION_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getOrganization"); - /** The Constant GET_ORGANIZATION_URL. */ + /** The Constant GET_ORGANIZATIONS_URL. */ public static final String GET_ORGANIZATIONS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getOrganizations"); /** The Constant UPDATE_ORGANIZATION_URL. */ @@ -377,10 +378,11 @@ public static interface PullRequestApiUrls { /** - * The Interface ObjectApiUrls. + * The Interface FeedUrls. */ public static interface FeedUrls { - /** The Constant GET_PUBLIC_USER_FEED_URL. */ + + /** The Constant GET_PUBLIC_USER_FEED_URL. */ public static final String GET_PUBLIC_USER_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getPublicUserFeed"); /** The Constant GET_PRIVATE_USER_FEED_URL. */ diff --git a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java index 55f38fe..ae8a2a9 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java +++ b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java @@ -153,19 +153,31 @@ public interface ParameterNames { /** The Constant DELETE_TOKEN. */ public static final String DELETE_TOKEN = "delete_token"; + /** The Constant NUM. */ public static final String NUM = "num"; + /** The Constant USER_REPOSITORY_PAIR. */ public static final String USER_REPOSITORY_PAIR = "userRepositoryPair"; + /** The Constant ORGANIZATION_NAME. */ public static final String ORGANIZATION_NAME = "organizationName"; + /** The Constant TEAM_ID. */ public static final String TEAM_ID = "teamId"; + + /** The Constant PERMISSION. */ public static final String PERMISSION = "permission"; + + /** The Constant REPO_NAMES. */ public static final String REPO_NAMES = "repo_names"; + + /** The Constant BILLING_EMAIL. */ public static final String BILLING_EMAIL = "billing_email"; + /** The Constant BASE. */ public static final String BASE = "base"; + /** The Constant HEAD. */ public static final String HEAD = "head"; } diff --git a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java index dd19201..8156d61 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java +++ b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java @@ -52,6 +52,7 @@ */ public abstract class BaseGitHubService extends GitHubApiGateway implements GitHubService { + /** The Constant UTF_8_CHAR_SET. */ protected static final Charset UTF_8_CHAR_SET = Charset.forName(ApplicationConstants.CONTENT_ENCODING); /** The parser. */ diff --git a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java index 9eb863f..44dff50 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java @@ -28,16 +28,22 @@ import com.google.gson.reflect.TypeToken; /** - * The Class NetworkServiceImpl. + * The Class FeedServiceImpl. */ public class FeedServiceImpl extends BaseGitHubService implements FeedService { + /** + * Instantiates a new feed service impl. + */ public FeedServiceImpl() { // by default we compress contents requestHeaders.put("Accept-Encoding", "gzip, deflate"); } + /* (non-Javadoc) + * @see com.github.api.v2.services.FeedService#getCommitFeed(java.lang.String, java.lang.String, java.lang.String, int) + */ @Override public Feed getCommitFeed(String userName, String repositoryName, String branchName, int count) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_COMMIT_FEED_URL); @@ -45,6 +51,9 @@ public Feed getCommitFeed(String userName, String repositoryName, String branchN return unmarshall(apiUrl); } + /* (non-Javadoc) + * @see com.github.api.v2.services.FeedService#getNetworkFeed(java.lang.String, java.lang.String, int) + */ @Override public Feed getNetworkFeed(String userName, String repositoryName, int count) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_NETWORK_FEED_URL); @@ -52,6 +61,9 @@ public Feed getNetworkFeed(String userName, String repositoryName, int count) { return unmarshall(apiUrl); } + /* (non-Javadoc) + * @see com.github.api.v2.services.FeedService#getPrivateUserFeed(java.lang.String, int) + */ @Override public Feed getPrivateUserFeed(String userName, int count) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_PRIVATE_USER_FEED_URL); @@ -59,6 +71,9 @@ public Feed getPrivateUserFeed(String userName, int count) { return unmarshall(apiUrl); } + /* (non-Javadoc) + * @see com.github.api.v2.services.FeedService#getPublicTimelineFeed(int) + */ @Override public Feed getPublicTimelineFeed(int count) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_PUBLIC_TIMELINE_FEED_URL); @@ -66,6 +81,9 @@ public Feed getPublicTimelineFeed(int count) { return unmarshall(apiUrl); } + /* (non-Javadoc) + * @see com.github.api.v2.services.FeedService#getPublicUserFeed(java.lang.String, int) + */ @Override public Feed getPublicUserFeed(String userName, int count) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_PUBLIC_USER_FEED_URL); @@ -73,6 +91,9 @@ public Feed getPublicUserFeed(String userName, int count) { return unmarshall(apiUrl); } + /* (non-Javadoc) + * @see com.github.api.v2.services.FeedService#getWikiFeed(java.lang.String, java.lang.String, int) + */ @Override public Feed getWikiFeed(String userName, String repositoryName, int count) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_WIKI_FEED_URL); @@ -80,6 +101,9 @@ public Feed getWikiFeed(String userName, String repositoryName, int count) { return unmarshall(apiUrl); } + /* (non-Javadoc) + * @see com.github.api.v2.services.FeedService#getBlogFeed(int) + */ @Override public Feed getBlogFeed(int count) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_BLOG_FEED_URL); @@ -87,6 +111,9 @@ public Feed getBlogFeed(int count) { return unmarshall(apiUrl); } + /* (non-Javadoc) + * @see com.github.api.v2.services.FeedService#getDiscussionsFeed(int) + */ @Override public Feed getDiscussionsFeed(int count) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_DISCUSSIONS_FEED_URL); @@ -94,6 +121,9 @@ public Feed getDiscussionsFeed(int count) { return unmarshall(apiUrl); } + /* (non-Javadoc) + * @see com.github.api.v2.services.FeedService#getDiscussionsFeed(java.lang.String, int) + */ @Override public Feed getDiscussionsFeed(String topic, int count) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_DISCUSSIONS_FEED_BY_TOPIC_URL); @@ -101,6 +131,9 @@ public Feed getDiscussionsFeed(String topic, int count) { return unmarshall(apiUrl); } + /* (non-Javadoc) + * @see com.github.api.v2.services.FeedService#getJobPositionsFeed(int) + */ @Override public Feed getJobPositionsFeed(int count) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_JOB_POSITIONS_FEED_URL); @@ -109,6 +142,14 @@ public Feed getJobPositionsFeed(int count) { } + /** + * Unmarshall. + * + * @param apiUrl + * the api url + * + * @return the feed + */ protected Feed unmarshall(String apiUrl) { JsonObject response = unmarshall(callApiGet(apiUrl)); if (response.isJsonObject()) { @@ -125,6 +166,9 @@ protected Feed unmarshall(String apiUrl) { return null; } + /* (non-Javadoc) + * @see com.github.api.v2.services.impl.BaseGitHubService#getGsonBuilder() + */ protected GsonBuilder getGsonBuilder() { GsonBuilder gson = super.getGsonBuilder(); gson.setDateFormat("EEE', 'dd' 'MMM' 'yyyy' 'HH:mm:ss' 'Z"); diff --git a/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java b/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java index 2875849..8acc217 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java +++ b/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java @@ -330,7 +330,7 @@ protected InputStream callApiPost(String apiUrl, Map parameters, /** - * Call api get. + * Call api delete. * * @param apiUrl * the api url @@ -342,7 +342,7 @@ protected InputStream callApiDelete(String apiUrl) { } /** - * Call api get. + * Call api delete. * * @param apiUrl * the api url diff --git a/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java index 0a30c3d..1fe04cd 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java @@ -175,6 +175,9 @@ public List searchIssues(String userName, String repositoryName, return unmarshall(new TypeToken>(){}, json.get("issues")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.IssueService#getIssues(java.lang.String, java.lang.String, java.lang.String) + */ @Override public List getIssues(String userName, String repositoryName, String label) { diff --git a/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java index 0f82069..073e5ad 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java @@ -48,6 +48,9 @@ protected GsonBuilder getGsonBuilder() { return gson; } + /* (non-Javadoc) + * @see com.github.api.v2.services.OrganizationService#addTeamMember(java.lang.String, java.lang.String) + */ @Override public void addTeamMember(String teamId, String userName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.ADD_TEAM_MEMBER_URL); @@ -55,6 +58,9 @@ public void addTeamMember(String teamId, String userName) { unmarshall(callApiPost(apiUrl, new HashMap())); } + /* (non-Javadoc) + * @see com.github.api.v2.services.OrganizationService#addTeamRepository(java.lang.String, java.lang.String) + */ @Override public void addTeamRepository(String userName, String repositoryName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.ADD_TEAM_REPOSITORY_URL); @@ -62,6 +68,9 @@ public void addTeamRepository(String userName, String repositoryName) { unmarshall(callApiPost(apiUrl, new HashMap())); } + /* (non-Javadoc) + * @see com.github.api.v2.services.OrganizationService#createTeam(com.github.api.v2.schema.Team) + */ @Override public void createTeam(Team team) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.CREATE_TEAM_URL); @@ -73,6 +82,9 @@ public void createTeam(Team team) { callApiPost(apiUrl, parameters); } + /* (non-Javadoc) + * @see com.github.api.v2.services.OrganizationService#deleteTeam(java.lang.String) + */ @Override public void deleteTeam(String teamId) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.DELETE_TEAM_URL); @@ -80,6 +92,9 @@ public void deleteTeam(String teamId) { callApiDelete(apiUrl); } + /* (non-Javadoc) + * @see com.github.api.v2.services.OrganizationService#getAllOrganizationRepositories() + */ @Override public List getAllOrganizationRepositories() { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_ALL_REPOSITORIES_URL); @@ -89,6 +104,9 @@ public List getAllOrganizationRepositories() { return unmarshall(new TypeToken>(){}, json.get("repositories")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.OrganizationService#getOrganization(java.lang.String) + */ @Override public Organization getOrganization(String name) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_ORGANIZATION_URL); @@ -100,6 +118,9 @@ public Organization getOrganization(String name) { return new Organization(); } + /* (non-Javadoc) + * @see com.github.api.v2.services.OrganizationService#getPublicMembers(java.lang.String) + */ @Override public List getPublicMembers(String organizationName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_PUBLIC_MEMBERS_URL); @@ -109,6 +130,9 @@ public List getPublicMembers(String organizationName) { return unmarshall(new TypeToken>(){}, json.get("users")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.OrganizationService#getPublicRepositories(java.lang.String) + */ @Override public List getPublicRepositories(String organizationName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_PUBLIC_REPOSITORIES_URL); @@ -118,6 +142,9 @@ public List getPublicRepositories(String organizationName) { return unmarshall(new TypeToken>(){}, json.get("repositories")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.OrganizationService#getTeam(java.lang.String) + */ @Override public Team getTeam(String teamId) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_TEAM_URL); @@ -127,6 +154,9 @@ public Team getTeam(String teamId) { return unmarshall(new TypeToken(){}, json.get("team")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.OrganizationService#getTeamMembers(java.lang.String) + */ @Override public List getTeamMembers(String teamId) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_TEAM_MEMBERS_URL); @@ -136,6 +166,9 @@ public List getTeamMembers(String teamId) { return unmarshall(new TypeToken>(){}, json.get("users")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.OrganizationService#getTeamRepositories(java.lang.String) + */ @Override public List getTeamRepositories(String teamId) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_TEAM_REPOSITORIES_URL); @@ -145,6 +178,9 @@ public List getTeamRepositories(String teamId) { return unmarshall(new TypeToken>(){}, json.get("repositories")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.OrganizationService#getTeams(java.lang.String) + */ @Override public List getTeams(String organizationName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_TEAMS_URL); @@ -154,6 +190,9 @@ public List getTeams(String organizationName) { return unmarshall(new TypeToken>(){}, json.get("teams")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.OrganizationService#getUserOrganizations() + */ @Override public List getUserOrganizations() { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_ORGANIZATIONS_URL); @@ -163,6 +202,9 @@ public List getUserOrganizations() { return unmarshall(new TypeToken>(){}, json.get("organizations")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.OrganizationService#removeTeamMember(java.lang.String, java.lang.String) + */ @Override public void removeTeamMember(String teamId, String userName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.REMOVE_TEAM_MEMBER_URL); @@ -170,6 +212,9 @@ public void removeTeamMember(String teamId, String userName) { callApiDelete(apiUrl); } + /* (non-Javadoc) + * @see com.github.api.v2.services.OrganizationService#removeTeamRepository(java.lang.String, java.lang.String, java.lang.String) + */ @Override public void removeTeamRepository(String teamId, String userName, String repositoryName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.REMOVE_TEAM_REPOSITORY_URL); @@ -177,6 +222,9 @@ public void removeTeamRepository(String teamId, String userName, String reposito callApiDelete(apiUrl); } + /* (non-Javadoc) + * @see com.github.api.v2.services.OrganizationService#updateOrganization(com.github.api.v2.schema.Organization) + */ @Override public void updateOrganization(Organization organization) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.UPDATE_ORGANIZATION_URL); @@ -191,6 +239,9 @@ public void updateOrganization(Organization organization) { callApiPost(apiUrl, parameters); } + /* (non-Javadoc) + * @see com.github.api.v2.services.OrganizationService#updateTeam(com.github.api.v2.schema.Team) + */ @Override public void updateTeam(Team team) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.UPDATE_TEAM_URL); diff --git a/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java index ef9c0da..9280ff2 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java @@ -31,7 +31,7 @@ import com.google.gson.reflect.TypeToken; /** - * The Class ObjectServiceImpl. + * The Class PullRequestServiceImpl. */ public class PullRequestServiceImpl extends BaseGitHubService implements PullRequestService { @@ -86,6 +86,9 @@ public void createPullRequest(String userName, String repositoryName, String bas callApiPost(apiUrl, parameters); } + /* (non-Javadoc) + * @see com.github.api.v2.services.impl.BaseGitHubService#getGsonBuilder() + */ protected GsonBuilder getGsonBuilder() { GsonBuilder gson = super.getGsonBuilder(); gson.setDateFormat("yyyy-MM-dd'T'HH:mm:ss"); diff --git a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java index cc5d484..ba70ba3 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java @@ -364,6 +364,9 @@ public void watchRepository(String userName, String repositoryName) { unmarshall(callApiPost(apiUrl, new HashMap())); } + /* (non-Javadoc) + * @see com.github.api.v2.services.RepositoryService#getRepositoryArchive(java.lang.String, java.lang.String, java.lang.String) + */ @Override public ZipInputStream getRepositoryArchive(String userName, String repositoryName, String branchName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_REPOSITORY_ARCHIVE_URL); diff --git a/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java index b6c28a1..d4720b7 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java @@ -214,6 +214,9 @@ public void unfollowUser(String userName) { callApiPost(apiUrl, new HashMap()); } + /* (non-Javadoc) + * @see com.github.api.v2.services.UserService#getUserOrganizations(java.lang.String) + */ @Override public List getUserOrganizations(String userName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_USER_ORGANIZATIONS); diff --git a/core/src/test/java/com/github/api/v2/services/FeedServiceTest.java b/core/src/test/java/com/github/api/v2/services/FeedServiceTest.java index 84aafa8..716e8d0 100644 --- a/core/src/test/java/com/github/api/v2/services/FeedServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/FeedServiceTest.java @@ -24,9 +24,17 @@ import com.github.api.v2.schema.Repository; import com.github.api.v2.services.constant.TestConstants; +/** + * The Class FeedServiceTest. + */ public class FeedServiceTest extends BaseGitHubServiceTest { + + /** The service. */ private FeedService service; + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() + */ @Before public void setUp() throws Exception { super.setUp(); @@ -34,12 +42,18 @@ public void setUp() throws Exception { service.setAuthentication(authentication); } + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() + */ @After public void tearDown() throws Exception { super.tearDown(); service = null; } + /** + * Test get commit feed. + */ @Test public void testGetCommitFeed() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -49,6 +63,9 @@ public void testGetCommitFeed() { assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); } + /** + * Test get network feed. + */ @Test public void testGetNetworkFeed() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -58,6 +75,9 @@ public void testGetNetworkFeed() { assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); } + /** + * Test get private user feed. + */ @Test public void testGetPrivateUserFeed() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -66,6 +86,9 @@ public void testGetPrivateUserFeed() { assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); } + /** + * Test get public timeline feed. + */ @Test public void testGetPublicTimelineFeed() { Feed feed = service.getPublicTimelineFeed(10); @@ -73,6 +96,9 @@ public void testGetPublicTimelineFeed() { assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); } + /** + * Test get public user feed. + */ @Test public void testGetPublicUserFeed() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -81,6 +107,9 @@ public void testGetPublicUserFeed() { assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); } + /** + * Test get wiki feed. + */ @Test public void testGetWikiFeed() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); @@ -90,6 +119,9 @@ public void testGetWikiFeed() { assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); } + /** + * Test get blog feed. + */ @Test public void testGetBlogFeed() { Feed feed = service.getBlogFeed(10); @@ -97,6 +129,9 @@ public void testGetBlogFeed() { assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); } + /** + * Test get discussions feed. + */ @Test public void testGetDiscussionsFeed() { Feed feed = service.getDiscussionsFeed(10); @@ -104,6 +139,9 @@ public void testGetDiscussionsFeed() { assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); } + /** + * Test get discussions feed string. + */ @Test public void testGetDiscussionsFeedString() { Feed feed = service.getDiscussionsFeed("api", 10); @@ -111,6 +149,9 @@ public void testGetDiscussionsFeedString() { assertNotNullOrEmpty("Feed entries cannot be null or empty.", feed.getEntries()); } + /** + * Test get job positions feed. + */ @Test public void testGetJobPositionsFeed() { Feed feed = service.getJobPositionsFeed(10); diff --git a/core/src/test/java/com/github/api/v2/services/IssueServiceTest.java b/core/src/test/java/com/github/api/v2/services/IssueServiceTest.java index f5d5231..b5a5942 100644 --- a/core/src/test/java/com/github/api/v2/services/IssueServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/IssueServiceTest.java @@ -182,6 +182,9 @@ public void testSearchIssues() { assertNotNullOrEmpty("Issues cannot be null or empty.", issues); } + /** + * Test get issues by label. + */ @Test public void testGetIssuesByLabel() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); diff --git a/core/src/test/java/com/github/api/v2/services/ObjectServiceTest.java b/core/src/test/java/com/github/api/v2/services/ObjectServiceTest.java index 519984a..c3016af 100644 --- a/core/src/test/java/com/github/api/v2/services/ObjectServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/ObjectServiceTest.java @@ -35,6 +35,9 @@ public class ObjectServiceTest extends BaseGitHubServiceTest { /** The service. */ private ObjectService service; + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() + */ @Before public void setUp() throws Exception { super.setUp(); @@ -42,6 +45,9 @@ public void setUp() throws Exception { service.setAuthentication(authentication); } + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() + */ @After public void tearDown() throws Exception { super.tearDown(); diff --git a/core/src/test/java/com/github/api/v2/services/OrganizationServiceTest.java b/core/src/test/java/com/github/api/v2/services/OrganizationServiceTest.java index 17e2325..34b8a1e 100644 --- a/core/src/test/java/com/github/api/v2/services/OrganizationServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/OrganizationServiceTest.java @@ -21,7 +21,7 @@ import org.junit.Test; /** - * The Class RepositoryServiceTest. + * The Class OrganizationServiceTest. */ public class OrganizationServiceTest extends BaseGitHubServiceTest { @@ -47,91 +47,145 @@ public void tearDown() throws Exception { service = null; } + /** + * Test add team member. + */ @Test public void testAddTeamMember() { fail("Not yet implemented"); } + /** + * Test add team repository. + */ @Test public void testAddTeamRepository() { fail("Not yet implemented"); } + /** + * Test create team. + */ @Test public void testCreateTeam() { fail("Not yet implemented"); } + /** + * Test delete team. + */ @Test public void testDeleteTeam() { fail("Not yet implemented"); } + /** + * Test get all organization repositories. + */ @Test public void testGetAllOrganizationRepositories() { fail("Not yet implemented"); } + /** + * Test get organization. + */ @Test public void testGetOrganization() { fail("Not yet implemented"); } + /** + * Test get public members. + */ @Test public void testGetPublicMembers() { fail("Not yet implemented"); } + /** + * Test get public repositories. + */ @Test public void testGetPublicRepositories() { fail("Not yet implemented"); } + /** + * Test get team. + */ @Test public void testGetTeam() { fail("Not yet implemented"); } + /** + * Test get team members. + */ @Test public void testGetTeamMembers() { fail("Not yet implemented"); } + /** + * Test get team repositories. + */ @Test public void testGetTeamRepositories() { fail("Not yet implemented"); } + /** + * Test get teams. + */ @Test public void testGetTeams() { fail("Not yet implemented"); } + /** + * Test get user organizations string. + */ @Test public void testGetUserOrganizationsString() { fail("Not yet implemented"); } + /** + * Test get user organizations. + */ @Test public void testGetUserOrganizations() { fail("Not yet implemented"); } + /** + * Test remove team member. + */ @Test public void testRemoveTeamMember() { fail("Not yet implemented"); } + /** + * Test remove team repository. + */ @Test public void testRemoveTeamRepository() { fail("Not yet implemented"); } + /** + * Test update organization. + */ @Test public void testUpdateOrganization() { fail("Not yet implemented"); } + /** + * Test update team. + */ @Test public void testUpdateTeam() { fail("Not yet implemented"); diff --git a/core/src/test/java/com/github/api/v2/services/PullRequestServiceTest.java b/core/src/test/java/com/github/api/v2/services/PullRequestServiceTest.java index 8e3cada..aff1e48 100644 --- a/core/src/test/java/com/github/api/v2/services/PullRequestServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/PullRequestServiceTest.java @@ -26,13 +26,16 @@ import com.github.api.v2.services.constant.TestConstants; /** - * The Class ObjectServiceTest. + * The Class PullRequestServiceTest. */ public class PullRequestServiceTest extends BaseGitHubServiceTest { /** The service. */ private PullRequestService service; + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() + */ @Before public void setUp() throws Exception { super.setUp(); @@ -40,6 +43,9 @@ public void setUp() throws Exception { service.setAuthentication(authentication); } + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() + */ @After public void tearDown() throws Exception { super.tearDown(); @@ -47,7 +53,7 @@ public void tearDown() throws Exception { } /** - * Test get blob. + * Test get pull request. */ @Test public void testGetPullRequest() { @@ -59,7 +65,7 @@ public void testGetPullRequest() { } /** - * Test get blobs. + * Test get pull requests. */ @Test public void testGetPullRequests() { @@ -71,7 +77,7 @@ public void testGetPullRequests() { } /** - * Test get object content. + * Test create pull request. */ @Test public void testCreatePullRequest() { diff --git a/core/src/test/java/com/github/api/v2/services/constant/TestConstants.java b/core/src/test/java/com/github/api/v2/services/constant/TestConstants.java index 72c8e0c..75015e1 100644 --- a/core/src/test/java/com/github/api/v2/services/constant/TestConstants.java +++ b/core/src/test/java/com/github/api/v2/services/constant/TestConstants.java @@ -140,8 +140,10 @@ public final class TestConstants { public static final String TEST_KEY_ID = testConstants.getProperty("com.github.api.v2.services.testKeyId"); + /** The Constant TEST_BASE_SHA. */ public static final String TEST_BASE_SHA = testConstants.getProperty("com.github.api.v2.services.testBaseSha"); + /** The Constant TEST_HEAD_SHA. */ public static final String TEST_HEAD_SHA = testConstants.getProperty("com.github.api.v2.services.testHeadSha"); /** diff --git a/examples/src/java/com/github/api/v2/services/example/FeedSample.java b/examples/src/java/com/github/api/v2/services/example/FeedSample.java index 1da8673..ed06e10 100644 --- a/examples/src/java/com/github/api/v2/services/example/FeedSample.java +++ b/examples/src/java/com/github/api/v2/services/example/FeedSample.java @@ -22,7 +22,7 @@ import com.github.api.v2.services.GitHubServiceFactory; /** - * The Class ObjectApiSample. + * The Class FeedSample. */ public class FeedSample { @@ -39,6 +39,12 @@ public static void main(String[] args) { printResult(feed); } + /** + * Prints the result. + * + * @param feed + * the feed + */ private static void printResult(Feed feed) { if (feed != null) { System.out.println(feed.getAuthor()); diff --git a/examples/src/java/com/github/api/v2/services/example/OrganizationApiSample.java b/examples/src/java/com/github/api/v2/services/example/OrganizationApiSample.java index 64117ae..ec0e307 100644 --- a/examples/src/java/com/github/api/v2/services/example/OrganizationApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/OrganizationApiSample.java @@ -34,6 +34,9 @@ public class OrganizationApiSample { * * @param args * the arguments + * + * @throws Exception + * the exception */ public static void main(String[] args) throws Exception { GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); @@ -50,10 +53,22 @@ public static void main(String[] args) throws Exception { } } + /** + * Prints the result. + * + * @param repository + * the repository + */ private static void printResult(Repository repository) { System.out.println(repository); } + /** + * Prints the result. + * + * @param user + * the user + */ private static void printResult(User user) { System.out.println(user); } @@ -62,7 +77,7 @@ private static void printResult(User user) { * Prints the result. * * @param organization - * the repository + * the organization */ private static void printResult(Organization organization) { System.out.println(organization); diff --git a/examples/src/java/com/github/api/v2/services/example/PullRequestApiSample.java b/examples/src/java/com/github/api/v2/services/example/PullRequestApiSample.java index 0bc3271..a09367a 100644 --- a/examples/src/java/com/github/api/v2/services/example/PullRequestApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/PullRequestApiSample.java @@ -23,7 +23,7 @@ import com.github.api.v2.services.PullRequestService; /** - * The Class ObjectApiSample. + * The Class PullRequestApiSample. */ public class PullRequestApiSample { @@ -48,7 +48,7 @@ public static void main(String[] args) { * Prints the result. * * @param pullRequest - * the blob + * the pull request */ private static void printResult(PullRequest pullRequest) { System.out.println(pullRequest); diff --git a/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java b/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java index 54255e7..92b4be8 100644 --- a/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java +++ b/examples/src/java/com/github/api/v2/services/example/RepositoryApiSample.java @@ -36,6 +36,9 @@ public class RepositoryApiSample { * * @param args * the arguments + * + * @throws Exception + * the exception */ public static void main(String[] args) throws Exception { GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); diff --git a/schema/src/main/java/com/github/api/v2/schema/Block.java b/schema/src/main/java/com/github/api/v2/schema/Block.java index 6d3e33d..e5e980b 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Block.java +++ b/schema/src/main/java/com/github/api/v2/schema/Block.java @@ -17,49 +17,74 @@ package com.github.api.v2.schema; /** - * The Class Id. + * The Class Block. */ public class Block extends SchemaEntity { /** The Constant serialVersionUID. */ private static final long serialVersionUID = 9155892708485181542L; - /** The id. */ + /** The name. */ private String name; + + /** The start. */ private int start; + + /** The count. */ private int count; + /** + * Gets the name. + * * @return the name */ public String getName() { return name; } + /** - * @param name the name to set + * Sets the name. + * + * @param name + * the new name */ public void setName(String name) { this.name = name; } + /** + * Gets the start. + * * @return the start */ public int getStart() { return start; } + /** - * @param start the start to set + * Sets the start. + * + * @param start + * the new start */ public void setStart(int start) { this.start = start; } + /** + * Gets the count. + * * @return the count */ public int getCount() { return count; } + /** - * @param count the count to set + * Sets the count. + * + * @param count + * the new count */ public void setCount(int count) { this.count = count; diff --git a/schema/src/main/java/com/github/api/v2/schema/Feed.java b/schema/src/main/java/com/github/api/v2/schema/Feed.java index 728f7cc..3d345d9 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Feed.java +++ b/schema/src/main/java/com/github/api/v2/schema/Feed.java @@ -26,67 +26,111 @@ public class Feed extends SchemaEntity { /** The Constant serialVersionUID. */ private static final long serialVersionUID = 9155892708485181542L; + /** The title. */ private String title; + + /** The link. */ private String link; + + /** The author. */ private String author; + + /** The description. */ private String description; + + /** The entries. */ private List entries; + /** + * Gets the title. + * * @return the title */ public String getTitle() { return title; } + /** - * @param title the title to set + * Sets the title. + * + * @param title + * the new title */ public void setTitle(String title) { this.title = title; } + /** + * Gets the link. + * * @return the link */ public String getLink() { return link; } + /** - * @param link the link to set + * Sets the link. + * + * @param link + * the new link */ public void setLink(String link) { this.link = link; } + /** + * Gets the author. + * * @return the author */ public String getAuthor() { return author; } + /** - * @param author the author to set + * Sets the author. + * + * @param author + * the new author */ public void setAuthor(String author) { this.author = author; } + /** + * Gets the description. + * * @return the description */ public String getDescription() { return description; } + /** - * @param description the description to set + * Sets the description. + * + * @param description + * the new description */ public void setDescription(String description) { this.description = description; } + /** + * Gets the entries. + * * @return the entries */ public List getEntries() { return entries; } + /** - * @param entries the entries to set + * Sets the entries. + * + * @param entries + * the new entries */ public void setEntries(List entries) { this.entries = entries; diff --git a/schema/src/main/java/com/github/api/v2/schema/FeedEntry.java b/schema/src/main/java/com/github/api/v2/schema/FeedEntry.java index 4a81900..f3ccdf8 100644 --- a/schema/src/main/java/com/github/api/v2/schema/FeedEntry.java +++ b/schema/src/main/java/com/github/api/v2/schema/FeedEntry.java @@ -27,80 +27,133 @@ public class FeedEntry extends SchemaEntity { /** The Constant serialVersionUID. */ private static final long serialVersionUID = 9155892708485181542L; + /** The title. */ private String title; + + /** The link. */ private String link; + + /** The author. */ private String author; + + /** The published date. */ private Date publishedDate; + + /** The content. */ private String content; + + /** The categories. */ private List categories; + /** + * Gets the title. + * * @return the title */ public String getTitle() { return title; } + /** - * @param title the title to set + * Sets the title. + * + * @param title + * the new title */ public void setTitle(String title) { this.title = title; } + /** + * Gets the link. + * * @return the link */ public String getLink() { return link; } + /** - * @param link the link to set + * Sets the link. + * + * @param link + * the new link */ public void setLink(String link) { this.link = link; } + /** + * Gets the author. + * * @return the author */ public String getAuthor() { return author; } + /** - * @param author the author to set + * Sets the author. + * + * @param author + * the new author */ public void setAuthor(String author) { this.author = author; } + /** - * @return the publishedDate + * Gets the published date. + * + * @return the published date */ public Date getPublishedDate() { return publishedDate; } + /** - * @param publishedDate the publishedDate to set + * Sets the published date. + * + * @param publishedDate + * the new published date */ public void setPublishedDate(Date publishedDate) { this.publishedDate = publishedDate; } + /** + * Gets the content. + * * @return the content */ public String getContent() { return content; } + /** - * @param content the content to set + * Sets the content. + * + * @param content + * the new content */ public void setContent(String content) { this.content = content; } + /** + * Gets the categories. + * * @return the categories */ public List getCategories() { return categories; } + /** - * @param categories the categories to set + * Sets the categories. + * + * @param categories + * the new categories */ public void setCategories(List categories) { this.categories = categories; diff --git a/schema/src/main/java/com/github/api/v2/schema/Gist.java b/schema/src/main/java/com/github/api/v2/schema/Gist.java index a4bba5c..aad99ed 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Gist.java +++ b/schema/src/main/java/com/github/api/v2/schema/Gist.java @@ -33,6 +33,7 @@ public enum Visibility implements ValueEnum { /** The PUBLIC. */ PUBLIC("public"), + /** The PRIVATE. */ PRIVATE("private"); @@ -97,6 +98,7 @@ public static Visibility fromValue(String value) { /** The files. */ private List files; + /** The owner. */ private String owner; /** @@ -195,6 +197,8 @@ public void setFiles(List files) { } /** + * Gets the owner. + * * @return the owner */ public String getOwner() { @@ -202,7 +206,10 @@ public String getOwner() { } /** - * @param owner the owner to set + * Sets the owner. + * + * @param owner + * the new owner */ public void setOwner(String owner) { this.owner = owner; diff --git a/schema/src/main/java/com/github/api/v2/schema/Head.java b/schema/src/main/java/com/github/api/v2/schema/Head.java index db85d1a..e0c6648 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Head.java +++ b/schema/src/main/java/com/github/api/v2/schema/Head.java @@ -17,7 +17,7 @@ package com.github.api.v2.schema; /** - * The Class Id. + * The Class Head. */ public class Head extends SchemaEntity { @@ -27,10 +27,13 @@ public class Head extends SchemaEntity { /** The id. */ private String id; + /** The name. */ private String name; /** + * Gets the name. + * * @return the name */ public String getName() { @@ -38,7 +41,10 @@ public String getName() { } /** - * @param name the name to set + * Sets the name. + * + * @param name + * the new name */ public void setName(String name) { this.name = name; diff --git a/schema/src/main/java/com/github/api/v2/schema/Issue.java b/schema/src/main/java/com/github/api/v2/schema/Issue.java index aef6692..6bebb33 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Issue.java +++ b/schema/src/main/java/com/github/api/v2/schema/Issue.java @@ -117,25 +117,34 @@ public static State fromValue(String value) { /** The created at. */ private Date createdAt; + /** The closed at. */ private Date closedAt; + /** The labels. */ private List labels = new ArrayList(); /** - * @return the closedAt + * Gets the closed at. + * + * @return the closed at */ public Date getClosedAt() { return closedAt; } /** - * @param closedAt the closedAt to set + * Sets the closed at. + * + * @param closedAt + * the new closed at */ public void setClosedAt(Date closedAt) { this.closedAt = closedAt; } /** + * Gets the labels. + * * @return the labels */ public List getLabels() { @@ -143,7 +152,10 @@ public List getLabels() { } /** - * @param labels the labels to set + * Sets the labels. + * + * @param labels + * the new labels */ public void setLabels(List labels) { this.labels = labels; diff --git a/schema/src/main/java/com/github/api/v2/schema/NetworkCommit.java b/schema/src/main/java/com/github/api/v2/schema/NetworkCommit.java index 184f811..9b96332 100644 --- a/schema/src/main/java/com/github/api/v2/schema/NetworkCommit.java +++ b/schema/src/main/java/com/github/api/v2/schema/NetworkCommit.java @@ -20,7 +20,7 @@ import java.util.List; /** - * The Class Commit. + * The Class NetworkCommit. */ public class NetworkCommit extends SchemaEntity { diff --git a/schema/src/main/java/com/github/api/v2/schema/NetworkMeta.java b/schema/src/main/java/com/github/api/v2/schema/NetworkMeta.java index d2b4974..e790a6c 100644 --- a/schema/src/main/java/com/github/api/v2/schema/NetworkMeta.java +++ b/schema/src/main/java/com/github/api/v2/schema/NetworkMeta.java @@ -20,7 +20,7 @@ import java.util.List; /** - * The Class Network. + * The Class NetworkMeta. */ public class NetworkMeta extends SchemaEntity { @@ -36,7 +36,10 @@ public class NetworkMeta extends SchemaEntity { /** The dates. */ private List dates; + /** The users. */ private List users; + + /** The blocks. */ private List blocks; /** @@ -97,6 +100,8 @@ public void setDates(List dates) { } /** + * Gets the users. + * * @return the users */ public List getUsers() { @@ -104,13 +109,18 @@ public List getUsers() { } /** - * @param users the users to set + * Sets the users. + * + * @param users + * the new users */ public void setUsers(List users) { this.users = users; } /** + * Gets the blocks. + * * @return the blocks */ public List getBlocks() { @@ -118,7 +128,10 @@ public List getBlocks() { } /** - * @param blocks the blocks to set + * Sets the blocks. + * + * @param blocks + * the new blocks */ public void setBlocks(List blocks) { this.blocks = blocks; diff --git a/schema/src/main/java/com/github/api/v2/schema/NetworkUser.java b/schema/src/main/java/com/github/api/v2/schema/NetworkUser.java index 0eacd2a..94e90fb 100644 --- a/schema/src/main/java/com/github/api/v2/schema/NetworkUser.java +++ b/schema/src/main/java/com/github/api/v2/schema/NetworkUser.java @@ -20,48 +20,74 @@ /** - * The Class Commit. + * The Class NetworkUser. */ public class NetworkUser extends SchemaEntity { /** The Constant serialVersionUID. */ private static final long serialVersionUID = 9155892708485181542L; + /** The name. */ private String name; + + /** The repo. */ private String repo; + + /** The heads. */ private List heads; + /** + * Gets the name. + * * @return the name */ public String getName() { return name; } + /** - * @param name the name to set + * Sets the name. + * + * @param name + * the new name */ public void setName(String name) { this.name = name; } + /** + * Gets the repo. + * * @return the repo */ public String getRepo() { return repo; } + /** - * @param repo the repo to set + * Sets the repo. + * + * @param repo + * the new repo */ public void setRepo(String repo) { this.repo = repo; } + /** + * Gets the heads. + * * @return the heads */ public List getHeads() { return heads; } + /** - * @param heads the heads to set + * Sets the heads. + * + * @param heads + * the new heads */ public void setHeads(List heads) { this.heads = heads; diff --git a/schema/src/main/java/com/github/api/v2/schema/Organization.java b/schema/src/main/java/com/github/api/v2/schema/Organization.java index e95669d..ba94399 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Organization.java +++ b/schema/src/main/java/com/github/api/v2/schema/Organization.java @@ -77,9 +77,7 @@ public static Type fromValue(String value) { } } - /** - * - */ + /** The Constant serialVersionUID. */ private static final long serialVersionUID = 2665103321482505351L; /** The id. */ @@ -130,13 +128,18 @@ public static Type fromValue(String value) { /** The created at. */ private Date createdAt; + /** The permission. */ private Permission permission; + /** The billing email. */ private String billingEmail; + /** The type. */ private Type type; /** + * Gets the permission. + * * @return the permission */ public Permission getPermission() { @@ -144,27 +147,37 @@ public Permission getPermission() { } /** - * @param permission the permission to set + * Sets the permission. + * + * @param permission + * the new permission */ public void setPermission(Permission permission) { this.permission = permission; } /** - * @return the billingEmail + * Gets the billing email. + * + * @return the billing email */ public String getBillingEmail() { return billingEmail; } /** - * @param billingEmail the billingEmail to set + * Sets the billing email. + * + * @param billingEmail + * the new billing email */ public void setBillingEmail(String billingEmail) { this.billingEmail = billingEmail; } /** + * Gets the type. + * * @return the type */ public Type getType() { @@ -172,7 +185,10 @@ public Type getType() { } /** - * @param type the type to set + * Sets the type. + * + * @param type + * the new type */ public void setType(Type type) { this.type = type; diff --git a/schema/src/main/java/com/github/api/v2/schema/Permission.java b/schema/src/main/java/com/github/api/v2/schema/Permission.java index aabdba0..b0656e9 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Permission.java +++ b/schema/src/main/java/com/github/api/v2/schema/Permission.java @@ -1,3 +1,19 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package com.github.api.v2.schema; import java.util.HashMap; @@ -5,14 +21,16 @@ /** - * The Enum Permission. - */ + * The Enum Permission. + */ public enum Permission implements ValueEnum { /** The ADMIN. */ ADMIN("admin"), + /** The PULL. */ PULL("pull"), + /** The PUSH. */ PUSH("push"); diff --git a/schema/src/main/java/com/github/api/v2/schema/PullRequest.java b/schema/src/main/java/com/github/api/v2/schema/PullRequest.java index c2fa2e9..cfd0361 100644 --- a/schema/src/main/java/com/github/api/v2/schema/PullRequest.java +++ b/schema/src/main/java/com/github/api/v2/schema/PullRequest.java @@ -23,19 +23,20 @@ import com.github.api.v2.schema.Issue.State; /** - * The Class Blob. + * The Class PullRequest. */ public class PullRequest extends SchemaEntity { /** The Constant serialVersionUID. */ private static final long serialVersionUID = 9155892708485181542L; + /** The user. */ private User user; /** The gravatar id. */ private String gravatarId; - /** The updated at. */ + /** The issue updated at. */ private Date issueUpdatedAt; /** The votes. */ @@ -62,14 +63,28 @@ public class PullRequest extends SchemaEntity { /** The created at. */ private Date createdAt; + /** The issue created at. */ private Date issueCreatedAt; + + /** The html url. */ private String htmlUrl; + + /** The diff url. */ private String diffUrl; + + /** The patch url. */ private String patchUrl; + + /** The issue user. */ private User issueUser; + + /** The base. */ private Version base; + + /** The head. */ private Version head; + /** The labels. */ private List labels = new ArrayList(); /** @@ -111,19 +126,19 @@ public void setGravatarId(String gravatarId) { } /** - * Gets the updated at. + * Gets the issue updated at. * - * @return the updated at + * @return the issue updated at */ public Date getIssueUpdatedAt() { return issueUpdatedAt; } /** - * Sets the updated at. + * Sets the issue updated at. * * @param updatedAt - * the new updated at + * the new issue updated at */ public void setIssueUpdatedAt(Date updatedAt) { this.issueUpdatedAt = updatedAt; @@ -282,76 +297,103 @@ public void setComments(int comments) { } /** - * @return the issueCreatedAt + * Gets the issue created at. + * + * @return the issue created at */ public Date getIssueCreatedAt() { return issueCreatedAt; } /** - * @param issueCreatedAt the issueCreatedAt to set + * Sets the issue created at. + * + * @param issueCreatedAt + * the new issue created at */ public void setIssueCreatedAt(Date issueCreatedAt) { this.issueCreatedAt = issueCreatedAt; } /** - * @return the htmlUrl + * Gets the html url. + * + * @return the html url */ public String getHtmlUrl() { return htmlUrl; } /** - * @param htmlUrl the htmlUrl to set + * Sets the html url. + * + * @param htmlUrl + * the new html url */ public void setHtmlUrl(String htmlUrl) { this.htmlUrl = htmlUrl; } /** - * @return the diffUrl + * Gets the diff url. + * + * @return the diff url */ public String getDiffUrl() { return diffUrl; } /** - * @param diffUrl the diffUrl to set + * Sets the diff url. + * + * @param diffUrl + * the new diff url */ public void setDiffUrl(String diffUrl) { this.diffUrl = diffUrl; } /** - * @return the patchUrl + * Gets the patch url. + * + * @return the patch url */ public String getPatchUrl() { return patchUrl; } /** - * @param patchUrl the patchUrl to set + * Sets the patch url. + * + * @param patchUrl + * the new patch url */ public void setPatchUrl(String patchUrl) { this.patchUrl = patchUrl; } /** - * @return the issueUser + * Gets the issue user. + * + * @return the issue user */ public User getIssueUser() { return issueUser; } /** - * @param issueUser the issueUser to set + * Sets the issue user. + * + * @param issueUser + * the new issue user */ public void setIssueUser(User issueUser) { this.issueUser = issueUser; } /** + * Gets the base. + * * @return the base */ public Version getBase() { @@ -359,13 +401,18 @@ public Version getBase() { } /** - * @param base the base to set + * Sets the base. + * + * @param base + * the new base */ public void setBase(Version base) { this.base = base; } /** + * Gets the head. + * * @return the head */ public Version getHead() { @@ -373,13 +420,18 @@ public Version getHead() { } /** - * @param head the head to set + * Sets the head. + * + * @param head + * the new head */ public void setHead(Version head) { this.head = head; } /** + * Gets the labels. + * * @return the labels */ public List getLabels() { @@ -387,7 +439,10 @@ public List getLabels() { } /** - * @param labels the labels to set + * Sets the labels. + * + * @param labels + * the new labels */ public void setLabels(List labels) { this.labels = labels; diff --git a/schema/src/main/java/com/github/api/v2/schema/Repository.java b/schema/src/main/java/com/github/api/v2/schema/Repository.java index 7fea3b5..29abeef 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Repository.java +++ b/schema/src/main/java/com/github/api/v2/schema/Repository.java @@ -32,6 +32,7 @@ public enum Visibility implements ValueEnum { /** The PUBLIC. */ PUBLIC("public"), + /** The PRIVATE. */ PRIVATE("private"); @@ -159,8 +160,10 @@ public static Visibility fromValue(String value) { /** The has downloads. */ private boolean hasDownloads; + /** The organization. */ private String organization; + /** The permission. */ private Permission permission; /** @@ -639,6 +642,8 @@ public void setHasDownloads(boolean hasDownloads) { } /** + * Gets the organization. + * * @return the organization */ public String getOrganization() { @@ -646,13 +651,18 @@ public String getOrganization() { } /** - * @param organization the organization to set + * Sets the organization. + * + * @param organization + * the new organization */ public void setOrganization(String organization) { this.organization = organization; } /** + * Gets the permission. + * * @return the permission */ public Permission getPermission() { @@ -660,7 +670,10 @@ public Permission getPermission() { } /** - * @param permission the permission to set + * Sets the permission. + * + * @param permission + * the new permission */ public void setPermission(Permission permission) { this.permission = permission; diff --git a/schema/src/main/java/com/github/api/v2/schema/Team.java b/schema/src/main/java/com/github/api/v2/schema/Team.java index 9a8df34..c107976 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Team.java +++ b/schema/src/main/java/com/github/api/v2/schema/Team.java @@ -35,6 +35,7 @@ public class Team extends SchemaEntity { /** The permission. */ private Permission permission; + /** The repo names. */ private List repoNames; /** @@ -57,6 +58,8 @@ public void setId(String id) { } /** + * Gets the name. + * * @return the name */ public String getName() { @@ -64,13 +67,18 @@ public String getName() { } /** - * @param name the name to set + * Sets the name. + * + * @param name + * the new name */ public void setName(String name) { this.name = name; } /** + * Gets the permission. + * * @return the permission */ public Permission getPermission() { @@ -78,21 +86,29 @@ public Permission getPermission() { } /** - * @param permission the permission to set + * Sets the permission. + * + * @param permission + * the new permission */ public void setPermission(Permission permission) { this.permission = permission; } /** - * @return the repoNames + * Gets the repo names. + * + * @return the repo names */ public List getRepoNames() { return repoNames; } /** - * @param repoNames the repoNames to set + * Sets the repo names. + * + * @param repoNames + * the new repo names */ public void setRepoNames(List repoNames) { this.repoNames = repoNames; diff --git a/schema/src/main/java/com/github/api/v2/schema/User.java b/schema/src/main/java/com/github/api/v2/schema/User.java index 714cb15..efb360c 100644 --- a/schema/src/main/java/com/github/api/v2/schema/User.java +++ b/schema/src/main/java/com/github/api/v2/schema/User.java @@ -89,12 +89,15 @@ public class User extends SchemaEntity { /** The plan. */ private Plan plan; + /** The permission. */ private Permission permission; /** The score. */ private double score; /** + * Gets the score. + * * @return the score */ public double getScore() { @@ -102,7 +105,10 @@ public double getScore() { } /** - * @param score the score to set + * Sets the score. + * + * @param score + * the new score */ public void setScore(double score) { this.score = score; @@ -508,6 +514,8 @@ public void setGravatarId(String gravatarId) { } /** + * Gets the permission. + * * @return the permission */ public Permission getPermission() { @@ -515,7 +523,10 @@ public Permission getPermission() { } /** - * @param permission the permission to set + * Sets the permission. + * + * @param permission + * the new permission */ public void setPermission(Permission permission) { this.permission = permission; diff --git a/schema/src/main/java/com/github/api/v2/schema/Version.java b/schema/src/main/java/com/github/api/v2/schema/Version.java index dea9673..d20ff21 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Version.java +++ b/schema/src/main/java/com/github/api/v2/schema/Version.java @@ -18,7 +18,7 @@ /** - * The Class Tree. + * The Class Version. */ public class Version extends SchemaEntity { @@ -41,19 +41,19 @@ public class Version extends SchemaEntity { private User user; /** - * Gets the name. + * Gets the label. * - * @return the name + * @return the label */ public String getLabel() { return label; } /** - * Sets the name. + * Sets the label. * - * @param name - * the new name + * @param label + * the new label */ public void setLabel(String label) { this.label = label; @@ -79,25 +79,27 @@ public void setSha(String sha) { } /** - * Gets the mode. + * Gets the ref. * - * @return the mode + * @return the ref */ public String getRef() { return ref; } /** - * Sets the mode. + * Sets the ref. * - * @param mode - * the new mode + * @param ref + * the new ref */ public void setRef(String ref) { this.ref = ref; } /** + * Gets the repository. + * * @return the repository */ public Repository getRepository() { @@ -105,13 +107,18 @@ public Repository getRepository() { } /** - * @param repository the repository to set + * Sets the repository. + * + * @param repository + * the new repository */ public void setRepository(Repository repository) { this.repository = repository; } /** + * Gets the user. + * * @return the user */ public User getUser() { @@ -119,7 +126,10 @@ public User getUser() { } /** - * @param user the user to set + * Sets the user. + * + * @param user + * the new user */ public void setUser(User user) { this.user = user; From 160cbdca8ef1e96f3b08f73da9d6e1104806da04 Mon Sep 17 00:00:00 2001 From: Azwan Adli Abdullah Date: Tue, 25 Jan 2011 12:33:54 +0800 Subject: [PATCH 44/95] Prevent ParseException on date --- .../v2/services/impl/BaseGitHubService.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java index 8156d61..e6f92d1 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java +++ b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java @@ -20,7 +20,10 @@ import java.io.InputStreamReader; import java.lang.reflect.Type; import java.nio.charset.Charset; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Date; import java.util.List; import com.github.api.v2.schema.Gist; @@ -142,6 +145,29 @@ protected GsonBuilder getGsonBuilder() { // } // // }); + + builder.registerTypeAdapter(Date.class, new JsonDeserializer() { + + @Override + public Date deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2) throws JsonParseException { + SimpleDateFormat format = new SimpleDateFormat(ApplicationConstants.DATE_FORMAT); + try { + return format.parse(arg0.getAsJsonPrimitive().getAsString()); + } + catch (ParseException e) { + format = new SimpleDateFormat("yyyy-MM-ddEHH:mm:ss'Z'"); + try { + return format.parse(arg0.getAsJsonPrimitive().getAsString()); + } + catch (ParseException e1) { + //throw new JsonParseException(e1); + return null; + } + } + } + + }); + builder.registerTypeAdapter(Issue.State.class, new JsonDeserializer() { @Override public Issue.State deserialize(JsonElement arg0, Type arg1, From d042eb5593132f53da09e8c329b441dfb4601c96 Mon Sep 17 00:00:00 2001 From: Azwan Adli Abdullah Date: Tue, 25 Jan 2011 13:24:37 +0800 Subject: [PATCH 45/95] Remove Logger to avoid NotSerializableException, thrown from andoid OS. java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.github.api.v2.schema.Repository) E/AndroidRuntime( 1085): at android.os.Parcel.writeSerializable(Parcel.java:1176) --- .../src/main/java/com/github/api/v2/schema/SchemaEntity.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/schema/src/main/java/com/github/api/v2/schema/SchemaEntity.java b/schema/src/main/java/com/github/api/v2/schema/SchemaEntity.java index 4a8a58c..fa426f3 100644 --- a/schema/src/main/java/com/github/api/v2/schema/SchemaEntity.java +++ b/schema/src/main/java/com/github/api/v2/schema/SchemaEntity.java @@ -17,7 +17,6 @@ package com.github.api.v2.schema; import java.io.Serializable; -import java.util.logging.Logger; /** @@ -26,7 +25,7 @@ public abstract class SchemaEntity implements Serializable { /** The logger. */ - protected final Logger logger = Logger.getLogger(getClass().getCanonicalName()); + //protected final Logger logger = Logger.getLogger(getClass().getCanonicalName()); /** The Constant serialVersionUID. */ private static final long serialVersionUID = 250056223059654638L; From 8b6b0e91cf074337d1a81dc88176d27f9d2d3f2b Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Wed, 26 Jan 2011 17:23:53 +0500 Subject: [PATCH 46/95] Minor update --- .../com/github/api/v2/services/RepositoryService.java | 8 ++++++-- .../api/v2/services/constant/ParameterNames.java | 3 +++ .../api/v2/services/impl/RepositoryServiceImpl.java | 8 ++++---- .../api/v2/services/constant/GitHubApiUrls.properties | 4 ++-- .../test/java/com/github/api/v2/services/AllTests.java | 10 ++++++---- .../github/api/v2/services/RepositoryServiceTest.java | 4 ++-- 6 files changed, 23 insertions(+), 14 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/RepositoryService.java b/core/src/main/java/com/github/api/v2/services/RepositoryService.java index 726971c..6bc8a9c 100644 --- a/core/src/main/java/com/github/api/v2/services/RepositoryService.java +++ b/core/src/main/java/com/github/api/v2/services/RepositoryService.java @@ -222,22 +222,26 @@ public interface RepositoryService extends GitHubService { /** * Adds the collaborator. * + * @param userName + * the user name * @param repositoryName * the repository name * @param collaboratorName * the collaborator name */ - public void addCollaborator(String repositoryName, String collaboratorName); + public void addCollaborator(String userName, String repositoryName, String collaboratorName); /** * Removes the collaborator. * + * @param userName + * the user name * @param repositoryName * the repository name * @param collaboratorName * the collaborator name */ - public void removeCollaborator(String repositoryName, String collaboratorName); + public void removeCollaborator(String userName, String repositoryName, String collaboratorName); /** * Gets the pushable repositories. diff --git a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java index ae8a2a9..6081e9b 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java +++ b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java @@ -179,5 +179,8 @@ public interface ParameterNames { /** The Constant HEAD. */ public static final String HEAD = "head"; + + /** The Constant COLLABORATOR_NAME. */ + public static final String COLLABORATOR_NAME = "collaboratorName"; } diff --git a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java index ba70ba3..9f4331a 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java @@ -44,9 +44,9 @@ public class RepositoryServiceImpl extends BaseGitHubService implements * @see com.github.api.v2.services.RepositoryService#addCollaborator(java.lang.String, java.lang.String) */ @Override - public void addCollaborator(String repositoryName, String collaboratorName) { + public void addCollaborator(String userName, String repositoryName, String collaboratorName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.ADD_COLLABORATOR_URL); - String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.USER_NAME, collaboratorName).buildUrl(); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.COLLABORATOR_NAME, collaboratorName).buildUrl(); unmarshall(callApiPost(apiUrl, new HashMap())); } @@ -258,10 +258,10 @@ public List getWatchers(String userName, String repositoryName) { * @see com.github.api.v2.services.RepositoryService#removeCollaborator(java.lang.String, java.lang.String) */ @Override - public void removeCollaborator(String repositoryName, + public void removeCollaborator(String userName, String repositoryName, String collaboratorName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.REMOVE_COLLABORATOR_URL); - String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.USER_NAME, collaboratorName).buildUrl(); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.COLLABORATOR_NAME, collaboratorName).buildUrl(); unmarshall(callApiPost(apiUrl, new HashMap())); } diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index 63ae83e..9f07c15 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -64,8 +64,8 @@ com.github.api.v2.services.repositoryService.getKeys=http://github.com/api/{vers com.github.api.v2.services.repositoryService.addKey=http://github.com/api/{version}/{format}/repos/key/{repositoryName}/add com.github.api.v2.services.repositoryService.removeKey=http://github.com/api/{version}/{format}/repos/key/{repositoryName}/remove com.github.api.v2.services.repositoryService.getCollaborators=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/collaborators -com.github.api.v2.services.repositoryService.addCollaborator=http://github.com/api/{version}/{format}/repos/collaborators/{repositoryName}/add/{userName} -com.github.api.v2.services.repositoryService.removeCollaborator=http://github.com/api/{version}/{format}/repos/collaborators/{repositoryName}/remove/{userName} +com.github.api.v2.services.repositoryService.addCollaborator=http://github.com/api/{version}/{format}/repos/collaborators/{userName}/{repositoryName}/add/{collaboratorName} +com.github.api.v2.services.repositoryService.removeCollaborator=http://github.com/api/{version}/{format}/repos/collaborators/{userName}/{repositoryName}/remove/{collaboratorName} com.github.api.v2.services.repositoryService.getPushableRepositories=http://github.com/api/{version}/{format}/repos/pushable com.github.api.v2.services.repositoryService.getContributors=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/contributors com.github.api.v2.services.repositoryService.getWatchers=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/watchers diff --git a/core/src/test/java/com/github/api/v2/services/AllTests.java b/core/src/test/java/com/github/api/v2/services/AllTests.java index 0a08302..d41bc1b 100644 --- a/core/src/test/java/com/github/api/v2/services/AllTests.java +++ b/core/src/test/java/com/github/api/v2/services/AllTests.java @@ -32,15 +32,17 @@ public class AllTests { public static Test suite() { TestSuite suite = new TestSuite("Test for com.github.api.v2.services"); //$JUnit-BEGIN$ -// suite.addTestSuite(OAuthServiceTest.class); suite.addTestSuite(CommitServiceTest.class); - suite.addTestSuite(RepositoryServiceTest.class); suite.addTestSuite(IssueServiceTest.class); - suite.addTestSuite(ObjectServiceTest.class); suite.addTestSuite(NetworkServiceTest.class); - suite.addTestSuite(UserServiceTest.class); suite.addTestSuite(GistServiceTest.class); + suite.addTestSuite(OrganizationServiceTest.class); suite.addTestSuite(FeedServiceTest.class); + suite.addTestSuite(RepositoryServiceTest.class); + suite.addTestSuite(PullRequestServiceTest.class); + suite.addTestSuite(OAuthServiceTest.class); + suite.addTestSuite(ObjectServiceTest.class); + suite.addTestSuite(UserServiceTest.class); //$JUnit-END$ return suite; } diff --git a/core/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java b/core/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java index 04b5323..02cffa7 100644 --- a/core/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java @@ -75,7 +75,7 @@ public void testCreateRepository() { public void testAddCollaborator() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - service.addCollaborator(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_USER_NAME); + service.addCollaborator(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_USER_NAME); } /** @@ -232,7 +232,7 @@ public void testGetWatchers() { public void testRemoveCollaborator() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - service.removeCollaborator(TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_USER_NAME); + service.removeCollaborator(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME, TestConstants.TEST_USER_NAME); } /** From 67f5adb7aa820744212645127ec767fc73b26b73 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Thu, 27 Jan 2011 17:35:54 +0500 Subject: [PATCH 47/95] Organization and Pull Request API. --- .../v2/services/impl/BaseGitHubService.java | 13 ------- .../services/impl/RepositoryServiceImpl.java | 10 ------ .../constant/GitHubApiUrls.properties | 2 +- dist/github-java-sdk.jar | Bin 138900 -> 166603 bytes .../java/com/github/api/v2/schema/Gist.java | 9 +++-- .../com/github/api/v2/schema/Repository.java | 33 ++++++++++-------- 6 files changed, 25 insertions(+), 42 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java index 8156d61..759c03d 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java +++ b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java @@ -129,19 +129,6 @@ protected GsonBuilder getGsonBuilder() { GsonBuilder builder = new GsonBuilder(); builder.setDateFormat(ApplicationConstants.DATE_FORMAT); builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); -// builder.setFieldNamingStrategy(new FieldNamingStrategy() { -// @Override -// public String translateName(Field field) { -// if (field.getType().equals(Repository.Visibility.class)) { -// return "private"; -// } else if (field.getType().equals(Gist.Visibility.class)) { -// return "public"; -// } else { -// return field.getName(); -// } -// } -// -// }); builder.registerTypeAdapter(Issue.State.class, new JsonDeserializer() { @Override public Issue.State deserialize(JsonElement arg0, Type arg1, diff --git a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java index 9f4331a..c05f0b0 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java @@ -30,7 +30,6 @@ import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; -import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; @@ -373,13 +372,4 @@ public ZipInputStream getRepositoryArchive(String userName, String repositoryNam String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, branchName).buildUrl(); return new ZipInputStream(callApiGet(apiUrl)); } - - /* (non-Javadoc) - * @see com.github.api.v2.services.impl.BaseGitHubService#getGsonBuilder() - */ - protected GsonBuilder getGsonBuilder() { - GsonBuilder gson = super.getGsonBuilder(); - gson.setDateFormat("yyyy-MM-dd'T'HH:mm:ss"); - return gson; - } } diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index 9f07c15..70e3ef3 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -73,7 +73,7 @@ com.github.api.v2.services.repositoryService.getForks=http://github.com/api/{ver com.github.api.v2.services.repositoryService.getLanguageBreakdown=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/languages com.github.api.v2.services.repositoryService.getTags=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/tags com.github.api.v2.services.repositoryService.getBranches=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/branches -com.github.api.v2.services.repositoryService.getRepositoryArchive=http://github.com/{userName}/{repositoryName}/zipball/{branch} +com.github.api.v2.services.repositoryService.getRepositoryArchive=https://github.com/{userName}/{repositoryName}/zipball/{branch} # Commit API com.github.api.v2.services.commitService.getCommits=http://github.com/api/{version}/{format}/commits/list/{userName}/{repositoryName}/{branch} diff --git a/dist/github-java-sdk.jar b/dist/github-java-sdk.jar index a4b7a27d690ccfa51b6e6c9a4ff5308127fe9514..de67902ab882556c3c3f9b60072dd917c0e95eb3 100644 GIT binary patch delta 95173 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 ZlWVJ?0gnj~=Lh(A7jUI1BAh=+{}0nyKPUhI diff --git a/schema/src/main/java/com/github/api/v2/schema/Gist.java b/schema/src/main/java/com/github/api/v2/schema/Gist.java index aad99ed..ebd1def 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Gist.java +++ b/schema/src/main/java/com/github/api/v2/schema/Gist.java @@ -21,6 +21,8 @@ import java.util.List; import java.util.Map; +import com.google.gson.annotations.SerializedName; + /** * The Class Gist. */ @@ -90,7 +92,8 @@ public static Visibility fromValue(String value) { private String repo; /** The visibility. */ - private Visibility visibility; + @SerializedName("public") + private boolean visibility; /** The created at. */ private Date createdAt; @@ -145,7 +148,7 @@ public void setRepo(String repo) { * @return the visibility */ public Visibility getVisibility() { - return visibility; + return visibility ? Visibility.PUBLIC : Visibility.PRIVATE; } /** @@ -155,7 +158,7 @@ public Visibility getVisibility() { * the new visibility */ public void setVisibility(Visibility visibility) { - this.visibility = visibility; + this.visibility = (visibility == Visibility.PUBLIC); } /** diff --git a/schema/src/main/java/com/github/api/v2/schema/Repository.java b/schema/src/main/java/com/github/api/v2/schema/Repository.java index 29abeef..ad17a1c 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Repository.java +++ b/schema/src/main/java/com/github/api/v2/schema/Repository.java @@ -20,6 +20,8 @@ import java.util.HashMap; import java.util.Map; +import com.google.gson.annotations.SerializedName; + /** * The Class Repository. */ @@ -98,7 +100,8 @@ public static Visibility fromValue(String value) { private String description; /** The visibility. */ - private Visibility visibility; + @SerializedName("private") + private boolean visibility; /** The url. */ private String url; @@ -140,10 +143,10 @@ public static Visibility fromValue(String value) { private String id; /** The pushed. */ - private Date pushed; + private Date pushedAt; /** The created. */ - private Date created; + private Date createdAt; /** The source. */ private String source; @@ -248,7 +251,7 @@ public void setDescription(String description) { * @return the visibility */ public Visibility getVisibility() { - return visibility; + return visibility ? Visibility.PRIVATE : Visibility.PUBLIC ; } /** @@ -258,7 +261,7 @@ public Visibility getVisibility() { * the new visibility */ public void setVisibility(Visibility visibility) { - this.visibility = visibility; + this.visibility = (visibility == Visibility.PRIVATE); } /** @@ -513,8 +516,8 @@ public void setId(String id) { * * @return the pushed */ - public Date getPushed() { - return pushed; + public Date getPushedAt() { + return pushedAt; } /** @@ -523,8 +526,8 @@ public Date getPushed() { * @param pushed * the new pushed */ - public void setPushed(Date pushed) { - this.pushed = pushed; + public void setPushedAt(Date pushedAt) { + this.pushedAt = pushedAt; } /** @@ -532,8 +535,8 @@ public void setPushed(Date pushed) { * * @return the created */ - public Date getCreated() { - return created; + public Date getCreatedAt() { + return createdAt; } /** @@ -542,8 +545,8 @@ public Date getCreated() { * @param created * the new created */ - public void setCreated(Date created) { - this.created = created; + public void setCreated(Date createdAt) { + this.createdAt = createdAt; } /** @@ -684,14 +687,14 @@ public void setPermission(Permission permission) { */ @Override public String toString() { - return "Repository [actions=" + actions + ", created=" + created + return "Repository [actions=" + actions + ", created=" + createdAt + ", description=" + description + ", followers=" + followers + ", fork=" + fork + ", forks=" + forks + ", hasDownloads=" + hasDownloads + ", hasIssues=" + hasIssues + ", hasWiki=" + hasWiki + ", homepage=" + homepage + ", id=" + id + ", language=" + language + ", name=" + name + ", openIssues=" + openIssues + ", owner=" + owner + ", parent=" + parent - + ", pushed=" + pushed + ", score=" + score + ", size=" + size + + ", pushed=" + pushedAt + ", score=" + score + ", size=" + size + ", source=" + source + ", type=" + type + ", url=" + url + ", username=" + username + ", visibiity=" + visibility + ", watchers=" + watchers + "]"; From 0eff5fd910366f932de24fc89b9f8b3f004d5480 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Thu, 27 Jan 2011 17:58:54 +0500 Subject: [PATCH 48/95] Minor bug fixes.. --- .../api/v2/services/impl/UserServiceImpl.java | 4 +++- .../constant/GitHubApiUrls.properties | 2 +- dist/github-java-sdk.jar | Bin 166603 -> 166823 bytes 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java index d4720b7..a5ae718 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java @@ -28,6 +28,7 @@ import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; +import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; @@ -201,7 +202,8 @@ public List searchUsersByName(String name) { String apiUrl = builder.withField(ParameterNames.USER_NAME, name).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("users")); + Gson gson = getGsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create(); + return gson.fromJson(json.get("users"), new TypeToken>(){}.getType()); } /* (non-Javadoc) diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index 70e3ef3..37e6e68 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -42,7 +42,7 @@ com.github.api.v2.services.issueService.getIssuesByLabel=http://github.com/api/{ # Gist API com.github.api.v2.services.gistService.getGist=http://gist.github.com/api/v1/{format}/{gistId} -com.github.api.v2.services.gistService.getGistContent=http://gist.github.com/raw/{gistId}/{fileName} +com.github.api.v2.services.gistService.getGistContent=https://gist.github.com/raw/{gistId}/{fileName} com.github.api.v2.services.gistService.getUserGists=http://gist.github.com/api/v1/{format}/gists/{userName} # Network API diff --git a/dist/github-java-sdk.jar b/dist/github-java-sdk.jar index de67902ab882556c3c3f9b60072dd917c0e95eb3..abab51bc5194b0ea65cc1a2e83d21e8cda412bb1 100644 GIT binary patch delta 9278 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 From 4c063d876a5d171d647c1a99232ac635662aa9d5 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Thu, 27 Jan 2011 18:06:56 +0500 Subject: [PATCH 49/95] README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2e022e9..bcbbd38 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ The library is divided into various services each implementing a specific portio * CommitService: Provides methods of the [Commit API](http://develop.github.com/p/commits.html). * ObjectService: Provides methods of the [Object API](http://develop.github.com/p/object.html). * OrganizationService: Provides methods of the [Organization API](http://develop.github.com/p/orgs.html). +* PullRequestService: Provides methods of the [Pull Request API](http://develop.github.com/p/pulls.html). * FeedService: Provides methods for reading the Atom/RSS feeds. * OAuthService: Provides methods for OAuth 2.0 authentication and authorization. From 17c54eb78297d1750b60645fce38c4a6e150d75e Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Fri, 28 Jan 2011 14:47:57 +0500 Subject: [PATCH 50/95] Minor bug fixes. --- .../github/api/v2/services/IssueService.java | 2 +- .../api/v2/services/OrganizationService.java | 5 +- .../api/v2/services/PullRequestService.java | 2 +- .../api/v2/services/RepositoryService.java | 2 +- .../v2/services/constant/ParameterNames.java | 11 ++-- .../v2/services/impl/IssueServiceImpl.java | 6 ++- .../impl/OrganizationServiceImpl.java | 52 +++++++++---------- .../services/impl/PullRequestServiceImpl.java | 6 ++- .../services/impl/RepositoryServiceImpl.java | 4 +- .../constant/GitHubApiUrls.properties | 10 ++-- 10 files changed, 50 insertions(+), 50 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/IssueService.java b/core/src/main/java/com/github/api/v2/services/IssueService.java index af4a6d3..97f0e17 100644 --- a/core/src/main/java/com/github/api/v2/services/IssueService.java +++ b/core/src/main/java/com/github/api/v2/services/IssueService.java @@ -111,7 +111,7 @@ public interface IssueService extends GitHubService { * @param body * the body */ - public void createIssue(String userName, String repositoryName, String title, String body); + public Issue createIssue(String userName, String repositoryName, String title, String body); /** * Close issue. diff --git a/core/src/main/java/com/github/api/v2/services/OrganizationService.java b/core/src/main/java/com/github/api/v2/services/OrganizationService.java index a5993db..2ff03b7 100644 --- a/core/src/main/java/com/github/api/v2/services/OrganizationService.java +++ b/core/src/main/java/com/github/api/v2/services/OrganizationService.java @@ -19,6 +19,7 @@ import java.util.List; import com.github.api.v2.schema.Organization; +import com.github.api.v2.schema.Permission; import com.github.api.v2.schema.Repository; import com.github.api.v2.schema.Team; import com.github.api.v2.schema.User; @@ -96,7 +97,7 @@ public interface OrganizationService extends GitHubService { * @param team * the team */ - public void createTeam(Team team); + public Team createTeam(String organizationName, String teamName, Permission permission, List repoNames); /** * Gets the team. @@ -172,7 +173,7 @@ public interface OrganizationService extends GitHubService { * @param repositoryName * the repository name */ - public void addTeamRepository(String userName, String repositoryName); + public void addTeamRepository(String teamId, String userName, String repositoryName); /** * Removes the team repository. diff --git a/core/src/main/java/com/github/api/v2/services/PullRequestService.java b/core/src/main/java/com/github/api/v2/services/PullRequestService.java index 0a111ed..2c3383d 100644 --- a/core/src/main/java/com/github/api/v2/services/PullRequestService.java +++ b/core/src/main/java/com/github/api/v2/services/PullRequestService.java @@ -82,5 +82,5 @@ public interface PullRequestService extends GitHubService { * @param body * the body */ - public void createPullRequest(String userName, String repositoryName, String base, String head, String title, String body); + public PullRequest createPullRequest(String userName, String repositoryName, String base, String head, String title, String body); } diff --git a/core/src/main/java/com/github/api/v2/services/RepositoryService.java b/core/src/main/java/com/github/api/v2/services/RepositoryService.java index 6bc8a9c..b69f6ad 100644 --- a/core/src/main/java/com/github/api/v2/services/RepositoryService.java +++ b/core/src/main/java/com/github/api/v2/services/RepositoryService.java @@ -153,7 +153,7 @@ public interface RepositoryService extends GitHubService { * @param visibility * the visibility */ - public void createRepository(String name, String description, String homePage, Visibility visibility); + public Repository createRepository(String name, String description, String homePage, Visibility visibility); /** * Delete repository. diff --git a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java index 6081e9b..2caa845 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java +++ b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java @@ -52,19 +52,19 @@ public interface ParameterNames { public static final String FILE_NAME = "fileName"; /** The Constant NET_HASH. */ - public static final String NET_HASH = "netHash"; + public static final String NET_HASH = "nethash"; /** The Constant START_INDEX. */ - public static final String START_INDEX = "startIndex"; + public static final String START_INDEX = "start"; /** The Constant END_INDEX. */ - public static final String END_INDEX = "endIndex"; + public static final String END_INDEX = "end"; /** The Constant LANGUAGE. */ public static final String LANGUAGE = "language"; /** The Constant START_PAGE. */ - public static final String START_PAGE = "startPage"; + public static final String START_PAGE = "start_page"; /** The Constant VISIBILITY. */ public static final String VISIBILITY = "visibility"; @@ -156,9 +156,6 @@ public interface ParameterNames { /** The Constant NUM. */ public static final String NUM = "num"; - /** The Constant USER_REPOSITORY_PAIR. */ - public static final String USER_REPOSITORY_PAIR = "userRepositoryPair"; - /** The Constant ORGANIZATION_NAME. */ public static final String ORGANIZATION_NAME = "organizationName"; diff --git a/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java index 1fe04cd..23ff0d8 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java @@ -77,14 +77,16 @@ public void closeIssue(String userName, String repositoryName, * @see com.github.api.v2.services.IssueService#createIssue(java.lang.String, java.lang.String, java.lang.String, java.lang.String) */ @Override - public void createIssue(String userName, String repositoryName, + public Issue createIssue(String userName, String repositoryName, String title, String body) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.CREATE_ISSUE_URL); String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); Map parameters = new HashMap(); parameters.put(ParameterNames.TITLE, title); parameters.put(ParameterNames.BODY, body); - callApiPost(apiUrl, parameters); + JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); + + return unmarshall(new TypeToken(){}, json.get("issue")); } /* (non-Javadoc) diff --git a/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java index 073e5ad..ee95b8b 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java @@ -21,6 +21,7 @@ import java.util.Map; import com.github.api.v2.schema.Organization; +import com.github.api.v2.schema.Permission; import com.github.api.v2.schema.Repository; import com.github.api.v2.schema.Team; import com.github.api.v2.schema.User; @@ -28,7 +29,7 @@ import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; -import com.google.gson.GsonBuilder; +import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; @@ -38,48 +39,46 @@ public class OrganizationServiceImpl extends BaseGitHubService implements OrganizationService { - - /* (non-Javadoc) - * @see com.github.api.v2.services.impl.BaseGitHubService#getGsonBuilder() - */ - protected GsonBuilder getGsonBuilder() { - GsonBuilder gson = super.getGsonBuilder(); - gson.setDateFormat("yyyy-MM-dd'T'HH:mm:ss"); - return gson; - } - /* (non-Javadoc) * @see com.github.api.v2.services.OrganizationService#addTeamMember(java.lang.String, java.lang.String) */ @Override public void addTeamMember(String teamId, String userName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.ADD_TEAM_MEMBER_URL); - String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).withParameter(ParameterNames.NAME, userName).buildUrl(); - unmarshall(callApiPost(apiUrl, new HashMap())); + String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).buildUrl(); + Map parameters = new HashMap(); + parameters.put(ParameterNames.NAME, userName); + unmarshall(callApiPost(apiUrl, parameters)); } /* (non-Javadoc) * @see com.github.api.v2.services.OrganizationService#addTeamRepository(java.lang.String, java.lang.String) */ @Override - public void addTeamRepository(String userName, String repositoryName) { + public void addTeamRepository(String teamId, String userName, String repositoryName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.ADD_TEAM_REPOSITORY_URL); - String apiUrl = builder.withParameter(ParameterNames.USER_REPOSITORY_PAIR, userName + "/" + repositoryName).buildUrl(); - unmarshall(callApiPost(apiUrl, new HashMap())); + String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).buildUrl(); + Map parameters = new HashMap(); + parameters.put(ParameterNames.NAME, userName + "/" + repositoryName); + unmarshall(callApiPost(apiUrl, parameters)); } /* (non-Javadoc) * @see com.github.api.v2.services.OrganizationService#createTeam(com.github.api.v2.schema.Team) */ @Override - public void createTeam(Team team) { + public Team createTeam(String organizationName, String teamName, Permission permission, List repoNames) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.CREATE_TEAM_URL); - String apiUrl = builder.buildUrl(); + String apiUrl = builder.withField(ParameterNames.ORGANIZATION_NAME, organizationName).buildUrl(); Map parameters = new HashMap(); - parameters.put("team[" + ParameterNames.NAME + "]", team.getName()); - parameters.put("team[" + ParameterNames.PERMISSION + "]", team.getPermission().value()); - parameters.put("team[" + ParameterNames.REPO_NAMES + "]", team.getRepoNames().toString()); - callApiPost(apiUrl, parameters); + parameters.put("team[" + ParameterNames.NAME + "]", teamName); + parameters.put("team[" + ParameterNames.PERMISSION + "]", permission.value()); + for (String repoName : repoNames) { + parameters.put("team[" + ParameterNames.REPO_NAMES + "][]", repoName); + } + JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); + + return unmarshall(new TypeToken(){}, json.get("team")); } /* (non-Javadoc) @@ -111,11 +110,10 @@ public List getAllOrganizationRepositories() { public Organization getOrganization(String name) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_ORGANIZATION_URL); String apiUrl = builder.withField(ParameterNames.ORGANIZATION_NAME, name).buildUrl(); - System.out.println(convertStreamToString(callApiGet(apiUrl))); -// JsonObject json = unmarshall(callApiGet(apiUrl)); -// -// return unmarshall(new TypeToken(){}, json.get("organization")); - return new Organization(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + Gson gson = getGsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create(); + return gson.fromJson(json.get("organization"), new TypeToken(){}.getType()); } /* (non-Javadoc) diff --git a/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java index 9280ff2..57395a8 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java @@ -75,7 +75,7 @@ public List getPullRequests(String userName, String repositoryName, /* (non-Javadoc) * @see com.github.api.v2.services.ObjectService#getObjectContent(java.lang.String, java.lang.String, java.lang.String) */ - public void createPullRequest(String userName, String repositoryName, String base, String head, String title, String body) { + public PullRequest createPullRequest(String userName, String repositoryName, String base, String head, String title, String body) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.PullRequestApiUrls.CREATE_PULL_REQUEST_URL); String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); Map parameters = new HashMap(); @@ -83,7 +83,9 @@ public void createPullRequest(String userName, String repositoryName, String bas parameters.put("pull[" + ParameterNames.HEAD + "]", head); parameters.put("pull[" + ParameterNames.TITLE + "]", title); parameters.put("pull[" + ParameterNames.BODY + "]", body); - callApiPost(apiUrl, parameters); + JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); + + return unmarshall(new TypeToken(){}, json.get("pull")); } /* (non-Javadoc) diff --git a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java index c05f0b0..04ef4fe 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java @@ -80,7 +80,7 @@ public void changeVisibility(String repositoryName, Visibility visibility) { * @see com.github.api.v2.services.RepositoryService#createRepository(java.lang.String, java.lang.String, java.lang.String, com.github.api.v2.schema.Repository.Visibility) */ @Override - public void createRepository(String name, String description, + public Repository createRepository(String name, String description, String homePage, Visibility visibility) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.CREATE_REPOSITORY_URL); String apiUrl = builder.buildUrl(); @@ -91,7 +91,7 @@ public void createRepository(String name, String description, parameters.put(ParameterNames.PUBLIC, ((visibility == Visibility.PUBLIC)? "1" : "0")); JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); - unmarshall(new TypeToken(){}, json.get("repository")); + return unmarshall(new TypeToken(){}, json.get("repository")); } /* (non-Javadoc) diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index 37e6e68..48b5afb 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -47,10 +47,10 @@ com.github.api.v2.services.gistService.getUserGists=http://gist.github.com/api/v # Network API com.github.api.v2.services.networkService.getNetworkMeta=http://github.com/{userName}/{repositoryName}/network_meta -com.github.api.v2.services.networkService.getNetworkData=http://github.com/{userName}/{repositoryName}/network_data_chunk?{netHash}{startIndex}{endIndex} +com.github.api.v2.services.networkService.getNetworkData=http://github.com/{userName}/{repositoryName}/network_data_chunk?{nethash}{start}{end} # Repository API -com.github.api.v2.services.repositoryService.searchRepositories=http://github.com/api/{version}/{format}/repos/search/{keyword}?{language}{startPage} +com.github.api.v2.services.repositoryService.searchRepositories=http://github.com/api/{version}/{format}/repos/search/{keyword}?{language}{start_page} com.github.api.v2.services.repositoryService.getRepository=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName} com.github.api.v2.services.repositoryService.updateRepository=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName} com.github.api.v2.services.repositoryService.getRepositories=http://github.com/api/{version}/{format}/repos/show/{userName} @@ -100,10 +100,10 @@ com.github.api.v2.services.organizationService.updateTeam=http://github.com/api/ com.github.api.v2.services.organizationService.deleteTeam=http://github.com/api/{version}/{format}/teams/{teamId} com.github.api.v2.services.organizationService.getTeamMembers=http://github.com/api/{version}/{format}/teams/{teamId}/members com.github.api.v2.services.organizationService.addTeamMember=http://github.com/api/{version}/{format}/teams/{teamId}/members -com.github.api.v2.services.organizationService.removeTeamMember=http://github.com/api/{version}/{format}/teams/{teamId}/members?name={userName} +com.github.api.v2.services.organizationService.removeTeamMember=http://github.com/api/{version}/{format}/teams/{teamId}/members?{name} com.github.api.v2.services.organizationService.getTeamRepositories=http://github.com/api/{version}/{format}/teams/{teamId}/repositories -com.github.api.v2.services.organizationService.addTeamRepository=http://github.com/api/{version}/{format}/teams/{teamId}/repositories?name={userName} -com.github.api.v2.services.organizationService.removeTeamRepository=http://github.com/api/{version}/{format}/teams/{teamId}/repositories?name={userRepositoryPair} +com.github.api.v2.services.organizationService.addTeamRepository=http://github.com/api/{version}/{format}/teams/{teamId}/repositories +com.github.api.v2.services.organizationService.removeTeamRepository=http://github.com/api/{version}/{format}/teams/{teamId}/repositories?{name} # Pull Request API com.github.api.v2.services.pullRequestService.createPullRequest=http://github.com/api/{version}/{format}/pulls/{userName}/{repositoryName} From fcfbc7cbb507bb4c3b38d7724b4fe9ed684390ca Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Fri, 28 Jan 2011 15:41:52 +0500 Subject: [PATCH 51/95] Minor bug fixes. --- .../java/com/github/api/v2/services/IssueService.java | 2 +- .../com/github/api/v2/services/impl/IssueServiceImpl.java | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/IssueService.java b/core/src/main/java/com/github/api/v2/services/IssueService.java index 97f0e17..af4a6d3 100644 --- a/core/src/main/java/com/github/api/v2/services/IssueService.java +++ b/core/src/main/java/com/github/api/v2/services/IssueService.java @@ -111,7 +111,7 @@ public interface IssueService extends GitHubService { * @param body * the body */ - public Issue createIssue(String userName, String repositoryName, String title, String body); + public void createIssue(String userName, String repositoryName, String title, String body); /** * Close issue. diff --git a/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java index 23ff0d8..46fa6de 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java @@ -77,16 +77,16 @@ public void closeIssue(String userName, String repositoryName, * @see com.github.api.v2.services.IssueService#createIssue(java.lang.String, java.lang.String, java.lang.String, java.lang.String) */ @Override - public Issue createIssue(String userName, String repositoryName, + public void createIssue(String userName, String repositoryName, String title, String body) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.CREATE_ISSUE_URL); String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); Map parameters = new HashMap(); parameters.put(ParameterNames.TITLE, title); parameters.put(ParameterNames.BODY, body); - JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); - - return unmarshall(new TypeToken(){}, json.get("issue")); +// JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); + callApiPost(apiUrl, parameters); +// return unmarshall(new TypeToken(){}, json.get("issue")); } /* (non-Javadoc) From a65168ac493d05b237b8c745763f524d94667c32 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Fri, 28 Jan 2011 16:09:32 +0500 Subject: [PATCH 52/95] Minor bug fixes. --- dist/github-java-sdk.jar | Bin 166823 -> 169033 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/github-java-sdk.jar b/dist/github-java-sdk.jar index abab51bc5194b0ea65cc1a2e83d21e8cda412bb1..8e6b9c1a63e03ebd1e0a40be7ec2a546074fa296 100644 GIT binary patch delta 29274 zcmZsCWmsIzmNkvLYjAgWceez0cL*LF8h5uwg1bX-x8UwBL4vym{m6Ug&U|;CdAk1e zu3hIxuXUn#|w%x6PODIWG_GuDIb1i zfltWs3h;j>4=BPz8n5Qi_$dtzf0Ar`PctyXznY-B_;r!$g3k4mGmH!NjTSR6>p;UY zXM`10Hg05~-BIjmGkt?Tlusp6ou~+4Y#@>dxydwyna3qU54!UbiR6ip1_V)72z05xD7AlSOk|l9gX7s8s8ezq4V|^{SkR^)c8Yz{Wa|KofjuXO#US;q@u^tXp zABqLNVVbYeYF8LgRpsa5tM-^XN81=;G~1@Dw_at-ZYe*D;_)f&&u?Y){l$<`XA{PF zO_XWam!gv2m^%vO9N~n4nwR(dArD%3UTAlu#{qt^FyI2iSD*dEcw?b>Vm%isY+^m^HbK`jvpd z-o13=HvkdLJ2RPv*mDkv-|BWZX5SR5aM(Ur4T&FGA2V7F*S2On=}!03=S&+hZ4LtyS9aM1WWES7vgL(r0@EQ{gOMBx${@KJUZC763+omTKz z{@}K*uix5) zp4ue-%bTg!ZVwc2FtBFO3>`ROQZ6ZR(ghJ>{q(0EXb7nf{-k|kNa`lV113!<^@(7H zOp$1b?hOf>?M6Z|xT0g*vkd-}pzO6eT}(rqP{dP-bhGdPC+;nA`UUa$c`y$*#J~8H zzH5ey^Ua1gyNiKAPBwt!%eQ!w<(p85bNLN+eWr5?V$RllD+)oCmr=-G&JBE()hrL> zS;V3)TsWfe=>yP)kmqVI8&Lcee>#2sp!j*xh~}xVWI6Iz?&hE1HonBXtqk{17-Lp= zm$7PX1M%OAh~dAIMRmSn?bX&BIo3!+uyz7ZhPm2h=eKPQbZNyoH4zk}+&mwpUr?GD z#y64sCG%TXW6T(FM-3$02Gfb+M%>=Xsjo_T-L1&tl+2B`G|h!jp7l&Q#JdPXF|#1W zXjPD#aBXDmM?^!6AD-nx74&Q|25Zf_qmdj|i>G@d)wL^Bh6lXv#1EA02mkwWIZc63vzv$YApn)N)13<@6T!unWQ1k zRX;3U09P-g=?ImC&BImiZA1s2G?{=}zt71EUf-e@1Ci7wz*R3KtOi@(CZGgfkIhpE zS#SG=5F8@fMIb4@mLbWX6)tJRgb3(n=SAr>n{wWX-*|4{MgyO!ty(Cj;`SXGJKrdR zOR}88eCcS@`=WD*^H!QU7iXb_SmufLX-J5f1RSOZ@b-2v)eTE3zZYliEJ7+T%2s*T z@56GwxJ*-d#<0MaeI5*$vJpkM{k)TKEAA7>)5!X)4>=qB{Ut<>S0&bQ;zJ@An65N)pCiyq7Sw0@R0-y$)Y zq;Tt)q~Yfj`|o@pf((n}%ly*zp$D_IxfFDYTq!l`@T58vq#8>PYOKy9<*Iv^Sf^kZ z@QujKc8y3XM3u|-p4dt-GkL|U2K{an;nTNS2Q?KZY}^{CLc8(MpZS3nzKFuQ$a73> z_90PUUcRifTC_-Qupl{zQ@Z!?8)Lim(~LjFdvDAz5L$1$ zgQIpmUnmDWh~{UYZ=E-SI!OLon2C6{l0+{ruJ1NX3!2pSMUG?a3?Af%QEEIiKpB{_+o-(9@LI*L@`dyBU>y0QqUVMZ`HkO)cW1n51H4dQ)Zg~&Y7 zgsA>7JQ9o?0Q-h0b5QhY{*XPQkAV6>@?GFva@Px&jfpiu4)H$ZK4Q*DU6R-6KAC29 zZ~T;7P+R1GD137Eo`1nm+SW3)0+{9P`$G4^j8vTwnkbu%rGFr}Q`Gd9P&o9&$@pRV z>HR=qAJK22PVe^}f$)&O<`PII=qDdh?n~bz*i7g^(72Elf)FPEqy6YP!ra3w>xbv3 zertR{e0-pe-?pq)c~wN z9LnI6I>AxvHxuGv|L*P-^{DY(fWNXP$v8s+xP&E$Ay1@DM8d;>Wo{h~STmxBuAj$e zm1Ak|imcW)zua)SoTxzKuJa zdiC1MEUB}L3I6>3+V?Ofd#n8++k3L}BF6sZVaFUS^NJa-S+<2gG2D~-_STH*R6VH; z=x$TLG_9iQCBfd|#ejErk0&LCkfG|!LE2B6_s62$tt@o0qU1HbcA2g~r7x6h&G}WP z)NX0lt4&o*Qr}l5uz;Vny7fzd4HTOmIyTg83s-zZNaK9?r`Xxp3=y(?DRCP)%dLSz za=|iubS@ZsEb~mrWnBA#_I&qnEx z6dn?~eGYzjprTbWiE`OYG?#}=-)vi#7eCcfPsO%9hbmkDIQIaFv250a4xTOr!|%ED z2BNzsb<-b)ifv`975d9klVruYz=}GEDmEcHwO46fd?YtNT4g5`eNZo{9(PnKzOjV5!`BHu2;15wdi2Y2!DYYp#{DEl z#Jshdkmy~unyQ4cjyzsv_js&a-;b5oeJ!>%)22y-Rf9-q{*m0MCwUPhpzU5;&FOjK zE`Kh*HJdKhJoSzZUsC=wQ5thQS1#Y0mMQ*cmf?(9@Wo_s{dOO~VxrzMeJ`H*b{cjd zycCNZ-sDeHo6$51NttC8OZkSiq4Lvl^E2)<&nCa z!}9jK{#>EGK0qS8v{}m)kkv#DGyb!u#ZRr*^bu3O zYK6%=-R}6Sxv3^6n~=Vev7Os4&!FBT!M;DS4qJA7Z5t2zs0kPUj+ex%vv-;H=!vEq zcRadV6V7CFxSVULB@ojmVBcp&VRB%fb~urFH)`L^J_?^&>vxxePK1`WR+=K>#R*4U z)lYm`1C9IS#yX=+KZD*SZS>S}iU4lggg}Snq(E$LC6j36?+jLb-nk8Jj7+twMj3no z`Wi&9U=uiK$=W>@RNWQZ-V8|yRSM7(Le3dB!$zqqA!pHn7r_er5>ogRoChL*`%RnLzD@;6!8fsK?SK~ySh`-{7YXlYzCuNWko4*u1)=1qeD)bRH z3G33dc1LY1wTY-t1F8K(I7S_3EU|oVW@%;)?OMPdc)ePX;C(f&M|2o+l?U`h@Ns5j z;QCDJ{s^)i=R3Lgd(JEDidQMc)m!WjT31$=ZTu8ks_{blcFPh|yf`YqEZ_!Utok8c zy>jf-5eq!ST3*^NyB(f8Tpse#bljpJ=AV`!%BYP6x69Xj*5D|}G?>*E=r2}AL-E!L z*%uhxXz=4DHB!c(mb_n{4FcxAU(F$Qx|pD> zw1EyNdak;}+tV*lf1Ne=^Y1zB_1cq!gY*6RJ_vNISa*cWW0iaKO^$djx$5B{({wyk zr+?U#5?LK-kNiCW*f&oRU2xI4~wa^U2O% zV0d5*W*)ud6^IS=;lmf0#M678oQUWGF+97_WBk^ zz49{LYVmk65C~$&5}6&A1qu^lF}T8FYv?dk7W93u5_TD!-=cO@$nBJQ*4FbAdmhQW z5&NmIi&oqqr?To)+%V-qXDgJcz6#uRNx`OKM!ObNQg;hCz0G`Mi1tG$*y=lMZdtW< z`UcuA*FKE8OQ60=R+m;j`1R+dYKOP?Qb69LORd%!eUDOhMnJ|1_a^p${;@pdz?NVN z?+Z6!@Bwch`!tVc6f*cPRFdzII}{LCinDgVu7TlZ_bi6x#39*2s9uNE$Rqx>|b6w&%C{iKA%h-;I-voolQkQ zAC#5|DSPq$0o)(ttlb|RJ*)t83`wF&Xv=ZRgmcnM-d_0B-BJ_e1$Jy30{1CI(7KI> zU_qJ_%)HFlgkt8=VHMF~h8QRz>i6iLUU+vNAwPjkVPXCu6h@?QS~B2b=BG!I+j+W| zpP6qpWU(zhctW}#I-u<}!<6~c0dM361!!MDg= zXnp(5{Gf}kh$;k#YXEj=gthpPufu&@W+{`X!UlvdM>InklF~H&W5^3J1T_kNi`Tmg zDK4G5V{w`|E6?mx5By4x2rZpNjR1&tJ_g22ynWxNmO$s02X#JMwA? z4wKYZ&I;V_e**(1dr;q5qcvbyoKKAKx=blv-z>$+gNX~sPov`gwx>iOOkEHwZ%ob1 zyH&GyRWdkUSRF2Vz?x{9P7c_l5tZNeoafcVO$>3@NWGo;Otkkhmhty zn{1_8eXugys-nNFr{eAWy1*r1F}*#P3(~%@B^20+oY9g_*2@@R(M@$~xjOr7)0pdA zjU5V!%m$)&sg~29diSqtLka-#w;#r|#7vH>n=3iEzE<>CB;(}FOTjf*w$;+9QMw43 zy|1szYK)m-H6*0p8((wV{z=rZIkEN`4SM$d>ayF>G{6rp@1C%o*JHF)ts*dp(WLh| zTprlL>F}&8F0~>yDK>&N_#Q-{e-tEGtZG{(z&`4IjeB{-`KKw;zFDY`ZU&1}wELsKWo+H-XM$=TAgZ7yVt*%Zr&0#|=)zGDVmm!3+tQ?ix=Q|P1N7b&TV2gJ7E8iF-**5> zZ#^udSYm6+sA6L!j$BR5D#fTvD=VJ2xyFf@VrPw~8ETJH_Vha(O%b_?AX*)@tc^3;HrV2htlEqHiYv)NA^La)7$C6 zDqJ*sjMakBY2}!GlslW=eLZG)s?!ptxq((DMfP_Hw+t@WnkF|^g~FK4@dfii2gUk@ z-mPR1@tqV#8+($j{z8%Cp!87QR6y?+*(?sGx{bZ+5`=Pr^bdRFz((jPac?$*Duh2K?Aq8kBa#Kjp+Xa?SC+%V!4-l?Du8slVv4~J0bbO>1{-3FY zi!e#e)fhN$xXfgfSFW z?q=GX_esbwUfUm)f>@>4bOoW64aw2Fk6)H|x4v8^=Y0d3Oq$^%YKq$#w+B&Ghrl{! z<*n4f@z>2>i*x3TIMZ2#m>mvKVGWegs0+R$G}+)IGIO7k@sZ(Y{Zuoj+bV0DKbIVh znlhoqU5yxRa8#H59(N@i=SHx^X27d{sinK!B;Hmw{_gWqH%QE>DtPR zP&>r3Jg*K6fA;7>)uA2bc&KpYYwJEPL*?6zptnw%`LuT}RPYmydg&0E8JCLvmxQf$ zHfEoWHH3gk_*;pGKSb#3SURF^b`(HAo9dOJa;?hYbJh(0Hv9mWdCg2Nz%^U&T`K1S zcFKCOM=9nH7F~#oD=k82QxN{)7rS4@mYaRmam`MwLj~?mC@8ciXiafL9@iFACx?Ij z=~%P~bFuwJu=W2$u&0z0LO3L+{;|{wfG3na%$)L(O8tMOf|SiZw%4voX7D@i`in{n z0A7r1RbJ9ZI?n%*t^l;f5XBTs`e~1$nW=HoEJlh_7NR6W4-e-H2OqEi3J#1*I{U`X z$B*G=0rAE_EOD79+(S&cxp7|xpGfF-k;Q&+D(G(U!5dFFqi`IwPvHIY`)qT@+DwHy z)~!Tx$^$wjdqtC)Qc9i7)*r7u-eH!66&%4l-vOIA+s))?AW#TTF6cW@e`ej6l)e@# zb@c&Sk7A`^Go*<@kA*EgKM$tqj1~kN@ol$g-R0xl2!2+wbu6oU`aY$6Mqip6 zC@hyo7K&O>i(0yi`k{>q!PE=4F4}KK6XuP+RnL!ntKP8SmBCBbgL;>3w0WV z-#!X&?Tx#IiAk$ldx>sPv&pAH%)HdVFSqG02opfm5Wc4@QWT-o98X1^hA7A(Ee zTS|Q>6S3Y9DIob=KYkL~4|3s~>qCB^AIaNbJ+vELr2$&y&7m{)(kilB-B4YKH|LGe z{mCO3itR00_O|B)24_yrKL=)ko{~lO2OxCyz74175V=kQpiWZ&YZB@scKzm5AK*VC zpwAW`2WZ<+^FQIFnLFuv$L){P^kdb>7nyqX_4fZZxFwY3;C4`HU}Y z($I*LOIG_O99X5Ok|=8t(3criJ%Sdg!2ITsg8XAD3Hu?G1eKMO`R%1|Dr|LlF1Air>bl6 zR-|Ngici;N1sgUln$$h5oS}fBM?B!{{RGoU+{gtP3Al@Z<>s-J@}~qNMyl)XI=Ti- zlUIY+TQ>kbN91f|j@joq^76YT<-AL!2btCb8q#E+m~KB?1_6DGHj8Gh&QIMI{ap9j z*yrz@c-|kI|BF}E^wkx@-_2hfNo=wEgCu~D(%!#MY*?^=b0yUVoUmSfwef#=06stS zpF9BRI{{$pIhLpYS6IXv90mmZ27s?;T5S05^`LW`51N^5{`~JqJ^ylG|ocotf1W7f^3GpePZ!>YN69CWrXR&`t!NKCJVa< zhZJ$f^Y5pOb~)f)HG zwY7znxzMwyA5RmG_qlq44x*QF#|a6wtXQ04qSU^)^uIlI^SGLkb?Zb`?KG=TO_xntnura1nEm7(OfhxnI- zS&58S^B5t;IP#d-XL9R7BG;LkX-mReyy6O+;eb!C<;y1wqC)nOKd+ei3E`EOXPPa$ z_2rK&l&x)U;SM5ZvWUW>(5-)7k7jc2cdUquy=eUI5BgoUe0R-L*nyAkV~ zKmTgx^wKD;-KlMMAD-KopIJXXLqiW&KlhCB3+oDRC~%7l8wk`+aPC!Te0G_(TclfT zJ%mcQHNf^Zk{`gDp7+}mQ-8%mD0Fj@{&AcprlUH%#PO7fNJ?4=e4Sn}<(mi9r{-@; zf`T!D{?o*=6y18qXpphL(zMy*DJvSj%)x|5?&MhAVtH0`(7N5aHG4k&#`WX04Mk#V zW59jGn;n+{C!~fY5+m!`EgP_~7=xke?w&oYf$A;_%o&D{TwbcDYFd-5K`;RZ)hm6D z%Z9>0L{VDoh5X3{EJ2}Z?`|@iW++hoDQtBc$94sm;Zg!Cd7txxs(nb(A^c}E{EH75 zUcb%0C|MdVQr5uat%6%R17qGJ=Dny7DLqkl$xJtF>ItMgaZ{YH;3F#)LZb}KuadzP-z0>mh?4fkv zu2*keMNLWL$ZkF3=2rvrIbus?4C=;a$ccARt5A%`@b#o&mIe4%zr$CBf*jpHROt)M zKP*ES@7DU%L94vuMoJbjE_-PF#!4=#N$-br;7gfF^haDg*rgcPNmc)}dGW-d>`0&;!iDMxKSzm+Uh~y*-O9iEmXv-(0;DaDB0T>^ z&sV7Phgnhwj%iXR9l9dPz31|ZA>4)MV%`J96IO$Ha9RC05W=Iv-@@cQ@JUaP9&;@j zfLF{&t7avim&%;vmTnt>rk_wMOhA~CXtO>A!(qP{beUo8R5$IZLjYP;S^o{cpTTh- zo_SmZH_F>W>Am3A-lARl8;I^PPAui<_f_77`e}2tc$TF>M%m`2yTE)y~MrN9DI|0xGUKXrtO z@yZ>!i`VvHxwU_Q9oQ$>WM-zyph^4vP$R}6$s07!)IevvI}>a^oVJ+$g!5}DI5UR! zA(z!$I2=L5-Rk9wt*~7X`Cnx4CE+g!8|Pw31PEv`h#z@`&&%Vec7dqu+0w0kK|}|jX>84{Sn^B-VmU*k}o6u zB!8LTtX}%<39Y`oqs7Yef09p1I$C)SeeI3UA@BdJzr#qN2z7ap;EV z)B=geX}N_zPV?Bgl@&hOkrqegot~7Ql0|D4*5Wh2>8?EWIfX3Cd>s7D&1K&t%lY2O zzUELqFr0l#%LG=2UsEKCt%~B8h1yt`d~cZ{&{Jf{UYyf`D~@g2rj-`@I-tt*r11sf zY)}TjZfY~A&8J~q{(0J_`}>i9@C!zRV?F`o-XPE3#M%xE*3V8TN+?N1b!Jr;CZz4U zs#PCM203^IaBspCoU&IQSALxxn&XV3b8SAi2ql5285baB4bpVFe-SFrBA6^*yc)PP zVH)S$U7~4o#NZAOO?sWrHBD@gtAtaBsFR*JW27nGpr9nTSeb$`W7lGZm`25ULZh7vPz` zHXvJ7j7S3&UFR(%;|8WpS#RS-(W1A5g#tC1o>JuvJaLU1&B!Zpi_#(pWf_#6d0*7{sDIqUAIS0GqK40ky&sUq`tTtR$euvD}S9`vX(<;IWv@9{F2YlxQ3m~gK0?p zxXJjqsk;+>(&*tsrY|~YR`Lx~ zW73@HY3}nb@PJT_idcsRhS0ItgWhYtGPG8i=CvY(abvbZA%=T&nI~q7_2(_m%b(!?QrQ!w2wT zD3KPFB%pIb?t3266EUUe`)+iuA@=k;=5%)|_EQ1aH7BcT=P$&f!{eS;@b+;4!vq2H_&PyJ%h3Wr} z^y%GuHP;7A#2`q+Fi_6W;A1MO%R%%#AlQ#zCw!$G@EYcS4)IZ2OG#0uT1GbVl{b2o z{Wb$ES-7W9dt@W=!&3EC6szKZQU9FfPi@4ysZVaazy1CRPTtM|_`YQE^e)f#s;oE% zD&~4!1K;3h@%8dBgz>rNTGJz-~iZC{i#Vdqt)qB_t6+kb%q#XCUsxEr-y z^jU4`5+u2Z&Z1u@2X4Y1#zyD1L%LQ`bf_=H^BSViMB@bv!TW{7uYfM8lE`3?HUyJO{4naIluDx`;O5B`8*#hVhss( zO`*D;#7S!!od?#!jSc=GG=gi;w-&4I7&*h{S@)Fvr4v?r;LhSyC0;5A7o~YZm>PB& zOx6Tj6z0uhvUMm(r#pZh>Mz&_9#`Y6@r*MKeZUZ6q114Yo5?i2b&&i;w&F9+<$PK2Ers5ic0edRS4 z+fmiBkgfi(N5{UhhVi~`MgXuPq+4+Zh{gCbqFetL4j_X@IJ`24oUC6BjTS6{JTSbb z&sJ5I+FZbtCFi8bKL)ZxZNYpXH z4RSdjzVuH@HjNd#L)IC}QXA0clCEj$(a_~BUX=^et#s9@RI}^~XkS1Qsk%;}2CE#> znQk>S>F;;KO1YvSS9C;YwpSYh`rPfF46iTEJ@UPw!~C`pD{ZCCql(P1u7DLww%BeYxOK;0~X64Me_@{tu=pLa&6JPq@aoPy$l3h0~Ks*8F>kSvt9}4Taj*z10MT!LVW!k2I ziaP%VtrHz2!_Ox=t?==RRu0fI$XnE=FBlB=PzItKo^3r3hKAtYLOm!6Es=iy#7s02 zs2T5@YWuq7K5Gm-nkh``*cCs-QX0$cH1^RJgiE`oN-x|iuJP2na!2LMJ1R$))c=HP z6TkdZkPvL~p%Xy^1Hp%1LGj|B!|6SKuoah4lwf802 zXHYaNfdf*Zk|rsMK_X57=w?(jz&ikhf(AhUr@he3j09){{9`Bi8$|o)qkuy<6T<@F zpqhzM0OS9j!uXg{a{ibi!2{etHg8}8U?KlLG%0rksu=|XFbRNw`^PEB3UYJ-M+Y*Q z+8MjJRB3$G#E{1HgHE&yM_8q?@+pf{g9xX$YDBj|!X?2KAvGz}X_F1DP1`7H$4~BB zeOLv(&)$olT2CEaxx7of%PL=-RS-P=3q#v}ppJ)Af-V%NTX9>=sY+ym$ zSJbDqnUv!#DYeb`Ayl}$uCsK#t^wrmttuRMJjk;aOnZQy$ZkAbZ7eTY0itLFqVuss#`eV-4@< zE_5_jLxnBl4ApI|LxV%D#12i~7Gxy-X=J>{QQx=PVSN7Egsh%oLmmbUr7NqR?M_CA z^>VBYPbALxUWVHm-HM=4+B@AYstF3U4j$%viv(Y>Bja8axqB%-t# z!2oNh*5*!mzwMRum`+&_V<@m4X?=E$AyIewD_Az{E{}MNLNR-}68{N>lI)>{%o%(~ zG*O2rtDlU>?k8p}+}p1M9uIq2d1tm)oO6o=bE~Li{fFl9i0751_mQ91nRhF5SD36e z)fh8&9pztKltKe<_Hw`Xkn6!abTm6rgqi8}NQT0i8%Ag;IEJZo8Xp4JNhj212X$8R zzEmGG{iMVLU15tRBk4DuVu72qpgQnuJ;YmM%j?mu7UwC!H zFr;>~zEQc;+yInsRY=7DvZ~KzS2(NnE1pAwudlZ?s`(t-KgBASZP3%;4+7-qaR zW;?9)(|hmgTcg_V`Z2_;E7zb(#9g8@T6;{2j_!I_+{kSqDH>9szLa%A4>4;k2NtB* zouMuAkTnzX(D)?%I#mfQ$Agbf>X%A>?PAr<5wiO(DpM>J0XmEZ(sJsdD-YkDc?A-b zBMSQYT%I>ts>)xIe^2~KIoQo;nIx>-syKiohvxl? zyY8&*tlNh&!CV#-h4#hH1LbJhXDja}VK&N7v`r4CtO$V?D7bd0n3ozc(^V4wBA10d ze2dr`R5GokyprjUd|H&6NKi9VS<3I;jc|<#2!vGe?fxYK6&40jCvtoD2CpQcoP#y> zC<5h+g@_3A{AAJ#4^8jk!ZZIsUCl7t7NJGs)fi}t6)i0O1fq+e=?z4F;X=&CKREQ> zq~tha{EdMQ?A#4+rBLM&@5F9)5Av!q;}1kEhAYe58=uyScSJV9=GISmcC4VYn8dn4 znZP>RabYFR*QBQ6+roP!Y?i#Rx12tK3qXfU_6aaX_b`Ojiwwzx?GPJ7+C@jl9ayXG z@g@o=?-}@KNE+rI`hqP;>PWz1ibO^$2U2Imelu)<^&x^1eo=-K4_{)^#H%oRA0YkWob_^os|S)luq zp#;mZA|7zrupo?_M<}Z7|||%pKWh*^@jUn_Nu+k0Y&zy-W z07B=Zg0CnGPy%ZHamQG~dLv5ZnDr3*M7d2TV)Y5)N5mHebod{n00!M+Hl8Lsx$xcS zy)Xe59X597a{Hr1CRf8*->o?=;f7aH>m(PiCztoqY(EDM*p-l>MYWWI7b&xzLGzg+SQEuf50fkA`5+ESxKEo%9O z({`k8;}^1MZ+yTjF1m*qRgz(r;pn~w4jVIrIrdG3JOZ!e7f==-Bsw(F0H8@yIwSjZ z-YL(1#da30WfS6?a`*#FYuIH34Kkd>$-37H!`v7!?5ZUc10ptcB=NF%n{k*;FIAGQJ1&6#St8Cl_OO0^)f>w*7rrrHxIK zN`*I&AjM(@=L!v?#3_{QIOWGt%L%4L>qzzq1XsmEBBLs0vyQC(&aT|AVg@gaPad;M z7w6H)aVIjnm7@p>I2a=vM0W}MG})GerA|6SPzu&9G?$0>8u-IT8F1x=;rLr`K6WeL z>&&$^1af*R$s9FEa!z%Qhw-^m3a?`_#x)&)BcnfKXZf<$sqPBE`(MpS0ixs$eOdiN zE;(d5*6X)0GAD|k=p7wPXpA(rzT2g@D&Kjkz2>!9u9SV>r~6VTS)s<-+19VSy{`|K ze##t_bK~-;4neG%?!L7+-d?KWfXNIWESou$^qvT2dbhs;^CC+~&x0Q#n@*>rk0faU zOq*Cl=$OYjJ`Q)VfRyilQVQ728}3m|A?o*|TQIuVgi$_e z38@E{eukjA{CwiP;d;Dz8rS#CaVnX@j*=P&b3!S(e@~bP=K=aV_^>j(4E_{E@d{K{q30OC}A)E@s#lE z$*i7k#Li8J)~ox}wcSVn_v&x8rBC#9XMQ6+pew9ugzBz8q6K997syYy5dW{auvw3Je}; z%{|OAHn9f*!;&^Y+CzbG>KX6TJ(-Vwn8Fs=c9+~-+}uq~ZVW(%OhwR`_0qzX>Wg0g z6eRK~$yg8br95;LeJ3qZ+EKYG*K?N<|5q|^%J*4b*EsVhlg4w*{e~hM{^>Pk>SSkt zX_HFAq~w~b{z$_!Ou&$v(7S69FbBZ#VtwFHvbj{=(=Rx7<>7u5H-xtW@e=l@2*-Hr zfqDCqK#fBJoJk_fk#%m^3d(z*fLh?&T2j1Ch8DsxLRJm3HHa0|_0C+O%i z8K$sDN5s%hzjFD(jQG1qViuKBVShnEgd+xZCQnLibXV9dXZd#piJd7s4pmTLmMT~iQj5%Eo`o3IAYymA&0=f-bydI?)Qz0A{0^)dolUco#}sN4Oj@QCa?CB!g3^Ep%(WC_xP!fsWY8 z&%E)tE|`l|{$-gV^twk|({~9|FwGTTK{T5OVGwNdv!RTHj&ENqkjg~S=L=v7?xhL* ztueTZ5);N}TiVy8=8`uqh~pO48W@?!F1u5Y_+23Ni&03)aA{+-ebS88Kci=91^?1} z>r%hmYwLF8bEiWcPF_=na*9+Iy^#8gMq#zXF8_CW$ikyXdq)vnm#tkrnWEKge}jCf zA{XYXR}y!DH>(0FKj*tg{gU&$Gp(ZEnveERxcAL&khp!xH}o$V*Z14pZ(UnE?sjtx zmBCxPaZ}WfPJgi95Y-7fLb@ePzT3WP1m0^*Z`yOd|Kmw$v|b+Xh6V$3M*shH;osBF z_%lEziSY>r*r=-iUk-xmhzi*g%PRN~fkJpCTFFRSUt0L0ig37rrIGtKysYt`=_~&4 z{lYszutJXzFJE>xs!)7sXadfEcwcU!uGUG26>5g|Jtcb+f3$!Am_4`bOF>_Y zUcz_V+^W{3S4DcTyreM%5%9}sg+iAayh_|%?klXGyb}~XA%~NoWFS8Hgs9}9#p>*d zGZ(3_28KAeZTeUW?-v8jlWwDmM2btF5re08hB9{NqN$^zYIJ)&1)nET#$*xiLIhxi z$x*uJ_t%@@2WA`koLPme3rmk4MOVY+^_JYPSCKpOSyWm$9!=lNG4VY}YBRh)URo!} zF2o;l5gen~&X|Hr_y$Bj?to8Fv*flT#GkOhq3mw-IR03K8`OM?9o=Q_Rd4!we?PsA zb12|<9Ru7-@Y`31*nqEahaBn@kL%=bh&?mHvbED~(Pnq}<@WVr+dgKq-&dg0GynI^ z4b0z0vWm-!ZstcLIr~5CAO8mNZ|Dbo6tzVk6%1EXtVR=u%F|Cby{V)VRW*3Bq zlW~xGZV7m9PVJpE-yndA+fiG=3QTQ?Ve?InrK`y^YKr3x*ZgJ0!0d2y*Jll&#utA6 zKTa;g9>BC*%39S-eob6pqNJmS*OL)VoU_-D!m?)x4I}c&Z-*C7m39+G8biJT zS4Ll%+oi#)Alwx`SRv~KhyTF}PRT&qzpPjuZz$s4H<9uyw+Myw`pXIx1I>dRqY64X zqXv7nS5lmX^p@F!TRBal=C@v->n~LwtjI_BONu9U*Q0` zhIRNOm4C5`P)|C}9D&>Bx8i#F{@3-gnf8{rFiz!pAEK>)F3LWNVrN+&y0Lo`H51h3+ zg$Ck%@iM9pQ%O;QUAd{VN*r~WPY&hiVa=$m?GuojdWc|a^$5BY&Mwu*HYwR`r!oOg zzYx=#_mM3x;IFS_Gp=Fn7``LMqT_2^(rv?xpJDD&I`7zhy2x2iwkjcb6zOl4EfFjf zF-Q-Z&u5ta7KKPzzjsN^AvhIea|u6uC6;t^18-bf^pPf<^^w1zoz-KyChF5-T@##l ziGkCae~l&c&mYE;13YnIsrNH)W;!dj2fma9x3?O(U9^}5!3ghXfmVbtDy6D9Dqd3I z9|wR%NP{UY+whWQR4ut-pi!SbW^?Vv%9}Xd7BLaN_=;%xck(c%Zq1Z;of#XfI1P^u zaE98d`UhyNY?0l8v5S{hiN_dsERHBGF;B9z2MoshzQna2@`jbg%N7YH!p}rDPAH?tic(I1A#-_`s6ye`ER28~L$Y!vh^K{sJfl3JxjW$A?!bB2c0GRbDRf zCEtK9p6)Avmek#n-wrXBaAi}*afjJSB*p9SugTM*`8z5sZPO`U+}3yp-t*8@lswq8 zM@BB`C7Zj8_8|{_i3($b-uak_UzrQM$`sCr6(;1zQ&i;Y%FMz9+?qEGoDTR}W4jA5 zgj5^SvZw?l^qOWU2ZzJ$qlI5NkdE9bIGIwFX4fMcy88dxy6!-%{_oF4vW1YHO~~Gv zWoPe^J+fs}9(#t&OC`w&B_n$zm1K|X6$zCs5sBaXd7eIf^!t4M({o?vbfR%r>oX*~nc|g+7aX9*ABE?w6s64rt9&0_@z^YN`cMY>3y}rkvI-H$Vtc1K9 z1j!eDeUIE+4X)r38nV5YntLS4Vsvo-+6wo_QQ15FvZaM&PRTyj20WJ(IS>yCOxpqeLf}{D#zx?9I7Y4yxm>rMEb433~BD{+S?BH{q4vjU zh?;>>gGsPrg6LS6~>Tlq}TNCp*xkz+b^--|2+G zj+^Z#NbcZ(^T65D`#>;1_Uaz-!FHHycw>+;K55%;`JjW$r_@fLI zrush%!xV*aZ7>nH6)wuxILM^&%IjooFhQ8%el6ioWSHT} z5aZJre>Md0ZjGBZ(2Wnr`C<|ya2{Q5(PuI+ox8({oO09alPPP7!yu~SG~W3T3|V}E z*&7N>1>;qY(jh|M999`+TSIU?V;_Tgls|1)HDGOW5gA`7lm1}Zboo=^GsD8eIehz_ zLj1|QUyw5nHy@im%rUX4=89_7=BSD?qk31weT%0~4*i{{U84$j5fNB@8E#pwJ@V|6 zpFLUm&$-jtBlrd+Y99|rz5EVl+=wErm@aEQ*8qdkOU)vpmhvY!4cVsYtQGer%rm?f zeWZ^?{cLogg{z%}O6K|=&MxqKGkTWwUs(Iw8f6)B{-p%@3TxDo{YO)~s+2Q!^gdid zYp*|fT>i#ppw_2ifLLI8V17uO29LVvHRo4UKgMIgZ=S4pLy=s`QDLDS%T;d{F@N@n zZnlDE#Des~FWFeZgq=6kH#!QpA4n7bsGK~sz0%5P$>ZEi=K6fKYL|xhf!xM^LVxou z`GYtu-qp)y-YnxAvBN3nw@C9=A{ve)TRF z3Spl9G`_ehVtNy+g-S~H$9M8A|7$e^<&_S~o-Sj^j1DqK%km8ka>!=fDTd-VUDR) zdxKM>TflpXwQI&CI&mtIJ}^gR&GLIF_xAyk&&mcl7UC3m*kD}WE{F+vygmB1H|BxC zF;1XO7Qi@FqEVgO)1lj2ZGQjV?P-OMbk$2ah1<{7(+59fjExdL^FSQ9diX;6*t-P& z$c;SJgoWOs2yEnsqWO8qaUId}8I@czA586Rq$_xwxceAt*&Wg$R)R8wg5?cPOA}Rw zkI-}(6P&TKcsSjM`CWxpGFPkPQ?&E_)R#(jwi!w3@AvoL8h0j;edbdy8kv9Oj3wnS zaBDd5&C;cJVwS@Q1w4IRu#flCE9QT0tKC~?rqpsObr<;hKrrzDm;ABld-nayAvPDG zX0m`LJL~h;@;e2{w~txs4c0izFBf&O-k76*yuu)zS|~Rz7CmiJT6J5H?i*I-K2?Ge z3!>e8;p`k&7TuBHmopV%C&uR zXDUF)7@PoT!qKD%U_cMxt>-lZ>0kiW{xg6eL|7A1V}f^+Vub#P!By~HFVh`4ex}PT z%4Djeo_KhV@OV_2U{wsvGh&^jlwwUQ>!;eUsnswTo2}@$T&$_x)lQgv#ymP{ST@<6 zUsg8xdi3X4YqzpXt9!FOeSHojER}~n;9lMMb^Kwkbr$h9<~Vrl5(Z^l2oX7U676Y{ z;23BNk;C%q8iI9hrsW;2(4!_SETtY=>LlzIi^1~H+Q=*B@#B3#2nsdc$t>F4MgD670$m?tWu_&m*n=UmK)5bs1~)t#>I*5Sh~9x zcb`>QtK%jQspnp|stiSzp+QcGo?^{QeUVFKB-kxwN8^3Oh&K`36itRgS8*C=Ok69l3Trno88a&)iHQl1_UEJ|4jkL+ zc%^(HX@De0I5KoJ_jZ5gUZ(}&<<`4Q!?Chzyk0CcX&J0JC2}S~Y!l?FhG~Ug)QytZ z5R-;FbNWvrcc@c5c}Pi=_bONuxeUF}X4XiW+KFUY8$~c!`WtzeSsL{_n4A%=-kSg1 zo5>|@oJ>r_L#wA$J}?-^XNstk6}RzOBhAWXo2+_Mhg&ADnz_Uf_GJRUOG)eiJJN`6 zy4aRn)9@&k`uvic+bCH&R?AS$l@7xUf5cYBzV=*2v73cZq_o3eS~Qh-ujOg`mu*xRpdgcKMqGkiDgG9 zVNvIk;G0)($p}55zU)rAkzTRDnHudI@pkv!-4_O(yqIU0tW7#pz$uWVs@g zlf&YZ?(8^(;Wyb_CLQrSWpP(iTbb~w;W`HSn3k-NURsS|+4bj3vY~;(Ln8yeo@OB`jS_b#$E?b<TPmHGW>>I~ zq_Q*1Y@@9~T&t*mAG+{_xWOdF#4pSh5fnQekx-%ax*Zbo9y6zh=N9bv?d~YwT350f zcCZ|v7FAe^+r~3FlI0pO%BU1}UOlZFXJjz2`9-N%puCzVX<(BpY$A}wcoc)!uw=K)vs;GZY2K1)m#>^q33%bk6>}i zT2y0Sr1CX?l6oVtd}dii?fSPB-Y6ciKMrceYU&;nmx)?>q)uOzbkF=GP1!)n z@@)Rz!noXk{!Q-Ys^QyRVYBRpH$K0F8>goY;^5~^Qqp3k1De?M;9`Y_OuQxpv zd6wGzw=NOw;rDd0$am~*VZGJpi7lV6tQV!D-%XZS$x$h2{OKzl%D8=6tlzj%7#DH# zV@Rx@KLayOh%m7S-|n3CeGUYOBykLg%*ZNAXN%6@E6bAVCXtto&UFd6|E%+rUI*~% zE*&H}1q9@%ZP)e$E%6vO?AY>-KpGfS4u2jvi{Azm{x-Zkk`QV<^ zN>0fN?dvM(&gQW7%Ap_rk|7r(nl%uo0{5bqc56pQyPe7>f{(1}jx0X52??6z+Db85 z;;MKy_DZxUlrb{q-`?IyO@i6VO^C1MUr3KO>X3IY!7ZPYzF;>pU-P5oEM1f1&xE8_ zwWp15?n=`NAG*=aWd?3WWBX^}^x^ZDtntzxS9jlCSctGsMIK`q8xStdM1c*1lyx`Ur8r>oHnNzVIB z>pgnw8BmuJFOTO?#OF}*=>5XV=Sjq8+Fy7*5%>aTRNkLB@>I9ewEefw<}RsrsxLOD z2d49J7xrXpW`DUjv>Ktr93lO2sN3i2DEp-Zwvm;_tnvh$ufDew_h|N`GbYYSpD*>* zVX+LibJN~1u{ob1b=9`TBTmvmeNwvSRQOcE9a~?W^4SEgHyn;LHd{_yzuGqMAWWO} zsk&2X?n!*1?EbP^UBh~AD`vNNk*Lurz59~+i^==`2@79Rs_EM{LmRctGzZ$_Zm0{? zRhyAaKgwnkrPpDiwo7%>+A_{3$erets&@ER@`$Cv>UK2DSdhNZBWaf1Va;uQRk`ea zd(eolS(2LX3>-&n;Zs_tZcX355$>y7M3IYd1P23sb`K>P2 z|5}nXi?+5mu5{hD4din~S=xz{^~Q3>JoGhxHcL)q$>@^Q{6{q_lU_GY)w#{S$yAmk zRVz)%o7Nmxr)HmcSePQ6DxL26CWbSIjo#I(4Nsbx!rJlZ>QtTY6<7D_>o#Ni@)YGU zJg+=$V0^pK_z~$-!5ZV!pGI7J5Zc9=c_~KZ_0Nefcu6l_Rb(6MXR4au?7$OGd3TS8 za!EtT5!=uIAmc_ zQ+LLGrh%BLXW_|br5^5!lA&k9f-7IN^%^j8`kT3kAD<6%nGK9Ker2Kc#*v#+cB}9wMopacolG*r zg-wMwpHeXuly8P5eKvNAv2Y~ny){#$uaH@saWBq};AdkQ;U_(cV;a5iUPRGZY4`Oz zgdCnVMbuq~$AT|xa9=0lziybm$Tm#&+9)nB2V==^c$i0Hj@HMRfl)yvt50 zLj1S_JOv27#lrSlYl7S?QR%kYd9vR+nfz{Ois#NM(ll~tC%W`kdM{$kCm*{kOp1|WbFkt zhsT!}bUi6v{Yr=7n2a~~;alS&V;~~z1#j4qRC#wfTj)yhK@fL~wYl7J+SuZ8FRuP+ z=qx#4u|xIQr5<@hzZNjL&AA>vlEZ9y1$7-MP%I@})nN^zgqzf&9*}>@x$GI*xbbMT ziC!h=))hhV71sjgDHW2s6oyRhe48qT#xd@E-^-G0F6Yh`l6~Bn)YZu(pGVvpzA2k> zNiLB@@~cyhh4S*0?+#~EQlHAGj#vFmcFybI&a%{iF8Z8vQk9Y73f~=F+pFjWlC`_@ zrIi@+qdVvgORLNDukUeW`0a_j|N6pVdvf(fWO0Sm)0MK)Svg_lB41+(DQ*IL`9xPL zAsrdj2CYigr^*+-CRYtt&Y>-}ELO>I%Z!n#QQGvVBwx7Y*+PJzWWrkITL5`LA z2~QOT5V>r#%K=%J`ga#_`dU;dFIKVzW%IUO7>_cl#4X>_M$F7NwA5bRMSMJ8Y1qCu zVR#d+j1yRB3V&ShiZD;&yCEkcJ_PeV8rfdluYSHGcggL&0~N`j`yTJM>r!P;!!zAM zJ??{|k8P3TS@W;N@D?_(H!1HOAtb|FW~0rL3EoiR)J;Z9b%#sIyBd7)j~{;6%Q*ea44)-cVWNZ`5jTdM~f7I4!8QZ2v9FZX1IHB6p7C(tF zFix|d{8;zL|Ax%EfB-)He_g=QnI8DaQ~oOTUkl~qf=c8{t3xk8dQdMuWo^5O^vCIk zoTcMtB|gLmp|J5w5N9IQ9i7bC`gSi{Y~k0@!ipI10fTQXn>_x7JU-_7-X)o)&vxyZ zT8AWXO1cYE%5UX8Jt}_W=NII4qvwZJ`a_mYL@}QKGk(^Dxu-ijecB9*tFEd-dtpys zDw%)gA73z?xZD2rzTKm;q!=h|e$vEG3tLioJ-v~%KJ_D+Xpqx_b3FDK_T=lk71`I- z%S&%)h7>JDW7i^cH9Ts5w%7Vnb0+;|fQ3NB8L^Rjja|z-3S;N|!B?4sYv8L4@W?%} zK`dq;i2mFd=P;pXe}eidlh%sYOQp}fADzkf`San#k2_S!a}B*jinRf%Uh|sd(`Utv zpAS;(Rk8rD-2D`81l9XD3*bn)9gRJKMB)SWB>!XWzVIPi@agUx_;k0rwN|rFMfoe_ zR#Z)gM|ihu(`w?tN1Po7S&8L-s)AgVz_C{ji6R`~3o?2A*CyZWdeWP@N{zc`iFrP+ ztn+M=-Id0QknHi|BO+?);MO*fcLj%BfV^_XiyI_K4Y{kN7G| zYYvbFWH;$jO7g5k>0jU-i>YF69hET9g)gvtI8ZS8WrDM|y0g6$xfY=lp7b*9?F^#f z)g2yg;LhKR-ez*lH5B${?8FD&)n})0?_ZeWpU8^Ps2-VDu@amX?>aJn=)Kwpd~+^b z&#a!rh(3F)Qo)OMuJX2&bmQ!2n^KdF_nJTJF%P8gZ%xcG21BVQ7;%OQ4CUnVj%i11 z@UfiC@xxKIhf*U^26?-LIS9vNx1X#D?p4H-?=*}++Kos1scLK=1m?HSXz?9o^d>&3 z=GEllnK23f3FQ+3Z$4=-G=&p&u4FsiMytUwVxCP5`0^jOdDm_oG5TbyqkZ|M@!WKq zX*K&F;zMLXuGs*#`mU<(NrLJCsO52gUtp8mLB?+ftHAgM0oubVhV-!BBig2P7ejhk zM}q@Gl}|WWeYvE)^T9BJEPN^SX*m^)aBmnUVO>%%rhYfpM{iW@7!T~30G&rH-nH4Tutlrp|zy#)s{nBTq+fw$Q5NBE$2?Q1q5=pfXuBMza>y4r9zS6nCk2u)MHY$hq zuPU^tci-?k*kyYrYi^|5%3X$Mq-d`4)pr54}At zc%ORb?pIkZ0ga-nHZ})BXql*%(C(@yTsn?!}yvX=tKD z5Y{5Dy676oyd8`EqfD}Wu=!#}dAUTgm-Q?5s$qv&4I-jYU8 zn+m!2^p+SI3TT}kX0sW|)pIJ^_u23b8a`QjRDk30aiF~i`Wzm8{wZ#c2x7b1n%uME zDR$r*cEpIMPi$u>^TTN}W)U}qbJ6y{Rv)Ijk?T9xI4a`=$AniJmPPodBwVf16vZiU z`0m5{?gCd7eWZqZ431iY!Dn4Tasy0#hP!sycsrNvrL;sQ+O0aAxGZ%Z=o~n2=_egw zh(>V*VMpCaA95h-xZ;xFxf_H?%zOup;RO069~02TJ-zkgfjD8W(Tnpmc%ECFllUw~ za)J~W&8YV8d+=-)hKm`$RI}0Lv?=IX#He0$Hm&a*Q8aujwKDPLflj&*^jG zg42x$FIxmYE)<%#@mFeiesVD}3@*8nC%7VaulptURHZ9#R@t|{yfNi`YD8j%1HI;= zzarm&hs8zPg76ynd_q^Mazq;Zwy1@W*x4`Q@jZ`VF5PdE_t;BM7tjyKVjpqrN)I(E zQP(ilb?EFy%ip4#LP4nsl9tR&@EI(rnweF#-{k4t?5vgEZ>g~-EXQ%f< zB?g~nhV^}ht7xY`KK&|pNY;V47+l!;5R>OEr=n-;*YpPU#l@C;Vwwzn0g+3JjFB33 zEc+itEmXf83%{J$E#MXsMqFI7{d8(YwUgOPvxeke9~GX`bba27IzRWMqP_*%mv>z{ zmQ;-HKr73GF3#TfpIz(qV>+vOQ!?3ExqGym(v)bRIHUwyTtxW`KZSh47$SMWxx>JZ z)NTCHor&4K-53Sg)RF{f{N069E%T`yGz9?{HwxQDi!cLU%P}qH^;GW0_lGaz*X|Gr zmIy^Kkog5H*|l?Q@F%Yn9ezA|dCg02sM{;V-x&5&!tP=RUF-$>xLNNO<9*~fW6vhIE}>no%e2du3WOJsn4{|VMUlUi%%&( zN-|2qK4o_uH*7}Gi#&Sq=D5|4jTqB4de)|@m!^i2jH9oAoa_F!cWP5%aXi{JRL7Vj z<<8M<`QfcNyZwHhYW7pA>d{_g`#L*@^JDo3s*0uF`5Z(g1|kfY_pIp=Q%S^T2fjZz zlArA^f5*Jfk+OE5_xx&67jL?n&?9%^dujcW0;6lXLY<{ypSm97KB-NU35oTJ+q?VT zn0=&rb!mFsOqMg5vt^?7L&MOEx_gtOXIHs^f4l9^ACfI=Ew6IiTfePuW39}}&hFyYeL#@(O<1*6$zk+C_c|)5+d!ULcuS;ct{aM0n4v9S8}& zZ%sWy;6JQg(lYW7tQ?7$&z#-tjyZTbpCvq0e*BF&yX8phtWaElGJ8RoXm-R@rp{{> zf)EY2JocxUcwTbM(>|?dCHn-pJXPzdytCN@utt`*eAKeXSJ{pvKb^TSXhQfoJwS^m zmQHMf#32c!&>3FqY@61W-B*>jcu~?RoZzRy?E^_VKisXl6TkSD=aq)~!z|7IXTx9D zc2-lpW{b&=A>{MPtK<(=IUqiaRRa0Qi3w3){Q2K1;Gb8apUAwfb^DsoDntbSzY3W@ zN%`Sz9moq3poHi3AjULDN^hG$B$LPYl`_f3u8ZUzGGBkwLAr)TK?{-5-14`gS{!Yu{V?e5s!p>&ER)9d7wWM%bpB@>^V+=rBBLH%W z08j{KH-;$Ta8m$0l|ZrHDW8K^OaW^esT!q-0z-_b(5h|b0Q|0k0)wr{;asG>cSw8o z>L`#_lmgAvLoze3qQG@?V%XFSFtbbm$fAP+Wn|Bwnc!PH4di8j0&gpxLxUVhW|;{J z+>}0pE=bxKfIrQUAbi^xx&&Rm27YUxg+GyIa;;E8bu);T2_$2e`IEC4q>U5*YZ!WL z0FxbLX{UhWEkGw9IwG%;$&A^N$%x@xONbV;A3lE#5{5S{Aqo`eW(Cng+g|XN6+mBD zLF6cO@ESlVe94Ne;RYWtmyt#JoOR3F~P9${>@+!4GU9O313{AITXQ zyik%eA;l-tl>I%J=EZ;LAjKRmJm(K;g;Y72uIz6Wt>&_wR*gi{UQ|=UtM(8f9ymBD!`eu~lLuou043)RAQn%X?Z<^T zZ6QL`xyql&p7-lS3XmzE$eEBji(E9?@!-vY2fP5v{55(Z-SBxANCTzH;|x@Ndf_wf zkOUm={9E^A0-;NP=?3*9O96SJaN(qo-^I6G2Q~@@QT5WCM0X9!IKl}CO5dZ6k2w7{ zPSVCeUI!|M%vScd@wX$$ib=o>wqQyj4~(uL4SXI$H4Nk)LN_ebEjy7zmCH_MtnnqF6_z!V`2jt)F2U%*RD=3v_7HtdH4cG$7i)2n7bd~z6 zPtMPQ3W}j`1f>3i3()V{LhFMQu;{u7Za5nw-{f@u)9mqYXeu}ri*7c(8(658U~5-M z0vRX`Yxse=h8)w|xSW|!fDNnvwCD34+QxOz%c!m!bO4n&-Ul_4g?Sx+>vz9tyO{;_ zHU6VdaER2`K$Ws>eIDx(U`hXnMRJ5Lbw9>t}E z50S_sDOv%X$VIILr0}s9fS1XTFf$C!-=a?El4T+w99Yl`ItQ^)qeUKGkRn7!^M^+U z)7yeVyO7nOr~3n+L(OI;aD-Rp-}7Jpe}7?QK=Y9Ye37Hg4{@{pLD*rd8xR8|!u|&# zM;1j6Tls+A;PVCLDR81?4`o5%GjiEP%TkcCYN0OzQhR`GH?zx`skAGdLs!^CkWuc8ZNxy4F;yu2gr&posd!af{wC7!a1@h zU~r@jeea`fw)p` z=H#IP>A&tV3uQFlGZ4&)iU5cV#XlLJ{`VRet@(#f^-u2+qGHnp0>RCd2+s#VlBm8z z8Cp-Y%6$u_{P2IK{9WCD4Iw8iIm*a}KbZGD`X@xlHlQZ{gFw){0YkJ1#JH0p1L4sk zhaezoH~u4{Lhfp$FcuPiVfqI~Ma7ey2JTlGWQ;YueiLk;?=0cA;NMkdM2b#^?8^Ps zS3~g2U`Prcc7iCFkj#?-p|XE5CvA~NucBBdBRT(Ot=glD29cxWDC)^@&A+LqoX}KC zfa8`yRhm#)V ztpg#qV0}Wp2w)?C>@XHByMzGGyI8mX5DDN9k(j68QUrK*<*4}s6T-&`NE&i$f>S~v zT3EUolL-0FLkjzb0%QCykgz!<@Cx}a2TU0T)+G?ei{jdXtU?fJANqnc94tgH!XOcd zVdxJc4B3yMFNFI*N`!aO5Fu(7M}!00eq(5nRSXE@)EL0Thr7c;-RdUMFj)j71li7@ zFKi+pVQ6y^ebGAmPlJaefE~QAe_$M#G!j%WXcLWCL_!jf=@$Be>nkQPx|;?gffnl_ z8a^Ebs*HUM=S4wm@XQ{tjI1Rb76mb2iD5zTJSjv2H%CE|SeJ+)cq;<*5fLt^Fl{u% zjpauAn;?w`;lr*-2%7>0F~D`vkQ5dVHR_5LJ{JRIM)bewpvjl8BAI_*HO7F(4Y9$S zF_1piPp;o+7c(&F5)0G@cz#2P!(mNVQ}6dyuBo2_-jzBp+H~tG2+R|!9UcYuplo` zW9ZOP5qzL=ED4~N3brW5N$0mFY|79u?)Rc`YB)H712myMQ*20T+Cn3CeWSn3+^u62 z@1}ju;P3L7_(9cL@u-~Po>H_1r&sd^w_n|N#@7rw0EU2ioIT2qMavSi>wXjyss|2r zwb@=H%#InJ2Xs3NWVg1r92%b(98yFs!jg)ul!q0CEhK?*x44Zm?|lK|Xt(ar6+@!$ z|9m<)2#(EQkNKs_r?WMB&(aVzV$+Lrx1tJJxnzg&a$2b_CT|>oux|W}kDe^R*Npq} zbGV%H@+*pt^Dff~QgP=dhjxZhJXnYn+ky3qrn*^{&%)}>MU;w}dzg&=)A!D&REC$2 zy`-#!en)Y@UxO-H643e6%Iy$%7%U~*Tz)LNnHU$8snLObiTa#hR%c{SMlJnHV#@AX z8HOylIf=LG-?I4D$>tjepJn<61=ttw&!`+%^?sM)Pjp$q!2GUv@k%YD&kASWNxs<^ z;_ofBe_s18isd--U@1gC#brrc0-2xS3Pw|srjBy}YE81#NRdgG&lTFHszUT4{`3Se zOLHlSQJyY2=~}K(<{P)=bs;b{=+Ft^l*nxEBKCj0jq%sWP8}R`w_+p({dNje@>8S{ zPhrN%hfQQ8uh%Ls#OzoXt_zzDtw9@x1SD>`P%ZWG`U`is^O@+ycM}}gl-jRT^NlUj z;raIhle*iB(56W1w%q-f&d}*T$Jdqh%ZnaomH4YY%;{?)WpOzC&0=z>h(lz=h#K-FcKK)f7G;NO;wq5u&*9zw0YS^n_&#e(#k4jiknE<*W zZEX?ec$b(FP*rbt-SN(ctcGau73O@J?=={~FXWDwDZ~TuJQBe#+@lGtBOvOojk2BC zpqsI>t#J#rynAQqPFPVE9$^VeupJ5d-8(t3KP40?L>3S6pWy@Yqap|MYeNwN3lf&U zE{kAV^kmPgkxTtDYMH4BeaJ{0G~V;wtNq)*t~q117nV<+^PV%T|~ ze7Ye86-)W-tM_i&`Ir}3)(QDLL-GT-s80*dpVyp%o1<+b-GgRV8z>X>HVjSlWWey7 z40$_vAAjx($fxz`z!l1)fg9W+1gV#bv^ z7LDSf0S79zVijMz4FeB^Zd%JGPI%OZ7NqxoX^!hvylp9AQN$JWpiBhk>U;IOg&oW=) zOcZnc!gle*FC2(oF&;Vi|vmDMdks0TETts08ngH5d(c3 zzx)ZoNNi>>@A0_#6WczL>Z6zcmGPH(Dd5l^&D3ypE^k?N;rw`sekf|2-H#rif7Q~O z%)C9-eZ9&n|I_;zqQbT0@xQ+X8LKae+kkiPa$w)R`|qR*vc|-M%n}{Kfow4`K(j>T zpi>G$po+XK^d}78yb5dU<4}V-d@GDuvZ`-h}`dYqMY|BQCa&*jp)& zu@WXpmEhK&9*C2(uq8GIMfPx1I*py_R{gmc$c(`Ue&})$;y{2k*h93H;3==`5Z5Ce zoUk8byZ&Tai=wH+xJqrJyC15XHZb)2Rc5MzdPAq(j4ll@9~s`}U!eVc^w*twpXA;i{Q*c+pA_Opg@XoO(*%%% z#^v$AKm#Z^h%cu!3|LwwSxf(Dse%cwFsaff=Uqxphz_?$P;fKBBaTX z6zVTnkoZs4(2y)K2Utk8d^9u!UD^-|`g;T)xRV{g^wu#V2<;mg(9ve82Esqp=AJia zI~~Uo5kNDCGZ>#hS`-*eFK#Rs$0)t%+I;)l`_vcyc@lX~;(8xG!fsNSOJ4*A4GryV zehv5}ji5!{F&;~bq=hnVR6&j#=-ANrMalMCP12>lIfIB-0q=L`o5p(=wtKd?DD$Q~&0D+^^$ETnYRlWO!#h=(e0%70=|=LsoH}wkypKR_FfuC>3PaKsx%FXZW3rBd{l)xrSe7-X|emhN-57!$d-h zmS4Q@wEtBqJ>UM0cIS4IDVMSjir;aEQA+}Pmw66Ce1=$~zqFiMK3|Bp>0|NpcPt%( zi+i9~vo#NhhFnxKX4eQWnzn4L{)nqWnTRq|ly5taEsyaBhbCtdYGOJLG!r^k-ZerA zF0`qZCy)^nPs~*5Pa~pnwNaIJVFl;MA70uRTWv1v;VN^(5`&BK&^7tF+f#lCVaH3u zIC{D7BV97`to5f|4?IOV*}kA7J33!xKXjJc5iQth73XGl@pOei$F&7p4dgY;#>Mte zs-f-*jPOjcolb>pD6gXPvAEsgc(MJCWLvp0Oa~fis5GyNe9e^jAm_dL)2sP7dl%NR zsmmp((y~Z}8&!{nHBXSpeG7ph-Chy&;KF}4KQX=aNk94cm-{AL>9#ya{JA1U=+Lfc z^UV*l^}_bRqA#sDCmkAVMwl0nHMg`>({y_4;^vsstx*|>kZkU>=_j?AAcZ=&l*||m z{Z8Pb;>s3pXtQm)z7|?m7gZ*zqn9b?NchJgX-5}>Uz;0<;{K6&z1M80WrV6#bMt#$ zsFCL|aI=S;YV!g;ml^ajNs&5}xkONRm=yqXO}`GiG!G{mjc)z2Goa|55z*GYG=+az~F8-zDzqpyZA-H*`N5T?^W?WoIVxXhwD`F)@RZ2_#0_7Yfx*9 z_gr^qgZ=9*)N80~AG88p2T?twov^v6*WlCQm#di<{q+XPR^nQr$ib~}!td|jZV)&K z7@>CG$TUH_r9od;iJ#xd*@hvL_QM&Y!9NSxmiLgou)ISYROnKW^@H>KdU1Ic8E+6^ z5ckCR)V$5T-ay@f+VSCD@D6&Ayo+4+1?ENWV)qOj-x1Ie_r(0vwoSgCMg1DpfplMI z^Lm5+ccxV)^vFDcdH2o)@$VuBGQ}hS{TTf_(IP^GEYjeh7{kFaVgNRXNN@=fG-EhF zh{9D2a_ol&{nvm{xT^kh@=tAx#}L%NF68#B|1(4bhW}@Lc3Sz@0Lz<0!9%9JXaAX^ z|IYE$kc#AXz~7VwtV{o9k;d8}fJLAH)S#?XVqia^A9qsg&sGr!9!8`b3OJj<3W5<`+5Gt!_0GHHcWE@>6*CE6TIOAwcT{f>;vUfjF=6f(MsEw#AM-T2ugqr zcvy68RRjZNRu?bZZlql`!jYig-etcd;`T4kyXm5}{l?~?L{PKtXTIpe< z+};~sO8kI>F)Q0kp_C#1V?_bVoWYJ6jZyE)3tPs>O|q@Cfh}uqU`B0D`fQpX)r^N;wbHWl=x-kxQ}beH)?f>S-K zHK>o!Hh)t}?{^u)v0_4iM-wWxWUYtJ*GH z>CbwWWbEUe$pJjV-ObQ}qHCS)h7L34nMSia6f|6IMfviw2R8yN8F+A!KyT~Y>MCn$ zx@u%XCo63Q$r5*R8mO-DbIVfsc=`M(9ZDg74GG%1WUHlcjbSPzq0X{`d2Y5e=;?<~ zurXVpC~b(|4cqd}@={-=m5EPjde_2c->0aiGp)_<h5Qeoc9* zNf!@^tEl-wiO0eBcv|6Tz-t;<1GDt1Zd~LRIUqecQ&7gV~FcUzJb^ZOq+_yrnyDf#=YSE{ARhk>?6R zo)o=Q0c2fnSaDiAfp^+OSFWh;kGsi_Y^!ZC7Sod0C60t0jFJVUcDhE4_rn5N#hFD;kHsV)A%vgB`3vJ1gR8T_E=W3z#2ME38A4o$@31PMea|C z4T~>}p9h~?5Kgj@Rbijqp)}?4Q1E@#Cl&OGXoxaUch`l)&>KW@#$|-GA|mR(496Jjn`Na;IKS!R3u zbT?D_w+>&SNKW}{Q+v@cfBW&bijhf@9l-_AXJd~M0#O=~a2!sU?;X}rlw0sFEZ?-i9lR400vEV`$9>nt{C{!_w^%BsV6 zkAT^0OdGuX`=c=Nl+!@u-D|}{^hNqO^G27veQvLG#?7|naLhhu+yG5^1D5%32`l)N zs5cc=8ae;Zr6SrvCO(ro%5kRtOe5T@E?mtj zhAbZXZljAU(+jqOUB!LEirrORgznt-!}aOe%s3*0Pr`%yalS{5BitHfdV?eIjB0A* zPXI<{Him*RDQ|XoLe^}jx#*b|hEEcjPOH=!jkSyS9(Bz`NyN82)$A&`Q#lxNM2(f+~7s8uEPJu~U}`{V9T~rZK}Oilzx| z(w^-Sp1K9YqnvzqmESPzoo(PpNSJKI@aid$mt)oV#GX7{&x-O$bZ|*?P+0j@xgA^C zdbRpvG&IJp?MQ|7^=j9$c-Kxv)>%1zhgv-)F3ql;-c0;C(|f``BJOPQsQMW(H1p&x z7uDbE@j0rf*F!x@qsL>EdKW69;Q0?uEYKM3QnUHd$EQWWigW>A)eG+2lxXwM5< zqND`XweP=$;6IQ42`xgY0Af4SE*mzI7$Yx}ayZh6e=kEB^^;f#PfR);x|drjNyd%O z!B11gDe5Y9cGY~9=57nL((2PCaWl8e? z_&~_o#^_O=PF`irJo-ns+>3~G`h7>0t2RNA%Z>WON;>SqHv*djMqrQL$~S}z9Inwr zH9pc+gKJfUjPo9yC6ijXrp9sl^R8je=5FVZK{=jD?IqA>9y-16@F+84vTjgbP64lyZl{M9M*~!K{1Acymi= zl{u0%!H1leaBhbl*pv-cS6nCSLZ*UUH|H2J`p2_;UN3J+06YTBa2sRW8~xJsmwx## zUYOwDR#5Q3L}k6mX%QU3hKe-X==#daHKfnv%}8Gnkv@ZcwbU8J4YY53Q-8}#PN&36 zBfT(@i=TCpug757oB1jmS%z%?=5-!haW=oWoWCW1hb0g_K}nsWQ?{a7=9P2RS8SUr z0M-H3XqdGz%*;Hdnu8})zZ+rYhvZYYvH9^N zQSMi&(dG(q&8gA_&F8KDk=zX$E75Vn4?6r*X;c-;W!Dqt0Gc4<4Dz#L0v69Bv+Q~) zecX8On!+;XYMFXZUOina>QM)YG@`VOzUDi;j+g~s_U)WDX*Zb$!3UjJ3ifye^#?ttmsN{|Ev@2Ee8Z;|_y;e@URXpq>*z*yrax5eN)uWyAQL>hGBGwL{Qx;6(%{|KeeUm=A76QGKZqa24&l{iFvQv za~JVa*(Qi-ED!~v`F4@Sex8jD#s4NA3QPxTPp|k=f2hV!TDpbPrCzQZN}k2Gb>+eJ zm|WBIb77g_bH<+u`BjIbQ4O3I#hzE8Zlstvnh$!G)A7=&z*8NY?TY;+y5nRzrdD$J z29sI?#hH&eej8@PWJ*)%$bMoa(A6X5;wW&5-v34pUp=_gWUS>VONW2ZDy2Mti)~s+ z?!}DRU`obTFj~RWp@Y@dE`7e!5>Ld*!>hlrJm6oY!ecqyVYIB?*L{%6Kr}0h5Y*H+BD*#nS@-Tu3Z^A zrBXA;;8}8+7^iY7o2vI&1Z@zAx}H)){hc@eENlK{QEu#W zXYdyw)%3G9h_;qW#M$94P*@lfxT^)tkE>qw2CxJe(m3bl0N+BQ)2PFKYE<>(_B{Iw z`R1q0SplWX`+MlWBa%3rzCY^?561ro4^Ue&BIH+oDFBjKyM_fF5y20tnUsVK4YmXR zYrMI@gKcd9s1T8>>VIp&x>f*8h{;3Ee`@?krN9_&Q1Er0fQEm4AnpBK|29Je??(PL zz#kpnNEW!6q5t^`EcE_sfS0mTNd?&Natr?{Djpo*N~J~QYL3A zCS(9X>Rl-H5k`FoM{F%BZN4oMM_6w#&*~P3p7fMUo^9?q}L$h~OrtDw3zx28S214WCL?|3H**ud);x%ZVOwY+}e)M$bcXDUriR?i#;jQ8$--O)(MaXU$ML+F7Kv>j@;}@hxoch?)6RE{TU{lr>-rQ! zT71dA!3$>8^;+qr}yWbWD2T!tKh@;N=~pZVczMBN?i-? zeVJ2sgypCsFH%$kE<%-%F2$Ae6~@ltTyRFWQ-703uoPCjP6lS){wXggcAu1>=q0C= zjG~S=V7W$s>US6^Cme`Z(*~bFi%Xmq;ht{;p<_cypr5o zQ2YPDhC!$JwthZi%nqSJ1FacYUvUSlDR(O5qe~neYGE%Q=gz~{boBDl7E6u?Acnxx z9Zmp@)287QR)GdOY!*qAh#Tab4|FLMu%k`b0hEv9TATD1K`2sZ1SLs=2UZ=A%Uj|Uo=`9s5w3$Jr~k^x&@oi$}u zMRkK)kctaiebZ@ja|P_8>IRt6R|$&{?7OfP(7?x8O`<{iOFp_j@W0>!|_C2eF zHX_TIR0>=f$o<#ZIa3%r*XfK0nCDv+j`>mLT|p2J3+Q2&7)W9F>ac?@*^*Cyeg=pp zzJH%?roBSwl8M(}T91QY_qmZaT5uD~%QCcWfLCLfsN(+rjmEbA~mF< zuRy!Ob*WO-2lQnVzILsnUbAo9BP5%+OKx41yf_gcp6SkYQryDMRW5&j5eg6r7EE_3 z89-cS9$=XCklI2I>l@zIcRmRT3iUU*4mU^`K+7XKJfHTmeu4|`x2brJ%YpO-QRom8 zWf|F+B1cP=3A25-x|dzfKD&|LI2PU53S{tE8B`f)1=fFxmV$|KnyK!?{B(fDYnA4+ zu}u*2vkpIPP-H;Z%8j?|JUVxnZLxsnWvr9i^q7p_z0u=KV}DYVO~fo?F!pNcxvkS- z{8F$w%@KcUH4@=8pUNxclcEFY(;qU9!lPXWz#dw(u(55ZtwRsie29cHiw*fV#*gUB zXzh_DF2EcmJs-NYytu$q(`L$1R{m!xz8#M)qw@kf9ORh2P!z|sR+fUNxVoLO@58h@PF-_h` zl~0`R_y$ENhY#MsP(>|HR_fySq)Dd)1aj>XKA^Dw5>$d~;<(BrlU@yX6?Ijy%QBNK z{gN(?P*q9aE>q&^XjM7WV26lWzd`;nWIMA!584@otCT6OEX8j@HLJ*coPf=p8dw(I zJME?Yp>t*uPvFl$QH95l#2TYj_9}rTRsEv3A~+_=+mc-S7|c!@8w(7;`si36PNXmo}`*yMU@A54Dq&C6UmB%m~W%vrL7X zfAXr_t^@F4SK~nS6TN4Ej+a?4hK86mt2-TWO=^3E_Uu3aJm|B+D0=5)9x8>Pt$a^2+#D45DH+-`Bt0qqdOG7 z^AF7RgtX>{*E(4|Q96f`4w2lnyiA~FvxJss>Iq04PvJ9ur;GAId<^ebSv{nW(+rmO zMy4thMW*(bs~>-_#-x57@&qpp?gQVuO+cS_IHNIw(3ukg(FNKgGxv%Aq(+~GnvoZU zCSX5n@+y&|oPR`dtQ|ti{V_CjAij%9akIeWyXnXnvyABW!E2;Eq&7<#uNZI6W!dF7 zecl#_P(Q}())@&jQI)XI=!0^J zX?sDo7JC#?&N|zsdog#V1p4n+qUUC;^@fCZ%oyw3BlJIM+F^6|TF*+yMR=`m2*xv>fi^q~ zzCtnEZ{oSahq=NBJQwg>CEWuj?4e_q0UIQGV(tss4u-x`3W?FHLV7$W$mv;92qV86r^peAfqjX@a;o5Mw9Ug(5S~?kSS+3z zhlAxnKkfL2JakHH`NT?S`BeDs>2%^wcna=M*}Ds(+6OGvhYL!}Cxa_rtL4eh zBkHJo!Z0r64nQz@MR_?}r`x+j9jHTv(#RLOih6_29`L*Kvg8A6EUNVk?Ducb@v?Sdw z61iYEyyG={?WHv8pq%xLl>NQyiM+$qlW9-IUy_83zuVed(5f%$t2Ma%u9)~uaK%t= zi?2DNp#ju-JQZkqjSS>OS32zZ*cy=D8n5n%S+Q$ex~`@=US^w3%rt>Icb@Cd&FH%- zv!<40P}ScUt|JUF)0|pJNRS{?(#j`u;TmRA9??-L#H_@y`)QlQ(N$mwA+zC9Bs4IU zrMkw8^r}?0G-;8cDl6wu<^q55z}D!GyKoD?vINpRi3Zo^X;Uzpxz94q=U*IY1DePX zX#}^OL@KkDEAyR1(y(8$Vehj8m@?fQ0&&_!5e=*m4eVs;(>xkr{bFEVJz;-?Q2gxo zWm|zsRr0|dTI;tgVI6pPhwt45ZM(}E#tZQL(8)Ku5qGE9kYDRzo+|KOxWZr6YB9`T z+a36;qWOEGc!i14d;Bp)(G>e8U?}JkRR$_3=;i)h5%eLrmIl!YSy62s)bBq_}B z^Dh*`WA!S`eFV(SejGoaUoN}9Ygvd;#PmpA3LkMH82_RyUzdI=qhMF5a-pnH*d$O` za?PjNu=m;*LvVZ~QH*GlWMU0T2b%0u#QhN3PJrXpl(RGxj>FVM{&vjIugjoSq8g)e zWS!UT|10t&f|m>p)++QS=m4V;V~b>tsCd&j3IPmLx=NXyVj*^F2EuIeC;CG@@ztjE zBFCvY`4wOt{N8`JtZr)Yn`m@~?MisLf*tS;irBOg2C2nl?vLBr$YSHyI57F~LQPNQA1 zsf|kp#2kZEKyFcR{rvm#`XvlJ?jr8k#~Cf~G@B@sZ^@W%HshCnnbt1OITS>-MpzfL z{UE0C!X|F))=#TxX^eqqotGsO?)ZlkreVmKYkK1}R{wGu4R4Z+X4roO8{m)bP?!z0 zC;)WWhL1>qPC&ye1^@~Q{C4DO_=o^F0f1ROp|Bd>$f(wTgdGjS1b{o}|6Kdlg4w`@ z4Y-E^b5H{$!N0wr;2WZ80Udz9HpV}U7+8-CKm@ebz?LNN`x0*x_F;+MqE%I*6wrfP ztBt4)4Tk`y7^Yc@$32LFcl+6$o4#$q`}ogz?K6h=lC#&-itr?GYTDgxo`5=kfP%!0 z4&<5TnR&}~dD{Vef;D_6EW6PAQLz@Kpu9;oF(9|nV(8%erh~WI2PetNC|tdi&697# zejLC<1v5*T&tW;QuSX$jp)r;x9t9Z5GGQNGxIgK1V2hbZv2)%MiOK%-{z1WEoalkV zyud8>Il;*OEBn1_FTDeQ6`sq_u-)?9((#gd+IDylg}byf0n5&BUCW4^ijmdzP~y@u zwkSI1;e*oBy;3c8Gd&&l;gX6Gmq!&`jp;;S`c7leDqmTm{A|TS&(v>GrRY^D|-u zb?^&1J8yj9%hGRT2Vom6itxjQP_g~kBoNEBaGw2hebq7h; zSd_~%hEWl_pJ1hEmeIq2n1PZ)>JOd_cBk))L9|fa@(S-

yo{`kPS3AgxOC$By<* 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 From 2af277533b1594ddb21db84d8415579a59126551 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Mon, 31 Jan 2011 17:14:51 +0500 Subject: [PATCH 53/95] Changed the access token regex. --- .../constant/ApplicationConstants.properties | 2 +- dist/github-java-sdk.jar | Bin 169033 -> 169036 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/com/github/api/v2/services/constant/ApplicationConstants.properties b/core/src/main/resources/com/github/api/v2/services/constant/ApplicationConstants.properties index f65ca29..9762f09 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/ApplicationConstants.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/ApplicationConstants.properties @@ -5,6 +5,6 @@ com.github.api.v2.services.defaultApiVersion=v2 com.github.api.v2.services.defaultFormat=json com.github.api.v2.services.requestHeaders.Accept-Encoding=gzip, deflate com.github.api.v2.services.dateFormat=yyyy/MM/dd HH:mm:ss Z -com.github.api.v2.services.accessTokenPattern=access_token=([^&]+)(&expires=(\\d+))? +com.github.api.v2.services.accessTokenPattern=access_token=([^&^\\s]+)(&expires=(\\d+))? com.github.api.v2.services.accessDeniedPattern=false diff --git a/dist/github-java-sdk.jar b/dist/github-java-sdk.jar index 8e6b9c1a63e03ebd1e0a40be7ec2a546074fa296..13550d2fddefc4f73c66c44d538f8061b6dbf865 100644 GIT binary patch delta 6526 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 od;wJ=btH+yPPnRZ#dVR$+bQHB^(PVxi! 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 Date: Mon, 7 Feb 2011 13:18:34 +0500 Subject: [PATCH 54/95] Fixed Pull Request --- .../github/api/v2/services/CommitService.java | 16 + .../api/v2/services/OrganizationService.java | 14 +- .../api/v2/services/PullRequestService.java | 2 + .../api/v2/services/RepositoryService.java | 2 + .../v2/services/constant/ParameterNames.java | 2 + .../v2/services/impl/BaseGitHubService.java | 8 + .../v2/services/impl/CommitServiceImpl.java | 11 +- .../services/impl/PullRequestServiceImpl.java | 10 - .../constant/GitHubApiUrls.properties | 2 +- .../v2/services/constant/TestConstants.java | 9 + .../com/github/api/v2/schema/Discussion.java | 358 ++++++++++++++++++ .../com/github/api/v2/schema/PullRequest.java | 57 ++- .../com/github/api/v2/schema/Repository.java | 20 +- .../java/com/github/api/v2/schema/Team.java | 3 +- 14 files changed, 480 insertions(+), 34 deletions(-) create mode 100644 schema/src/main/java/com/github/api/v2/schema/Discussion.java diff --git a/core/src/main/java/com/github/api/v2/services/CommitService.java b/core/src/main/java/com/github/api/v2/services/CommitService.java index d3d88c4..493a9bf 100644 --- a/core/src/main/java/com/github/api/v2/services/CommitService.java +++ b/core/src/main/java/com/github/api/v2/services/CommitService.java @@ -39,6 +39,22 @@ public interface CommitService extends GitHubService { */ public List getCommits(String userName, String repositoryName, String branch); + /** + * Gets the commits. + * + * @param userName + * the user name + * @param repositoryName + * the repository name + * @param branch + * the branch + * @param pageNumber + * the page number + * + * @return the commits + */ + public List getCommits(String userName, String repositoryName, String branch, int pageNumber); + /** * Gets the commits. * diff --git a/core/src/main/java/com/github/api/v2/services/OrganizationService.java b/core/src/main/java/com/github/api/v2/services/OrganizationService.java index 2ff03b7..d5779e2 100644 --- a/core/src/main/java/com/github/api/v2/services/OrganizationService.java +++ b/core/src/main/java/com/github/api/v2/services/OrganizationService.java @@ -94,8 +94,16 @@ public interface OrganizationService extends GitHubService { /** * Creates the team. * - * @param team - * the team + * @param organizationName + * the organization name + * @param teamName + * the team name + * @param permission + * the permission + * @param repoNames + * the repo names + * + * @return the team */ public Team createTeam(String organizationName, String teamName, Permission permission, List repoNames); @@ -168,6 +176,8 @@ public interface OrganizationService extends GitHubService { /** * Adds the team repository. * + * @param teamId + * the team id * @param userName * the user name * @param repositoryName diff --git a/core/src/main/java/com/github/api/v2/services/PullRequestService.java b/core/src/main/java/com/github/api/v2/services/PullRequestService.java index 2c3383d..9475415 100644 --- a/core/src/main/java/com/github/api/v2/services/PullRequestService.java +++ b/core/src/main/java/com/github/api/v2/services/PullRequestService.java @@ -81,6 +81,8 @@ public interface PullRequestService extends GitHubService { * the title * @param body * the body + * + * @return the pull request */ public PullRequest createPullRequest(String userName, String repositoryName, String base, String head, String title, String body); } diff --git a/core/src/main/java/com/github/api/v2/services/RepositoryService.java b/core/src/main/java/com/github/api/v2/services/RepositoryService.java index b69f6ad..336a863 100644 --- a/core/src/main/java/com/github/api/v2/services/RepositoryService.java +++ b/core/src/main/java/com/github/api/v2/services/RepositoryService.java @@ -152,6 +152,8 @@ public interface RepositoryService extends GitHubService { * the home page * @param visibility * the visibility + * + * @return the repository */ public Repository createRepository(String name, String description, String homePage, Visibility visibility); diff --git a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java index 2caa845..87ba0c5 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java +++ b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java @@ -180,4 +180,6 @@ public interface ParameterNames { /** The Constant COLLABORATOR_NAME. */ public static final String COLLABORATOR_NAME = "collaboratorName"; + /** The Constant PAGE. */ + public static final String PAGE = "page"; } diff --git a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java index 759c03d..8c7c59e 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java +++ b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java @@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.List; +import com.github.api.v2.schema.Discussion; import com.github.api.v2.schema.Gist; import com.github.api.v2.schema.Issue; import com.github.api.v2.schema.Language; @@ -171,6 +172,13 @@ public Organization.Type deserialize(JsonElement arg0, Type arg1, return Organization.Type.fromValue(arg0.getAsString()); } }); + builder.registerTypeAdapter(Discussion.Type.class, new JsonDeserializer() { + @Override + public Discussion.Type deserialize(JsonElement arg0, Type arg1, + JsonDeserializationContext arg2) throws JsonParseException { + return Discussion.Type.fromValue(arg0.getAsString()); + } + }); builder.registerTypeAdapter(Permission.class, new JsonDeserializer() { @Override public Permission deserialize(JsonElement arg0, Type arg1, diff --git a/core/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java index dfedeb5..86eece2 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java @@ -51,8 +51,17 @@ public Commit getCommit(String userName, String repositoryName, String sha) { @Override public List getCommits(String userName, String repositoryName, String branch) { + return getCommits(userName, repositoryName, branch, 1); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.CommitService#getCommits(java.lang.String, java.lang.String, java.lang.String, int) + */ + @Override + public List getCommits(String userName, String repositoryName, + String branch, int pageNumber) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.CommitApiUrls.GET_COMMITS_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, branch).buildUrl(); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, branch).withParameter(ParameterNames.PAGE, String.valueOf(pageNumber)).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); return unmarshall(new TypeToken>(){}, json.get("commits")); diff --git a/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java index 57395a8..ff898b7 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java @@ -26,7 +26,6 @@ import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; -import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; @@ -87,13 +86,4 @@ public PullRequest createPullRequest(String userName, String repositoryName, Str return unmarshall(new TypeToken(){}, json.get("pull")); } - - /* (non-Javadoc) - * @see com.github.api.v2.services.impl.BaseGitHubService#getGsonBuilder() - */ - protected GsonBuilder getGsonBuilder() { - GsonBuilder gson = super.getGsonBuilder(); - gson.setDateFormat("yyyy-MM-dd'T'HH:mm:ss"); - return gson; - } } diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index 48b5afb..957ad74 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -76,7 +76,7 @@ com.github.api.v2.services.repositoryService.getBranches=http://github.com/api/{ com.github.api.v2.services.repositoryService.getRepositoryArchive=https://github.com/{userName}/{repositoryName}/zipball/{branch} # Commit API -com.github.api.v2.services.commitService.getCommits=http://github.com/api/{version}/{format}/commits/list/{userName}/{repositoryName}/{branch} +com.github.api.v2.services.commitService.getCommits=http://github.com/api/{version}/{format}/commits/list/{userName}/{repositoryName}/{branch}?{page} com.github.api.v2.services.commitService.getCommitsFile=http://github.com/api/{version}/{format}/commits/list/{userName}/{repositoryName}/{branch}/{filePath} com.github.api.v2.services.commitService.getCommit=http://github.com/api/{version}/{format}/commits/show/{userName}/{repositoryName}/{sha} diff --git a/core/src/test/java/com/github/api/v2/services/constant/TestConstants.java b/core/src/test/java/com/github/api/v2/services/constant/TestConstants.java index 75015e1..25375b3 100644 --- a/core/src/test/java/com/github/api/v2/services/constant/TestConstants.java +++ b/core/src/test/java/com/github/api/v2/services/constant/TestConstants.java @@ -145,7 +145,16 @@ public final class TestConstants { /** The Constant TEST_HEAD_SHA. */ public static final String TEST_HEAD_SHA = testConstants.getProperty("com.github.api.v2.services.testHeadSha"); + + /** The Constant TEST_ORGANIZATION_NAME. */ + public static final String TEST_ORGANIZATION_NAME = testConstants.getProperty("com.github.api.v2.services.testOrgName"); + + /** The Constant TEST_TEAM_NAME. */ + public static final String TEST_TEAM_NAME = testConstants.getProperty("com.github.api.v2.services.testTeamName"); + /** The Constant TEST_PULL_REQUEST_NUMBER. */ + public static final String TEST_PULL_REQUEST_NUMBER = testConstants.getProperty("com.github.api.v2.services.testPullRequestNumber"); + /** * Instantiates a new test constants. */ diff --git a/schema/src/main/java/com/github/api/v2/schema/Discussion.java b/schema/src/main/java/com/github/api/v2/schema/Discussion.java new file mode 100644 index 0000000..ee66e06 --- /dev/null +++ b/schema/src/main/java/com/github/api/v2/schema/Discussion.java @@ -0,0 +1,358 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import com.github.api.v2.services.constant.ApplicationConstants; + +/** + * The Class Discussion. + */ +public class Discussion extends SchemaEntity { + + /** The Constant COMMENT_DATE_FORMAT. */ + private static final SimpleDateFormat COMMENT_DATE_FORMAT = new SimpleDateFormat(ApplicationConstants.DATE_FORMAT); + + /** The Constant COMMIT_DATE_FORMAT. */ + private static final SimpleDateFormat COMMIT_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + + /** + * The Enum Type. + */ + public enum Type implements ValueEnum { + + /** The ISSU e_ comment. */ + ISSUE_COMMENT("IssueComment"), + /** The COMMIT. */ + COMMIT("Commit"); + + /** The Constant stringToEnum. */ + private static final Map stringToEnum = new HashMap(); + + static { // Initialize map from constant name to enum constant + for (Type op : values()) { + stringToEnum.put(op.value(), op); + } + } + + /** The value. */ + private final String value; + + /** + * Instantiates a new type. + * + * @param value + * the value + */ + Type(String value) { + this.value = value; + } + + /* (non-Javadoc) + * @see com.github.api.v2.schema.ValueEnum#value() + */ + @Override + public String value() { + return value; + } + + /** + * From value. + * + * @param value + * the value + * + * @return the type + */ + public static Type fromValue(String value) { + return stringToEnum.get(value); + } + } + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** The created at. */ + private String createdAt; + + /** The body. */ + private String body; + + /** The updated at. */ + private Date updatedAt; + + /** The id. */ + private long id; + + /** The user. */ + private User user; + + /** The gravatar id. */ + private String gravatarId; + + /** The type. */ + private Type type; + + /** The sha. */ + private String sha; + + /** The author. */ + private String author; + + /** The subject. */ + private String subject; + + /** The email. */ + private String email; + + /** + * Gets the type. + * + * @return the type + */ + public Type getType() { + return type; + } + + /** + * Sets the type. + * + * @param type + * the new type + */ + public void setType(Type type) { + this.type = type; + } + + /** + * Gets the created at. + * + * @return the created at + */ + public Date getCreatedAt() { + try { + return getDateFormat().parse(createdAt); + } catch (ParseException e) { + return null; + } + } + + /** + * Sets the created at. + * + * @param createdAt + * the new created at + */ + public void setCreatedAt(Date createdAt) { + this.createdAt = getDateFormat().format(createdAt); + } + + /** + * Gets the body. + * + * @return the body + */ + public String getBody() { + return body; + } + + /** + * Sets the body. + * + * @param body + * the new body + */ + public void setBody(String body) { + this.body = body; + } + + /** + * Gets the updated at. + * + * @return the updated at + */ + public Date getUpdatedAt() { + return updatedAt; + } + + /** + * Sets the updated at. + * + * @param updatedAt + * the new updated at + */ + public void setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + } + + /** + * Gets the id. + * + * @return the id + */ + public long getId() { + return id; + } + + /** + * Sets the id. + * + * @param id + * the new id + */ + public void setId(long id) { + this.id = id; + } + + /** + * Gets the user. + * + * @return the user + */ + public User getUser() { + return user; + } + + /** + * Sets the user. + * + * @param user + * the new user + */ + public void setUser(User user) { + this.user = user; + } + + /** + * Gets the gravatar id. + * + * @return the gravatar id + */ + public String getGravatarId() { + return gravatarId; + } + + /** + * Sets the gravatar id. + * + * @param gravatarId + * the new gravatar id + */ + public void setGravatarId(String gravatarId) { + this.gravatarId = gravatarId; + } + + /** + * Gets the sha. + * + * @return the sha + */ + public String getSha() { + return sha; + } + + /** + * Sets the sha. + * + * @param sha + * the new sha + */ + public void setSha(String sha) { + this.sha = sha; + } + + /** + * Gets the author. + * + * @return the author + */ + public String getAuthor() { + return author; + } + + /** + * Sets the author. + * + * @param author + * the new author + */ + public void setAuthor(String author) { + this.author = author; + } + + /** + * Gets the subject. + * + * @return the subject + */ + public String getSubject() { + return subject; + } + + /** + * Sets the subject. + * + * @param subject + * the new subject + */ + public void setSubject(String subject) { + this.subject = subject; + } + + /** + * Gets the email. + * + * @return the email + */ + public String getEmail() { + return email; + } + + /** + * Sets the email. + * + * @param email + * the new email + */ + public void setEmail(String email) { + this.email = email; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Comment [body=" + body + ", createdAt=" + createdAt + + ", gravatarId=" + gravatarId + ", id=" + id + ", updatedAt=" + + updatedAt + ", user=" + user + "]"; + } + + /** + * Gets the date format. + * + * @return the date format + */ + private SimpleDateFormat getDateFormat() { + return (getType() == Type.COMMIT)? COMMIT_DATE_FORMAT : COMMENT_DATE_FORMAT; + } +} diff --git a/schema/src/main/java/com/github/api/v2/schema/PullRequest.java b/schema/src/main/java/com/github/api/v2/schema/PullRequest.java index cfd0361..9853a49 100644 --- a/schema/src/main/java/com/github/api/v2/schema/PullRequest.java +++ b/schema/src/main/java/com/github/api/v2/schema/PullRequest.java @@ -16,6 +16,8 @@ */ package com.github.api.v2.schema; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -26,6 +28,9 @@ * The Class PullRequest. */ public class PullRequest extends SchemaEntity { + + /** The Constant DATE_FORMAT. */ + private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); /** The Constant serialVersionUID. */ private static final long serialVersionUID = 9155892708485181542L; @@ -37,7 +42,7 @@ public class PullRequest extends SchemaEntity { private String gravatarId; /** The issue updated at. */ - private Date issueUpdatedAt; + private String issueUpdatedAt; /** The votes. */ private int votes; @@ -61,10 +66,10 @@ public class PullRequest extends SchemaEntity { private State state; /** The created at. */ - private Date createdAt; + private String createdAt; /** The issue created at. */ - private Date issueCreatedAt; + private String issueCreatedAt; /** The html url. */ private String htmlUrl; @@ -87,6 +92,9 @@ public class PullRequest extends SchemaEntity { /** The labels. */ private List labels = new ArrayList(); + /** The discussion. */ + private List discussion = new ArrayList(); + /** * Gets the user. * @@ -131,7 +139,11 @@ public void setGravatarId(String gravatarId) { * @return the issue updated at */ public Date getIssueUpdatedAt() { - return issueUpdatedAt; + try { + return DATE_FORMAT.parse(issueUpdatedAt); + } catch (ParseException e) { + return null; + } } /** @@ -141,7 +153,7 @@ public Date getIssueUpdatedAt() { * the new issue updated at */ public void setIssueUpdatedAt(Date updatedAt) { - this.issueUpdatedAt = updatedAt; + this.issueUpdatedAt = DATE_FORMAT.format(updatedAt); } /** @@ -264,7 +276,11 @@ public void setState(State state) { * @return the created at */ public Date getCreatedAt() { - return createdAt; + try { + return DATE_FORMAT.parse(createdAt); + } catch (ParseException e) { + return null; + } } /** @@ -274,7 +290,7 @@ public Date getCreatedAt() { * the new created at */ public void setCreatedAt(Date createdAt) { - this.createdAt = createdAt; + this.createdAt = DATE_FORMAT.format(createdAt); } /** @@ -302,7 +318,11 @@ public void setComments(int comments) { * @return the issue created at */ public Date getIssueCreatedAt() { - return issueCreatedAt; + try { + return DATE_FORMAT.parse(issueCreatedAt); + } catch (ParseException e) { + return null; + } } /** @@ -312,7 +332,7 @@ public Date getIssueCreatedAt() { * the new issue created at */ public void setIssueCreatedAt(Date issueCreatedAt) { - this.issueCreatedAt = issueCreatedAt; + this.issueCreatedAt = DATE_FORMAT.format(issueCreatedAt); } /** @@ -448,6 +468,25 @@ public void setLabels(List labels) { this.labels = labels; } + /** + * Gets the discussion. + * + * @return the discussion + */ + public List getDiscussion() { + return discussion; + } + + /** + * Sets the discussion. + * + * @param discussion + * the new discussion + */ + public void setDiscussion(List discussion) { + this.discussion = discussion; + } + /* (non-Javadoc) * @see java.lang.Object#toString() */ diff --git a/schema/src/main/java/com/github/api/v2/schema/Repository.java b/schema/src/main/java/com/github/api/v2/schema/Repository.java index ad17a1c..aca4cd5 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Repository.java +++ b/schema/src/main/java/com/github/api/v2/schema/Repository.java @@ -142,10 +142,10 @@ public static Visibility fromValue(String value) { /** The id. */ private String id; - /** The pushed. */ + /** The pushed at. */ private Date pushedAt; - /** The created. */ + /** The created at. */ private Date createdAt; /** The source. */ @@ -512,28 +512,28 @@ public void setId(String id) { } /** - * Gets the pushed. + * Gets the pushed at. * - * @return the pushed + * @return the pushed at */ public Date getPushedAt() { return pushedAt; } /** - * Sets the pushed. + * Sets the pushed at. * - * @param pushed - * the new pushed + * @param pushedAt + * the new pushed at */ public void setPushedAt(Date pushedAt) { this.pushedAt = pushedAt; } /** - * Gets the created. + * Gets the created at. * - * @return the created + * @return the created at */ public Date getCreatedAt() { return createdAt; @@ -542,7 +542,7 @@ public Date getCreatedAt() { /** * Sets the created. * - * @param created + * @param createdAt * the new created */ public void setCreated(Date createdAt) { diff --git a/schema/src/main/java/com/github/api/v2/schema/Team.java b/schema/src/main/java/com/github/api/v2/schema/Team.java index c107976..e630a9e 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Team.java +++ b/schema/src/main/java/com/github/api/v2/schema/Team.java @@ -16,6 +16,7 @@ */ package com.github.api.v2.schema; +import java.util.ArrayList; import java.util.List; /** @@ -36,7 +37,7 @@ public class Team extends SchemaEntity { private Permission permission; /** The repo names. */ - private List repoNames; + private List repoNames = new ArrayList(); /** * Gets the id. From 2231c552ec57b2cf51af4c5614f72092141ef184 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Mon, 7 Feb 2011 13:20:26 +0500 Subject: [PATCH 55/95] Pull Request Discussion. --- dist/github-java-sdk.jar | Bin 169036 -> 173525 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/github-java-sdk.jar b/dist/github-java-sdk.jar index 13550d2fddefc4f73c66c44d538f8061b6dbf865..7006ef7ece26b1747d2bd26630b0f388c1bd301d 100644 GIT binary patch delta 29362 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 BY03Zq From 3ddae2892c1a86ed8077d994ded188b0da6390ed Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Mon, 7 Feb 2011 16:25:39 +0500 Subject: [PATCH 56/95] Added additional OAuth scopes. --- .../java/com/github/api/v2/services/OAuthService.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/OAuthService.java b/core/src/main/java/com/github/api/v2/services/OAuthService.java index c96bced..0bba1d8 100644 --- a/core/src/main/java/com/github/api/v2/services/OAuthService.java +++ b/core/src/main/java/com/github/api/v2/services/OAuthService.java @@ -34,9 +34,15 @@ public enum Scope implements ValueEnum { /** The USER. */ USER("user"), + + /** The PUBLIC_REPO. */ + PUBLIC_REPO("public_repo"), - /** The REPOSITORY. */ - REPOSITORY("repo"); + /** The REPOSITORY. */ + REPOSITORY("repo"), + + /** The GIST. */ + GIST("gist"); /** The Constant stringToEnum. */ private static final Map stringToEnum = new HashMap(); From 13dc2cc8ce103c59bdafcbd7f5b420f84d6af934 Mon Sep 17 00:00:00 2001 From: Azwan Adli Abdullah Date: Tue, 8 Feb 2011 10:49:26 +0800 Subject: [PATCH 57/95] getWatchers full=1 and all search services should escape the keyword string --- .../v2/services/impl/RepositoryServiceImpl.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java index ba70ba3..47fd392 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java @@ -246,12 +246,15 @@ public Map getTags(String userName, String repositoryName) { * @see com.github.api.v2.services.RepositoryService#getWatchers(java.lang.String, java.lang.String) */ @Override - public List getWatchers(String userName, String repositoryName) { + public List getWatchers(String userName, String repositoryName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_WATCHERS_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName) + .withField(ParameterNames.REPOSITORY_NAME, repositoryName) + .buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("watchers")); + return unmarshall(new TypeToken>(){}, json.get("watchers")); + //return unmarshall(new TypeToken>(){}, json.get("watchers")); } /* (non-Javadoc) @@ -283,7 +286,7 @@ public void removeDeployKey(String repositoryName, String id) { @Override public List searchRepositories(String query) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); - String apiUrl = builder.withField(ParameterNames.KEYWORD, query).buildUrl(); + String apiUrl = builder.withField(ParameterNames.KEYWORD, query, true).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); return unmarshall(new TypeToken>(){}, json.get("repositories")); @@ -295,7 +298,7 @@ public List searchRepositories(String query) { @Override public List searchRepositories(String query, Language language) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); - String apiUrl = builder.withField(ParameterNames.KEYWORD, query).withParameterEnum(ParameterNames.LANGUAGE, language).buildUrl(); + String apiUrl = builder.withField(ParameterNames.KEYWORD, query, true).withParameterEnum(ParameterNames.LANGUAGE, language).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); return unmarshall(new TypeToken>(){}, json.get("repositories")); @@ -307,7 +310,7 @@ public List searchRepositories(String query, Language language) { @Override public List searchRepositories(String query, int pageNumber) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); - String apiUrl = builder.withField(ParameterNames.KEYWORD, query).withParameter(ParameterNames.START_PAGE, String.valueOf(pageNumber)).buildUrl(); + String apiUrl = builder.withField(ParameterNames.KEYWORD, query, true).withParameter(ParameterNames.START_PAGE, String.valueOf(pageNumber)).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); return unmarshall(new TypeToken>(){}, json.get("repositories")); @@ -320,7 +323,7 @@ public List searchRepositories(String query, int pageNumber) { public List searchRepositories(String query, Language language, int pageNumber) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); - String apiUrl = builder.withField(ParameterNames.KEYWORD, query).withParameterEnum(ParameterNames.LANGUAGE, language).withParameter(ParameterNames.START_PAGE, String.valueOf(pageNumber)).buildUrl(); + String apiUrl = builder.withField(ParameterNames.KEYWORD, query, true).withParameterEnum(ParameterNames.LANGUAGE, language).withParameter(ParameterNames.START_PAGE, String.valueOf(pageNumber)).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); return unmarshall(new TypeToken>(){}, json.get("repositories")); From 285f2b614f650ad55d55a34cca86eb86c52cacb1 Mon Sep 17 00:00:00 2001 From: slapperwan Date: Tue, 8 Feb 2011 10:51:26 +0800 Subject: [PATCH 58/95] getWatchers full=1 and return list of User --- .../main/java/com/github/api/v2/services/RepositoryService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/github/api/v2/services/RepositoryService.java b/core/src/main/java/com/github/api/v2/services/RepositoryService.java index 726971c..0923440 100644 --- a/core/src/main/java/com/github/api/v2/services/RepositoryService.java +++ b/core/src/main/java/com/github/api/v2/services/RepositoryService.java @@ -268,7 +268,7 @@ public interface RepositoryService extends GitHubService { * * @return the watchers */ - public List getWatchers(String userName, String repositoryName); + public List getWatchers(String userName, String repositoryName); /** * Gets the forks. From ece0b21a9abf3b7b050aedd1a7ee2ddc68c0696b Mon Sep 17 00:00:00 2001 From: slapperwan Date: Tue, 8 Feb 2011 10:53:32 +0800 Subject: [PATCH 59/95] Fix param names --- .../com/github/api/v2/services/constant/ParameterNames.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java index ae8a2a9..6737a84 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java +++ b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java @@ -64,7 +64,7 @@ public interface ParameterNames { public static final String LANGUAGE = "language"; /** The Constant START_PAGE. */ - public static final String START_PAGE = "startPage"; + public static final String START_PAGE = "start_page"; /** The Constant VISIBILITY. */ public static final String VISIBILITY = "visibility"; @@ -180,4 +180,7 @@ public interface ParameterNames { /** The Constant HEAD. */ public static final String HEAD = "head"; + /** The Constant FULL */ + public static final String FULL = "full"; + } From 9d11df6b2a36b5b2e25c06c39398b556fc3f26d7 Mon Sep 17 00:00:00 2001 From: slapperwan Date: Tue, 8 Feb 2011 10:54:45 +0800 Subject: [PATCH 60/95] Add service to get feed with json response --- .../github/api/v2/services/FeedService.java | 23 +++++++++++++++ .../api/v2/services/impl/FeedServiceImpl.java | 28 +++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/core/src/main/java/com/github/api/v2/services/FeedService.java b/core/src/main/java/com/github/api/v2/services/FeedService.java index aa469d9..027bbf2 100644 --- a/core/src/main/java/com/github/api/v2/services/FeedService.java +++ b/core/src/main/java/com/github/api/v2/services/FeedService.java @@ -16,7 +16,10 @@ */ package com.github.api.v2.services; +import java.util.List; + import com.github.api.v2.schema.Feed; +import com.github.api.v2.schema.UserFeed; /** @@ -143,4 +146,24 @@ public interface FeedService extends GitHubService { * @return the blog feed */ public Feed getBlogFeed(int count); + + /** + * Gets the public user feed with json response. + * + * @param userName + * the user name + * + * @return the private user feed + */ + public List getPrivateUserFeedJson(String userName); + + /** + * Gets the private user feed with json response. + * + * @param userName + * the user name + * + * @return the public user feed + */ + public List getPublicUserFeedJson(String userName); } diff --git a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java index 44dff50..cdfcd38 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java @@ -16,15 +16,21 @@ */ package com.github.api.v2.services.impl; +import java.io.InputStreamReader; +import java.util.List; + import com.github.api.v2.schema.Feed; +import com.github.api.v2.schema.UserFeed; import com.github.api.v2.services.FeedService; import com.github.api.v2.services.GitHubException; import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; /** @@ -160,6 +166,9 @@ protected Feed unmarshall(String apiUrl) { } JsonElement data = json.get("responseData"); if (data != null) { + //Gson gson = getGsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create(); + //Gson gson = getGsonBuilder().create(); + //return gson.fromJson(data, new TypeToken>(){}.getType()); return unmarshall(new TypeToken(){}, data.getAsJsonObject().get("feed")); } } @@ -174,6 +183,25 @@ protected GsonBuilder getGsonBuilder() { gson.setDateFormat("EEE', 'dd' 'MMM' 'yyyy' 'HH:mm:ss' 'Z"); return gson; } + + /* (non-Javadoc) + * @see com.github.api.v2.services.FeedService#getPrivateUserFeedJson(java.lang.String) + */ + @Override + public List getPrivateUserFeedJson(String userName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_PRIVATE_USER_FEED_JSON_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); + JsonArray json = unmarshallArray(callApiGet(apiUrl)); + return unmarshall(new TypeToken>(){}, json); + } + + @Override + public List getPublicUserFeedJson(String userName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_PUBLIC_USER_FEED_JSON_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); + JsonArray json = unmarshallArray(callApiGet(apiUrl)); + return unmarshall(new TypeToken>(){}, json); + } // @SuppressWarnings("unchecked") // private Feed populateFeed(SyndFeed feed) { From c46f9f27918eeb07e32b9a51a673b9aa0e5351d7 Mon Sep 17 00:00:00 2001 From: slapperwan Date: Tue, 8 Feb 2011 10:55:20 +0800 Subject: [PATCH 61/95] Add service to get feed with json response --- .../com/github/api/v2/services/constant/GitHubApiUrls.java | 6 ++++++ .../api/v2/services/constant/GitHubApiUrls.properties | 6 ++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java index bf9d725..df00ab4 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java +++ b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java @@ -384,9 +384,15 @@ public static interface FeedUrls { /** The Constant GET_PUBLIC_USER_FEED_URL. */ public static final String GET_PUBLIC_USER_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getPublicUserFeed"); + + /** The Constant GET_PUBLIC_USER_FEED_JSON_URL. */ + public static final String GET_PUBLIC_USER_FEED_JSON_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getPublicUserFeedJson"); /** The Constant GET_PRIVATE_USER_FEED_URL. */ public static final String GET_PRIVATE_USER_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getPrivateUserFeed"); + + /** The Constant GET_PRIVATE_USER_FEED_URL. */ + public static final String GET_PRIVATE_USER_FEED_JSON_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getPrivateUserFeedJson"); /** The Constant GET_COMMIT_FEED_URL. */ public static final String GET_COMMIT_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getCommitFeed"); diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index 63ae83e..5f4f93c 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -50,7 +50,7 @@ com.github.api.v2.services.networkService.getNetworkMeta=http://github.com/{user com.github.api.v2.services.networkService.getNetworkData=http://github.com/{userName}/{repositoryName}/network_data_chunk?{netHash}{startIndex}{endIndex} # Repository API -com.github.api.v2.services.repositoryService.searchRepositories=http://github.com/api/{version}/{format}/repos/search/{keyword}?{language}{startPage} +com.github.api.v2.services.repositoryService.searchRepositories=http://github.com/api/{version}/{format}/repos/search/{keyword}?{language}{start_page} com.github.api.v2.services.repositoryService.getRepository=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName} com.github.api.v2.services.repositoryService.updateRepository=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName} com.github.api.v2.services.repositoryService.getRepositories=http://github.com/api/{version}/{format}/repos/show/{userName} @@ -68,7 +68,7 @@ com.github.api.v2.services.repositoryService.addCollaborator=http://github.com/a com.github.api.v2.services.repositoryService.removeCollaborator=http://github.com/api/{version}/{format}/repos/collaborators/{repositoryName}/remove/{userName} com.github.api.v2.services.repositoryService.getPushableRepositories=http://github.com/api/{version}/{format}/repos/pushable com.github.api.v2.services.repositoryService.getContributors=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/contributors -com.github.api.v2.services.repositoryService.getWatchers=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/watchers +com.github.api.v2.services.repositoryService.getWatchers=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/watchers?full=1 com.github.api.v2.services.repositoryService.getForks=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/network com.github.api.v2.services.repositoryService.getLanguageBreakdown=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/languages com.github.api.v2.services.repositoryService.getTags=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName}/tags @@ -112,7 +112,9 @@ com.github.api.v2.services.pullRequestService.getPullRequests=http://github.com/ # Feed com.github.api.v2.services.feedService.getPublicUserFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg +com.github.api.v2.services.feedService.getPublicUserFeedJson=https://github.com/{userName}.json com.github.api.v2.services.feedService.getPrivateUserFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg +com.github.api.v2.services.feedService.getPrivateUserFeedJson=https://github.com/{userName}.private.json com.github.api.v2.services.feedService.getCommitFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}%2F{repositoryName}%2Fcommits%2F{branch}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg com.github.api.v2.services.feedService.getNetworkFeed=http://github.com/{userName}/{repositoryName}/network/feed com.github.api.v2.services.feedService.getWikiFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fwiki.github.com%2F{userName}%2F{repositoryName}%2Fwikis.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg From a966dd012284b83636e2665faf613fa336546a29 Mon Sep 17 00:00:00 2001 From: slapperwan Date: Tue, 8 Feb 2011 10:56:03 +0800 Subject: [PATCH 62/95] New method to unmarshall json array --- .../v2/services/impl/BaseGitHubService.java | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java index e6f92d1..25531a0 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java +++ b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java @@ -34,6 +34,7 @@ import com.github.api.v2.schema.Repository; import com.github.api.v2.schema.SchemaEntity; import com.github.api.v2.schema.Tree; +import com.github.api.v2.schema.UserFeed; import com.github.api.v2.services.AsyncResponseHandler; import com.github.api.v2.services.GitHubException; import com.github.api.v2.services.GitHubService; @@ -42,6 +43,7 @@ import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; @@ -155,12 +157,11 @@ public Date deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext return format.parse(arg0.getAsJsonPrimitive().getAsString()); } catch (ParseException e) { - format = new SimpleDateFormat("yyyy-MM-ddEHH:mm:ss'Z'"); + format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); try { return format.parse(arg0.getAsJsonPrimitive().getAsString()); } catch (ParseException e1) { - //throw new JsonParseException(e1); return null; } } @@ -217,6 +218,13 @@ public Permission deserialize(JsonElement arg0, Type arg1, return Permission.fromValue(arg0.getAsString()); } }); + builder.registerTypeAdapter(UserFeed.Type.class, new JsonDeserializer() { + @Override + public UserFeed.Type deserialize(JsonElement arg0, Type arg1, + JsonDeserializationContext arg2) throws JsonParseException { + return UserFeed.Type.fromValue(arg0.getAsString()); + } + }); return builder; } @@ -243,6 +251,29 @@ protected JsonObject unmarshall(InputStream jsonContent) { } } + /** + * Unmarshall. + * + * @param jsonContent + * the json content + * + * @return the json array + */ + protected JsonArray unmarshallArray(InputStream jsonContent) { + try { + JsonElement element = parser.parse(new InputStreamReader(jsonContent, UTF_8_CHAR_SET)); + if (element.isJsonArray()) { + return element.getAsJsonArray(); + } else { + throw new GitHubException("Unknown content found in response." + element); + } + } catch (Exception e) { + throw new GitHubException(e); + } finally { + closeStream(jsonContent); + } + } + /** * Creates the git hub api url builder. * From b083b761cbed4da400821faefbc52be529dd2806 Mon Sep 17 00:00:00 2001 From: slapperwan Date: Tue, 8 Feb 2011 10:56:36 +0800 Subject: [PATCH 63/95] Do not verify HTTPS connection --- .../api/v2/services/impl/GitHubApiGateway.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java b/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java index 8acc217..7c7c85b 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java +++ b/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java @@ -34,6 +34,10 @@ import java.util.logging.Logger; import java.util.zip.GZIPInputStream; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLSession; + import com.github.api.v2.services.GitHubException; import com.github.api.v2.services.auth.Authentication; import com.github.api.v2.services.auth.HeaderBasedAuthentication; @@ -245,6 +249,10 @@ protected InputStream callApiGet(String apiUrl, int expected) { request.setRequestProperty(headerName, requestHeaders.get(headerName)); } + //fixed for android 1.5, API 3 + if (request instanceof HttpsURLConnection) { + ((HttpsURLConnection) request).setHostnameVerifier(DO_NOT_VERIFY); + } request.connect(); if (request.getResponseCode() != expected) { @@ -542,4 +550,11 @@ private static String encodeUrl(String original) { return original; } } + + final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() { + public boolean verify(String hostname, SSLSession session) { + return true; + } + }; + } From 41f0644417c1b123350e8a2df46c2ccb77b37a84 Mon Sep 17 00:00:00 2001 From: slapperwan Date: Tue, 8 Feb 2011 10:59:49 +0800 Subject: [PATCH 64/95] News feed json --- .../com/github/api/v2/schema/Payload.java | 160 +++++++++++++++ .../api/v2/schema/PayloadPullRequest.java | 54 +++++ .../github/api/v2/schema/PayloadTarget.java | 50 +++++ .../com/github/api/v2/schema/UserFeed.java | 190 ++++++++++++++++++ 4 files changed, 454 insertions(+) create mode 100644 schema/src/main/java/com/github/api/v2/schema/Payload.java create mode 100644 schema/src/main/java/com/github/api/v2/schema/PayloadPullRequest.java create mode 100644 schema/src/main/java/com/github/api/v2/schema/PayloadTarget.java create mode 100644 schema/src/main/java/com/github/api/v2/schema/UserFeed.java diff --git a/schema/src/main/java/com/github/api/v2/schema/Payload.java b/schema/src/main/java/com/github/api/v2/schema/Payload.java new file mode 100644 index 0000000..c62f14b --- /dev/null +++ b/schema/src/main/java/com/github/api/v2/schema/Payload.java @@ -0,0 +1,160 @@ +package com.github.api.v2.schema; + +import java.util.List; + +public class Payload extends SchemaEntity { + + /** The repo */ + private String repo; + + /** The actor */ + private String actor; + + /** The actor gravatar */ + private String actorGravatar; + + /** The ref */ + private String ref; + + /** The action */ + private String action; + + /** The number (issue number, pull request number)*/ + private int number; + + /** The commit (comment commit) */ + private String commit; + + /** The shas */ + private List shas; + + /** The pull request */ + private PayloadPullRequest pullRequest; + + /** The name */ + private String name; + + /** The target */ + private PayloadTarget target; + + /** The object */ + private String object; + + /** The objectName */ + private String objectName; + + /** The member */ + private String member; + + public String getRepo() { + return repo; + } + + public void setRepo(String repo) { + this.repo = repo; + } + + public String getActor() { + return actor; + } + + public void setActor(String actor) { + this.actor = actor; + } + + public String getActorGravatar() { + return actorGravatar; + } + + public void setActorGravatar(String actorGravatar) { + this.actorGravatar = actorGravatar; + } + + public String getRef() { + return ref; + } + + public void setRef(String ref) { + this.ref = ref; + } + + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } + + public int getNumber() { + return number; + } + + public void setNumber(int number) { + this.number = number; + } + + public List getShas() { + return shas; + } + + public void setShas(List shas) { + this.shas = shas; + } + + public String getCommit() { + return commit; + } + + public void setCommit(String commit) { + this.commit = commit; + } + + public PayloadPullRequest getPullRequest() { + return pullRequest; + } + + public void setPullRequest(PayloadPullRequest pullRequest) { + this.pullRequest = pullRequest; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public PayloadTarget getTarget() { + return target; + } + + public void setTarget(PayloadTarget target) { + this.target = target; + } + + public String getObject() { + return object; + } + + public void setObject(String object) { + this.object = object; + } + + public String getObjectName() { + return objectName; + } + + public void setObjectName(String objectName) { + this.objectName = objectName; + } + + public String getMember() { + return member; + } + + public void setMember(String member) { + this.member = member; + } +} diff --git a/schema/src/main/java/com/github/api/v2/schema/PayloadPullRequest.java b/schema/src/main/java/com/github/api/v2/schema/PayloadPullRequest.java new file mode 100644 index 0000000..1aefb97 --- /dev/null +++ b/schema/src/main/java/com/github/api/v2/schema/PayloadPullRequest.java @@ -0,0 +1,54 @@ +package com.github.api.v2.schema; + +public class PayloadPullRequest { + + private String title; + private int deletions; + private int issueId; + private int commits; + private int number; + private int id; + private int additions; + public String getTitle() { + return title; + } + public void setTitle(String title) { + this.title = title; + } + public int getDeletions() { + return deletions; + } + public void setDeletions(int deletions) { + this.deletions = deletions; + } + public int getIssueId() { + return issueId; + } + public void setIssueId(int issueId) { + this.issueId = issueId; + } + public int getCommits() { + return commits; + } + public void setCommits(int commits) { + this.commits = commits; + } + public int getNumber() { + return number; + } + public void setNumber(int number) { + this.number = number; + } + public int getId() { + return id; + } + public void setId(int id) { + this.id = id; + } + public int getAdditions() { + return additions; + } + public void setAdditions(int additions) { + this.additions = additions; + } +} diff --git a/schema/src/main/java/com/github/api/v2/schema/PayloadTarget.java b/schema/src/main/java/com/github/api/v2/schema/PayloadTarget.java new file mode 100644 index 0000000..8107d4f --- /dev/null +++ b/schema/src/main/java/com/github/api/v2/schema/PayloadTarget.java @@ -0,0 +1,50 @@ +package com.github.api.v2.schema; + +public class PayloadTarget extends SchemaEntity { + + /** The repos */ + private int repos; + + /** The followers */ + private int followers; + + /** The login */ + private String login; + + /** The gravatarId */ + private String gravatarId; + + public int getRepos() { + return repos; + } + + public void setRepos(int repos) { + this.repos = repos; + } + + public int getFollowers() { + return followers; + } + + public void setFollowers(int followers) { + this.followers = followers; + } + + public String getLogin() { + return login; + } + + public void setLogin(String login) { + this.login = login; + } + + public String getGravatarId() { + return gravatarId; + } + + public void setGravatarId(String gravatarId) { + this.gravatarId = gravatarId; + } + + +} diff --git a/schema/src/main/java/com/github/api/v2/schema/UserFeed.java b/schema/src/main/java/com/github/api/v2/schema/UserFeed.java new file mode 100644 index 0000000..87c1ef4 --- /dev/null +++ b/schema/src/main/java/com/github/api/v2/schema/UserFeed.java @@ -0,0 +1,190 @@ +package com.github.api.v2.schema; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +public class UserFeed extends SchemaEntity { + + /** The enum Type */ + public enum Type implements ValueEnum { + + /** The IssuesEvent. */ + ISSUES_EVENT("IssuesEvent"), + + /** The PushEvent. */ + PUSH_EVENT("PushEvent"), + + /** The CommitCommentEvent. */ + COMMIT_COMMENT_EVENT("CommitCommentEvent"), + + /** The PullRequestEvent. */ + PULL_REQUEST_EVENT("PullRequestEvent"), + + /** The WatchEvent */ + WATCH_EVENT("WatchEvent"), + + /** The GistEvent */ + GIST_EVENT("GistEvent"), + + /** The ForkEvent */ + FORK_EVENT("ForkEvent"), + + /** The ForkApplyEvent */ + FORK_APPLY_EVENT("ForkApplyEvent"), + + /** The FollowEvent */ + FOLLOW_EVENT("FollowEvent"), + + /** The CreateEvent */ + CREATE_EVENT("CreateEvent"), + + /** The DeleteEvent */ + DELETE_EVENT("DeleteEvent"), + + /** The WikiEvent */ + WIKI_EVENT("WikiEvent"), + + /** The MemberEvent */ + MEMBER_EVENT("MemberEvent") + ; + + /** The Constant stringToEnum. */ + private static final Map stringToEnum = new HashMap(); + + static { // Initialize map from constant name to enum constant + for (Type op : values()) { + stringToEnum.put(op.value(), op); + } + } + + /** The value. */ + private final String value; + + /** + * Instantiates a new type. + * @param value the value + */ + Type(String value) { + this.value = value; + } + + /* (non-Javadoc) + * @see com.github.api.v2.schema.ValueEnum#value() + */ + @Override + public String value() { + return value; + } + + /** + * From value. + * @param value the value + * @return the type + */ + public static Type fromValue(String value) { + return stringToEnum.get(value); + } + } + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 3211495454271146055L; + + /** The actor. */ + private User actorAttributes; + + /** The payload */ + private Payload payload; + + /** The repository */ + private Repository repository; + + /** The created at */ + private Date createdAt; + + /** The public */ + private boolean isPublic; + + /** The actor */ + private String actor; + + /** The url */ + private String url; + + /** The times */ + private int times; + + private Type type; + + public User getActorAttributes() { + return actorAttributes; + } + + public void setActorAttributes(User actorAttributes) { + this.actorAttributes = actorAttributes; + } + + public Payload getPayload() { + return payload; + } + + public void setPayload(Payload payload) { + this.payload = payload; + } + + public Repository getRepository() { + return repository; + } + + public void setRepository(Repository repository) { + this.repository = repository; + } + + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public boolean isPublic() { + return isPublic; + } + + public void setPublic(boolean isPublic) { + this.isPublic = isPublic; + } + + public String getActor() { + return actor; + } + + public void setActor(String actor) { + this.actor = actor; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public int getTimes() { + return times; + } + + public void setTimes(int times) { + this.times = times; + } + + public Type getType() { + return type; + } + + public void setType(Type type) { + this.type = type; + } +} From 9dbb736d8ca91289857426f3f2bfe510228912fb Mon Sep 17 00:00:00 2001 From: slapperwan Date: Tue, 8 Feb 2011 11:14:33 +0800 Subject: [PATCH 65/95] Revert --- .../v2/services/impl/BaseGitHubService.java | 43 +++++++++---------- .../v2/services/RepositoryServiceTest.java | 2 +- .../github/api/v2/schema/SchemaEntity.java | 3 +- 3 files changed, 23 insertions(+), 25 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java index b5de8a2..8c029eb 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java +++ b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java @@ -20,10 +20,7 @@ import java.io.InputStreamReader; import java.lang.reflect.Type; import java.nio.charset.Charset; -import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Date; import java.util.List; import com.github.api.v2.schema.Discussion; @@ -136,26 +133,26 @@ protected GsonBuilder getGsonBuilder() { builder.setDateFormat(ApplicationConstants.DATE_FORMAT); builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); - builder.registerTypeAdapter(Date.class, new JsonDeserializer() { - - @Override - public Date deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2) throws JsonParseException { - SimpleDateFormat format = new SimpleDateFormat(ApplicationConstants.DATE_FORMAT); - try { - return format.parse(arg0.getAsJsonPrimitive().getAsString()); - } - catch (ParseException e) { - format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); - try { - return format.parse(arg0.getAsJsonPrimitive().getAsString()); - } - catch (ParseException e1) { - return null; - } - } - } - - }); +// builder.registerTypeAdapter(Date.class, new JsonDeserializer() { +// +// @Override +// public Date deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2) throws JsonParseException { +// SimpleDateFormat format = new SimpleDateFormat(ApplicationConstants.DATE_FORMAT); +// try { +// return format.parse(arg0.getAsJsonPrimitive().getAsString()); +// } +// catch (ParseException e) { +// format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); +// try { +// return format.parse(arg0.getAsJsonPrimitive().getAsString()); +// } +// catch (ParseException e1) { +// return null; +// } +// } +// } +// +// }); builder.registerTypeAdapter(Issue.State.class, new JsonDeserializer() { @Override public Issue.State deserialize(JsonElement arg0, Type arg1, diff --git a/core/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java b/core/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java index 02cffa7..ad35df3 100644 --- a/core/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/RepositoryServiceTest.java @@ -221,7 +221,7 @@ public void testGetTags() { public void testGetWatchers() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Repository."), TestConstants.TEST_REPOSITORY_NAME); - List watchers = service.getWatchers(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); + List watchers = service.getWatchers(TestConstants.TEST_USER_NAME, TestConstants.TEST_REPOSITORY_NAME); assertNotNullOrEmpty("Watchers cannot be null or empty.", watchers); } diff --git a/schema/src/main/java/com/github/api/v2/schema/SchemaEntity.java b/schema/src/main/java/com/github/api/v2/schema/SchemaEntity.java index fa426f3..4a8a58c 100644 --- a/schema/src/main/java/com/github/api/v2/schema/SchemaEntity.java +++ b/schema/src/main/java/com/github/api/v2/schema/SchemaEntity.java @@ -17,6 +17,7 @@ package com.github.api.v2.schema; import java.io.Serializable; +import java.util.logging.Logger; /** @@ -25,7 +26,7 @@ public abstract class SchemaEntity implements Serializable { /** The logger. */ - //protected final Logger logger = Logger.getLogger(getClass().getCanonicalName()); + protected final Logger logger = Logger.getLogger(getClass().getCanonicalName()); /** The Constant serialVersionUID. */ private static final long serialVersionUID = 250056223059654638L; From 60c3a41df26735811d1215f22526e73cb49f7050 Mon Sep 17 00:00:00 2001 From: slapperwan Date: Tue, 8 Feb 2011 11:27:17 +0800 Subject: [PATCH 66/95] Fail-save when parsing date --- .../v2/services/impl/BaseGitHubService.java | 44 ++++++++++--------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java index 8c029eb..a9a356d 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java +++ b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java @@ -20,7 +20,10 @@ import java.io.InputStreamReader; import java.lang.reflect.Type; import java.nio.charset.Charset; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Date; import java.util.List; import com.github.api.v2.schema.Discussion; @@ -133,26 +136,27 @@ protected GsonBuilder getGsonBuilder() { builder.setDateFormat(ApplicationConstants.DATE_FORMAT); builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); -// builder.registerTypeAdapter(Date.class, new JsonDeserializer() { -// -// @Override -// public Date deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2) throws JsonParseException { -// SimpleDateFormat format = new SimpleDateFormat(ApplicationConstants.DATE_FORMAT); -// try { -// return format.parse(arg0.getAsJsonPrimitive().getAsString()); -// } -// catch (ParseException e) { -// format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); -// try { -// return format.parse(arg0.getAsJsonPrimitive().getAsString()); -// } -// catch (ParseException e1) { -// return null; -// } -// } -// } -// -// }); + //fail-save + builder.registerTypeAdapter(Date.class, new JsonDeserializer() { + + @Override + public Date deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2) throws JsonParseException { + SimpleDateFormat format = new SimpleDateFormat(ApplicationConstants.DATE_FORMAT); + try { + return format.parse(arg0.getAsJsonPrimitive().getAsString()); + } + catch (ParseException e) { + format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + try { + return format.parse(arg0.getAsJsonPrimitive().getAsString()); + } + catch (ParseException e1) { + return null; + } + } + } + + }); builder.registerTypeAdapter(Issue.State.class, new JsonDeserializer() { @Override public Issue.State deserialize(JsonElement arg0, Type arg1, From a84ce58abc07eee02f18fa273a990a5042491499 Mon Sep 17 00:00:00 2001 From: slapperwan Date: Thu, 10 Feb 2011 17:14:37 +0800 Subject: [PATCH 67/95] New property targetId --- .../main/java/com/github/api/v2/schema/Payload.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/schema/src/main/java/com/github/api/v2/schema/Payload.java b/schema/src/main/java/com/github/api/v2/schema/Payload.java index c62f14b..572ddee 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Payload.java +++ b/schema/src/main/java/com/github/api/v2/schema/Payload.java @@ -46,6 +46,9 @@ public class Payload extends SchemaEntity { /** The member */ private String member; + /** The target id */ + private String targetId; + public String getRepo() { return repo; } @@ -157,4 +160,12 @@ public String getMember() { public void setMember(String member) { this.member = member; } + + public String getTargetId() { + return targetId; + } + + public void setTargetId(String targetId) { + this.targetId = targetId; + } } From 5e2012431de3185eb6737ccd02910ba7413d16a0 Mon Sep 17 00:00:00 2001 From: slapperwan Date: Thu, 10 Feb 2011 17:20:54 +0800 Subject: [PATCH 68/95] Fixed property type for author and id --- .../java/com/github/api/v2/schema/Discussion.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/schema/src/main/java/com/github/api/v2/schema/Discussion.java b/schema/src/main/java/com/github/api/v2/schema/Discussion.java index ee66e06..22b9e5e 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Discussion.java +++ b/schema/src/main/java/com/github/api/v2/schema/Discussion.java @@ -101,7 +101,7 @@ public static Type fromValue(String value) { private Date updatedAt; /** The id. */ - private long id; + private String id; /** The user. */ private User user; @@ -116,7 +116,7 @@ public static Type fromValue(String value) { private String sha; /** The author. */ - private String author; + private User author; /** The subject. */ private String subject; @@ -209,7 +209,7 @@ public void setUpdatedAt(Date updatedAt) { * * @return the id */ - public long getId() { + public String getId() { return id; } @@ -219,7 +219,7 @@ public long getId() { * @param id * the new id */ - public void setId(long id) { + public void setId(String id) { this.id = id; } @@ -285,7 +285,7 @@ public void setSha(String sha) { * * @return the author */ - public String getAuthor() { + public User getAuthor() { return author; } @@ -295,7 +295,7 @@ public String getAuthor() { * @param author * the new author */ - public void setAuthor(String author) { + public void setAuthor(User author) { this.author = author; } From fae3fc227df1c9a6c1503f0dd40188accbe83cde Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Thu, 10 Feb 2011 16:38:48 +0500 Subject: [PATCH 69/95] Fixed the properties in Discussion.java. Also modified callApiPost to throw exception. --- .../github/api/v2/services/OAuthService.java | 2 +- .../v2/services/impl/GitHubApiGateway.java | 4 +- .../v2/services/impl/IssueServiceImpl.java | 4 +- .../api/v2/services/impl/UserServiceImpl.java | 2 +- .../com/github/api/v2/schema/Discussion.java | 264 +++++++++++++++++- 5 files changed, 256 insertions(+), 20 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/OAuthService.java b/core/src/main/java/com/github/api/v2/services/OAuthService.java index 0bba1d8..b532864 100644 --- a/core/src/main/java/com/github/api/v2/services/OAuthService.java +++ b/core/src/main/java/com/github/api/v2/services/OAuthService.java @@ -35,7 +35,7 @@ public enum Scope implements ValueEnum { /** The USER. */ USER("user"), - /** The PUBLIC_REPO. */ + /** The PUBLI c_ repo. */ PUBLIC_REPO("public_repo"), /** The REPOSITORY. */ diff --git a/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java b/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java index 8acc217..6e43159 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java +++ b/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java @@ -316,8 +316,8 @@ protected InputStream callApiPost(String apiUrl, Map parameters, request.connect(); if (request.getResponseCode() != expected) { - return getWrappedInputStream(request.getErrorStream(), - GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())); + throw new GitHubException(convertStreamToString(getWrappedInputStream(request.getErrorStream(), + GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())))); } else { return getWrappedInputStream(request.getInputStream(), GZIP_ENCODING.equalsIgnoreCase(request.getContentEncoding())); diff --git a/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java index 46fa6de..2a39f4a 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java @@ -46,7 +46,7 @@ public void addComment(String userName, String repositoryName, String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.ISSUE_NUMBER, String.valueOf(issueNumber)).buildUrl(); Map parameters = new HashMap(); parameters.put(ParameterNames.COMMENT, comment); - callApiPost(apiUrl, parameters); + callApiPost(apiUrl, parameters, 201); } /* (non-Javadoc) @@ -85,7 +85,7 @@ public void createIssue(String userName, String repositoryName, parameters.put(ParameterNames.TITLE, title); parameters.put(ParameterNames.BODY, body); // JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); - callApiPost(apiUrl, parameters); + callApiPost(apiUrl, parameters, 201); // return unmarshall(new TypeToken(){}, json.get("issue")); } diff --git a/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java index a5ae718..5519d6b 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java @@ -106,7 +106,7 @@ public List getKeys() { String apiUrl = builder.buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("keys")); + return unmarshall(new TypeToken>(){}, json.get("public_keys")); } /* (non-Javadoc) diff --git a/schema/src/main/java/com/github/api/v2/schema/Discussion.java b/schema/src/main/java/com/github/api/v2/schema/Discussion.java index ee66e06..50dee65 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Discussion.java +++ b/schema/src/main/java/com/github/api/v2/schema/Discussion.java @@ -20,6 +20,7 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.Map; import com.github.api.v2.services.constant.ApplicationConstants; @@ -42,6 +43,9 @@ public enum Type implements ValueEnum { /** The ISSU e_ comment. */ ISSUE_COMMENT("IssueComment"), + /** The PUL l_ reques t_ revie w_ comment. */ + PULL_REQUEST_REVIEW_COMMENT("PullRequestReviewComment"), + /** The COMMIT. */ COMMIT("Commit"); @@ -92,7 +96,7 @@ public static Type fromValue(String value) { private static final long serialVersionUID = 9155892708485181542L; /** The created at. */ - private String createdAt; + private Date createdAt; /** The body. */ private String body; @@ -101,7 +105,7 @@ public static Type fromValue(String value) { private Date updatedAt; /** The id. */ - private long id; + private String id; /** The user. */ private User user; @@ -116,13 +120,43 @@ public static Type fromValue(String value) { private String sha; /** The author. */ - private String author; + private User author; + + /** The committer. */ + private User committer; + + /** The tree. */ + private String tree; /** The subject. */ private String subject; /** The email. */ - private String email; + private String email; + + /** The committed date. */ + private String committedDate; + + /** The authored date. */ + private String authoredDate; + + /** The parents. */ + private List parents; + + /** The diff hunk. */ + private String diffHunk; + + /** The path. */ + private String path; + + /** The position. */ + private int position; + + /** The commit id. */ + private String commitId; + + /** The original commit id. */ + private String originalCommitId; /** * Gets the type. @@ -149,11 +183,7 @@ public void setType(Type type) { * @return the created at */ public Date getCreatedAt() { - try { - return getDateFormat().parse(createdAt); - } catch (ParseException e) { - return null; - } + return createdAt; } /** @@ -163,7 +193,7 @@ public Date getCreatedAt() { * the new created at */ public void setCreatedAt(Date createdAt) { - this.createdAt = getDateFormat().format(createdAt); + this.createdAt = createdAt; } /** @@ -209,7 +239,7 @@ public void setUpdatedAt(Date updatedAt) { * * @return the id */ - public long getId() { + public String getId() { return id; } @@ -219,7 +249,7 @@ public long getId() { * @param id * the new id */ - public void setId(long id) { + public void setId(String id) { this.id = id; } @@ -285,7 +315,7 @@ public void setSha(String sha) { * * @return the author */ - public String getAuthor() { + public User getAuthor() { return author; } @@ -295,7 +325,7 @@ public String getAuthor() { * @param author * the new author */ - public void setAuthor(String author) { + public void setAuthor(User author) { this.author = author; } @@ -336,6 +366,101 @@ public String getEmail() { public void setEmail(String email) { this.email = email; } + + /** + * Gets the diff hunk. + * + * @return the diff hunk + */ + public String getDiffHunk() { + return diffHunk; + } + + /** + * Sets the diff hunk. + * + * @param diffHunk + * the new diff hunk + */ + public void setDiffHunk(String diffHunk) { + this.diffHunk = diffHunk; + } + + /** + * Gets the path. + * + * @return the path + */ + public String getPath() { + return path; + } + + /** + * Sets the path. + * + * @param path + * the new path + */ + public void setPath(String path) { + this.path = path; + } + + /** + * Gets the position. + * + * @return the position + */ + public int getPosition() { + return position; + } + + /** + * Sets the position. + * + * @param position + * the new position + */ + public void setPosition(int position) { + this.position = position; + } + + /** + * Gets the commit id. + * + * @return the commit id + */ + public String getCommitId() { + return commitId; + } + + /** + * Sets the commit id. + * + * @param commitId + * the new commit id + */ + public void setCommitId(String commitId) { + this.commitId = commitId; + } + + /** + * Gets the original commit id. + * + * @return the original commit id + */ + public String getOriginalCommitId() { + return originalCommitId; + } + + /** + * Sets the original commit id. + * + * @param originalCommitId + * the new original commit id + */ + public void setOriginalCommitId(String originalCommitId) { + this.originalCommitId = originalCommitId; + } /* (non-Javadoc) * @see java.lang.Object#toString() @@ -355,4 +480,115 @@ public String toString() { private SimpleDateFormat getDateFormat() { return (getType() == Type.COMMIT)? COMMIT_DATE_FORMAT : COMMENT_DATE_FORMAT; } + + /** + * Gets the committer. + * + * @return the committer + */ + public User getCommitter() { + return committer; + } + + /** + * Sets the committer. + * + * @param committer + * the new committer + */ + public void setCommitter(User committer) { + this.committer = committer; + } + + /** + * Gets the tree. + * + * @return the tree + */ + public String getTree() { + return tree; + } + + /** + * Sets the tree. + * + * @param tree + * the new tree + */ + public void setTree(String tree) { + this.tree = tree; + } + + /** + * Gets the committed date. + * + * @return the committed date + */ + public Date getCommittedDate() { + if (committedDate == null) { + return null; + } else { + try { + return getDateFormat().parse(committedDate); + } catch (ParseException e) { + return null; + } + } + } + + /** + * Sets the committed date. + * + * @param committedDate + * the new committed date + */ + public void setCommittedDate(Date committedDate) { + this.committedDate = (committedDate == null)? null : getDateFormat().format(committedDate); + } + + /** + * Gets the authored date. + * + * @return the authored date + */ + public Date getAuthoredDate() { + if (authoredDate == null) { + return null; + } else { + try { + return getDateFormat().parse(authoredDate); + } catch (ParseException e) { + return null; + } + } + } + + /** + * Sets the authored date. + * + * @param authoredDate + * the new authored date + */ + public void setAuthoredDate(Date authoredDate) { + this.authoredDate = (authoredDate == null)? null : getDateFormat().format(authoredDate); + } + + /** + * Gets the parents. + * + * @return the parents + */ + public List getParents() { + return parents; + } + + /** + * Sets the parents. + * + * @param parents + * the new parents + */ + public void setParents(List parents) { + this.parents = parents; + } } From 06e88912338e22ac8d467e46708c20f5773bc86c Mon Sep 17 00:00:00 2001 From: slapperwan Date: Sun, 13 Feb 2011 17:29:38 +0800 Subject: [PATCH 70/95] Add more properties --- .../com/github/api/v2/schema/Payload.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/schema/src/main/java/com/github/api/v2/schema/Payload.java b/schema/src/main/java/com/github/api/v2/schema/Payload.java index 572ddee..a67609a 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Payload.java +++ b/schema/src/main/java/com/github/api/v2/schema/Payload.java @@ -49,6 +49,15 @@ public class Payload extends SchemaEntity { /** The target id */ private String targetId; + /** The ref type */ + private String refType; + + /** The url */ + private String url; + + /** The id */ + private String id; + public String getRepo() { return repo; } @@ -168,4 +177,28 @@ public String getTargetId() { public void setTargetId(String targetId) { this.targetId = targetId; } + + public String getRefType() { + return refType; + } + + public void setRefType(String refType) { + this.refType = refType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } } From 56620248332b8cca8df96a20717114de17a25ade Mon Sep 17 00:00:00 2001 From: slapperwan Date: Sun, 13 Feb 2011 17:30:06 +0800 Subject: [PATCH 71/95] DownloadEvent --- schema/src/main/java/com/github/api/v2/schema/UserFeed.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/schema/src/main/java/com/github/api/v2/schema/UserFeed.java b/schema/src/main/java/com/github/api/v2/schema/UserFeed.java index 87c1ef4..9f25c95 100644 --- a/schema/src/main/java/com/github/api/v2/schema/UserFeed.java +++ b/schema/src/main/java/com/github/api/v2/schema/UserFeed.java @@ -46,7 +46,10 @@ public enum Type implements ValueEnum { WIKI_EVENT("WikiEvent"), /** The MemberEvent */ - MEMBER_EVENT("MemberEvent") + MEMBER_EVENT("MemberEvent"), + + /** The DownloadEvent */ + DOWNLOAD_EVENT("DownloadEvent") ; /** The Constant stringToEnum. */ From c5295af3971c4085bc23c45189c3586803efb7ed Mon Sep 17 00:00:00 2001 From: slapperwan Date: Sun, 20 Feb 2011 16:10:06 +0800 Subject: [PATCH 72/95] Throws exception and add more language --- .../v2/services/impl/BaseGitHubService.java | 2 +- .../v2/services/impl/CommitServiceImpl.java | 23 ++- .../api/v2/services/impl/FeedServiceImpl.java | 27 +++- .../api/v2/services/impl/GistServiceImpl.java | 17 ++- .../v2/services/impl/IssueServiceImpl.java | 58 ++++++- .../v2/services/impl/NetworkServiceImpl.java | 16 +- .../v2/services/impl/ObjectServiceImpl.java | 25 ++- .../impl/OrganizationServiceImpl.java | 65 ++++++-- .../services/impl/PullRequestServiceImpl.java | 30 +++- .../services/impl/RepositoryServiceImpl.java | 142 +++++++++++++++--- .../api/v2/services/impl/UserServiceImpl.java | 67 +++++++-- .../com/github/api/v2/schema/Language.java | 20 ++- .../com/github/api/v2/schema/Payload.java | 18 +++ .../java/com/github/api/v2/schema/Tree.java | 11 +- .../java/com/github/api/v2/schema/User.java | 13 +- .../com/github/api/v2/schema/UserFeed.java | 8 +- 16 files changed, 470 insertions(+), 72 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java index a9a356d..f1fc2ff 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java +++ b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java @@ -96,7 +96,7 @@ public BaseGitHubService(String apiVersion) { * @return the t */ @SuppressWarnings("unchecked") - protected T unmarshall(TypeToken typeToken, JsonElement response) { + protected T unmarshall(TypeToken typeToken, JsonElement response) throws JsonParseException { Gson gson = getGsonBuilder().create(); return (T) gson.fromJson(response, typeToken.getType()); } diff --git a/core/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java index 86eece2..f946370 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java @@ -20,11 +20,13 @@ import com.github.api.v2.schema.Commit; import com.github.api.v2.services.CommitService; +import com.github.api.v2.services.GitHubException; import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; import com.google.gson.reflect.TypeToken; /** @@ -42,7 +44,12 @@ public Commit getCommit(String userName, String repositoryName, String sha) { String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.SHA, sha).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken(){}, json.get("commit")); + try { + return unmarshall(new TypeToken(){}, json.get("commit")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -64,7 +71,12 @@ public List getCommits(String userName, String repositoryName, String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, branch).withParameter(ParameterNames.PAGE, String.valueOf(pageNumber)).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("commits")); + try { + return unmarshall(new TypeToken>(){}, json.get("commits")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -77,7 +89,12 @@ public List getCommits(String userName, String repositoryName, String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, branch).withField(ParameterNames.FILE_PATH, filePath).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("commits")); + try { + return unmarshall(new TypeToken>(){}, json.get("commits")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) diff --git a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java index cdfcd38..c21d0d0 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java @@ -16,7 +16,6 @@ */ package com.github.api.v2.services.impl; -import java.io.InputStreamReader; import java.util.List; import com.github.api.v2.schema.Feed; @@ -30,7 +29,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.google.gson.JsonParser; +import com.google.gson.JsonParseException; import com.google.gson.reflect.TypeToken; /** @@ -169,7 +168,12 @@ protected Feed unmarshall(String apiUrl) { //Gson gson = getGsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create(); //Gson gson = getGsonBuilder().create(); //return gson.fromJson(data, new TypeToken>(){}.getType()); - return unmarshall(new TypeToken(){}, data.getAsJsonObject().get("feed")); + try { + return unmarshall(new TypeToken(){}, data.getAsJsonObject().get("feed")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } } return null; @@ -192,7 +196,12 @@ public List getPrivateUserFeedJson(String userName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_PRIVATE_USER_FEED_JSON_URL); String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); JsonArray json = unmarshallArray(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json); + try { + return unmarshall(new TypeToken>(){}, json); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } @Override @@ -200,7 +209,15 @@ public List getPublicUserFeedJson(String userName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_PUBLIC_USER_FEED_JSON_URL); String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); JsonArray json = unmarshallArray(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json); + + //Gson gson = getGsonBuilder().setDateFormat("yyyy-MM-dd").create(); + //return gson.fromJson(json, List.class); + try { + return unmarshall(new TypeToken>(){}, json); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } // @SuppressWarnings("unchecked") diff --git a/core/src/main/java/com/github/api/v2/services/impl/GistServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/GistServiceImpl.java index d8bb3b1..2d1d931 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/GistServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/GistServiceImpl.java @@ -21,10 +21,12 @@ import com.github.api.v2.schema.Gist; import com.github.api.v2.services.GistService; +import com.github.api.v2.services.GitHubException; import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; import com.google.gson.reflect.TypeToken; /** @@ -42,7 +44,13 @@ public Gist getGist(String gistId) { String apiUrl = builder.withField(ParameterNames.GIST_ID, gistId).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - List gists = unmarshall(new TypeToken>(){}, json.get("gists")); + List gists; + try { + gists = unmarshall(new TypeToken>(){}, json.get("gists")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } return (gists.isEmpty())? null : gists.get(0); } @@ -65,6 +73,11 @@ public List getUserGists(String userName) { String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("gists")); + try { + return unmarshall(new TypeToken>(){}, json.get("gists")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } } diff --git a/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java index 2a39f4a..70fc009 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java @@ -23,11 +23,13 @@ import com.github.api.v2.schema.Comment; import com.github.api.v2.schema.Issue; import com.github.api.v2.schema.Issue.State; +import com.github.api.v2.services.GitHubException; import com.github.api.v2.services.IssueService; import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; import com.google.gson.reflect.TypeToken; /** @@ -59,7 +61,12 @@ public List addLabel(String userName, String repositoryName, String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.LABEL, label).withField(ParameterNames.ISSUE_NUMBER, String.valueOf(issueNumber)).buildUrl(); JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); - return unmarshall(new TypeToken>(){}, json.get("labels")); + try { + return unmarshall(new TypeToken>(){}, json.get("labels")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -99,7 +106,12 @@ public Issue getIssue(String userName, String repositoryName, String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.ISSUE_NUMBER, String.valueOf(issueNumber)).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken(){}, json.get("issue")); + try { + return unmarshall(new TypeToken(){}, json.get("issue")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -112,7 +124,12 @@ public List getIssueComments(String userName, String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.ISSUE_NUMBER, String.valueOf(issueNumber)).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("comments")); + try { + return unmarshall(new TypeToken>(){}, json.get("comments")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -124,7 +141,12 @@ public List getIssueLabels(String userName, String repositoryName) { String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("labels")); + try { + return unmarshall(new TypeToken>(){}, json.get("labels")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -137,7 +159,12 @@ public List getIssues(String userName, String repositoryName, String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withFieldEnum(ParameterNames.STATE, state).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("issues")); + try { + return unmarshall(new TypeToken>(){}, json.get("issues")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -150,7 +177,12 @@ public List removeLabel(String userName, String repositoryName, String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.LABEL, label).withField(ParameterNames.ISSUE_NUMBER, String.valueOf(issueNumber)).buildUrl(); JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); - return unmarshall(new TypeToken>(){}, json.get("labels")); + try { + return unmarshall(new TypeToken>(){}, json.get("labels")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -174,7 +206,12 @@ public List searchIssues(String userName, String repositoryName, String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withFieldEnum(ParameterNames.STATE, state).withField(ParameterNames.KEYWORD, keyword).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("issues")); + try { + return unmarshall(new TypeToken>(){}, json.get("issues")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -187,7 +224,12 @@ public List getIssues(String userName, String repositoryName, String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.LABEL, label).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("issues")); + try { + return unmarshall(new TypeToken>(){}, json.get("issues")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) diff --git a/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java index 1018bd6..40cb3d0 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java @@ -20,6 +20,7 @@ import com.github.api.v2.schema.NetworkCommit; import com.github.api.v2.schema.NetworkMeta; +import com.github.api.v2.services.GitHubException; import com.github.api.v2.services.NetworkService; import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; @@ -27,6 +28,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; import com.google.gson.reflect.TypeToken; /** @@ -45,7 +47,12 @@ public List getNetworkData(String userName, String repositoryName String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withParameter(ParameterNames.NET_HASH, networkHash).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("commits")); + try { + return unmarshall(new TypeToken>(){}, json.get("commits")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -58,7 +65,12 @@ public List getNetworkData(String userName, String repositoryName String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withParameter(ParameterNames.NET_HASH, networkHash).withParameter(ParameterNames.START_INDEX, String.valueOf(startIndex)).withParameter(ParameterNames.END_INDEX, String.valueOf(endIndex)).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("commits")); + try { + return unmarshall(new TypeToken>(){}, json.get("commits")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) diff --git a/core/src/main/java/com/github/api/v2/services/impl/ObjectServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/ObjectServiceImpl.java index e3fd543..2b979d9 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/ObjectServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/ObjectServiceImpl.java @@ -21,11 +21,13 @@ import com.github.api.v2.schema.Blob; import com.github.api.v2.schema.Tree; +import com.github.api.v2.services.GitHubException; import com.github.api.v2.services.ObjectService; import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; import com.google.gson.reflect.TypeToken; /** @@ -40,11 +42,16 @@ public class ObjectServiceImpl extends BaseGitHubService implements @Override public Blob getBlob(String userName, String repositoryName, String treeSha, String filePath) { - GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.ObjectApiUrls.GET_BLOBS_URL); + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.ObjectApiUrls.GET_BLOB_URL); String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.SHA, treeSha).withField(ParameterNames.FILE_PATH, filePath).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken(){}, json.get("blob")); + try { + return unmarshall(new TypeToken(){}, json.get("blob")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -57,7 +64,12 @@ public List getBlobs(String userName, String repositoryName, String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.SHA, treeSha).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("blobs")); + try { + return unmarshall(new TypeToken>(){}, json.get("blobs")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -81,6 +93,11 @@ public List getTree(String userName, String repositoryName, String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.SHA, treeSha).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("tree")); + try { + return unmarshall(new TypeToken>(){}, json.get("tree")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } } diff --git a/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java index ee95b8b..21e8d20 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java @@ -25,12 +25,14 @@ import com.github.api.v2.schema.Repository; import com.github.api.v2.schema.Team; import com.github.api.v2.schema.User; +import com.github.api.v2.services.GitHubException; import com.github.api.v2.services.OrganizationService; import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; import com.google.gson.Gson; import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; import com.google.gson.reflect.TypeToken; /** @@ -78,7 +80,12 @@ public Team createTeam(String organizationName, String teamName, Permission perm } JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); - return unmarshall(new TypeToken(){}, json.get("team")); + try { + return unmarshall(new TypeToken(){}, json.get("team")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -100,7 +107,12 @@ public List getAllOrganizationRepositories() { String apiUrl = builder.buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("repositories")); + try { + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -125,7 +137,12 @@ public List getPublicMembers(String organizationName) { String apiUrl = builder.withField(ParameterNames.ORGANIZATION_NAME, organizationName).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("users")); + try { + return unmarshall(new TypeToken>(){}, json.get("users")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -137,7 +154,12 @@ public List getPublicRepositories(String organizationName) { String apiUrl = builder.withField(ParameterNames.ORGANIZATION_NAME, organizationName).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("repositories")); + try { + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -149,7 +171,12 @@ public Team getTeam(String teamId) { String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken(){}, json.get("team")); + try { + return unmarshall(new TypeToken(){}, json.get("team")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -161,7 +188,12 @@ public List getTeamMembers(String teamId) { String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("users")); + try { + return unmarshall(new TypeToken>(){}, json.get("users")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -173,7 +205,12 @@ public List getTeamRepositories(String teamId) { String apiUrl = builder.withField(ParameterNames.TEAM_ID, teamId).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("repositories")); + try { + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -185,7 +222,12 @@ public List getTeams(String organizationName) { String apiUrl = builder.withField(ParameterNames.ORGANIZATION_NAME, organizationName).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("teams")); + try { + return unmarshall(new TypeToken>(){}, json.get("teams")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -197,7 +239,12 @@ public List getUserOrganizations() { String apiUrl = builder.buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("organizations")); + try { + return unmarshall(new TypeToken>(){}, json.get("organizations")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) diff --git a/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java index ff898b7..4ba40a3 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java @@ -22,11 +22,13 @@ import com.github.api.v2.schema.PullRequest; import com.github.api.v2.schema.Issue.State; +import com.github.api.v2.services.GitHubException; import com.github.api.v2.services.PullRequestService; import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; import com.google.gson.reflect.TypeToken; /** @@ -44,7 +46,12 @@ public PullRequest getPullRequest(String userName, String repositoryName, int is String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.ISSUE_NUMBER, String.valueOf(issueNumber)).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken(){}, json.get("pull")); + try { + return unmarshall(new TypeToken(){}, json.get("pull")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -56,7 +63,12 @@ public List getPullRequests(String userName, String repositoryName) String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.STATE, "").buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("pulls")); + try { + return unmarshall(new TypeToken>(){}, json.get("pulls")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -68,7 +80,12 @@ public List getPullRequests(String userName, String repositoryName, String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.STATE, state.value()).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("pulls")); + try { + return unmarshall(new TypeToken>(){}, json.get("pulls")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -84,6 +101,11 @@ public PullRequest createPullRequest(String userName, String repositoryName, Str parameters.put("pull[" + ParameterNames.BODY + "]", body); JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); - return unmarshall(new TypeToken(){}, json.get("pull")); + try { + return unmarshall(new TypeToken(){}, json.get("pull")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } } diff --git a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java index 2bba0a6..4c9076f 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java @@ -26,11 +26,13 @@ import com.github.api.v2.schema.Repository; import com.github.api.v2.schema.User; import com.github.api.v2.schema.Repository.Visibility; +import com.github.api.v2.services.GitHubException; import com.github.api.v2.services.RepositoryService; import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; import com.google.gson.reflect.TypeToken; /** @@ -61,7 +63,12 @@ public List addDeployKey(String repositoryName, String title, String key) { parameters.put(ParameterNames.KEY, key); JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); - return unmarshall(new TypeToken>(){}, json.get("public_keys")); + try { + return unmarshall(new TypeToken>(){}, json.get("public_keys")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -73,7 +80,12 @@ public void changeVisibility(String repositoryName, Visibility visibility) { String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).withFieldEnum(ParameterNames.VISIBILITY, visibility).buildUrl(); JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); - unmarshall(new TypeToken(){}, json.get("repository")); + try { + unmarshall(new TypeToken(){}, json.get("repository")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -91,7 +103,12 @@ public Repository createRepository(String name, String description, parameters.put(ParameterNames.PUBLIC, ((visibility == Visibility.PUBLIC)? "1" : "0")); JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); - return unmarshall(new TypeToken(){}, json.get("repository")); + try { + return unmarshall(new TypeToken(){}, json.get("repository")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -117,7 +134,12 @@ public Repository forkRepository(String userName, String repositoryName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.FORK_REPOSITORY_URL); String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); - return unmarshall(new TypeToken(){}, json.get("repository")); + try { + return unmarshall(new TypeToken(){}, json.get("repository")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -129,7 +151,12 @@ public Map getBranches(String userName, String repositoryName) { String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("branches")); + try { + return unmarshall(new TypeToken>(){}, json.get("branches")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -141,7 +168,12 @@ public List getCollaborators(String userName, String repositoryName) { String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("collaborators")); + try { + return unmarshall(new TypeToken>(){}, json.get("collaborators")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -153,7 +185,12 @@ public List getContributors(String userName, String repositoryName) { String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("contributors")); + try { + return unmarshall(new TypeToken>(){}, json.get("contributors")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -165,7 +202,12 @@ public List getForks(String userName, String repositoryName) { String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("network")); + try { + return unmarshall(new TypeToken>(){}, json.get("network")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -177,7 +219,12 @@ public List getDeployKeys(String repositoryName) { String apiUrl = builder.withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("public_keys")); + try { + return unmarshall(new TypeToken>(){}, json.get("public_keys")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -190,7 +237,12 @@ public Map getLanguageBreakdown(String userName, String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("languages")); + try { + return unmarshall(new TypeToken>(){}, json.get("languages")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -202,7 +254,12 @@ public List getPushableRepositories() { String apiUrl = builder.buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("repositories")); + try { + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -214,7 +271,12 @@ public List getRepositories(String userName) { String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("repositories")); + try { + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -226,7 +288,12 @@ public Repository getRepository(String userName, String repositoryName) { String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken(){}, json.get("repository")); + try { + return unmarshall(new TypeToken(){}, json.get("repository")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -238,7 +305,12 @@ public Map getTags(String userName, String repositoryName) { String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("tags")); + try { + return unmarshall(new TypeToken>(){}, json.get("tags")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -252,7 +324,12 @@ public List getWatchers(String userName, String repositoryName) { .buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("watchers")); + try { + return unmarshall(new TypeToken>(){}, json.get("watchers")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } //return unmarshall(new TypeToken>(){}, json.get("watchers")); } @@ -288,7 +365,12 @@ public List searchRepositories(String query) { String apiUrl = builder.withField(ParameterNames.KEYWORD, query, true).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("repositories")); + try { + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -300,7 +382,12 @@ public List searchRepositories(String query, Language language) { String apiUrl = builder.withField(ParameterNames.KEYWORD, query, true).withParameterEnum(ParameterNames.LANGUAGE, language).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("repositories")); + try { + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -312,7 +399,12 @@ public List searchRepositories(String query, int pageNumber) { String apiUrl = builder.withField(ParameterNames.KEYWORD, query, true).withParameter(ParameterNames.START_PAGE, String.valueOf(pageNumber)).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("repositories")); + try { + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -325,7 +417,12 @@ public List searchRepositories(String query, Language language, String apiUrl = builder.withField(ParameterNames.KEYWORD, query, true).withParameterEnum(ParameterNames.LANGUAGE, language).withParameter(ParameterNames.START_PAGE, String.valueOf(pageNumber)).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("repositories")); + try { + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -353,7 +450,12 @@ public void updateRepository(Repository repository) { parameters.put("values[" + ParameterNames.HAS_DOWNLOADS + "]", String.valueOf(repository.isHasDownloads())); JsonObject json = unmarshall(callApiPost(apiUrl, parameters)); - unmarshall(new TypeToken(){}, json.get("repository")); + try { + unmarshall(new TypeToken(){}, json.get("repository")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) diff --git a/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java index 5519d6b..7b410a1 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java @@ -24,12 +24,14 @@ import com.github.api.v2.schema.Organization; import com.github.api.v2.schema.Repository; import com.github.api.v2.schema.User; +import com.github.api.v2.services.GitHubException; import com.github.api.v2.services.UserService; import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; import com.google.gson.Gson; import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; import com.google.gson.reflect.TypeToken; /** @@ -82,7 +84,12 @@ public User getCurrentUser() { String apiUrl = builder.buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken(){}, json.get("user")); + try { + return unmarshall(new TypeToken(){}, json.get("user")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -94,7 +101,12 @@ public List getEmails() { String apiUrl = builder.buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("emails")); + try { + return unmarshall(new TypeToken>(){}, json.get("emails")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -106,7 +118,12 @@ public List getKeys() { String apiUrl = builder.buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("public_keys")); + try { + return unmarshall(new TypeToken>(){}, json.get("public_keys")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -118,7 +135,12 @@ public User getUserByUsername(String userName) { String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken(){}, json.get("user")); + try { + return unmarshall(new TypeToken(){}, json.get("user")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -130,7 +152,12 @@ public List getUserFollowers(String userName) { String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("users")); + try { + return unmarshall(new TypeToken>(){}, json.get("users")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -142,7 +169,12 @@ public List getUserFollowing(String userName) { String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("users")); + try { + return unmarshall(new TypeToken>(){}, json.get("users")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -154,7 +186,12 @@ public List getWatchedRepositories(String userName) { String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("repositories")); + try { + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -190,7 +227,12 @@ public User getUserByEmail(String email) { String apiUrl = builder.withField(ParameterNames.EMAIL, email).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken(){}, json.get("user")); + try { + return unmarshall(new TypeToken(){}, json.get("user")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) @@ -199,7 +241,7 @@ public User getUserByEmail(String email) { @Override public List searchUsersByName(String name) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.SEARCH_USERS_BY_NAME_URL); - String apiUrl = builder.withField(ParameterNames.USER_NAME, name).buildUrl(); + String apiUrl = builder.withField(ParameterNames.USER_NAME, name, true).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); Gson gson = getGsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create(); @@ -225,7 +267,12 @@ public List getUserOrganizations(String userName) { String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); - return unmarshall(new TypeToken>(){}, json.get("organizations")); + try { + return unmarshall(new TypeToken>(){}, json.get("organizations")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } } /* (non-Javadoc) diff --git a/schema/src/main/java/com/github/api/v2/schema/Language.java b/schema/src/main/java/com/github/api/v2/schema/Language.java index aa089e8..edd9bee 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Language.java +++ b/schema/src/main/java/com/github/api/v2/schema/Language.java @@ -184,7 +184,25 @@ public enum Language implements ValueEnum { VimL("VimL"), /** The Visual basic. */ - VisualBasic("Visual Basic"); + VisualBasic("Visual Basic"), + + /** The XML. */ + XML("XML"), + + /** The CSS */ + CSS("CSS"), + + /** The Diff */ + DIFF("Diff"), + + /** The HTML */ + HTML("HTML"), + + /** The SQL */ + SQL("SQL"), + + /** The Tex */ + TEX("TeX"); /** The Constant stringToEnum. */ private static final Map stringToEnum = new HashMap(); diff --git a/schema/src/main/java/com/github/api/v2/schema/Payload.java b/schema/src/main/java/com/github/api/v2/schema/Payload.java index a67609a..610eb19 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Payload.java +++ b/schema/src/main/java/com/github/api/v2/schema/Payload.java @@ -2,6 +2,8 @@ import java.util.List; +import com.google.gson.annotations.SerializedName; + public class Payload extends SchemaEntity { /** The repo */ @@ -31,6 +33,10 @@ public class Payload extends SchemaEntity { /** The pull request */ private PayloadPullRequest pullRequest; + /** The pull request int */ +// @SerializedName("pull_request") +// private int pullRequestInt; + /** The name */ private String name; @@ -58,6 +64,9 @@ public class Payload extends SchemaEntity { /** The id */ private String id; + /** The title. */ + private String title; + public String getRepo() { return repo; } @@ -201,4 +210,13 @@ public String getId() { public void setId(String id) { this.id = id; } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + } diff --git a/schema/src/main/java/com/github/api/v2/schema/Tree.java b/schema/src/main/java/com/github/api/v2/schema/Tree.java index f38f770..8d8de7e 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Tree.java +++ b/schema/src/main/java/com/github/api/v2/schema/Tree.java @@ -93,6 +93,7 @@ public static Type fromValue(String value) { /** The type. */ private Type type; + private String mimeType; /** * Gets the name. * @@ -174,6 +175,14 @@ public void setType(Type type) { @Override public String toString() { return "Tree [mode=" + mode + ", name=" + name + ", sha=" + sha - + ", type=" + type + "]"; + + ", type=" + type + ", mimeType=" + mimeType + "]"; } + + public String getMimeType() { + return mimeType; + } + + public void setMimeType(String mimeType) { + this.mimeType = mimeType; + } } diff --git a/schema/src/main/java/com/github/api/v2/schema/User.java b/schema/src/main/java/com/github/api/v2/schema/User.java index efb360c..4c17907 100644 --- a/schema/src/main/java/com/github/api/v2/schema/User.java +++ b/schema/src/main/java/com/github/api/v2/schema/User.java @@ -95,6 +95,9 @@ public class User extends SchemaEntity { /** The score. */ private double score; + /** The type */ + private String type;//User or Organization + /** * Gets the score. * @@ -532,7 +535,15 @@ public void setPermission(Permission permission) { this.permission = permission; } - /* (non-Javadoc) + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override diff --git a/schema/src/main/java/com/github/api/v2/schema/UserFeed.java b/schema/src/main/java/com/github/api/v2/schema/UserFeed.java index 9f25c95..de7f616 100644 --- a/schema/src/main/java/com/github/api/v2/schema/UserFeed.java +++ b/schema/src/main/java/com/github/api/v2/schema/UserFeed.java @@ -49,7 +49,13 @@ public enum Type implements ValueEnum { MEMBER_EVENT("MemberEvent"), /** The DownloadEvent */ - DOWNLOAD_EVENT("DownloadEvent") + DOWNLOAD_EVENT("DownloadEvent"), + + /** The GollumEvent */ + GOLLUM_EVENT("GollumEvent"), + + /** The PublicEvent */ + PUBLIC_EVENT("PublicEvent") ; /** The Constant stringToEnum. */ From 0d0de777068c7570f5cddfcd8db7d7bfb2811255 Mon Sep 17 00:00:00 2001 From: slapperwan Date: Sun, 20 Feb 2011 16:11:09 +0800 Subject: [PATCH 73/95] Update --- .../github/api/v2/services/constant/GitHubApiUrls.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index 299ef48..5c29fd6 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -81,7 +81,7 @@ com.github.api.v2.services.commitService.getCommitsFile=http://github.com/api/{v com.github.api.v2.services.commitService.getCommit=http://github.com/api/{version}/{format}/commits/show/{userName}/{repositoryName}/{sha} # Object API -com.github.api.v2.services.objectService.getTree=http://github.com/api/{version}/{format}/tree/full/{userName}/{repositoryName}/{sha} +com.github.api.v2.services.objectService.getTree=http://github.com/api/{version}/{format}/tree/show/{userName}/{repositoryName}/{sha} com.github.api.v2.services.objectService.getBlob=http://github.com/api/{version}/{format}/blob/show/{userName}/{repositoryName}/{sha}/{filePath} com.github.api.v2.services.objectService.getBlobs=http://github.com/api/{version}/{format}/blob/full/{userName}/{repositoryName}/{sha} com.github.api.v2.services.objectService.getObjectContent=http://github.com/api/{version}/{format}/blob/show/{userName}/{repositoryName}/{sha} From 155ae6ef078d9bb654e61547adb4668eb767c49b Mon Sep 17 00:00:00 2001 From: slapperwan Date: Sat, 26 Feb 2011 02:23:49 +0800 Subject: [PATCH 74/95] Sometimes the pull request payload return an integer instead the PulLRequest object --- .../github/api/v2/services/FeedService.java | 2 + .../github/api/v2/services/IssueService.java | 19 ++++++ .../v2/services/constant/GitHubApiUrls.java | 4 ++ .../v2/services/impl/BaseGitHubService.java | 41 +++++++++++-- .../api/v2/services/impl/FeedServiceImpl.java | 25 +++++--- .../v2/services/impl/IssueServiceImpl.java | 28 +++++++++ .../constant/GitHubApiUrls.properties | 2 + .../com/github/api/v2/schema/Discussion.java | 11 ++-- .../v2/schema/IntegerPayloadPullRequest.java | 51 ++++++++++++++++ .../v2/schema/ObjectPayloadPullRequest.java | 55 +++++++++++++++++ .../api/v2/schema/PayloadPullRequest.java | 61 +++---------------- 11 files changed, 230 insertions(+), 69 deletions(-) create mode 100644 schema/src/main/java/com/github/api/v2/schema/IntegerPayloadPullRequest.java create mode 100644 schema/src/main/java/com/github/api/v2/schema/ObjectPayloadPullRequest.java diff --git a/core/src/main/java/com/github/api/v2/services/FeedService.java b/core/src/main/java/com/github/api/v2/services/FeedService.java index 027bbf2..cfd5628 100644 --- a/core/src/main/java/com/github/api/v2/services/FeedService.java +++ b/core/src/main/java/com/github/api/v2/services/FeedService.java @@ -18,6 +18,8 @@ import java.util.List; +import android.content.Context; + import com.github.api.v2.schema.Feed; import com.github.api.v2.schema.UserFeed; diff --git a/core/src/main/java/com/github/api/v2/services/IssueService.java b/core/src/main/java/com/github/api/v2/services/IssueService.java index af4a6d3..23773d4 100644 --- a/core/src/main/java/com/github/api/v2/services/IssueService.java +++ b/core/src/main/java/com/github/api/v2/services/IssueService.java @@ -211,4 +211,23 @@ public interface IssueService extends GitHubService { */ public void addComment(String userName, String repositoryName, int issueNumber, String comment); + /** + * Adds the label without issue. + * + * @param userName the user name + * @param repositoryName the repository name + * @param label the label + * @return the list + */ + public List addLabelWithoutIssue(String userName, String repositoryName, String label); + + /** + * Removes the label without issue. + * + * @param userName the user name + * @param repositoryName the repository name + * @param label the label + * @return the list + */ + public List removeLabelWithoutIssue(String userName, String repositoryName, String label); } diff --git a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java index df00ab4..443672d 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java +++ b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java @@ -27,6 +27,9 @@ import java.util.logging.Level; import java.util.logging.Logger; +import android.util.Log; + +import com.gh4a.Constants; import com.github.api.v2.schema.ValueEnum; /** @@ -668,6 +671,7 @@ private static String encodeUrl(String original) { try { return URLEncoder.encode(original, ApplicationConstants.CONTENT_ENCODING); } catch (UnsupportedEncodingException e) { + Log.v(Constants.LOG_TAG, "++++++++++++++++ " + e.getMessage(), e); // should never be here.. return original; } diff --git a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java index f1fc2ff..050e8d3 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java +++ b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java @@ -26,11 +26,17 @@ import java.util.Date; import java.util.List; +import android.util.Log; + +import com.gh4a.Constants; import com.github.api.v2.schema.Discussion; import com.github.api.v2.schema.Gist; +import com.github.api.v2.schema.IntegerPayloadPullRequest; import com.github.api.v2.schema.Issue; import com.github.api.v2.schema.Language; +import com.github.api.v2.schema.ObjectPayloadPullRequest; import com.github.api.v2.schema.Organization; +import com.github.api.v2.schema.PayloadPullRequest; import com.github.api.v2.schema.Permission; import com.github.api.v2.schema.Repository; import com.github.api.v2.schema.SchemaEntity; @@ -67,6 +73,10 @@ public abstract class BaseGitHubService extends GitHubApiGateway implements GitH /** The handlers. */ private List>> handlers = new ArrayList>>(); + private static final SimpleDateFormat sdf = new SimpleDateFormat(ApplicationConstants.DATE_FORMAT); + + private static final SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + /** * Instantiates a new base git hub service. */ @@ -135,20 +145,20 @@ protected GsonBuilder getGsonBuilder() { GsonBuilder builder = new GsonBuilder(); builder.setDateFormat(ApplicationConstants.DATE_FORMAT); builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); - - //fail-save + + //added by slapperwan builder.registerTypeAdapter(Date.class, new JsonDeserializer() { @Override public Date deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2) throws JsonParseException { - SimpleDateFormat format = new SimpleDateFormat(ApplicationConstants.DATE_FORMAT); + try { - return format.parse(arg0.getAsJsonPrimitive().getAsString()); + return sdf.parse(arg0.getAsJsonPrimitive().getAsString()); } catch (ParseException e) { - format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + //sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); try { - return format.parse(arg0.getAsJsonPrimitive().getAsString()); + return sdf2.parse(arg0.getAsJsonPrimitive().getAsString()); } catch (ParseException e1) { return null; @@ -157,6 +167,8 @@ public Date deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext } }); + builder.registerTypeAdapter(PayloadPullRequest.class, new PayloadPullRequestDeserializer()); + builder.registerTypeAdapter(Issue.State.class, new JsonDeserializer() { @Override public Issue.State deserialize(JsonElement arg0, Type arg1, @@ -280,4 +292,21 @@ protected JsonArray unmarshallArray(InputStream jsonContent) { protected GitHubApiUrlBuilder createGitHubApiUrlBuilder(String urlFormat) { return new GitHubApiUrlBuilder(urlFormat); } + + private class PayloadPullRequestDeserializer implements JsonDeserializer { + public PayloadPullRequest deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) + throws JsonParseException { + if (json.isJsonPrimitive()) { + IntegerPayloadPullRequest payloadPullRequest = new IntegerPayloadPullRequest(); + payloadPullRequest.setNumber(json.getAsInt()); + return payloadPullRequest; + } + else if (json.isJsonObject()) { + ObjectPayloadPullRequest obj2 = context.deserialize(json, new TypeToken(){}.getType()); + return obj2; + } + + return null; + } + } } diff --git a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java index c21d0d0..8d30cda 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java @@ -16,16 +16,25 @@ */ package com.github.api.v2.services.impl; +import java.lang.reflect.Type; +import java.util.Collection; import java.util.List; +import android.content.Context; +import android.util.Log; + +import com.gh4a.Constants; import com.github.api.v2.schema.Feed; +import com.github.api.v2.schema.Payload; import com.github.api.v2.schema.UserFeed; import com.github.api.v2.services.FeedService; import com.github.api.v2.services.GitHubException; import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; +import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.google.gson.InstanceCreator; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -210,14 +219,14 @@ public List getPublicUserFeedJson(String userName) { String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); JsonArray json = unmarshallArray(callApiGet(apiUrl)); - //Gson gson = getGsonBuilder().setDateFormat("yyyy-MM-dd").create(); - //return gson.fromJson(json, List.class); - try { - return unmarshall(new TypeToken>(){}, json); - } - catch (JsonParseException e) { - throw new GitHubException(e.getMessage(), e); - } + Gson gson = getGsonBuilder().create(); + return gson.fromJson(json, new TypeToken>(){}.getType()); +// try { +// return unmarshall(new TypeToken>(){}, json); +// } +// catch (JsonParseException e) { +// throw new GitHubException(e.getMessage(), e); +// } } // @SuppressWarnings("unchecked") diff --git a/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java index 70fc009..076b990 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java @@ -245,4 +245,32 @@ public void updateIssue(String userName, String repositoryName, parameters.put(ParameterNames.BODY, body); callApiPost(apiUrl, parameters); } + + @Override + public List addLabelWithoutIssue(String userName, String repositoryName, String label) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.ADD_LABEL_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.LABEL, label).buildUrl(); + JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); + + try { + return unmarshall(new TypeToken>(){}, json.get("labels")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } + } + + @Override + public List removeLabelWithoutIssue(String userName, String repositoryName, String label) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.IssueApiUrls.REMOVE_LABEL_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.LABEL, label).buildUrl(); + JsonObject json = unmarshall(callApiPost(apiUrl, new HashMap())); + + try { + return unmarshall(new TypeToken>(){}, json.get("labels")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } + } } diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index 5c29fd6..26fddd5 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -36,7 +36,9 @@ com.github.api.v2.services.issueService.reopenIssue=http://github.com/api/{versi com.github.api.v2.services.issueService.updateIssue=http://github.com/api/{version}/{format}/issues/edit/{userName}/{repositoryName}/{issueNumber} com.github.api.v2.services.issueService.getIssueLabels=http://github.com/api/{version}/{format}/issues/labels/{userName}/{repositoryName} com.github.api.v2.services.issueService.addLabel=http://github.com/api/{version}/{format}/issues/label/add/{userName}/{repositoryName}/{label}/{issueNumber} +com.github.api.v2.services.issueService.addLabelWithoutIssue=http://github.com/api/{version}/{format}/issues/label/add/{userName}/{repositoryName}/{label} com.github.api.v2.services.issueService.removeLabel=http://github.com/api/{version}/{format}/issues/label/remove/{userName}/{repositoryName}/{label}/{issueNumber} +com.github.api.v2.services.issueService.removeLabelWithoutIssue=http://github.com/api/{version}/{format}/issues/label/remove/{userName}/{repositoryName}/{label} com.github.api.v2.services.issueService.addComment=http://github.com/api/{version}/{format}/issues/comment/{userName}/{repositoryName}/{issueNumber} com.github.api.v2.services.issueService.getIssuesByLabel=http://github.com/api/{version}/{format}/issues/list/{userName}/{repositoryName}/label/{label} diff --git a/schema/src/main/java/com/github/api/v2/schema/Discussion.java b/schema/src/main/java/com/github/api/v2/schema/Discussion.java index 14e97d2..07b5757 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Discussion.java +++ b/schema/src/main/java/com/github/api/v2/schema/Discussion.java @@ -43,11 +43,14 @@ public enum Type implements ValueEnum { /** The ISSU e_ comment. */ ISSUE_COMMENT("IssueComment"), - /** The PUL l_ reques t_ revie w_ comment. */ - PULL_REQUEST_REVIEW_COMMENT("PullRequestReviewComment"), + + /** The PUL l_ reques t_ revie w_ comment. */ + PULL_REQUEST_REVIEW_COMMENT("PullRequestReviewComment"), + + /** The COMMIT. */ + COMMIT("Commit"), - /** The COMMIT. */ - COMMIT("Commit"); + COMMIT_COMMENT("CommitComment"); /** The Constant stringToEnum. */ private static final Map stringToEnum = new HashMap(); diff --git a/schema/src/main/java/com/github/api/v2/schema/IntegerPayloadPullRequest.java b/schema/src/main/java/com/github/api/v2/schema/IntegerPayloadPullRequest.java new file mode 100644 index 0000000..a29029c --- /dev/null +++ b/schema/src/main/java/com/github/api/v2/schema/IntegerPayloadPullRequest.java @@ -0,0 +1,51 @@ +package com.github.api.v2.schema; + +public class IntegerPayloadPullRequest implements PayloadPullRequest { + + private int number; + + public void setNumber(int number) { + this.number = number; + } + + @Override + public int getAdditions() { + // TODO Auto-generated method stub + return 0; + } + + @Override + public int getCommits() { + // TODO Auto-generated method stub + return 0; + } + + @Override + public int getDeletions() { + // TODO Auto-generated method stub + return 0; + } + + @Override + public int getId() { + // TODO Auto-generated method stub + return 0; + } + + @Override + public int getIssueId() { + // TODO Auto-generated method stub + return 0; + } + + @Override + public int getNumber() { + return number; + } + + @Override + public String getTitle() { + // TODO Auto-generated method stub + return null; + } +} diff --git a/schema/src/main/java/com/github/api/v2/schema/ObjectPayloadPullRequest.java b/schema/src/main/java/com/github/api/v2/schema/ObjectPayloadPullRequest.java new file mode 100644 index 0000000..f3fd66f --- /dev/null +++ b/schema/src/main/java/com/github/api/v2/schema/ObjectPayloadPullRequest.java @@ -0,0 +1,55 @@ +package com.github.api.v2.schema; + +public class ObjectPayloadPullRequest implements PayloadPullRequest { + + private String title; + private int deletions; + private int issueId; + private int commits; + private int number; + private int id; + private int additions; + + public String getTitle() { + return title; + } + public void setTitle(String title) { + this.title = title; + } + public int getDeletions() { + return deletions; + } + public void setDeletions(int deletions) { + this.deletions = deletions; + } + public int getIssueId() { + return issueId; + } + public void setIssueId(int issueId) { + this.issueId = issueId; + } + public int getCommits() { + return commits; + } + public void setCommits(int commits) { + this.commits = commits; + } + public int getNumber() { + return number; + } + public void setNumber(int number) { + this.number = number; + } + public int getId() { + return id; + } + public void setId(int id) { + this.id = id; + } + public int getAdditions() { + return additions; + } + public void setAdditions(int additions) { + this.additions = additions; + } +} diff --git a/schema/src/main/java/com/github/api/v2/schema/PayloadPullRequest.java b/schema/src/main/java/com/github/api/v2/schema/PayloadPullRequest.java index 1aefb97..2e19c7b 100644 --- a/schema/src/main/java/com/github/api/v2/schema/PayloadPullRequest.java +++ b/schema/src/main/java/com/github/api/v2/schema/PayloadPullRequest.java @@ -1,54 +1,13 @@ package com.github.api.v2.schema; -public class PayloadPullRequest { +public interface PayloadPullRequest { - private String title; - private int deletions; - private int issueId; - private int commits; - private int number; - private int id; - private int additions; - public String getTitle() { - return title; - } - public void setTitle(String title) { - this.title = title; - } - public int getDeletions() { - return deletions; - } - public void setDeletions(int deletions) { - this.deletions = deletions; - } - public int getIssueId() { - return issueId; - } - public void setIssueId(int issueId) { - this.issueId = issueId; - } - public int getCommits() { - return commits; - } - public void setCommits(int commits) { - this.commits = commits; - } - public int getNumber() { - return number; - } - public void setNumber(int number) { - this.number = number; - } - public int getId() { - return id; - } - public void setId(int id) { - this.id = id; - } - public int getAdditions() { - return additions; - } - public void setAdditions(int additions) { - this.additions = additions; - } -} + public String getTitle(); + public int getDeletions(); + public int getIssueId(); + public int getCommits(); + public int getNumber(); + public int getId(); + public int getAdditions(); + +} \ No newline at end of file From 98307a0721633a4be14b0b92d6b8ab537094305e Mon Sep 17 00:00:00 2001 From: slapperwan Date: Mon, 7 Mar 2011 14:05:17 +0800 Subject: [PATCH 75/95] Repositories pagination --- .../api/v2/services/RepositoryService.java | 8 ++++++++ .../v2/services/constant/GitHubApiUrls.java | 6 ++++-- .../services/impl/RepositoryServiceImpl.java | 20 +++++++++++++++++++ .../constant/GitHubApiUrls.properties | 4 +++- .../com/github/api/v2/schema/FeedEntry.java | 9 +++++++++ 5 files changed, 44 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/RepositoryService.java b/core/src/main/java/com/github/api/v2/services/RepositoryService.java index e6355df..355b5a3 100644 --- a/core/src/main/java/com/github/api/v2/services/RepositoryService.java +++ b/core/src/main/java/com/github/api/v2/services/RepositoryService.java @@ -337,4 +337,12 @@ public interface RepositoryService extends GitHubService { * @return the repository archive */ public ZipInputStream getRepositoryArchive(String userName, String repositoryName, String branchName); + + /** + * Gets the repositories. + * + * @param userName the user name + * @return the repositories + */ + public List getRepositories(String userName, int page); } diff --git a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java index 443672d..258d1c1 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java +++ b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java @@ -206,12 +206,15 @@ public static interface RepositoryApiUrls { /** The Constant GET_REPOSITORY_URL. */ public static final String GET_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getRepository"); - + /** The Constant UPDATE_REPOSITORY_URL. */ public static final String UPDATE_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.updateRepository"); /** The Constant GET_REPOSITORIES_URL. */ public static final String GET_REPOSITORIES_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getRepositories"); + + /** The Constant GET_REPOSITORIES_BY_PAGE_URL. */ + public static final String GET_REPOSITORIES_BY_PAGE_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.getRepositoriesByPage"); /** The Constant WATCH_REPOSITORY_URL. */ public static final String WATCH_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.repositoryService.watchRepository"); @@ -671,7 +674,6 @@ private static String encodeUrl(String original) { try { return URLEncoder.encode(original, ApplicationConstants.CONTENT_ENCODING); } catch (UnsupportedEncodingException e) { - Log.v(Constants.LOG_TAG, "++++++++++++++++ " + e.getMessage(), e); // should never be here.. return original; } diff --git a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java index 4c9076f..45b0390 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java @@ -21,6 +21,9 @@ import java.util.Map; import java.util.zip.ZipInputStream; +import android.util.Log; + +import com.gh4a.Constants; import com.github.api.v2.schema.Key; import com.github.api.v2.schema.Language; import com.github.api.v2.schema.Repository; @@ -477,4 +480,21 @@ public ZipInputStream getRepositoryArchive(String userName, String repositoryNam String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).withField(ParameterNames.REPOSITORY_NAME, repositoryName).withField(ParameterNames.BRANCH, branchName).buildUrl(); return new ZipInputStream(callApiGet(apiUrl)); } + + @Override + public List getRepositories(String userName, int page) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.GET_REPOSITORIES_BY_PAGE_URL); + String apiUrl = builder.withField(ParameterNames.USER_NAME, userName) + .withField(ParameterNames.PAGE, String.valueOf(page)).buildUrl(); + + Log.v(Constants.LOG_TAG, "+++++++++++++++++++ " + apiUrl); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + try { + return unmarshall(new TypeToken>(){}, json.get("repositories")); + } + catch (JsonParseException e) { + throw new GitHubException(e.getMessage(), e); + } + } } diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index 26fddd5..9452401 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -56,6 +56,7 @@ com.github.api.v2.services.repositoryService.searchRepositories=http://github.co com.github.api.v2.services.repositoryService.getRepository=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName} com.github.api.v2.services.repositoryService.updateRepository=http://github.com/api/{version}/{format}/repos/show/{userName}/{repositoryName} com.github.api.v2.services.repositoryService.getRepositories=http://github.com/api/{version}/{format}/repos/show/{userName} +com.github.api.v2.services.repositoryService.getRepositoriesByPage=http://github.com/api/{version}/{format}/repos/show/{userName}?page={page} com.github.api.v2.services.repositoryService.watchRepository=http://github.com/api/{version}/{format}/repos/watch/{userName}/{repositoryName} com.github.api.v2.services.repositoryService.unwatchRepository=http://github.com/api/{version}/{format}/repos/unwatch/{userName}/{repositoryName} com.github.api.v2.services.repositoryService.forkRepository=http://github.com/api/{version}/{format}/repos/fork/{userName}/{repositoryName} @@ -115,7 +116,8 @@ com.github.api.v2.services.pullRequestService.getPullRequests=http://github.com/ # Feed com.github.api.v2.services.feedService.getPublicUserFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg com.github.api.v2.services.feedService.getPublicUserFeedJson=https://github.com/{userName}.json -com.github.api.v2.services.feedService.getPrivateUserFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg +com.github.api.v2.services.feedService.getPrivateUserFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}.private.actor.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg +#com.github.api.v2.services.feedService.getPrivateUserFeed=https://github.com/{username}.private.actor.atom com.github.api.v2.services.feedService.getPrivateUserFeedJson=https://github.com/{userName}.private.json com.github.api.v2.services.feedService.getCommitFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}%2F{repositoryName}%2Fcommits%2F{branch}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg com.github.api.v2.services.feedService.getNetworkFeed=http://github.com/{userName}/{repositoryName}/network/feed diff --git a/schema/src/main/java/com/github/api/v2/schema/FeedEntry.java b/schema/src/main/java/com/github/api/v2/schema/FeedEntry.java index f3ccdf8..7a8cdb0 100644 --- a/schema/src/main/java/com/github/api/v2/schema/FeedEntry.java +++ b/schema/src/main/java/com/github/api/v2/schema/FeedEntry.java @@ -45,6 +45,7 @@ public class FeedEntry extends SchemaEntity { /** The categories. */ private List categories; + private String id; /** * Gets the title. * @@ -168,4 +169,12 @@ public String toString() { + ", link=" + link + ", publishedDate=" + publishedDate + ", title=" + title + "]"; } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } } From 6ad7b5f517c5bf8b37464d570444c723183b92d0 Mon Sep 17 00:00:00 2001 From: slapperwan Date: Tue, 15 Mar 2011 10:53:14 +0800 Subject: [PATCH 76/95] Get followers/following as full --- .../main/java/com/github/api/v2/services/UserService.java | 4 ++-- .../com/github/api/v2/services/impl/UserServiceImpl.java | 8 ++++---- .../api/v2/services/constant/GitHubApiUrls.properties | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/UserService.java b/core/src/main/java/com/github/api/v2/services/UserService.java index 80a3343..52f000f 100644 --- a/core/src/main/java/com/github/api/v2/services/UserService.java +++ b/core/src/main/java/com/github/api/v2/services/UserService.java @@ -81,7 +81,7 @@ public interface UserService extends GitHubService { * * @return the user followers */ - public List getUserFollowers(String userName); + public List getUserFollowers(String userName); /** * Gets the user following. @@ -91,7 +91,7 @@ public interface UserService extends GitHubService { * * @return the user following */ - public List getUserFollowing(String userName); + public List getUserFollowing(String userName); /** * Follow user. diff --git a/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java index 7b410a1..bebf77e 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java @@ -147,13 +147,13 @@ public User getUserByUsername(String userName) { * @see com.github.api.v2.services.UserService#getUserFollowers(java.lang.String) */ @Override - public List getUserFollowers(String userName) { + public List getUserFollowers(String userName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_USER_FOLLOWERS_URL); String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); try { - return unmarshall(new TypeToken>(){}, json.get("users")); + return unmarshall(new TypeToken>(){}, json.get("users")); } catch (JsonParseException e) { throw new GitHubException(e.getMessage(), e); @@ -164,13 +164,13 @@ public List getUserFollowers(String userName) { * @see com.github.api.v2.services.UserService#getUserFollowing(java.lang.String) */ @Override - public List getUserFollowing(String userName) { + public List getUserFollowing(String userName) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.UserApiUrls.GET_USER_FOLLOWING_URL); String apiUrl = builder.withField(ParameterNames.USER_NAME, userName).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); try { - return unmarshall(new TypeToken>(){}, json.get("users")); + return unmarshall(new TypeToken>(){}, json.get("users")); } catch (JsonParseException e) { throw new GitHubException(e.getMessage(), e); diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index 9452401..110f889 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -12,8 +12,8 @@ com.github.api.v2.services.userService.searchUsersByEmail=http://github.com/api/ com.github.api.v2.services.userService.getUser=http://github.com/api/{version}/{format}/user/show/{userName} com.github.api.v2.services.userService.getCurrentUser=http://github.com/api/{version}/{format}/user/show com.github.api.v2.services.userService.updateUser=http://github.com/api/{version}/{format}/user/show/{userName} -com.github.api.v2.services.userService.getUserFollowers=http://github.com/api/{version}/{format}/user/show/{userName}/followers -com.github.api.v2.services.userService.getUserFollowing=http://github.com/api/{version}/{format}/user/show/{userName}/following +com.github.api.v2.services.userService.getUserFollowers=http://github.com/api/{version}/{format}/user/show/{userName}/followers?full=1 +com.github.api.v2.services.userService.getUserFollowing=http://github.com/api/{version}/{format}/user/show/{userName}/following?full=1 com.github.api.v2.services.userService.followUser=http://github.com/api/{version}/{format}/user/follow/{userName} com.github.api.v2.services.userService.unfollowUser=http://github.com/api/{version}/{format}/user/unfollow/{userName} com.github.api.v2.services.userService.getWatchedRepositories=http://github.com/api/{version}/{format}/repos/watched/{userName} From ead967474e7d1bf91e77a2a7d8859c144c2ca21a Mon Sep 17 00:00:00 2001 From: slapperwan Date: Tue, 15 Mar 2011 10:54:06 +0800 Subject: [PATCH 77/95] Fixed follow event payload target' schema/src/main/java/com/github/api/v2/schema/ObjectPayloadTarget.java schema/src/main/java/com/github/api/v2/schema/StringPayloadTarget.java core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java schema/src/main/java/com/github/api/v2/schema/Payload.java schema/src/main/java/com/github/api/v2/schema/PayloadTarget.java --- .../api/v2/schema/ObjectPayloadTarget.java | 50 +++++++++++++++++++ .../api/v2/schema/StringPayloadTarget.java | 34 +++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 schema/src/main/java/com/github/api/v2/schema/ObjectPayloadTarget.java create mode 100644 schema/src/main/java/com/github/api/v2/schema/StringPayloadTarget.java diff --git a/schema/src/main/java/com/github/api/v2/schema/ObjectPayloadTarget.java b/schema/src/main/java/com/github/api/v2/schema/ObjectPayloadTarget.java new file mode 100644 index 0000000..d9615c8 --- /dev/null +++ b/schema/src/main/java/com/github/api/v2/schema/ObjectPayloadTarget.java @@ -0,0 +1,50 @@ +package com.github.api.v2.schema; + +public class ObjectPayloadTarget extends SchemaEntity implements PayloadTarget { + + /** The repos */ + private int repos; + + /** The followers */ + private int followers; + + /** The login */ + private String login; + + /** The gravatarId */ + private String gravatarId; + + public int getRepos() { + return repos; + } + + public void setRepos(int repos) { + this.repos = repos; + } + + public int getFollowers() { + return followers; + } + + public void setFollowers(int followers) { + this.followers = followers; + } + + public String getLogin() { + return login; + } + + public void setLogin(String login) { + this.login = login; + } + + public String getGravatarId() { + return gravatarId; + } + + public void setGravatarId(String gravatarId) { + this.gravatarId = gravatarId; + } + + +} diff --git a/schema/src/main/java/com/github/api/v2/schema/StringPayloadTarget.java b/schema/src/main/java/com/github/api/v2/schema/StringPayloadTarget.java new file mode 100644 index 0000000..934b530 --- /dev/null +++ b/schema/src/main/java/com/github/api/v2/schema/StringPayloadTarget.java @@ -0,0 +1,34 @@ +package com.github.api.v2.schema; + +public class StringPayloadTarget extends SchemaEntity implements PayloadTarget { + + private String login; + + public void setLogin(String login) { + this.login = login; + } + + @Override + public int getFollowers() { + // TODO Auto-generated method stub + return 0; + } + + @Override + public String getGravatarId() { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getLogin() { + return login; + } + + @Override + public int getRepos() { + // TODO Auto-generated method stub + return 0; + } + +} From 94731461b893b4fc4d59d43eeefe80b45b5527b6 Mon Sep 17 00:00:00 2001 From: slapperwan Date: Tue, 15 Mar 2011 10:54:29 +0800 Subject: [PATCH 78/95] Fixed follow event payload target --- .../v2/services/impl/BaseGitHubService.java | 28 ++++++++-- .../v2/services/impl/GitHubApiGateway.java | 1 + .../com/github/api/v2/schema/Payload.java | 2 - .../github/api/v2/schema/PayloadTarget.java | 52 ++----------------- 4 files changed, 31 insertions(+), 52 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java index 050e8d3..7276ec2 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java +++ b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java @@ -35,11 +35,14 @@ import com.github.api.v2.schema.Issue; import com.github.api.v2.schema.Language; import com.github.api.v2.schema.ObjectPayloadPullRequest; +import com.github.api.v2.schema.ObjectPayloadTarget; import com.github.api.v2.schema.Organization; import com.github.api.v2.schema.PayloadPullRequest; +import com.github.api.v2.schema.PayloadTarget; import com.github.api.v2.schema.Permission; import com.github.api.v2.schema.Repository; import com.github.api.v2.schema.SchemaEntity; +import com.github.api.v2.schema.StringPayloadTarget; import com.github.api.v2.schema.Tree; import com.github.api.v2.schema.UserFeed; import com.github.api.v2.services.AsyncResponseHandler; @@ -169,6 +172,8 @@ public Date deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext }); builder.registerTypeAdapter(PayloadPullRequest.class, new PayloadPullRequestDeserializer()); + builder.registerTypeAdapter(PayloadTarget.class, new PayloadTargetDeserializer()); + builder.registerTypeAdapter(Issue.State.class, new JsonDeserializer() { @Override public Issue.State deserialize(JsonElement arg0, Type arg1, @@ -305,8 +310,25 @@ else if (json.isJsonObject()) { ObjectPayloadPullRequest obj2 = context.deserialize(json, new TypeToken(){}.getType()); return obj2; } - - return null; + return null; } - } + } + + private class PayloadTargetDeserializer implements JsonDeserializer { + public PayloadTarget deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) + throws JsonParseException { + Log.v(Constants.LOG_TAG, "+++++++++++++++ " + json.isJsonPrimitive()); + Log.v(Constants.LOG_TAG, "+++++++++++++++ " + json.toString()); + if (json.isJsonPrimitive()) { + StringPayloadTarget payloadTarget = new StringPayloadTarget(); + payloadTarget.setLogin(json.getAsString()); + return payloadTarget; + } + else if (json.isJsonObject()) { + ObjectPayloadTarget obj2 = context.deserialize(json, new TypeToken(){}.getType()); + return obj2; + } + return null; + } + } } diff --git a/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java b/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java index f6d27f2..eb26b84 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java +++ b/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java @@ -173,6 +173,7 @@ public void setAuthentication(Authentication authentication) { * the is * * @return the string + * @throws IOException */ protected static String convertStreamToString(InputStream is) { /* diff --git a/schema/src/main/java/com/github/api/v2/schema/Payload.java b/schema/src/main/java/com/github/api/v2/schema/Payload.java index 610eb19..f4f1cea 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Payload.java +++ b/schema/src/main/java/com/github/api/v2/schema/Payload.java @@ -2,8 +2,6 @@ import java.util.List; -import com.google.gson.annotations.SerializedName; - public class Payload extends SchemaEntity { /** The repo */ diff --git a/schema/src/main/java/com/github/api/v2/schema/PayloadTarget.java b/schema/src/main/java/com/github/api/v2/schema/PayloadTarget.java index 8107d4f..0015ece 100644 --- a/schema/src/main/java/com/github/api/v2/schema/PayloadTarget.java +++ b/schema/src/main/java/com/github/api/v2/schema/PayloadTarget.java @@ -1,50 +1,8 @@ package com.github.api.v2.schema; -public class PayloadTarget extends SchemaEntity { - - /** The repos */ - private int repos; - - /** The followers */ - private int followers; - - /** The login */ - private String login; - - /** The gravatarId */ - private String gravatarId; - - public int getRepos() { - return repos; - } - - public void setRepos(int repos) { - this.repos = repos; - } - - public int getFollowers() { - return followers; - } - - public void setFollowers(int followers) { - this.followers = followers; - } - - public String getLogin() { - return login; - } - - public void setLogin(String login) { - this.login = login; - } - - public String getGravatarId() { - return gravatarId; - } - - public void setGravatarId(String gravatarId) { - this.gravatarId = gravatarId; - } - - +public interface PayloadTarget { + public int getRepos(); + public int getFollowers(); + public String getLogin(); + public String getGravatarId(); } From a6d2fe21e9d4f5b32e55f6c2494301a394a79a49 Mon Sep 17 00:00:00 2001 From: slapperwan Date: Tue, 15 Mar 2011 12:44:28 +0800 Subject: [PATCH 79/95] Fixed for sdk 1.5 --- .../api/v2/services/impl/BaseGitHubService.java | 5 ----- .../api/v2/services/impl/GitHubApiGateway.java | 14 ++++++++++++-- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java index 7276ec2..cba08cb 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java +++ b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java @@ -26,9 +26,6 @@ import java.util.Date; import java.util.List; -import android.util.Log; - -import com.gh4a.Constants; import com.github.api.v2.schema.Discussion; import com.github.api.v2.schema.Gist; import com.github.api.v2.schema.IntegerPayloadPullRequest; @@ -317,8 +314,6 @@ else if (json.isJsonObject()) { private class PayloadTargetDeserializer implements JsonDeserializer { public PayloadTarget deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - Log.v(Constants.LOG_TAG, "+++++++++++++++ " + json.isJsonPrimitive()); - Log.v(Constants.LOG_TAG, "+++++++++++++++ " + json.toString()); if (json.isJsonPrimitive()) { StringPayloadTarget payloadTarget = new StringPayloadTarget(); payloadTarget.setLogin(json.getAsString()); diff --git a/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java b/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java index eb26b84..c195b0b 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java +++ b/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java @@ -38,6 +38,8 @@ import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLSession; +import android.os.Build; + import com.github.api.v2.services.GitHubException; import com.github.api.v2.services.auth.Authentication; import com.github.api.v2.services.auth.HeaderBasedAuthentication; @@ -237,7 +239,8 @@ protected InputStream callApiGet(String apiUrl, int expected) { } HttpURLConnection request = (HttpURLConnection) url.openConnection(); - + request.setRequestMethod("GET"); + if (ApplicationConstants.CONNECT_TIMEOUT > -1) { request.setConnectTimeout(ApplicationConstants.CONNECT_TIMEOUT); } @@ -247,7 +250,14 @@ protected InputStream callApiGet(String apiUrl, int expected) { } for (String headerName : requestHeaders.keySet()) { - request.setRequestProperty(headerName, requestHeaders.get(headerName)); + if (Integer.parseInt(Build.VERSION.SDK) < 5) { + if (!headerName.equals("Accept-Encoding")) { + request.setRequestProperty(headerName, requestHeaders.get(headerName)); + } + } + else { + request.setRequestProperty(headerName, requestHeaders.get(headerName)); + } } //fixed for android 1.5, API 3 From 9d67be8f41b1c8e8effb3836b2f67f58d0ed58af Mon Sep 17 00:00:00 2001 From: slapperwan Date: Tue, 15 Mar 2011 16:18:15 +0800 Subject: [PATCH 80/95] Workaround fix for API level 3 and 4 --- .../java/com/github/api/v2/services/impl/GitHubApiGateway.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java b/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java index c195b0b..bdba81a 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java +++ b/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java @@ -39,7 +39,9 @@ import javax.net.ssl.SSLSession; import android.os.Build; +import android.util.Log; +import com.gh4a.Constants; import com.github.api.v2.services.GitHubException; import com.github.api.v2.services.auth.Authentication; import com.github.api.v2.services.auth.HeaderBasedAuthentication; @@ -264,6 +266,7 @@ protected InputStream callApiGet(String apiUrl, int expected) { if (request instanceof HttpsURLConnection) { ((HttpsURLConnection) request).setHostnameVerifier(DO_NOT_VERIFY); } + System.setProperty("http.keepAlive", "false"); request.connect(); if (request.getResponseCode() != expected) { From 881ef9700ec51e39ac3994211bed43923efa067b Mon Sep 17 00:00:00 2001 From: slapperwan Date: Tue, 15 Mar 2011 16:43:42 +0800 Subject: [PATCH 81/95] Removed dependencies on gh4a --- .../github/api/v2/services/FeedService.java | 2 -- .../v2/services/constant/GitHubApiUrls.java | 3 --- .../api/v2/services/impl/FeedServiceImpl.java | 7 ------- .../api/v2/services/impl/GitHubApiGateway.java | 14 +++++--------- .../services/impl/RepositoryServiceImpl.java | 4 ---- .../api/v2/services/UserServiceTest.java | 4 ++-- dist/github-java-sdk.jar | Bin 173525 -> 0 bytes schema/pom.xml | 10 +++++++++- 8 files changed, 16 insertions(+), 28 deletions(-) delete mode 100644 dist/github-java-sdk.jar diff --git a/core/src/main/java/com/github/api/v2/services/FeedService.java b/core/src/main/java/com/github/api/v2/services/FeedService.java index cfd5628..027bbf2 100644 --- a/core/src/main/java/com/github/api/v2/services/FeedService.java +++ b/core/src/main/java/com/github/api/v2/services/FeedService.java @@ -18,8 +18,6 @@ import java.util.List; -import android.content.Context; - import com.github.api.v2.schema.Feed; import com.github.api.v2.schema.UserFeed; diff --git a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java index 258d1c1..bf132f7 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java +++ b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java @@ -27,9 +27,6 @@ import java.util.logging.Level; import java.util.logging.Logger; -import android.util.Log; - -import com.gh4a.Constants; import com.github.api.v2.schema.ValueEnum; /** diff --git a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java index 8d30cda..3400b87 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java @@ -16,16 +16,10 @@ */ package com.github.api.v2.services.impl; -import java.lang.reflect.Type; import java.util.Collection; import java.util.List; -import android.content.Context; -import android.util.Log; - -import com.gh4a.Constants; import com.github.api.v2.schema.Feed; -import com.github.api.v2.schema.Payload; import com.github.api.v2.schema.UserFeed; import com.github.api.v2.services.FeedService; import com.github.api.v2.services.GitHubException; @@ -34,7 +28,6 @@ import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import com.google.gson.InstanceCreator; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; diff --git a/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java b/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java index bdba81a..6532ef5 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java +++ b/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java @@ -38,10 +38,6 @@ import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLSession; -import android.os.Build; -import android.util.Log; - -import com.gh4a.Constants; import com.github.api.v2.services.GitHubException; import com.github.api.v2.services.auth.Authentication; import com.github.api.v2.services.auth.HeaderBasedAuthentication; @@ -252,14 +248,14 @@ protected InputStream callApiGet(String apiUrl, int expected) { } for (String headerName : requestHeaders.keySet()) { - if (Integer.parseInt(Build.VERSION.SDK) < 5) { + //if (Integer.parseInt(Build.VERSION.SDK) < 5) { if (!headerName.equals("Accept-Encoding")) { request.setRequestProperty(headerName, requestHeaders.get(headerName)); } - } - else { - request.setRequestProperty(headerName, requestHeaders.get(headerName)); - } +// } +// else { +// request.setRequestProperty(headerName, requestHeaders.get(headerName)); +// } } //fixed for android 1.5, API 3 diff --git a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java index 45b0390..0fd149f 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java @@ -21,9 +21,6 @@ import java.util.Map; import java.util.zip.ZipInputStream; -import android.util.Log; - -import com.gh4a.Constants; import com.github.api.v2.schema.Key; import com.github.api.v2.schema.Language; import com.github.api.v2.schema.Repository; @@ -487,7 +484,6 @@ public List getRepositories(String userName, int page) { String apiUrl = builder.withField(ParameterNames.USER_NAME, userName) .withField(ParameterNames.PAGE, String.valueOf(page)).buildUrl(); - Log.v(Constants.LOG_TAG, "+++++++++++++++++++ " + apiUrl); JsonObject json = unmarshall(callApiGet(apiUrl)); try { diff --git a/core/src/test/java/com/github/api/v2/services/UserServiceTest.java b/core/src/test/java/com/github/api/v2/services/UserServiceTest.java index dd8fb64..369b7ba 100644 --- a/core/src/test/java/com/github/api/v2/services/UserServiceTest.java +++ b/core/src/test/java/com/github/api/v2/services/UserServiceTest.java @@ -125,7 +125,7 @@ public void testGetUserByUsername() { @Test public void testGetUserFollowers() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - List userFollowers = service.getUserFollowers(TestConstants.TEST_USER_NAME); + List userFollowers = service.getUserFollowers(TestConstants.TEST_USER_NAME); assertNotNullOrEmpty("User followers cannot be null or empty.", userFollowers); } @@ -135,7 +135,7 @@ public void testGetUserFollowers() { @Test public void testGetUserFollowing() { assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Username."), TestConstants.TEST_USER_NAME); - List userFollowing = service.getUserFollowing(TestConstants.TEST_USER_NAME); + List userFollowing = service.getUserFollowing(TestConstants.TEST_USER_NAME); assertNotNullOrEmpty("User followering cannot be null or empty.", userFollowing); } diff --git a/dist/github-java-sdk.jar b/dist/github-java-sdk.jar deleted file mode 100644 index 7006ef7ece26b1747d2bd26630b0f388c1bd301d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173525 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�_~mkR}2VoGt1XG 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 z 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

N;N4>F=&T>(EHj&cC4x7G-3Q&Cx|7VO{TY+6 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%0AlOjmS$+0X%76rau5JthF+CyJKi47QcAg}m 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


7pw9CUvy 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 github-java-schema jar - \ No newline at end of file + + + com.google.code.gson + gson + 1.4 + compile + + + From 115716aa1a05eafae314b5bd90f6acbeae2ac672 Mon Sep 17 00:00:00 2001 From: slapperwan Date: Tue, 15 Mar 2011 16:43:58 +0800 Subject: [PATCH 82/95] Removed dependencies on gh4a --- schema/src/main/java/com/github/api/v2/schema/Discussion.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/schema/src/main/java/com/github/api/v2/schema/Discussion.java b/schema/src/main/java/com/github/api/v2/schema/Discussion.java index 07b5757..f933f36 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Discussion.java +++ b/schema/src/main/java/com/github/api/v2/schema/Discussion.java @@ -23,15 +23,13 @@ import java.util.List; import java.util.Map; -import com.github.api.v2.services.constant.ApplicationConstants; - /** * The Class Discussion. */ public class Discussion extends SchemaEntity { /** The Constant COMMENT_DATE_FORMAT. */ - private static final SimpleDateFormat COMMENT_DATE_FORMAT = new SimpleDateFormat(ApplicationConstants.DATE_FORMAT); + private static final SimpleDateFormat COMMENT_DATE_FORMAT = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss Z"); /** The Constant COMMIT_DATE_FORMAT. */ private static final SimpleDateFormat COMMIT_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); From ca336a2547542075e7c6e7b9bf6f4ed5f82f4eb7 Mon Sep 17 00:00:00 2001 From: slapperwan Date: Wed, 23 Mar 2011 14:35:58 +0800 Subject: [PATCH 83/95] Rename gson package to avoid classpath problem in some HTC devices --- .classpath | 2 +- build.xml | 2 +- core/pom.xml | 4 ++-- .../v2/services/impl/BaseGitHubService.java | 22 +++++++++--------- .../v2/services/impl/CommitServiceImpl.java | 8 +++---- .../api/v2/services/impl/FeedServiceImpl.java | 14 +++++------ .../api/v2/services/impl/GistServiceImpl.java | 6 ++--- .../v2/services/impl/IssueServiceImpl.java | 6 ++--- .../v2/services/impl/NetworkServiceImpl.java | 10 ++++---- .../v2/services/impl/ObjectServiceImpl.java | 6 ++--- .../impl/OrganizationServiceImpl.java | 8 +++---- .../services/impl/PullRequestServiceImpl.java | 6 ++--- .../services/impl/RepositoryServiceImpl.java | 6 ++--- .../api/v2/services/impl/UserServiceImpl.java | 8 +++---- lib/gson-1.4.jar | Bin 166372 -> 0 bytes lib/mygson-1.4.jar | Bin 0 -> 172310 bytes schema/pom.xml | 2 +- .../java/com/github/api/v2/schema/Gist.java | 2 +- .../com/github/api/v2/schema/Repository.java | 2 +- 19 files changed, 57 insertions(+), 57 deletions(-) delete mode 100644 lib/gson-1.4.jar create mode 100644 lib/mygson-1.4.jar diff --git a/.classpath b/.classpath index ec30d48..ff00a5f 100644 --- a/.classpath +++ b/.classpath @@ -8,6 +8,6 @@ - + diff --git a/build.xml b/build.xml index da98af1..b1fcead 100644 --- a/build.xml +++ b/build.xml @@ -13,7 +13,7 @@ - + diff --git a/core/pom.xml b/core/pom.xml index eda3f9c..5f82f63 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -24,7 +24,7 @@ com.google.code.gson - gson + mygson 1.4 compile @@ -55,4 +55,4 @@ test - \ No newline at end of file + diff --git a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java index cba08cb..8b9c040 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java +++ b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java @@ -47,17 +47,17 @@ import com.github.api.v2.services.GitHubService; import com.github.api.v2.services.constant.ApplicationConstants; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; -import com.google.gson.FieldNamingPolicy; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonArray; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.JsonParser; -import com.google.gson.reflect.TypeToken; +import com.google.mygson.gh4a.FieldNamingPolicy; +import com.google.mygson.gh4a.Gson; +import com.google.mygson.gh4a.GsonBuilder; +import com.google.mygson.gh4a.JsonArray; +import com.google.mygson.gh4a.JsonDeserializationContext; +import com.google.mygson.gh4a.JsonDeserializer; +import com.google.mygson.gh4a.JsonElement; +import com.google.mygson.gh4a.JsonObject; +import com.google.mygson.gh4a.JsonParseException; +import com.google.mygson.gh4a.JsonParser; +import com.google.mygson.gh4a.reflect.TypeToken; /** * The Class BaseGitHubService. diff --git a/core/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java index f946370..4948c57 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/CommitServiceImpl.java @@ -24,10 +24,10 @@ import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.reflect.TypeToken; +import com.google.mygson.gh4a.GsonBuilder; +import com.google.mygson.gh4a.JsonObject; +import com.google.mygson.gh4a.JsonParseException; +import com.google.mygson.gh4a.reflect.TypeToken; /** * The Class CommitServiceImpl. diff --git a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java index 3400b87..80665b0 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java @@ -26,13 +26,13 @@ import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.reflect.TypeToken; +import com.google.mygson.gh4a.Gson; +import com.google.mygson.gh4a.GsonBuilder; +import com.google.mygson.gh4a.JsonArray; +import com.google.mygson.gh4a.JsonElement; +import com.google.mygson.gh4a.JsonObject; +import com.google.mygson.gh4a.JsonParseException; +import com.google.mygson.gh4a.reflect.TypeToken; /** * The Class FeedServiceImpl. diff --git a/core/src/main/java/com/github/api/v2/services/impl/GistServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/GistServiceImpl.java index 2d1d931..4046891 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/GistServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/GistServiceImpl.java @@ -25,9 +25,9 @@ import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.reflect.TypeToken; +import com.google.mygson.gh4a.JsonObject; +import com.google.mygson.gh4a.JsonParseException; +import com.google.mygson.gh4a.reflect.TypeToken; /** * The Class GistServiceImpl. diff --git a/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java index 076b990..1dce5c1 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/IssueServiceImpl.java @@ -28,9 +28,9 @@ import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.reflect.TypeToken; +import com.google.mygson.gh4a.JsonObject; +import com.google.mygson.gh4a.JsonParseException; +import com.google.mygson.gh4a.reflect.TypeToken; /** * The Class IssueServiceImpl. diff --git a/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java index 40cb3d0..c47be2b 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/NetworkServiceImpl.java @@ -25,11 +25,11 @@ import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.reflect.TypeToken; +import com.google.mygson.gh4a.Gson; +import com.google.mygson.gh4a.GsonBuilder; +import com.google.mygson.gh4a.JsonObject; +import com.google.mygson.gh4a.JsonParseException; +import com.google.mygson.gh4a.reflect.TypeToken; /** * The Class NetworkServiceImpl. diff --git a/core/src/main/java/com/github/api/v2/services/impl/ObjectServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/ObjectServiceImpl.java index 2b979d9..b9ac7a8 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/ObjectServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/ObjectServiceImpl.java @@ -26,9 +26,9 @@ import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.reflect.TypeToken; +import com.google.mygson.gh4a.JsonObject; +import com.google.mygson.gh4a.JsonParseException; +import com.google.mygson.gh4a.reflect.TypeToken; /** * The Class ObjectServiceImpl. diff --git a/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java index 21e8d20..d2dbc71 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java @@ -30,10 +30,10 @@ import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; -import com.google.gson.Gson; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.reflect.TypeToken; +import com.google.mygson.gh4a.Gson; +import com.google.mygson.gh4a.JsonObject; +import com.google.mygson.gh4a.JsonParseException; +import com.google.mygson.gh4a.reflect.TypeToken; /** * The Class OrganizationServiceImpl. diff --git a/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java index 4ba40a3..c5ad364 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/PullRequestServiceImpl.java @@ -27,9 +27,9 @@ import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.reflect.TypeToken; +import com.google.mygson.gh4a.JsonObject; +import com.google.mygson.gh4a.JsonParseException; +import com.google.mygson.gh4a.reflect.TypeToken; /** * The Class PullRequestServiceImpl. diff --git a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java index 0fd149f..fdfee29 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java @@ -31,9 +31,9 @@ import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.reflect.TypeToken; +import com.google.mygson.gh4a.JsonObject; +import com.google.mygson.gh4a.JsonParseException; +import com.google.mygson.gh4a.reflect.TypeToken; /** * The Class RepositoryServiceImpl. diff --git a/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java index bebf77e..6c0c0e8 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/UserServiceImpl.java @@ -29,10 +29,10 @@ import com.github.api.v2.services.constant.GitHubApiUrls; import com.github.api.v2.services.constant.ParameterNames; import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; -import com.google.gson.Gson; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.reflect.TypeToken; +import com.google.mygson.gh4a.Gson; +import com.google.mygson.gh4a.JsonObject; +import com.google.mygson.gh4a.JsonParseException; +import com.google.mygson.gh4a.reflect.TypeToken; /** * The Class UserServiceImpl. diff --git a/lib/gson-1.4.jar b/lib/gson-1.4.jar deleted file mode 100644 index b9c33d0390790ad6ef9549e16e9349f0f7fffca7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166372 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

IMdLXSRIQO>2WMOeG^kdTz4wG9G3Xms=;1 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%0D(dt*#$h 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 diff --git a/lib/mygson-1.4.jar b/lib/mygson-1.4.jar new file mode 100644 index 0000000000000000000000000000000000000000..121014044c3f6067fba553dd6af8676f4088db22 GIT binary patch literal 172310 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

cSOdsEB#efLD**=G6z zFNP6p@`53G9>_eTKAj%$k~W0##@;q~fs4jk1Hu=i0XaZb-!ZG$hsy)7l`$YBp39 z))%75YluG^5)cE6LLqA;2#CG0?X(xE+l*b!PxOw%Nv&t$kHlCyptXd_6>v>2GSfX} zCwZ9uyi7&weHkTZz;;^CGH9)|fX;U{c&;=`F}rNJR>-*VqtQb5ws-4&QFQZZ+=rY& zsl9-t)sg#V^f=3YxY=yrIK<5BIw_*2is=Z5#@2HvrV?~>4#XB8V-?)7%vCK>0mRK^ zU?u@va0kl-OqQObUk$rQ<=q~;F_SQmT#HSYw7P3*f$RaA4cJl(0Kyh8t|(AdXW>|5 z^*FPnDf-3Q7dpQ+Nv8ni*E&A~J~n%bEcS*G0ivy6duBXj{tc;lKv|V z962X)x4s;&;s@vHo=WMfYi#oN6~Jp9A(bYzGQ2V*wx3_sCAC1P2dYr_s5Q zoMC^g>9rAdW=-y=?7m{ z;wCzyQTp!Lcj3*+Gvq>Ej54aAG|Hl@BYUi1c556TTyW?d@{Vw#0Nu7YEL)~9WU1Vq zsTeQoFTD)u4o6OzOL19QWS(b~Mn1E5F^i8Bg(_eVFxsPsK!ljP4q1SrAvW^;CwG`6 zt$X+XZ%F(P|F$X)7XQQZqocGcio#>{V{8e^end=$!a6N(kQG!wkS_$X!b<$~Hy9?y zEH_jg08zv66X-nd#A*G3;O&>nICtB^S31|0WC-3TZw-M|X|c1SqqTbkQ z%+Vh7RIg|??L#?mtibb;R~V@Dg_NG>JlG9Rvc9`+G){XyKXG$qnT#eXe1c&=0~18b*YAU*pb$yBA~2 z)?aY^ol!DRNg}sByezr~T}cA{A%Qd1Z9e+YMtsJ0!P^IArwTcU@XoYhS#;5o4;UqE zk!^~CNaV;#)vf28d>B}0@XD{up%Pw$-635ylF?qjT94p@3g1twWKg@lmcl&f2515U z?cOhE$If4+lD20uuSpsh=gZS0b;9YeU@P;;%if{%m|oL(4jFy&@k+u@-Pl4Qk^qD+ zb1;2oOmSpP4$Wg%FIp#ScD$4h!($m#w=^yjhilL&9ul0hCS1-8d?zJwbt5EvvJ=${ zu#$-$b(G+79fm7j?o~BC>-uENmSU|l;Lde6ScX%H;H`Cs3y(rdnk6Qy2R3y|&B0g+ z8WFf)0k>6Z<{}^8>0kM6F()Dp)ZYPW?>Qo%(H6>YGTH+yY0e%y4#7P6v4OA|WdMF< z&20U><9!D#w2P@u_OsDf!`yEzh#a>&>c~WIv#-L zGxl~EjpJ@aXX)P@i{ApWyMF8xLYPs8a7x_^iSIyB4YIG1 z)6FCzt_xC~9)TlXoKQ3m z|7pAoQQNtg?{^ap^268@u{pM?E8dRln?Jxp6=GBvKaGO=6&8Fy?+!Bhk<)@LPzliJ zW?oFvVr5_dS>_g=+LW{K`SNA{Z@zpg4*$b~CzXF)A&W~%HK;pr(P^^<%p{T45dMKa z2*{eFV(GuXB4LrsRnUhc5J^Q)E5@bD7N6tg(a|fJ&hkEpIeRS54iD-N?Gd<7Ur2gh zwmf7xHoRQ=`gVZO`{6+-p%#~7L>Z|ImUYrwMpa;N#kaE3HQsrTQFSdL*J(Xxk*%#< zm0GcMP~rDp4(PnKRDQY@%*WE(@^(nfSaz?Apq>QTicWTO%s)1%@+(CQ`T8KjCqsto!3g8j&TCWtb z2_20bEGQRT>mo7SBIj*HX%N-#-`#;Q)pZ!02kO-pr`jrRpsu3LeO@7zw~IV;HHX-% z$l$sJiz7xoNGb-N8DnszQF=Aw{oJ zSyn5e0t3O#vHkcqNR=j27cZdjBn&^JQ?Jsr4EE*<=uL3rtJ`(r(oelHWNj+H7x_6+3PQ21ay%qI+PA8#4oWCwBKEeE~7<#uErLGx`?h)ZG$+D_nR7`JGiX>S~6;1_uam_oeHODU+ku9#XN#%C1e+UKdDG zz(izqGsbXJ6LlN$WXNJ710*0`;2GUq3EYC_V||-3^161#p&MW~68J6AcqxRWXIP5M zhdem7^%ctb1*RzA5hLn@K4f!<=}7F?E%Ih5ry98E7IbPh#u|hrE<8l|gIE;3>r$`! zD~yq-M-oOle7jTxd7b3G*n7{`(K-=zBT^C+vh22&7dpx#xj1{!5KUl(mikL+UluPK|%Qx6jpC)7Cyxk(nClhGq{DB}Xq2 zDy)mwaA)4m@`|=Km+xq!&khs*pTiRyQ<>FiWg({UleJk)y5{9n9{l2wQAe#sm^YFp zF`l8?GOUx{US(RYg=vPN%)eVF=>Kk=I856iBp9{J9XUcW25#uwVj#i*W+$j92`266 ziK+Ugc`f5&r+W}^=4IA#jLap9&`^o($bqa*jPik5}=8@MPmRqI7aLprr)kT8MkrBz1p0 zTofV%C|^044WDVz0v{QxO2$u(nV#Qd8cNUcO4W2$N<Fkh!Pgl(l`M zXD;&4E@{&{jotd%1b~w_bnmFQxzecUM~w*kUE8cvV){1rEN7eMkBc2j;NJ!lE2G#} zmleA-60(idm;UkFx4{dgAOx>uvN=1yZ567%#<61tAmPOO6kYhc!06m#6&b zuS=9o&?|$pN;t^Jx5Bd*DV)3v@v_d+(z+(jPOC%Z%f_reUMp}>T5}p)Oh){m;kLCl z4V-bRmU;QUx1^rbR{B}`Cf}|nC@IYO-XIrjS*qo$$A+*v7RHUoCxMKOi85v|%+QmL z4^MOGQ%f!tosPez*2$U&gF7poI4!hF(s;ieLW11A`SbAJ4%Vg$TlN;Zgz8J^H0fu< zSL8}i8AZlAQ|OYaFPQgdleEs&J3*;%;u71_ISJUPL5c$x2w&qA4ncu@1m6nB%j zx()pssz?bSo;g~=yw{V+Lh%sG&ACM*oWOUtV;`^h-H4ZPutS2u!E%o@G_iX*7LX=D51ksX=4QgsW)aF5==7l&I{&5 z%?*GQB@$CPWqJ2s(Mc(_NOfpCSvVQ{?wnYl$-1!0chpc`)!+f`qhm$Q3&;hVG^}uL zQqno?*8kvlqsN6D5)};C)^FdeT4 z2tvPu0eU_|7Iq@?&^)&W=mLaak9-?S`$M;{-nZnLc@;(ItWwJk(hPov>W?0j^_Mud z-f5Ox7i1d571v@-Z8dNpuYGlxADho=?8x-w7`VCdu-c8J!u75wu7n-F*()237kf6m z*4HD~zUM&K??{3UDKM>7wH&9-&Ex*)VC~r$Hr`#sHFEe&EvWUu}Ow@?PME z10KDRiJBFLcr|oaez3-#P4`ZB7t5#v=4XOOH+eH>41-L!m`DfdD|e%>&Pt-x#;Cu! zBeO=8jN?H~R*bTXa#$FG#B)BnFWzeAV3DT)1{HALjEY7v?+VG;uE3C8w<{>G$^1W8 zN45s)Z;kDv%4#f+L|N*XY{|(G+r?8pIaWy@Q!`(wAhQvbF#7iNRa<^2MjCC=$w(6v zg6NScvm_tqYM{c9RHUZLBKrmvYh4k)uYiG8d;(48gfZtzcWgDUXizmY|M;|UGhE>y zH{s_yY+Co!QL5GDjD~$I^jkOU6uwu2Z7P+dMK2CG&UJ65Ka#xGLcRTT9Xe@t1i^d+ zN4D*)I=bR(+#-pN+Hp7C%9ehm^pOdA5872)n7Eg>q~ytBPpVeGPkB^}+eX$>=wzW9B zaSL_bEz&-tcdVOEdVEK9G^8Ga8+YDeDCUVYY8MVwV~G%2c@JdqfQQ0v5cQkF!B-*8 zF(oeVV6$_LRfIWI32qHoj;VevyJFdf=7{tid>o5tF2b+KU4EO&u_l$~6-fxda{6o2 z*VfT;lrwf2E1)f2T`|i_RsNq}qcQX2bG&Os?z#(&qnIr}F)Y{i-#Pwx=YNy7dq&ve z;4(17!huOYlvjB9Kb*aDaHRjYE;{jKVmq1Gwr$(CZB5j%ZFX!Y6WcZ>ww(!2zQ4WC zxqF|w`&YMaS9QH_clG;E*IJ*YXFU()!rVK2QDS)A9zchRL29_zU|fefZSO%&S&uxm zX~e5dhoNq#bZdF~7?Jq^c~#;~8mD0qP$-Jf*kTlIV zJ5%Y)m~V5gnv>^jX$lUrty&>cPxrv_lSXRG4$E@>qrOhlBpG_X0C$e8qtz>5lOg^q z*=0Aq%;smdglVkCsAeW+Tw&l{Vl+E3$8dJz(AkImjqBF+hpw;%9oONz`M@&i>Roq) zpQ)Tz*WT-G*sJ`vcYI|yJatI+o5zBNN9I{|(~j_|0q#g6q!b?Sp#-_n<%qLJfiWnNkLn$CTQz<;3WRWdW7zn?Xp=s+gX!l^`w+7-9oW!rtF%{{GpRA z=-T=G&_c0jX6t?Wv+i3Ca55ZovvvlFZG7ehJ&TSeUz12?o;f|vR{H2dvx8hTL$MPin#nM?i{<^>oY|T z+ttUX8<`r7yvZ?-#2^RTFF5qSvbf1wAzUK}b(N z%{$&0@>V|09^P2QWTT|Ua%%kq z=UYR6)__Ognjm+2PU?RXgh$|>Fn1o|oH%mg*kLGf@>nqZpa>ntJ&fe^88z%uGW(zj z9mYGf=H%I7kUzXmV&e2E9DwLb?q?pXwoh&CY2f5hKlkeT`YN>_X0RGVT4(!}^KHgZ zZ)`_=u#VvC7yL)p^-Sc~SGKtaZbzyU3sD$11dR+PYm3hAqYjitup$b~jt#*hiW@po z`;92<>L{Gv;hFeE=D%98iti~LotfhkN%j5=JksqR=!#6dhNVJS4Q9wkS6JQrY$gPo3y^|VwV#BfuCO{)`t*6d$5jP*=cAV@=ST2jT1 zbeskS1&vYDs}ZD(1!iF;t7lXoz{`zw2mxbwE|Rt+Ra}|7peQ`S_Pi2qd|+lBq4xgDZG3TmIq(PF&ELOCc3|l5_})Rr+G*P42X*+l{bpjra+h5&C5VGZmKEaCuW36t9TzE&NOTv4z@OHDb-A&S%M;F@ z7^CeOCy~4usm1!o_dfYWT+&c_N{q9Ea@F7&(2Z~<`#%|rN&XL8T#>W%VkJ3jLDKIINb`DC+sW?*;qf*obj2wbDrC4+JQlHV3W2lWQX_IdKQF$oOG)7`8MXek^ZBaYP)?W z5qWa24ip|?KKR{pLth}b9?X+Rqesvb;pnCe)GHZpVs8huZ*1sx1Z@Ur!xM`Fah_kD z&x22Ekm`m%x_1NGOzo|UFOOO)vATS8qXKf4j5oEH4w^#k%@TX`L!<2c!Sk*17ff;| zA-ya_BjqcAM~}iFvEF_nQn824RQ&eY5G0k_+gLAl?^nGVK0QXQ{OW9n-JFUW4gENb zg`yh|z4VVTYU`sLpfXc@Dqaamd}@xeld~Q?j}oKt4aqu0r!dVhtILU=PJr)9j5X3e z{a6}zAmSO&F30@UQ}3bH>BO`;f&l|>`@|Iyft%4YEWIo?@0k2M{M|nGz08rw&}pGd)@xuT%U1x}xm> z7up>U!V^&+J#jDS+~vfsnCa9+E6sT^FNhPexyd3eQajR3F)y?ew>i9`-xBWJZWaZ2 z8J0n0YrimP<`6B@T=*^NEraiWS|&BdHs;M@%lmpx}mff*i!$$1|V03(PIXcBQ8AlsM%QGgkBfkx>s8Q5Z zKAO4Vq#m8JvnGcgwQ~()t4^Jnu}DF0+p*oADVkwO1Nr11hYx6wWZDx7$akOT?#Gg9 zs=k?r4W$B@wz^{ti9b2o+awe6ay6F=1(g2`@&mvyE~nyEuP+tvU^g$05l!cvYU}uG zwrsw{STeyzFLCv=(9Vc6lx{P`lpl-g6DVOCjkIcuMedkoRY~R(*?YG&aqe-fSpy=& zKgNXTCJX1-`swItRP|4Mv|Hl`CDHh|hjHO|ScGE_38#ItM`pyyJmi>Ak!`<+?9xm@ zSKTGiuXlTQMOMH{jW6P=TUE5~Yx0c6C6520L=%nGD>!mh50=9B@5#j3Ff4UNDk(x4 zkC`pnxVk-Y-5EuTf~jKitgqrs!p&guEfaFb1ys&vuxFufnx4Tvb0}Z8gAMG zLhOTIu&&FL17Dc?k+Agbubh8p){ z<%%zG%zGw)l(KiM)Of+@x3?e-VST}WbaTWd|Hg@e3UJLpK!$FW+hVtH1$}Roe;>Y-XX<_a3_{+~!{T{$So#XEJzO)Smg*)BLAQ zpB>|GxfAKpRd7-UJY=0;5rgo(+I4}6n=mm0-tT&G-bl+!IQ6Z=liZPL#wB=q!I~8b=mFSi&4qYSko|=g8#DfR(W+>%C{fy>f^6YxrQ2U|u6wAA$pnJli~jC%8AzMQ!Qi`PKps*{(9h^Shg zma%=vgof#rFZQUhQh=yJlAtMB#*^EL9Hj4?@c*lk{iExu`TG}wQyK36?{Q=4Y~^bA zFA+si4`Ulw=PxzIFJRY~ij%qLe-cxvj4S;^OqC4|I(i+!BO-_oIReIXdz%~vDwM3s zs1-68nA|@@2GW7`cAi*+kJsS z^t(aQ2C4cx>@F%q$EmP&Ht8|&##JJL5VF2BS-R5;x`yf2q3t`Is5Y(5hqp$YutPJQ z6`f1}>R>lq=vMzW1jj{x-}`^AA2TtwgV6AAr52Awm{Qrd|31<9lAAVujN zeQONbAf_2GU&={X(alUxF{?#pg7hG4E$qd=y~7f=kd(d+MxOr7jaAV|Rj%hTHaC{X zt%R{VXDC9!0N%3G{H~^L=1t{Z-A5O;CuZ-%G_pXUBgY;uwojB;YJDtiQpQQ9d+c*;4fW|bBMm29I2Zev%A&qi1(sa&Ko z377w!o<>A;+_h8z0rM8k-mElqb*sV7*pql?z4fJ`KGW$bQ1Q*o7iDiOEMx}pe>zaA zXZD`LGq>16{F)H(W+uv3EWyjxbpWl0ip^kb*SG2Se_qMpY4CCA9*@B!VsyOQ+NsAk z4f*<)S(99i^t3sdV$~-S;iQ4 z3OJjeGPlp^&!kHE_w_&t1$qb=`DvX$7l7onuWR0YPD${1@x{7%`OR^M$O zsUTe#4@oOB)ypeBKhDJ!UbrL$H%hVsFDCaoM&x78srFwTUK8puZ7(Y1`ARxy?`6Le ze61$bY}E#OIo&EV?iqWavgl40xTR2Fi8i}Sg?Qj^%K}fGz=|?Y zogs7zzg9(JVKG&RvD#$NrOGK`IAMZVFkJ;)=OB~8%1S#D(%{S`PTYCAeOBUpSJqSp zTuZAJEC2b)ksgOFU~o#E%lx%bNwDo%NbI4x8ThlSwFeNrV`Y#*IU~N&?BW^H#0L~E zc_sQ)WCcvF=jl~37K#LSWnn&+<8U)(`^gf)lyfrBji}Z?OxxWjW zH6Kt8*hn`VuEwv0n6lk4fwpgz$tEB%BpmiV^ocPtBY1lT@)y!@gpAZ;wBkjAXn*D) zY5thx%6-HnUS>#pLVA z7Go`;*TWn*AJh|}4JJqiifg_pYHrSh{%}`P-I4KODopera?lVd2*gILKA31{Q3!iR zlP}k;8sxrdh}Hw4l699iJJ8TioP_t*sgRZ=DI=#?)*|C3O<86dQ|$^tMCF<(Zws))ScrEtmTvD*e_g z%JY18jo0{|24!9Pb0F8aJ>kpj{c5i_$J5PO;R5rB zFaI>cHVAGBI04O+i|h-|!wZGy^x_`J(vF*J64ZFmrS`M8b*&GyI2VuLG_n_WhtWx< zxU2L`L)eF>2f73KMmx2JACz#3=YV%L`SIWU3)DZ`*JwkC;t<2Fa9Ath0^2=opxhwn z!}u}QxJWTaoMfEU!C>T9+ja9WnD9_W@QWDmQJgC391d&wYkdJ<(;)zuIj)sD$2C^y z8a8~EYiUFtc}H;Yg{Ao4KL4|jJG-4Xs|fL9M_#{BOAC=}zqbH{gdyazK7K~wavcNJ zfe$?pZ$VPq^YLr@38kq)3I1TYG25d(rcZ}&{rkB@=HN|Xvr`nbQOd)XIoSp`S%!aQ zZ$J0~mL1XUg$CEt`VfvMV@priY-yBVp+qiIJ&?PFu)9M7wupoH_dq`aaX+M3J_913 zF>HM#Dn5J7Z&G||Nq(n1lc7i4YF>(vx-QWYvc@*ITZ`NEm+A|-VWo~S#Aef86+Ut` zZw?*oE}vbuV{E&1?s=7b*9^k5p@!qN-HM$e;>mu--E_MY@96?j|9+q<#V@>)v**=# zJY~#7{mTZH5{|u&TV;O61#G>IW$PERQuUvK6a_fDj;39K*^YDE24=|hq~VWS(8aq+ z=TqEB7Wx8J;iyM0H2R%Y6hn1yY8ayP=2UlWuxZ-8zf8MtMiTM4YUMSJ^n1X*KP_%o zy2E;_Nl6JkqGtMkv5nDNOCc~Ik_VPyTF;wbr>V2_f%n!cV;|T=Q?4`t&Mv;Jo_rm! zgM!l72kiNG@)5U!o*Te(oXFqF&2=7a_5L)Mittf`ol>tF8zs27k<|FWpa%7m{c~k_ z$7%(5=SOO)BPr8}hDs6+b;|jy77FYmD^s&`-VP6p<=x2Vp&NA5SY7ZMrXh4wr)0f8 zoU2}nFt{eFO;NRqIc1?M+Wgq0ndpkfs?&Ob8P)R^uE=+8w^xt!rrYAp-tHE_5&i8O zgbeq2^PEH$ankB=H=Hfa)4L7LMH0`*;X<$UV)&Ee_wMcPz^yzOe-U>1Zd>!3|0w0b zac?32q3n41x4AXlzsU;z-xF%rsa`8kMnuSM|4P@2=9Qoo^%XUS@12woNW9Sak4xG* z!cjxfHpsK;XZZ-*!jkUJl=U2`f3dm@51rosLNE-#5Xw#FNE#QR+xVv}naJ4jab{*K zT~sk??mArt^N9cKJ4+$poaafjXA!U@&)SkQ6OHjnAFTOnQe-rWI~S%;J0yy~E6|E`=%_4>nie}4`;?+W zjhqD$MATmhC4{=f0^@|UX!u_VRD!S7@$}ap!3gqS6R5`jD}nkqEa;*h4))Hbf_8TH zE?>P5d%ORKVe4NX|A*3~N_pJwA3?xG4p!GWHaOcKAqhg#qtci~^-`*3RJ1=KG{9YF zHwUn?C}Z$ejTiQnpF!9*Ye9NJ>x6d;5trp8w1kR?>aHiUnZF=<1bYPh-98Z4h^hec zlx0TS=>|MQH!rvCw&Kk{hljnE%P<2uXI>H1CvCB!KYd2=R%2tKN>WfDO<0nqlWV=X zFohq3yAO){b=Q4Xd5}`(;!P;zlGC;&7){Cukz&|7PQHx8?vTDVl#$6yY_dWq8is2{->8ih9L zs6rcbrorj}$BsEyrC1}%)4B({Wy;{%xlFZqP_{WhsL8iR6ng(O zXE2*s4vQ7aJ$UgG3t?kcS)R*yFOGQo6i%0fPwpYS~(3cT535>{aC$f8?(OD3vvjw=@8HX<;0 zjuL5*WZGz#f{9-M5Fei`8uJ!Gy!2g@#CoC~pcIvQ;({jKzd%B$SRW!q_ld;bP59aI zf=78#`GR!@dzEK>l|MKaRJ06rNqhoow+A1Or7;A_HcFi^p-3*k4!Jprl0(XfZ8A~t z3Hnc}f8dkSNdJ}UH~ibRN9lj()c@U5|2MDI{}(%*=U{c5|Hn>IGj6Fop@WX;RDtDE zhDZiT3!?5Q<_^UiZm6+}iSj#8D=z(z;4lO5;juy+jzV+DL}=lI6C0deM;pt}!_)No zAUt9r`G??m>u{jUC~hTJfB^g77kGBda=!&B9)0;0bVhsZ!*cd>a0gP?%JxL_#Z+Ud zcOGRK029#uJ{)$jG5M7X9zy$Weq22#YM*ZW($d<%qFhwec7MSS4`1s`xUO0Q!rXFu=xi8q!Z`t*#p=$heONSpbal5he_T+)tZ>0; zrG9E7;9lZ6j+LH-t9un%E&%EEM6!#IqvJM2Tl}6{tjh^?b1O>4A750=?|U9RD#Z{V za2+Xl1H{t`p`;K}{rbUaz3NPDuOH&&YL6@)fJR?^ZQ|JGzN)!KeRsudH=ZYma zwbzR8K@XIq=oEx0TgZxn3-Y80MWw#1FoxMx2N!1*UWs(T`x@Lv;}POfrOI_Xrz`VzR3xgtk+$FA74=#CEcJOaQz{nqikudHvr2K_-G6W6Y_u;!AYQ z6eX~RId9k<6)*X|@4Jp73}dxSc_+(k>a-2{zuQff#*JYU*7i>`BM#Ko0KE+By2D$- za(UzoSi>B}B(TKT!r$j%ky^^QVaskmIYrhDpRaCWug-fA#GS9 zAfQtj2!@GLFv-I10xJMUcVZXEv^VHp9^_heVhfH^{-d&XXXRlMtr4bz?P4WMqHAoZ zp^q$^LAQaN-LCpRDAYn7V+>+-1(sUXL_DS|64@wjg-LSdKILPQ5`?tBumG)dqS84b z2i8qG0b1#&^M5Rq9rZNfvM-ZmOA^;4ujcsf{4iGY@S#MA`&;l7G;wt_+ovn26WsVpLL2@d!x>Y-31q0e*)nMn&FitN{b z6G^~Fg#9;I;`uJUU&5uF^!giu_X<3(i{mR!tEUvUNsl*nuD7P}=a+UW)b~Lc$NTj! zr-A!#Eu8;51Nk?}+P|De&d~O2@S)SS>Xq2&uyv|XGMdPllOq|Y@nWYObroY0Tgf-nm6)*kC!0HR&q5;xFf| zyu7-w`4aK1V0TF@;_z;7GgKQ4IF0UM*ys|GWQMJbTQ9J1s%tYmht2}plM!Zmn6>f# zG1ZtlAeT^yA6#T1N|W8C67INo!8cDEJrK_*@w-lH5st_nhJ#pkOtcttdKiXH-jE>C z4X%~`E19;11u>&ju}-TS?9q-BK7r#QEr@H+JRspnl+Bwf)}Dkn4NVREM8B<>xo>+b z>vbO~a4U-z`799E1~kI1f#JOqq4wFG37S~p;c>SIByX6iV4p;(v|YeoAx|D;QkLH9 z)emCbJ1Qhj5LmWH#Lh|V7z3;>{R40WaBRoRu(3Mvm!yHpriuNRLy zSw7>|EXEvoy5`StuebAEx4(w2>nZDvpyECV*_QKlywv9qjr1{S);h$L#al3IKI2FV zR+D$f1qBbD?!L(@11ALhU3~N=pd)4gHz^HlO)DmY7XYRnl4KBPkhQ^cMAsiuYCkCg z=Wc@?(&|qMeOSmUXwT+fEV9#?{m-oBwF;aB5!+5&%^zT4G?oQ-h6Cbr1e3_Y4>xhLqgqh&=2imKhI>0!$O21jpNR%C4 zt0|sKW%ev9DQ8${)l^RZhaPg8`gw=N7e06Qzwspg-)-1`gU|ghKK$Qj7`D-jKl%g^ zML#WMR1j%+1AnxCcRNuIN9XLt9%eOcfRRLXVueB2&L4nA*WwsFntq$kJUaXMR@)m^ zJK<9n_4GxItF7!^GGSVwn$W;|;hN5!_(ie5(ufqsKzlDsU6HLAYTT=dk}se3URLu( zdPG!FQI$nv)@RlAN<_t{ZRpcA7?~?V(H8-|x1e7UmAK&~aZD({j*2KGlHIS+7~1=< z)n20#3z>qiu)g&5{-5=r8UN?NFK%l0C7Et4=;UPR`OhYTq^*O^e-3f}vrWyB2yC=+#P)nYx&l?NeB!P{g9)^zzN|N8kcn+|u{{|gl5MZGCPZC-u zD<~;ow8PE(MFDx)w#>Zc@ACng7lSO^bm0a!?<%W}xtYJ}j@N%~d|XaLZ%xf zHF!^&zu(9>LEEbtGhsc&`0sC6YG5}+awe=)*~UV?;4EWybTID2W>gi~)^MI#>D`{|bAiY%#p3 z7|w~sTO8g7+cp{q%Z&Hu>bz}Ql%YTvkKIvPO&3^Bm}T8+YscR9)zqPtD>58mp%KSL zXs7)met%rR^RTV6Uj@ZsS>-6zd~tGGaGBrN6plFO%6_CI601=A8|DIh0av*R>{9%7 z{h5w0@_>_IAEzL;SR;YI`5G(=Fdp>?khuW0dV|F}fTe_9oT}q#r%@pcWLc^WtO!OO z(IbwQx*qd;P#SjK2=k&$px6dc;VEjh9ox*W)V-bK4>P$C;XM$Bpi*7hf5f#etb@Np z!Q&(IW)D;H|5t5P?>)3Z_!UF1zI^b1wm-suV}D-*k^iu_3oUOSZF5gQy)BY)r`?sQ zLCHim*^IFSycWr|;1$UV4yWCpKe_=&zPV4H^jqFt z_kUCQA1uGIk5l%hgg?tHyYTSgv9_Dh$&v5XRi8Ax_UR6D)C+>k9`!u|ei!VlxGZm{ zI}eGB0jvZ&y}Gn{ky*gyUf%bJdv`v17zG>nKl>!8kiOc=Fjhtlv!!@$r`)G!cRBY^ z!}3wEkV9Z^f8}1i!OM zA}x-Q0&N@&xQ4~k`)1;-Cd2uknn9~s4H?+HYWEPh9)OMOyo=4e@|wM36{B}Hz{Y$ImDP&ATsE7B@>^zjYiA(Z zLZJ|eym`-ymFr|c&e>%QI`uD$3guqRNz^)HKInRFK|cv6Vi!A8RY50xWtiD)hciU4 zA|v-0jCtF!&MXXDha938T0xTzYzCiCC)l3Br?LDYJ62)|@`=b5m)7jQ)4FcOWr3M; zyhSQMvUd>UNi4~#mnS<3*;|&y1~2vpZVEXOq;vUjcUpSHt1{)g zmAe&{SGIDDijHcuK_9~kScK0q3K{#H}%dLVjjzpZy=wn!ODpS5;2Pf9B&zcqe(&M$PQeM zLt75pb6;bjoH*{f!ZYvD(&_rDTJ8n5m2e0lLPINvXdZ!Ll7s1Ar z^w}b`#|`Uu5KiuDyN-tS2^~Al`@@m;ax{ZzKZ(L2&^d30pN+sizUvo2jGqYFJ}aLx zcZa)3Rb|L*8h>zp6oB{xy7#9f%-2egZ?KqKo_wjVGTyk|Nf*kii&V*hiKN zl@&y&_Rbv*q~4&RA^J}@?`8q)auv2AO9CSc6@)LLAs@Ors|V0km;0bE0Z}$|RAr3) zVjfDfpYo!#i4dz3(e|9zpdabFA=Ihphu+kzC){I2{)WA5XI!#n(iVb1*FmM9t)`Sf zX$~9PSt^{5ARW2j#IlOiXWaeIK6kulc^~>^$Dj2hj07qGrlzZPu+tJ~yu^zn6iBg&c^}EAU-aitDXuI^)r&}(+nv<54tkTZ zt5REwT(m`h2;CgN+v(K>usPPxU}SM~nntUzN)%QesQ2GaCHy#uKZqV|^EP2aRxP8Q zgw0@I1uhcOQiU(m@!4`&q(+~@RLNYX%4ia)dZw~PBu)le>ljPZcZkt$P+6Q)aH!=k zSw}Xioj3jnu~qM@ECJ1NrH=DwQwl?eEHLavS1pC|bnTuV0Y4Y*; zf$1mX8_wYrt(}mo!P^@IWIdsp)DeVPs`jSYvMQqa18l;*O8C;z775WvX|}-1&Ps8r zPe@XAfetyA>*R78|LGPrV6N%>LZk@B-f&h4G7~jf8uXI7xz|x4#LLzj0NChEe2UiS zzaewwDXlqsPHAt>Q`KKK2CKkfM2hPkxgey6J{(ahF4tB}@TZn&}z&7_vUzJxD8*K=>p6$$;YcZXyTq1#(x(YqsQ zub|(%Hub2O=XeQ5rl~p5FZuh!=NN2Yy3T4S;0d|s)zfwushTHWj-T^tdjiBAdw4U) zGt0q!qW|hLOT1@OjX9RkUHgIuuz7ZNh~(0;ddPTc*D$@;=S4RU}b9ODrl}g-=OzdM}}9K2I!~p&NU-KktRL?GZ$3%WXSR-45br zdtxWM8%puo@A4vkyc>El6FcV_t8i4P^Tg#)b{Y4L^iRld+PO|2ZA*&@ z1D<_H{ty9dbGn0L)8GSJ104o+Xb1rFdI-Ap(C)i%_-#-q8AW;sA$1 z$gi(sHcN4&*|I!m{~Xu&g0kH_XMsMhmIZ$2$8t9wzbPR+Vok#4xhH({xW_VS%W%Ul zeVrcf2u+Krx|t|_vtQ{nm9vk0^4OohUb^y3yVn!m&Fb@Uuf7&OwtWfNCHdlqUOl02 z*)xWqK(ljVG9bPP$!2Z4QseZ|}j4XX-=8kWC z&}EBB@l>8EmbBE`u_UJXB8CJYbD>>}Z+=hn<*V9~il>7LtfvcghfZ7V@o-w?;Ibfq z@R|>%$|C^s zZnVs9wog@x)q+3;t&~%Yb+`_YEK>G23wW5Af&d?XTNk>0Zt=$n!oQEltd`aZY`8xM zp4Az`Up0tH@1!qBRBu(f=B?=1m9vIwUJtR&17}q)t@mekA)iVc9Tt zBc#)b-OD8F$`{MOe@1EMD&GX6Q;+#>QNX-wKTT09S6OR%q23bs@C@}vtZTG)h2x^^ zDhO1Y?#l6gl%)=Q$RVK=%1jpgv#c<+rTO3?0rnCBaSTGOk|szW%wy@py?seikAbk% zxVT@JzN3^TsA*H>AsH&o+xb-U%r2!poGYZ6NS$&x!Hxkj!`-^ok=XlIjqKxY;qz&? zliB36xss3N?Fh0(Pg>>B{hUFEWMz`DqyT6Xi);ii75Re0-8w**8p54&qnEa57THd0 zheq9f-q3_u{3$BNwa0P3W;@)rZS-(f(xnZm$dEz5Thaowz-HaDXdR>@hY|lMSV%sQ zwMyw-Khj6C*DoT}rvgD+$SbE&ARxhOYWLs^)oM#Z`u!*S?eNkiqdUKmrF8Qof2D=!0_)9DzuT|ojwaLat)^JfWR{}!$`L_V_arc`)UVTD`#5edS8o}qL&*clB znycy7(OU)Hq6Qqqy7`S8ETPU=t0?7?MJu!}6KQ1ea>@MTf= z4mbInF6R5q3Su1{+zIGgxNZ$s?KH!OGx?azuJ%h@fN;W*As^Iij>&4q;JtJ75K`5L z=_dYv)yxy!chCo4cz+A3e^)b8{QH_&$ko!u1m*N@v$kf^O7tc1xopU`J*N z4Yy;$p<)(G^qx3T`AYQ#iR;`_XMD9OY5o3bJZWteL_3td*ouZwK(wt1j_C~gIy9Z{ zH)>!lNDy56t;TY4UDesz9Q;~z%BTBPGRN4!)4pnp8u5l)ZZ!2Eq4O{i#r6+ z6(X>}#olKJWe$7<@#x|m<{cBBB~<(`qL>TvCVISZKvXacQJS|9KagGYL8G=~Lk z%_%>tinE`s3@H#Ds)x;3L0(+h*IXy)X^}-z|fJV zcTR%Fj6|!@i)q!53saVy_(sE?s@HIbInWjaiqG#z^EY^A)I9M`(JXT0pt6_L16Ft# zesss64`rWuH%jg!7D)WVq0o}8*e%ni&=1HQ2XtsFCgGK6d z`#b!WdZTemgFp!G6GcwE15FMC{QT0nR5NS_AepT0c zJ6;CEM8#01Jy5G07p;;t8Ig&LNQ@jESCek#hVNegH!aU2hFuyBiqt3wZA_u84s*kiD6v7O9aVRE&f1k!$ zS@d>cpNmp6tBXDV`IzbgyYT&33V`?b&Z{atU*;P9<4u-=&7>5c*OnYPx)B3UdiPNt zniKk0zTbyNfvQWe-^c^iRiU3O@^r3tw!jW`!CZuAW%01Yffwvm%WFMSvNRtf5;c<# z4hBsX65A&{#03RqXJR)ECMt(6^EV)~t`d9LArb(LpaO$QfWTVi(uRNGenN0@hj^<> z5+43RI_wBH{?DVvXA|tDFhO>~$^6v=R1he$wQB`(RvOld{n$&|(oxo>q4J6?))uv; zMF6o1_Nx5R0zYAecC9#msl!ncrus*(*uT;P zs~>>50vPx2RA?B^%iWXF+&6ARxjT|rV=;_BtDaIQh9VS5%KFAkA|{=&t5dCx{V@V81DiRM#n#MO#)gM&a;HPfrDrhdOX6mUDT$IBzYMVP3ado&3p!9o1 zq|b6U-BZryv-MOM-SWz?5~mAU1+^^9Xrwn%QPwQ$pC+|~r)H8Ab|jj+U;aQI%A+F7 zSP0V6ipMOSMB2W5$LMSsCBRe0XNCaF~G0 zHR(0QEwAtx-98h7Nnd~BkUoe`E-paaT8Az5kU+^ z9gMJxmKphA`Bw~hB+c>=i&e*i@350d(2125@BnJ46!F#3;BFuyvpMc+6UJPh*UJ1R zIg&JE4fbT%!0`?;pHs>gKLTDgZcebz_eM#Tj;S)Gc-7hNAJWC?hFkTHh0K!KEJ26o z-FhA8%o_4V5RlGkW&@)-sMH6I#gSh|!q(d5m8gafWL&>7i@*0oU+sm0(k2}l#8_oH zIW;XG9m^>{-}YdtPyy+yvbvZylHI?-h!~MaEByMi*T>8g?-jYlq&fcL&h8hLd;K$$ zTYvIx8v6}Hi*-RjS#zg5eHD+S_Uwkp^y;&8d(n*1t2g@SrU0;-R(P#9=YV!db?OhX z%(1B@mOwsNXD}WKRc3OL zJ}DYRJDh0NwRY0lMAsnVI7+i7Sf0L1mYVjPJRxI&LR&R*NO)>LEf8_Q(7Do3U9r#b zy~vTm46j)Q1USm$dWW2%brke0h(;--reLZ&xkiJhlCE<&pGpa&i3`~npSLk>aA+uJ za^<9tTqJuA)aI!VHr-`G(cbGP_F`~9Won^0qOo*UIbYblRVUD_)N$`Xr>m~EOtf(e z_>J57C}mIF5VJ-@y=jr6>QdivXLUJh0hDfeC1oM!$eslAe` z4iVGD#8@R0>AiKmwA*i>X0`DLqn-Sj;!xIEojmIWZR_PkR-eq)`Vl}{Ytc1ss~tYU zZE>y_nO5Z)u6j|D5a^GplDvOuu+Zi1*8ZG%SdlGl=O8VhtJI<&FYicq;v${e=iKg^ zcCyTxx^bL>AEL2|13i4N!qw}eJBy8gRo<+Iu@d?ajP>_*0fBY$$LO&P0>RPfyp?7e zf7D9@_n)rcHJ(<X}MBUV)$T!At5rt4m#yHgs}Yq&SKrs72wBxCkMWi%)F*9EfL^FJ=$Kcd0(-XeJIb z3wGdzbumC>zxJ37BD^Q=TS5ujBXKNf1?z8xVeCkxz3Trywd;24N$od32X~Zu$G?4R zs{r$1qm~t-LY7JEC?l1wBh$NKwxz8onbxw?a=p%`0VS%+>)d+F{faYm0}regn&8x& z;6%M}zh&5xW$g$BW!rJLow%^UP!`D8c7aa=(yPaG(S$jpp7Fe*E>~frm{a@9I6i>mh|X9jK;;ru`fMJAd`XrZ=u+8mH=lJn){!I@7&R(HZ0utF1vk z-<0YkTXAL6XsR)UCBW?`K~H^)}-A?H^@G zsNPXh8d7p1O)#9hl15|?O}G)JpPqjvMldtQtDt3BBr6Job^@j=Ts!D z4E+p>-fqNaeJj69s=>ta$cO9WyQ-uAaT`x?tKw*X*>=rMnbF7fiRJr_eQO79$hcEr z6+pRR`?12;P|KjYOqATsTwb9tAq+;8)ZQH8Ywo|cf+qO|b#kMhHRBWAmYps9p zy;eK>YyUZ|&5L<4FJ|lS81HySf6%QCOsx~N>vbXQyN{3K0LLka$u|smyY8gVKWRPS zyI(|v0T?|t4K&jRnu#WwftM>ZR&CI|(qWkmbcI?UqiFpNjxdV}Ee%xQRLaY%qG@7g z{dZnZM<6BJ1IQjS+kz!-t1__-2aFJSktYP~{z5gR^BMzSJ=@zHG5Dwe-OPi(K9PRE zdJnJFXyp&CKL`%TG&3I=V=QQTjO3H+Hu*%=J41cs0oycT4UdlXtmm98{`ilTh%7Om zQ2R5G*b+GHL1viASmcsQ*+=zdyL>!mk0z9^;2M_RPdID}xYN{meH^})2$^&JsUJ>c zbK{ytxta@LdW!y!i*lk0m9=c@6yq_wtjt=!Q4~e@=HH~R=nu;8RCJS=Vo!O8de`Zs z7Sq~P0oHuU^c9?Rv1bJns<_EUN=LhKT#eGFWX6KM!>n|X8D{mxuQ-RYVdA6f%yiQ9 z`cpwPt=noW>hgK*eud)U#_pyb70)<|AXgrqIyJVgUK@#c42G1e4?wbS4O&Zch>;#> zdg2vuZh(X;GiQ1;l+P$@0@Ys(50ck&UQ`a>@smB3RNc|OU&lL+>NH6QvfQxrpjsIh zS{KAV#Qi`XNLjxtv&pi!)=E5R4(X!VVAb4k(cGvEuiQ95iPRavF#ECJ1--}L$NNd} z_$It@i!ea{LnPN5I`GCMD@EKP)EoRVY1m#3Z+P>@WzR3L@`;RYto4fZ`CCrX<(`EH z$n;pEyQJ?=_5DzHSznUmo1}^4Qj0`9Cw$lMPjh@!C!vZZ}8fUS~dA04_uI5gKFCrKw zwq&?fmLsu)-HI~V0v!OsN#J`Lx^dyCtC)^~*I?KtS>591HbV1AEz?au@lZYbP;Hbu zR~2gjgB1H$@Bbb3&_LP&2=+a*)OZ${z+{(eIha0BZ#y)6UV%c=a7`KV&P;#NBpjuMNr~T4W2S=wh_L21`a=ID zJ!`<^5UWP`(reQGT?>HYe{TUu+J4D4gslynocvbndY?Al55&`AD#MKSPDGB%|gB!IFc`Ska!k2mEF7xY8F+`6CTwMwA8ax^J5&C6(DP%cZ6n8Q-sx^0 z9TGtQ&ci#qbeWv9QTF;G{z7s^qVidUFX*vu;e!1H*oygt4YgPLw++IQ$7sPRiq>Q0Ub&gQOCf z+CKxZQ~umc%^(gqmTzE8+oe@eYxFxpL~0l)1hGF%*C|D)q#~g1*Ju2~sbQ=m#(Fn- zm(SuOm`LoNS0<7TY@y~}sKeMz98sYP2N?*s`sQAX%T=mPT08&mI2l`Kp=L2ezVmz;E$BAy~0A>nSOujblCaUN9p549>8CL&c?MniN z@lB#hU?P9!4KT~(bXKieB5W4^!c)$*`Q%gf{V9icX^J>}pYKp3=J4!g zHZ(4gOPLzQT$GDYMM%k(Ukq?wB9sf#f?FsTekhsA;X}|3*E_xhzV_X|aR2(xIO1At zvk@tU6Xb;J>9FAv|8~T*NFb;0JHNs88NpgW@}&AgEl&Zfa4A>~3sBP0bz_8)yC)1% z9}s`7+{0KL8m5ufR@Q_W~6dm`@3U8!Ble#DOso3F)Hc7Mud0cfwS# zO4Y3On!ho#(sNQZl(fJWs3NtkB%l;%)$M&P6dfzHP35Sti9wM;sX?I_KyZhr`hEei zz>XLh?tmCVMW*{>%QOQ2LrtnU>C(~rwP9KR*3ZK9zi(+N16PCpp+@_kiqd37S!qy4 zM4#0)H7l!T-#tkl3)JO+)(C_iMwBXe*LT2{zihA19JmI|x_e;fc-WzalVJ z(sw6&9?240A5+zV;HwzV#mJzIj0{QpjWJ5aLa#T05vHGh=1S#z9`VF;^)N_@4G>`n z1JHjLhrO^RgEIQ37-{5|wYkYt2=6Lbp2T1{YOkxCpeWE7z|6xb|B)+!^Q!)gS~V`? z7c0EEDo}`Ew zKTY8^tABJIsre})Ci7!5Kf?iZ!icaDL1BQ%(Wv7UMZHn(1N5)8y?F1#ZS?i{8ot)| ze~X#^Q%p$qH;?d3%=8Z>-Me^1oCK$dwY&L7olF}BisGLy6MUYUTT1C~#Inck= zwDu`R*mUQHShU%(!Fcira;C!~)TfR|;HjqUD<;a&xhC9qqnNoqfN|}dyJoNDe0nxX zzPxCek>|T!+m9Yw^N-z`cAw90us~;IyJFC}HXZ`i!E_?kt9Mg4lpYVHWEd{TG4Rr&!NXG}uD7^qJ6Z3sTY} z(lRV9PFVeu{X^QJij+D7hT1km*Xx3S*h{A(O+Xg?tM(A0@s^10%xeRJ+X~^v>xKF< zD?$abGwstXAht>0wOP&H@Rhj>(xIb! zjvA!g>qA80C#-Qb?@YmbG$LJSOojMsR=W|E>VUCH#bLeVQ>!g7O9bE(x#7P{RWs*S zuaGof7PzQ18Yc@or5JEAE-E>xwV*cT3lnY85;%VdftZN=k%A*57h~;ELLFgqQnOeJ zwq5P#wa%^T9^w&MTnQVJJK@HfB{PxhI=;>S!PW`NW0>yA!-c$}NqVIgL~_;AG@pDn)a!fv}k9DjPV0VQ&(yzM>5#Au7(GSbJFs zd`GONoX#c;5k?|Y&#R5*bem@f$}B_$9OHp7 z3(F0(#%OpMscYhsB(COMO@A425`D>glI+$f=VmrDyTzJONm@QK`Pqk0tDYVak!)k6 z12m^^oSRS~Aq^b?o#j;MMd-1kHrBo47pwDenVP?l-5cOy0U|Hny%vq`*DS4PZ5bE~ zF-*^;44NT{?jfD@w)8x((sVqfJBm2T*F6LZdCRlqI^3}hgA|V@w(9$w2ZQ6I?v+tj z44g%o(1$-pwlHT49TufBXu3;>F#y#})*=fla*GS3Pu~`8KX2;rma{ffwN6Gn#MI1LqZ_gH>EPa7uNrmAz!5T^Z>w=XaTa_8MeO~a=1JS8Z zJi*D}E3DC)fa4;D17%#b?}7#DNMGZbtzf0xHR$@tq)zL(h8W@uDO%&7Glh)4UERR7 zIoFec|7kRNWC)_|VmF(c8S8{=6baB9cuC()H4eVizhiC(O}ajpH)twi@Q!X#c7xGL z^WPg6qHIwQaX;Y6Q~MS)34(4HUPrFF;`X!@@*ty`P4Y}Sw@2xWwnL2~Tgb_IW9GPT zCf8ErxW8lB$wij=QQI$wjqmfTyu=G=*9rk0e>9Q_&JUSUvVlu1!0`- zktTJ-F`Y)8^2mN7)MT5yMze=(oZYxxkaO6Yj|Rc#JmUbe;Y}hXmx4cSwYWw@jK0nE zIi03A?m&I)89WYQobZvRH~zq_;Z2Z}pZLar^E~H3zTr(YrI+&PQG$=gVVR~s(4zoK zIv7Xpt!gxM$az{xG{v%kW*??Em<(Csh5%GT> zKL6=P;rYKfeE!1-`)@&Do9eHA%4WE}TP>32So&7#8cWq+#w^|6G2k?{Po?q-btxsd zO@D=#j#_vUjE0kw9jw|IX(9jmIJD(-srIO*y&s`VU;x03pct{OKR#?9mY_9ui z?Yu{P;LDy;^4j?QBu4y+aPRBBgI?D7^*{UaD=-x~oe*jgbF1!;QYFA#Rpe!u%pD0q z3GLlDlfb-{zkz_nuLsHO$T^X6f#6z+E9o0`?bO&Z_9UJGwc6S2oT~j0?*%dV^kfS2 zkKjxvth2*CA*thR*?(y>C3PNar{3u4pog)hCf3zrNy=gJF-N^xmkQf}B?$WMxuD-E zAl-&DC&%YE5^J+E>YcJWn9`O4gP@PTR`kZeT+7vsfC~aI=IYM*!)oBd4CHGZFMjq4 z?TnrvjNr(rIQ{RtD7ah%FR&K6P8L&bF)jxVGZFw-=L@J*%Z+s}{_7P%c&y&UjD=FL z3UE-#gbvph^4d>?##XEJsGJyBXY}FG?`!Klmg9>9P&`3+l)Y}?rIDH@Q^E;}x5j}s zT%pwQZugK^3=kw22L6Xi50w0|Pn_|wFxEsbphJRNlIg1JLO`)QX(9$;&^E@4ra-Y$ z#w`XS`s&FWPFCBYivDEmp9?(}?WR0Be4yj$tt7^ygNaXN_~iCfKTWOU!`bC7m-^2@ zht-HDvF0_cufO|<$#cP923s!Posz!_tB`FJi+#1>>sCRh%TFiIu;)QGM) z_=e$BC{ztSCD`*uPQPmMPCF=|TR9hUcF+ZXiy>X~`Tir}G>862 zRYkA1*jQaO=4NOu$Iz*BeLo*;xg$BXg3{6QRlwlkSysk48a!#Dr;v2aYKAV4q~0BX zl$B7e^J3|NJ)K!Iop~22olT|SvXR&icKZQ<>Mh=foOoR*e82vZ8j2|b(WUp!f%=?mFWQCbn6HXkJX{VuL0xk zqV~b`V=h7WfYw307DdX+SC8pfsu;n}9*GfF%;O$rC)E+;1H=wyL4w_PQlS19_&An~ z-l~F}3_KE72fcmh&2s&mOIx+pAWTRPt$ppDdRDB-DAJ^f4fDYk*r)oh#KMv;Md>9S zqg}_XLl)M-<3d0Td!c5PM+~BgrQ$A5yfa~7^}JO1y4lD`h@(XXd%~Kr(k0AnbR2JW zXx4fmk6fm!1guF)&`8;5{7HspiWa(R_yULF@1}i==v3_ptW*Sl+E!boZm&9zL5Z`% z_JtzbcJ6y4F{0{KPHFUlThJQ|pUiE%vp2-Yp!MhXk#ZK(!>Tksa}t+xgVK9}kM+LX z*e~)cyi&dG;kvuLu(6U`1N{!H`_|k&lDoNW^oa2Y1^6RREz+-zbgEPl;qb=EuDC7k`8-ZQ}`N`{u#l=*ttzOzG9s29SD-2PIYl6 z0xyV)`Q?f+5GrAGZ81`hu4R30j-{CfE79*kMX~C)6nJ_2kRGud#~tr@9ya?=MeBPo ztkP3M>&`Ask>4H`7V)lFyp9VVxN-}7CRMIs>nX=~%T~5KZ2dPC~$AaX{FoWUgHwGWeAiDl@me9-^N6Z*_Q)+o3&fJZ1a zoM#j^0tc`#d>|6LqKW~?`u@}zqNIs?A^T1F8u}C;h{s}?WU;9fwR$#K<%C%$q>*)M zPRX$lkV_GoB5O;@v|8ypb@QzJHlg|$rA=%zbV|p4>N}(kuzNbD%kLO4pf0l=uuFdz zs@`%O?}G0w%W{J`q)}lV-nm5x-U#b# zpVhLS>a0BV5cO6dZpOC*83PKzIK3~%RaRE-1gjucDUz^3yQMt$ z&n}l5ndjZL3C3w>WCW-O&HztZ5buSWr&xo=?sOoxp+%*nx+z6>(VhAlN+TY@KSuOx z03s%}rFnW^i9YdF$(ayb-at#edLr#Lo9RZG_f7MYZ#B1XASDgwrOG&iafc zJjp&~xYB1lXD?1dUFhH?t+E0Ldii{rw@9l3*S|+RS{QU!f9Fy9odtuin9S6utFZ=n1g3jB` zr=AdWuHzRyO+|ok+8uQQ)13>LF}-$VK|ZOeS2yf%OiK8==2Jicy=6kLX6c8*D9cPEU5uf+O>XL z<#N;IB0R&zdlvi-j5K|vNXi;1QYK$sv!Ng}i8S#--Eo>IkE=D^aKL@y2_6q>8}S-i z`gFa5bc3F5SG|YSXwN1^ftGuBRL;EtIp;j+G?>gJ**JG^7S5Vcuk;)a&`P;Zus2UN zD*YL|Z;U%i2B4Ml{q3Ha04w55MZ&MI+L17Smz<52pES>3$jin?_wn2D4i!(0-DwaR zQbqL!v>&NB%yVb zxmzUx8Bha1E5(}~#` zc6;CDnxL-w2IA2hqGfExSDlL~%_Pi(yaGmBI~nagI50ip@Hk>Vw@?~+FW0OSeAXzu-_Q>5n7}QG zkfNGdSk+aB5Ls>5wpB(C`#x_Z%MkU%v`TySgU|D75q?&;sXYQ(uzU(@FEMU+1{C|$k8^4PCOh$3cz;lF?f@n;f3lu4+f%n49Nkm3!)Ul_(6 zW}oRA=qYyRDV~7%VCqYtkiuB3SsN=?JudNU?SRBM2%;(!sF4F4s!o$F0@V*sR4TC* z)i)fCnj7i4)^_LvW4od#!|XZcr?ogQqC2{C9Z1({`)9Yy6X^snc&ch;(s0nRPlscy z9vJC+I}*1jR7F!&L(|yjDBvu8bF|(}C<4E#I{n0F^YZ?+ z$G5g~`^V?o8|+V;C%rsE#K@fEJTAy#4affvoi1*6#q zjfDldOvold7Z&Rd0c$!4>sr> z3yi!)8H|Mm^08-c9STx_=aaTPs5YdCL3CMH=Q7})X{aZz+r}gXb0iHMX9f!~ojkt8 zV7x^I;*769+?@A05#}lp4Ka}6pn{v9?(b2?YBrZH*=)+&%eLol#g9aKRJM?%GHQ5B`F`s zYEvV^q`{>Y`=Cv{b%|j*+i(Nw|(<15r^rWe?PXnyOi;Iay<533#G_yqIUP zIOKqqNMwd=wz8(Bd7#1Cog_qN1-Dr#J$c!bVO%8Q^0%CC=EO+(u$f?N`#IaelOPdz zsRcE&_A5l6N!W{5RAoZ&f~(m!A^ABDMv=6&$QnXpYb70ER7{BnQI?KI)Gd;*>*-#B zVl+&Xea{s##``VYk3;gqb=dbS&}}vwuCdtgY*)M>(zrXWxqT()Be(!r^Axs+ zgf5c1qHx&T{+zllg&pmB`2ag&F>LSHd~s)G{P_*@)@yu33b!lnO%T;pN_#QKly5vF zw77dADaHmF`H{CohGQQ>4h~=l(sW$lYV!9F86kM^7x;?EEW=*o{6gnP;N)o(@RJO)bbaCTcvC zEcu8OP8p5x!h2ClpQfW$h1<_mi?Q+!jofuC`3UQnvRjvy-jV{OuG;9aN^}o>`LuBn z>=I#Dd5_UG5-pO!T@R!lG{=uONWzXUtGsLtE7Od;C$AY~crnm!RwmGXFZCb8gfL9- zQdW97w&1CfTWnmP&55XyCCIHdilB-h8YxVLGo$AiP=Ue8vZkL5JL>Q!@Ub0m1ZHbu zbU38Jz(tKk!HyIv=!^HXX6+|05Z!2IsntR8B#*UiKC1>^u0jLOQKxr3MqglYs>To# za~gShT$*e~a8o8?es(9^dEkx9zt`_Cy4y{i%pEB-Zrg3LU>}ytFM_n=?n`qHUru>+ znMgg3gM4nyqMm)mU)557<>lTCJt>EjZc?%xI=CR3kMdG^)t#r;0-vhwJC$@^;nn6Z zRTFz)zY3Ucyte&bW9+p8W(Q-AA3Qj*T{7wRq^QU!gg|aB<3(H8Z_^Nfe=K+QCa8Ko zkk((6AzWsdt#49}wbU()2cDFW@a=^?Sj4d!c}6jcP*$!R;aWYnlPRt}n4-e{9p6_h zlX7V(so(DC0j%2|h~058z6gGIFhw_-!Yx(nQh70B^0N~`yf9-HPYvKeJJnJ1bCK&y zJ3=$1*#P?1pkI29+yYyd^{Ls?sM~J_uJ+Yy)IOq-mFh~=093aJyKJp#Yg}$R!ajZq zco5oNT{I7WWs(6^k{%(dNlz*1Hy6DNdH-%%Khd7*$+WH&V%)|yHzOWX5WJAZ(M`Yl z<3n>L*a1E^y(3 z66wI^y<9)2J^uTf&?YTuw4@{~>1*-6zLH~FLLs14an%od^F8sHlAq6?&-E^qf9y9{ zPS#*wZHyJ3msDsjke}dqI}i&T8Aln3V_u9pHvaRvly8fo5%&T2N`+Z^XJYY|t@kfQ zN7lr1@6pg^2auguisq%dUAB-HE31)Nu2JONdu_67XQTL}4Y8sh3n;RN#vn$~LspT? zXtFz1-r3l0YRy9}0Qb$G=qHtRTJ*bJ%@y!%KT|n<;fK2d)KApmef;24+Ym>STVClJ zE=y3|nA9GW*2d~z!)j^4XVtwmu1bhH5+aVHb;7nLLL{6JyMtTj2|U?h3*1ZzPV?>% zhw;b?h$+K*4hI@o{g35|9Iw|iU==UG_+$_&>WytiQR;+SI3YDEL93DpAL7BQ7J*wh zfvaLp%s{P5-njV4c$E>^J;nS8_A!AocavQ8 z`>UC;22Ool_{Es;{%tek{~NUUw+6>slYG;DuYG>8zyK7 z_nk};N>j&h-Z_L!7{Qf2ZIIVt`_U(|6AyonQ)nRza4k7~y_pNRQFSZDOh`8n@VPeV z_@lDe{n%-x`u=bf%MZK~R13~_vN~(bl__f$wSPR?l-QhbvWrIBp1MFcz-X;Jo>t1T zJfQ_zV$`9@4MAvM*6k-g9mbYV%AAob_Xit?(Ydu6a8sTGa`S$W#AZ;!3R4Xq)Cx`0 zts(~Z-T$zCG(2BOU)O**qZrBmOezsexLANjpVUQWUNQ?sBE@{mHrIcNcHEO%S99Fq z!eKM96fHHOF%<+2J{SVCg?L6O%%j)TsxV}{yEH2QBhlzL-Xzu-hHEXG7-QhAz7_o- z^ZazkW{qo;i-Kfu<*LO1s)nzJAym@i<1IEOVWWTz<0`vZl;S`FkHe3GLDD)d@d_K9 zaRqCo8v7qI(^@qS0Tr!D5Npygbh+Vgu=kO2>>*%--`D1BwMy0ruhe}g6<`H3jrx;v zFmELTJ=#hPe)?D1VJOt0odLoMLh7lD*4U1J6Dr?uGwM+19S?-~@+7+`1Ja}V#$Lv6 zg(7MOTpSh*0|OSzDnu}`P$)D=%7X%iG>FQ{z@_VDlqA6`?Td@pDBEDvr7a@^EUV%d z?k5=CR*cK7GXuK?>sy({O~|H6BTKY3i)9w`z|h&4}X6A*HCmxX3vm?;c0znV#r6r=Mj}oC}G4UMCvpsvpDW3EYYI|or2H2*} zuAWW=a^sWhF|~5(?4D_=gH7VTJonpO+*%hrvtTM%OHErGE*tH_sfDid+q7HAd>6JB zAx3u<{demw#;ore6G*4d{hW9=_uyVSq~xMzRTi^(#vpdH`$1 ztn(&DV(XRWg3bqG5?PNwJ0J`|3(ox}Jj*4-L1 z_mEdxW&*_mu%|J;9Ej^LPDq}@przcUrNm?53RS7 z1e`7UIbn{iTR?se6-pM2R+4O`;p0v;m{24QkG2)27pLn5gpD_Yf8xcqB ziP4}#*6 zF2cqp0FCiTWhnenoC^yRmt-!$BL!C5F`BCkc-O9{jcZ9F6T61CNS^TrYsWrGA(OH` z%vflMhp_2yUWtOR-nEwAiINWwebGF{fN3o@ z&UyNX^hTyq^C?kqz_oouQD*{vwf|XH0j2-*8})R!hc3|X?Zs(MXshZ}T`!LHN%za* zLa&j{@n;l3cWlN}7tG!(-KXSa_#k~4d5QhedRTL> zoek1FWWr;x20<)xkeNzNGb5E8Sg!A6mPC+ExtQ-75vv0WZqNGJ?O4G+okEh z9nB`e+d{F66S1GIQl?U%rj3Y-$ugz@3&jjpLTRjRxp6__yaIhDRmB*1`<8SQ89*hy z4~WZr*I52Kor#U&&}RlbNPV7kKUKYeOA+SH?OhA6voEQw}XpS>QHL>37PEW6MNDjw`d z4l##cpY$OLP8o_8@rd|~BD?>v3dI2K8c>67VW(bHID77XgFnIeMn+$E))m~?{dF+& z4rYe4e6b9!e|s>0NuU3>*(iVYzyABq|9@Q0-HPKeC2hT4C0lfTkKZ8`?nEhq=|h$hdDGQVeD3PSif5 z1EN!nmNEfs`M0vtLS6;Q$p(LnGOjKy8fa>^)7#popS7@UzhkY4xls5D1!RwO#qWCvq;(s<2dH?SV`Xw4SvHvSHUER^Z{=cTs zbgORvMc91M(U1hGSc8!~K(14#(Ix?lp{Cv#GtV`Hf69 z%`BzAZ1ETQi49-=2@w!5zxxIGhcnCR@-LJ4YNFrA>zN&plLmU5k!L6P_$`e%n(Ge@ z*=bshXl=24AsbD$Vms`Z_r^Q*oJ>dhI^IX|?UnUJUpOIsr+T%jKN!Rmuw>DRF9Qp zU}TFGq=~&caE82kw|?^h z2Z&MnypQ5cDno_>_2xgV)}=M3Pg)?#6}v{wAq(<1#lsHS%*AbvXCTbOUf8?Ns59WY zQifQX!8zR5H}+IhKAeSmQ;vxDHUqB4x(Gb)8kMIn-<%e^5hEOr48V3l>FBdKagi8p_S>LZ2@<@fyu@f)!f(Hht~eS~zNq~nV+i*G2?$K&u6^9( zH3|gGJ@S4!BuW-f8~gK?_Y^laSyi|y&5u{X45DCKt+V=vH$tSQPM8ybA8s2(EY1=5 z31hb$UG?ZaX=~F0BW@tTgX>;%0&{h6ga Vd* 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 w_FS_cRDc+qq&QpRn- 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 dYhoCxWgjkfD_9?gjU com.google.code.gson - gson + mygson 1.4 compile diff --git a/schema/src/main/java/com/github/api/v2/schema/Gist.java b/schema/src/main/java/com/github/api/v2/schema/Gist.java index ebd1def..a18d683 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Gist.java +++ b/schema/src/main/java/com/github/api/v2/schema/Gist.java @@ -21,7 +21,7 @@ import java.util.List; import java.util.Map; -import com.google.gson.annotations.SerializedName; +import com.google.mygson.gh4a.annotations.SerializedName; /** * The Class Gist. diff --git a/schema/src/main/java/com/github/api/v2/schema/Repository.java b/schema/src/main/java/com/github/api/v2/schema/Repository.java index aca4cd5..609c051 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Repository.java +++ b/schema/src/main/java/com/github/api/v2/schema/Repository.java @@ -20,7 +20,7 @@ import java.util.HashMap; import java.util.Map; -import com.google.gson.annotations.SerializedName; +import com.google.mygson.gh4a.annotations.SerializedName; /** * The Class Repository. From 2ff93409c5970892fb1d68a06edac6e80ae3b201 Mon Sep 17 00:00:00 2001 From: slapperwan Date: Sat, 2 Apr 2011 05:06:37 +0800 Subject: [PATCH 84/95] Public time feed service in JSON response --- .../java/com/github/api/v2/services/FeedService.java | 6 ++++++ .../github/api/v2/services/constant/GitHubApiUrls.java | 3 +++ .../github/api/v2/services/impl/FeedServiceImpl.java | 10 ++++++++++ .../api/v2/services/constant/GitHubApiUrls.properties | 1 + 4 files changed, 20 insertions(+) diff --git a/core/src/main/java/com/github/api/v2/services/FeedService.java b/core/src/main/java/com/github/api/v2/services/FeedService.java index 027bbf2..4746334 100644 --- a/core/src/main/java/com/github/api/v2/services/FeedService.java +++ b/core/src/main/java/com/github/api/v2/services/FeedService.java @@ -166,4 +166,10 @@ public interface FeedService extends GitHubService { * @return the public user feed */ public List getPublicUserFeedJson(String userName); + + /** + * Gets the public timeline feed. + * @return the public timeline feed in json format + */ + public List getPublicTimelineFeedJson(); } diff --git a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java index bf132f7..3edf554 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java +++ b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java @@ -409,6 +409,9 @@ public static interface FeedUrls { /** The Constant GET_PUBLIC_TIMELINE_FEED_URL. */ public static final String GET_PUBLIC_TIMELINE_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getPublicTimelineFeed"); + /** The Constant GET_PUBLIC_TIMELINE_FEED_URL_JSON. */ + public static final String GET_PUBLIC_TIMELINE_FEED_JSON_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getPublicTimelineFeedJson"); + /** The Constant GET_DISCUSSIONS_FEED_URL. */ public static final String GET_DISCUSSIONS_FEED_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.feedService.getDiscussionsFeed"); diff --git a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java index 80665b0..decb119 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/FeedServiceImpl.java @@ -221,6 +221,16 @@ public List getPublicUserFeedJson(String userName) { // throw new GitHubException(e.getMessage(), e); // } } + + @Override + public List getPublicTimelineFeedJson() { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.FeedUrls.GET_PUBLIC_TIMELINE_FEED_JSON_URL); + String apiUrl = builder.buildUrl(); + JsonArray json = unmarshallArray(callApiGet(apiUrl)); + + Gson gson = getGsonBuilder().create(); + return gson.fromJson(json, new TypeToken>(){}.getType()); + } // @SuppressWarnings("unchecked") // private Feed populateFeed(SyndFeed feed) { diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index 110f889..1a21e6d 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -127,3 +127,4 @@ com.github.api.v2.services.feedService.getDiscussionsFeed=http://ajax.googleapis com.github.api.v2.services.feedService.getDiscussionsFeedByTopic=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fsupport.github.com%2Fdiscussions%2F{keyword}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg com.github.api.v2.services.feedService.getJobPositionsFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fjobs.github.com%2Fpositions.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg com.github.api.v2.services.feedService.getBlogFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Ffeeds.feedburner.com%2Fgithub%3Fformat%3Drss&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg +com.github.api.v2.services.feedService.getPublicTimelineFeedJson=https://github.com/timeline.json From 6f3e1418474c39da414ec01f161f203aa1343c75 Mon Sep 17 00:00:00 2001 From: slapperwan Date: Sun, 10 Apr 2011 19:01:47 +0800 Subject: [PATCH 85/95] New event IssueCommentEvent --- .../src/main/java/com/github/api/v2/schema/Issue.java | 11 +++++++++++ .../main/java/com/github/api/v2/schema/Payload.java | 10 ++++++++++ .../main/java/com/github/api/v2/schema/UserFeed.java | 5 ++++- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/schema/src/main/java/com/github/api/v2/schema/Issue.java b/schema/src/main/java/com/github/api/v2/schema/Issue.java index 6bebb33..5b34511 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Issue.java +++ b/schema/src/main/java/com/github/api/v2/schema/Issue.java @@ -123,6 +123,9 @@ public static State fromValue(String value) { /** The labels. */ private List labels = new ArrayList(); + /** The pull request url */ + private String pullRequestUrl; + /** * Gets the closed at. * @@ -380,4 +383,12 @@ public String toString() { + state + ", title=" + title + ", updatedAt=" + updatedAt + ", user=" + user + ", votes=" + votes + "]"; } + + public String getPullRequestUrl() { + return pullRequestUrl; + } + + public void setPullRequestUrl(String pullRequestUrl) { + this.pullRequestUrl = pullRequestUrl; + } } diff --git a/schema/src/main/java/com/github/api/v2/schema/Payload.java b/schema/src/main/java/com/github/api/v2/schema/Payload.java index f4f1cea..6a55f58 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Payload.java +++ b/schema/src/main/java/com/github/api/v2/schema/Payload.java @@ -65,6 +65,9 @@ public class Payload extends SchemaEntity { /** The title. */ private String title; + /** The issue id **/ + private int issueId; + public String getRepo() { return repo; } @@ -217,4 +220,11 @@ public void setTitle(String title) { this.title = title; } + public int getIssueId() { + return issueId; + } + + public void setIssueId(int issueId) { + this.issueId = issueId; + } } diff --git a/schema/src/main/java/com/github/api/v2/schema/UserFeed.java b/schema/src/main/java/com/github/api/v2/schema/UserFeed.java index de7f616..b0ed003 100644 --- a/schema/src/main/java/com/github/api/v2/schema/UserFeed.java +++ b/schema/src/main/java/com/github/api/v2/schema/UserFeed.java @@ -55,7 +55,10 @@ public enum Type implements ValueEnum { GOLLUM_EVENT("GollumEvent"), /** The PublicEvent */ - PUBLIC_EVENT("PublicEvent") + PUBLIC_EVENT("PublicEvent"), + + /** The IssueCommentEvent */ + ISSUE_COMMENT_EVENT("IssueCommentEvent") ; /** The Constant stringToEnum. */ From 7a54fcd64ad72e820f34ec2c1828860508855329 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Thu, 14 Apr 2011 19:54:54 +0500 Subject: [PATCH 86/95] Finished Job API. --- build.xml | 2 - .../api/v2/services/GitHubServiceFactory.java | 10 + .../github/api/v2/services/JobService.java | 107 ++++++ .../v2/services/constant/GitHubApiUrls.java | 11 + .../v2/services/constant/ParameterNames.java | 12 + .../v2/services/impl/BaseGitHubService.java | 10 +- .../api/v2/services/impl/JobServiceImpl.java | 145 ++++++++ .../constant/GitHubApiUrls.properties | 6 +- .../com/github/api/v2/services/AllTests.java | 1 + .../api/v2/services/JobServiceTest.java | 73 ++++ .../v2/services/constant/TestConstants.java | 6 + .../api/v2/services/example/JobApiSample.java | 56 +++ .../com/github/api/v2/schema/Discussion.java | 1 + .../com/github/api/v2/schema/GeoLocation.java | 81 +++++ .../java/com/github/api/v2/schema/Job.java | 338 ++++++++++++++++++ 15 files changed, 855 insertions(+), 4 deletions(-) create mode 100644 core/src/main/java/com/github/api/v2/services/JobService.java create mode 100644 core/src/main/java/com/github/api/v2/services/impl/JobServiceImpl.java create mode 100644 core/src/test/java/com/github/api/v2/services/JobServiceTest.java create mode 100644 examples/src/java/com/github/api/v2/services/example/JobApiSample.java create mode 100644 schema/src/main/java/com/github/api/v2/schema/GeoLocation.java create mode 100644 schema/src/main/java/com/github/api/v2/schema/Job.java diff --git a/build.xml b/build.xml index 6877d65..b27788e 100644 --- a/build.xml +++ b/build.xml @@ -14,8 +14,6 @@ - - diff --git a/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java b/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java index 00f9fc1..35f5a8d 100644 --- a/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java +++ b/core/src/main/java/com/github/api/v2/services/GitHubServiceFactory.java @@ -20,6 +20,7 @@ import com.github.api.v2.services.impl.FeedServiceImpl; import com.github.api.v2.services.impl.GistServiceImpl; import com.github.api.v2.services.impl.IssueServiceImpl; +import com.github.api.v2.services.impl.JobServiceImpl; import com.github.api.v2.services.impl.NetworkServiceImpl; import com.github.api.v2.services.impl.OAuthServiceImpl; import com.github.api.v2.services.impl.ObjectServiceImpl; @@ -154,4 +155,13 @@ public FeedService createFeedService() { public PullRequestService createPullRequestService() { return new PullRequestServiceImpl(); } + + /** + * Creates a new GitHubService object. + * + * @return the job service + */ + public JobService createJobService() { + return new JobServiceImpl(); + } } diff --git a/core/src/main/java/com/github/api/v2/services/JobService.java b/core/src/main/java/com/github/api/v2/services/JobService.java new file mode 100644 index 0000000..c2a2b5c --- /dev/null +++ b/core/src/main/java/com/github/api/v2/services/JobService.java @@ -0,0 +1,107 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.util.List; + +import com.github.api.v2.schema.GeoLocation; +import com.github.api.v2.schema.Job; + + +/** + * The Interface JobService. + */ +public interface JobService extends GitHubService { + + /** + * Search jobs. + * + * @param query + * the query + * + * @return the list< job> + */ + public List searchJobs(String query); + + /** + * Search jobs. + * + * @param query + * the query + * @param location + * the location + * + * @return the list< job> + */ + public List searchJobs(String query, String location); + + /** + * Search jobs. + * + * @param query + * the query + * @param location + * the location + * + * @return the list< job> + */ + public List searchJobs(String query, GeoLocation location); + + /** + * Search full time jobs. + * + * @param query + * the query + * + * @return the list< job> + */ + public List searchFullTimeJobs(String query); + + /** + * Search full time jobs. + * + * @param query + * the query + * @param location + * the location + * + * @return the list< job> + */ + public List searchFullTimeJobs(String query, String location); + + /** + * Search full time jobs. + * + * @param query + * the query + * @param location + * the location + * + * @return the list< job> + */ + public List searchFullTimeJobs(String query, GeoLocation location); + + /** + * Gets the job. + * + * @param id + * the id + * + * @return the job + */ + public Job getJob(String id); +} diff --git a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java index bf9d725..11918b7 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java +++ b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java @@ -376,6 +376,17 @@ public static interface PullRequestApiUrls { public static final String GET_PULL_REQUEST_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.pullRequestService.getPullRequest"); } + /** + * The Interface JobApiUrls. + */ + public static interface JobApiUrls { + + /** The Constant SEARCH_JOBS_URL. */ + public static final String SEARCH_JOBS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.jobService.searchJobs"); + + /** The Constant GET_JOB_URL. */ + public static final String GET_JOB_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.jobService.getJob"); + } /** * The Interface FeedUrls. diff --git a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java index 87ba0c5..feec8a3 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java +++ b/core/src/main/java/com/github/api/v2/services/constant/ParameterNames.java @@ -182,4 +182,16 @@ public interface ParameterNames { /** The Constant PAGE. */ public static final String PAGE = "page"; + + /** The Constant SEARCH. */ + public static final String SEARCH = "search"; + + /** The Constant LATITUDE. */ + public static final String LATITUDE = "lat"; + + /** The Constant LONGITUDE. */ + public static final String LONGITUDE = "long"; + + /** The Constant FULL_TIME. */ + public static final String FULL_TIME = "full_time"; } diff --git a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java index 8c7c59e..9e3d153 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java +++ b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java @@ -26,6 +26,7 @@ import com.github.api.v2.schema.Discussion; import com.github.api.v2.schema.Gist; import com.github.api.v2.schema.Issue; +import com.github.api.v2.schema.Job; import com.github.api.v2.schema.Language; import com.github.api.v2.schema.Organization; import com.github.api.v2.schema.Permission; @@ -57,7 +58,7 @@ public abstract class BaseGitHubService extends GitHubApiGateway implements GitH protected static final Charset UTF_8_CHAR_SET = Charset.forName(ApplicationConstants.CONTENT_ENCODING); /** The parser. */ - private final JsonParser parser = new JsonParser(); + protected final JsonParser parser = new JsonParser(); /** The handlers. */ private List>> handlers = new ArrayList>>(); @@ -186,6 +187,13 @@ public Permission deserialize(JsonElement arg0, Type arg1, return Permission.fromValue(arg0.getAsString()); } }); + builder.registerTypeAdapter(Job.Type.class, new JsonDeserializer() { + @Override + public Job.Type deserialize(JsonElement arg0, Type arg1, + JsonDeserializationContext arg2) throws JsonParseException { + return Job.Type.fromValue(arg0.getAsString()); + } + }); return builder; } diff --git a/core/src/main/java/com/github/api/v2/services/impl/JobServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/JobServiceImpl.java new file mode 100644 index 0000000..13af405 --- /dev/null +++ b/core/src/main/java/com/github/api/v2/services/impl/JobServiceImpl.java @@ -0,0 +1,145 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.impl; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.List; + +import com.github.api.v2.schema.GeoLocation; +import com.github.api.v2.schema.Job; +import com.github.api.v2.services.GitHubException; +import com.github.api.v2.services.JobService; +import com.github.api.v2.services.constant.GitHubApiUrls; +import com.github.api.v2.services.constant.ParameterNames; +import com.github.api.v2.services.constant.GitHubApiUrls.GitHubApiUrlBuilder; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; + +/** + * The Class JobServiceImpl. + */ +public class JobServiceImpl extends BaseGitHubService implements JobService { + + /* (non-Javadoc) + * @see com.github.api.v2.services.JobService#getJob(java.lang.String) + */ + @Override + public Job getJob(String id) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.JobApiUrls.GET_JOB_URL); + String apiUrl = builder.withField(ParameterNames.ID, id).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + return unmarshall(new TypeToken(){}, json); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.JobService#searchFullTimeJobs(java.lang.String) + */ + @Override + public List searchFullTimeJobs(String query) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.JobApiUrls.SEARCH_JOBS_URL); + String apiUrl = builder.withParameter(ParameterNames.SEARCH, query).withParameter(ParameterNames.FULL_TIME, "true").buildUrl(); + JsonElement json = unmarshallList(callApiGet(apiUrl)); + return unmarshall(new TypeToken>(){}, json); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.JobService#searchFullTimeJobs(java.lang.String, java.lang.String) + */ + @Override + public List searchFullTimeJobs(String query, String location) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.JobApiUrls.SEARCH_JOBS_URL); + String apiUrl = builder.withParameter(ParameterNames.FULL_TIME, "true").withParameter(ParameterNames.SEARCH, query).withParameter(ParameterNames.LOCATION, location).buildUrl(); + JsonElement json = unmarshallList(callApiGet(apiUrl)); + return unmarshall(new TypeToken>(){}, json); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.JobService#searchFullTimeJobs(java.lang.String, com.github.api.v2.schema.GeoLocation) + */ + @Override + public List searchFullTimeJobs(String query, GeoLocation location) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.JobApiUrls.SEARCH_JOBS_URL); + String apiUrl = builder.withParameter(ParameterNames.FULL_TIME, "true").withParameter(ParameterNames.SEARCH, query).withParameter(ParameterNames.LATITUDE, String.valueOf(location.getLatitude())).withParameter(ParameterNames.LONGITUDE, String.valueOf(location.getLongitude())).buildUrl(); + JsonElement json = unmarshallList(callApiGet(apiUrl)); + return unmarshall(new TypeToken>(){}, json); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.JobService#searchJobs(java.lang.String) + */ + @Override + public List searchJobs(String query) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.JobApiUrls.SEARCH_JOBS_URL); + String apiUrl = builder.withParameter(ParameterNames.SEARCH, query).buildUrl(); + JsonElement json = unmarshallList(callApiGet(apiUrl)); + return unmarshall(new TypeToken>(){}, json); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.JobService#searchJobs(java.lang.String, java.lang.String) + */ + @Override + public List searchJobs(String query, String location) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.JobApiUrls.SEARCH_JOBS_URL); + String apiUrl = builder.withParameter(ParameterNames.SEARCH, query).withParameter(ParameterNames.LOCATION, location).buildUrl(); + JsonElement json = unmarshallList(callApiGet(apiUrl)); + return unmarshall(new TypeToken>(){}, json); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.JobService#searchJobs(java.lang.String, com.github.api.v2.schema.GeoLocation) + */ + @Override + public List searchJobs(String query, GeoLocation location) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.JobApiUrls.SEARCH_JOBS_URL); + String apiUrl = builder.withParameter(ParameterNames.SEARCH, query).withParameter(ParameterNames.LATITUDE, String.valueOf(location.getLatitude())).withParameter(ParameterNames.LONGITUDE, String.valueOf(location.getLongitude())).buildUrl(); + JsonElement json = unmarshallList(callApiGet(apiUrl)); + return unmarshall(new TypeToken>(){}, json); + } + + /** + * Unmarshall list. + * + * @param jsonContent + * the json content + * + * @return the json element + */ + protected JsonElement unmarshallList(InputStream jsonContent) { + try { + return parser.parse(new InputStreamReader(jsonContent, UTF_8_CHAR_SET)); + } catch (Exception e) { + throw new GitHubException(e); + } finally { + closeStream(jsonContent); + } + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.impl.BaseGitHubService#getGsonBuilder() + */ + @Override + protected GsonBuilder getGsonBuilder() { + GsonBuilder gson = super.getGsonBuilder(); + gson.setDateFormat("EEE MMM d HH:mm:ss z yyyy"); + return gson; + } + +} diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index 957ad74..74298d2 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -23,7 +23,7 @@ com.github.api.v2.services.userService.removeKey=http://github.com/api/{version} com.github.api.v2.services.userService.getEmails=http://github.com/api/{version}/{format}/user/emails com.github.api.v2.services.userService.addEmail=http://github.com/api/{version}/{format}/user/email/add com.github.api.v2.services.userService.removeEmail=http://github.com/api/{version}/{format}/user/email/remove -com.github.api.v2.services.userService.getUserOrganizations=http://github.com/api/{version}/{format}/user/show/{userName}/organizations +com.github.api.v2.services.userService.getUserOrganizations=http://github.com/api/{version}/{format}/{userName}/organizations # Issue API com.github.api.v2.services.issueService.searchIssues=http://github.com/api/{version}/{format}/issues/search/{userName}/{repositoryName}/{state}/{keyword} @@ -110,6 +110,10 @@ com.github.api.v2.services.pullRequestService.createPullRequest=http://github.co com.github.api.v2.services.pullRequestService.getPullRequest=http://github.com/api/{version}/{format}/pulls/{userName}/{repositoryName}/{issueNumber} com.github.api.v2.services.pullRequestService.getPullRequests=http://github.com/api/{version}/{format}/pulls/{userName}/{repositoryName}/{state} +# Job API +com.github.api.v2.services.jobService.searchJobs=http://jobs.github.com/positions.{format}?{search}{location}{lat}{long}{full_time} +com.github.api.v2.services.jobService.getJob=http://jobs.github.com/positions/{id}.{format} + # Feed com.github.api.v2.services.feedService.getPublicUserFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg com.github.api.v2.services.feedService.getPrivateUserFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg diff --git a/core/src/test/java/com/github/api/v2/services/AllTests.java b/core/src/test/java/com/github/api/v2/services/AllTests.java index d41bc1b..3a02c9f 100644 --- a/core/src/test/java/com/github/api/v2/services/AllTests.java +++ b/core/src/test/java/com/github/api/v2/services/AllTests.java @@ -43,6 +43,7 @@ public static Test suite() { suite.addTestSuite(OAuthServiceTest.class); suite.addTestSuite(ObjectServiceTest.class); suite.addTestSuite(UserServiceTest.class); + suite.addTestSuite(JobServiceTest.class); //$JUnit-END$ return suite; } diff --git a/core/src/test/java/com/github/api/v2/services/JobServiceTest.java b/core/src/test/java/com/github/api/v2/services/JobServiceTest.java new file mode 100644 index 0000000..cf08b84 --- /dev/null +++ b/core/src/test/java/com/github/api/v2/services/JobServiceTest.java @@ -0,0 +1,73 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services; + +import java.util.List; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.api.v2.schema.Job; +import com.github.api.v2.services.constant.TestConstants; + +/** + * The Class JobServiceTest. + */ +public class JobServiceTest extends BaseGitHubServiceTest { + + /** The service. */ + private JobService service; + + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#setUp() + */ + @Before + public void setUp() throws Exception { + super.setUp(); + service = factory.createJobService(); + } + + /* (non-Javadoc) + * @see com.github.api.v2.services.BaseGitHubServiceTest#tearDown() + */ + @After + public void tearDown() throws Exception { + super.tearDown(); + service = null; + } + + /** + * Test get job. + */ + @Test + public void testGetJob() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Job Id."), TestConstants.TEST_JOB_ID); + Job job = service.getJob(TestConstants.TEST_JOB_ID); + assertNotNull("Job cannot be null", job); + } + + /** + * Test search jobs. + */ + @Test + public void testSearchJobs() { + assertNotNullOrEmpty(String.format(RESOURCE_MISSING_MESSAGE, "Test Job Query."), TestConstants.TEST_JOB_QUERY); + List jobs = service.searchJobs(TestConstants.TEST_JOB_QUERY); + assertNotNullOrEmpty("Jobs cannot be null or empty", jobs); + } +} diff --git a/core/src/test/java/com/github/api/v2/services/constant/TestConstants.java b/core/src/test/java/com/github/api/v2/services/constant/TestConstants.java index 25375b3..499d8fa 100644 --- a/core/src/test/java/com/github/api/v2/services/constant/TestConstants.java +++ b/core/src/test/java/com/github/api/v2/services/constant/TestConstants.java @@ -154,6 +154,12 @@ public final class TestConstants { /** The Constant TEST_PULL_REQUEST_NUMBER. */ public static final String TEST_PULL_REQUEST_NUMBER = testConstants.getProperty("com.github.api.v2.services.testPullRequestNumber"); + + /** The Constant TEST_JOB_ID. */ + public static final String TEST_JOB_ID = testConstants.getProperty("com.github.api.v2.services.testJobId"); + + /** The Constant TEST_JOB_QUERY. */ + public static final String TEST_JOB_QUERY = testConstants.getProperty("com.github.api.v2.services.testJobQuery"); /** * Instantiates a new test constants. diff --git a/examples/src/java/com/github/api/v2/services/example/JobApiSample.java b/examples/src/java/com/github/api/v2/services/example/JobApiSample.java new file mode 100644 index 0000000..10dfc4b --- /dev/null +++ b/examples/src/java/com/github/api/v2/services/example/JobApiSample.java @@ -0,0 +1,56 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.services.example; + +import java.util.List; + +import com.github.api.v2.schema.Job; +import com.github.api.v2.services.GitHubServiceFactory; +import com.github.api.v2.services.JobService; + +/** + * The Class JobApiSample. + */ +public class JobApiSample { + + /** + * The main method. + * + * @param args + * the arguments + */ + public static void main(String[] args) { + GitHubServiceFactory factory = GitHubServiceFactory.newInstance(); + JobService service = factory.createJobService(); + List jobs = service.searchJobs("python", "new york"); + for (Job job : jobs) { + printResult(job); + } + Job job = service.getJob("82eeae34-65ff-11e0-99be-a34ef36756d3"); + printResult(job); + } + + /** + * Prints the result. + * + * @param job + * the job + */ + private static void printResult(Job job) { + System.out.println(job); + } +} diff --git a/schema/src/main/java/com/github/api/v2/schema/Discussion.java b/schema/src/main/java/com/github/api/v2/schema/Discussion.java index 50dee65..00a5122 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Discussion.java +++ b/schema/src/main/java/com/github/api/v2/schema/Discussion.java @@ -43,6 +43,7 @@ public enum Type implements ValueEnum { /** The ISSU e_ comment. */ ISSUE_COMMENT("IssueComment"), + /** The PUL l_ reques t_ revie w_ comment. */ PULL_REQUEST_REVIEW_COMMENT("PullRequestReviewComment"), diff --git a/schema/src/main/java/com/github/api/v2/schema/GeoLocation.java b/schema/src/main/java/com/github/api/v2/schema/GeoLocation.java new file mode 100644 index 0000000..1321623 --- /dev/null +++ b/schema/src/main/java/com/github/api/v2/schema/GeoLocation.java @@ -0,0 +1,81 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +/** + * The Class GeoLocation. + */ +public class GeoLocation { + + /** The latitude. */ + private double latitude; + + /** The longitude. */ + private double longitude; + + /** + * Instantiates a new geo location. + * + * @param latitude + * the latitude + * @param longitude + * the longitude + */ + public GeoLocation(double latitude, double longitude) { + super(); + this.latitude = latitude; + this.longitude = longitude; + } + + /** + * Gets the latitude. + * + * @return the latitude + */ + public double getLatitude() { + return latitude; + } + + /** + * Sets the latitude. + * + * @param latitude + * the new latitude + */ + public void setLatitude(double latitude) { + this.latitude = latitude; + } + + /** + * Gets the longitude. + * + * @return the longitude + */ + public double getLongitude() { + return longitude; + } + + /** + * Sets the longitude. + * + * @param longitude + * the new longitude + */ + public void setLongitude(double longitude) { + this.longitude = longitude; + } +} diff --git a/schema/src/main/java/com/github/api/v2/schema/Job.java b/schema/src/main/java/com/github/api/v2/schema/Job.java new file mode 100644 index 0000000..12ece91 --- /dev/null +++ b/schema/src/main/java/com/github/api/v2/schema/Job.java @@ -0,0 +1,338 @@ +/* + * Copyright 2010 Nabeel Mukhtar + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.github.api.v2.schema; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * The Class Job. + */ +public class Job extends SchemaEntity { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = 9155892708485181542L; + + /** + * The Enum Type. + */ + public enum Type implements ValueEnum { + + /** The CONTRACT. */ + CONTRACT("Contract"), + + /** The FUL l_ time. */ + FULL_TIME("Full Time"); + + /** The Constant stringToEnum. */ + private static final Map stringToEnum = new HashMap(); + + static { // Initialize map from constant name to enum constant + for (Type op : values()) { + stringToEnum.put(op.value(), op); + } + } + + /** The value. */ + private final String value; + + /** + * Instantiates a new type. + * + * @param value + * the value + */ + Type(String value) { + this.value = value; + } + + /* (non-Javadoc) + * @see com.github.api.v2.schema.ValueEnum#value() + */ + @Override + public String value() { + return value; + } + + /** + * From value. + * + * @param value + * the value + * + * @return the type + */ + public static Type fromValue(String value) { + return stringToEnum.get(value); + } + } + + + /** The company. */ + private String company; + + /** The location. */ + private String location; + + /** The created at. */ + private Date createdAt; + + /** The company url. */ + private String companyUrl; + + /** The title. */ + private String title; + + /** The url. */ + private String url; + + /** The id. */ + private String id; + + /** The company logo. */ + private String companyLogo; + + /** The type. */ + private Type type; + + /** The how to apply. */ + private String howToApply; + + /** The description. */ + private String description; + + /** + * Gets the company. + * + * @return the company + */ + public String getCompany() { + return company; + } + + /** + * Sets the company. + * + * @param company + * the new company + */ + public void setCompany(String company) { + this.company = company; + } + + /** + * Gets the location. + * + * @return the location + */ + public String getLocation() { + return location; + } + + /** + * Sets the location. + * + * @param location + * the new location + */ + public void setLocation(String location) { + this.location = location; + } + + /** + * Gets the created at. + * + * @return the created at + */ + public Date getCreatedAt() { + return createdAt; + } + + /** + * Sets the created at. + * + * @param createdAt + * the new created at + */ + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + /** + * Gets the company url. + * + * @return the company url + */ + public String getCompanyUrl() { + return companyUrl; + } + + /** + * Sets the company url. + * + * @param companyUrl + * the new company url + */ + public void setCompanyUrl(String companyUrl) { + this.companyUrl = companyUrl; + } + + /** + * Gets the title. + * + * @return the title + */ + public String getTitle() { + return title; + } + + /** + * Sets the title. + * + * @param title + * the new title + */ + public void setTitle(String title) { + this.title = title; + } + + /** + * Gets the url. + * + * @return the url + */ + public String getUrl() { + return url; + } + + /** + * Sets the url. + * + * @param url + * the new url + */ + public void setUrl(String url) { + this.url = url; + } + + /** + * Gets the id. + * + * @return the id + */ + public String getId() { + return id; + } + + /** + * Sets the id. + * + * @param id + * the new id + */ + public void setId(String id) { + this.id = id; + } + + /** + * Gets the company logo. + * + * @return the company logo + */ + public String getCompanyLogo() { + return companyLogo; + } + + /** + * Sets the company logo. + * + * @param companyLogo + * the new company logo + */ + public void setCompanyLogo(String companyLogo) { + this.companyLogo = companyLogo; + } + + /** + * Gets the type. + * + * @return the type + */ + public Type getType() { + return type; + } + + /** + * Sets the type. + * + * @param type + * the new type + */ + public void setType(Type type) { + this.type = type; + } + + /** + * Gets the how to apply. + * + * @return the how to apply + */ + public String getHowToApply() { + return howToApply; + } + + /** + * Sets the how to apply. + * + * @param howToApply + * the new how to apply + */ + public void setHowToApply(String howToApply) { + this.howToApply = howToApply; + } + + /** + * Gets the description. + * + * @return the description + */ + public String getDescription() { + return description; + } + + /** + * Sets the description. + * + * @param description + * the new description + */ + public void setDescription(String description) { + this.description = description; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "Job [company=" + company + ", companyLogo=" + companyLogo + + ", companyUrl=" + companyUrl + ", createdAt=" + createdAt + + ", description=" + description + ", howToApply=" + howToApply + + ", id=" + id + ", location=" + location + ", title=" + title + + ", type=" + type + ", url=" + url + "]"; + } +} From 669a76e67945b8ce550acf1af4d231616f7450ef Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Fri, 15 Apr 2011 12:12:50 +0500 Subject: [PATCH 87/95] Fix for Issue #12. --- .../api/v2/services/impl/GitHubApiGateway.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java b/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java index 6e43159..8004966 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java +++ b/core/src/main/java/com/github/api/v2/services/impl/GitHubApiGateway.java @@ -535,11 +535,15 @@ protected InputStream getWrappedInputStream(InputStream is, boolean gzip) * @return the string */ private static String encodeUrl(String original) { - try { - return URLEncoder.encode(original, ApplicationConstants.CONTENT_ENCODING); - } catch (UnsupportedEncodingException e) { - // should never be here.. - return original; - } + if (original == null) { + return ""; + } else { + try { + return URLEncoder.encode(original, ApplicationConstants.CONTENT_ENCODING); + } catch (UnsupportedEncodingException e) { + // should never be here.. + return original; + } + } } } From ffec0bca18dfb569925f9251be417b802ad5c01f Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Fri, 15 Apr 2011 12:21:42 +0500 Subject: [PATCH 88/95] Updated README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index bcbbd38..096c5c9 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ The library is divided into various services each implementing a specific portio * ObjectService: Provides methods of the [Object API](http://develop.github.com/p/object.html). * OrganizationService: Provides methods of the [Organization API](http://develop.github.com/p/orgs.html). * PullRequestService: Provides methods of the [Pull Request API](http://develop.github.com/p/pulls.html). +* JobService: Provides methods of the [Job API](http://jobs.github.com/api). * FeedService: Provides methods for reading the Atom/RSS feeds. * OAuthService: Provides methods for OAuth 2.0 authentication and authorization. From acc7aaa016c51cc696d5321269ce3297e8dda605 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Fri, 15 Apr 2011 14:13:42 +0500 Subject: [PATCH 89/95] Fix for issue #14 --- .../github/api/v2/services/constant/GitHubApiUrls.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index 74298d2..84981c0 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -23,7 +23,7 @@ com.github.api.v2.services.userService.removeKey=http://github.com/api/{version} com.github.api.v2.services.userService.getEmails=http://github.com/api/{version}/{format}/user/emails com.github.api.v2.services.userService.addEmail=http://github.com/api/{version}/{format}/user/email/add com.github.api.v2.services.userService.removeEmail=http://github.com/api/{version}/{format}/user/email/remove -com.github.api.v2.services.userService.getUserOrganizations=http://github.com/api/{version}/{format}/{userName}/organizations +com.github.api.v2.services.userService.getUserOrganizations=http://github.com/api/{version}/{format}/user/show/{userName}/organizations # Issue API com.github.api.v2.services.issueService.searchIssues=http://github.com/api/{version}/{format}/issues/search/{userName}/{repositoryName}/{state}/{keyword} From a4e670e287d6ea26b324022d2d5145271dc810cb Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Fri, 15 Apr 2011 14:26:35 +0500 Subject: [PATCH 90/95] OrganizationService#getOwners(). --- .../github/api/v2/services/OrganizationService.java | 10 ++++++++++ .../api/v2/services/constant/GitHubApiUrls.java | 3 +++ .../api/v2/services/impl/OrganizationServiceImpl.java | 11 +++++++++++ .../api/v2/services/constant/GitHubApiUrls.properties | 1 + 4 files changed, 25 insertions(+) diff --git a/core/src/main/java/com/github/api/v2/services/OrganizationService.java b/core/src/main/java/com/github/api/v2/services/OrganizationService.java index d5779e2..0018f4e 100644 --- a/core/src/main/java/com/github/api/v2/services/OrganizationService.java +++ b/core/src/main/java/com/github/api/v2/services/OrganizationService.java @@ -81,6 +81,16 @@ public interface OrganizationService extends GitHubService { */ public List getPublicMembers(String organizationName); + /** + * Gets the owners. + * + * @param organizationName + * the organization name + * + * @return the owners + */ + public List getOwners(String organizationName); + /** * Gets the teams. * diff --git a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java index 11918b7..273d495 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java +++ b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java @@ -359,6 +359,9 @@ public static interface OrganizationApiUrls { /** The Constant REMOVE_TEAM_REPOSITORY_URL. */ public static final String REMOVE_TEAM_REPOSITORY_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.removeTeamRepository"); + + /** The Constant GET_OWNERS_URL. */ + public static final String GET_OWNERS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.organizationService.getOwners");; } /** diff --git a/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java index ee95b8b..0545d38 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/OrganizationServiceImpl.java @@ -128,6 +128,17 @@ public List getPublicMembers(String organizationName) { return unmarshall(new TypeToken>(){}, json.get("users")); } + /* (non-Javadoc) + * @see com.github.api.v2.services.OrganizationService#getOwners(java.lang.String) + */ + public List getOwners(String organizationName) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.OrganizationApiUrls.GET_OWNERS_URL); + String apiUrl = builder.withField(ParameterNames.ORGANIZATION_NAME, organizationName).buildUrl(); + JsonObject json = unmarshall(callApiGet(apiUrl)); + + return unmarshall(new TypeToken>(){}, json.get("users")); + } + /* (non-Javadoc) * @see com.github.api.v2.services.OrganizationService#getPublicRepositories(java.lang.String) */ diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index 84981c0..f89e71d 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -93,6 +93,7 @@ com.github.api.v2.services.organizationService.updateOrganization=http://github. com.github.api.v2.services.organizationService.getAllRepositories=http://github.com/api/{version}/{format}/organizations/repositories com.github.api.v2.services.organizationService.getPublicRepositories=http://github.com/api/{version}/{format}/organizations/{organizationName}/public_repositories com.github.api.v2.services.organizationService.getPublicMembers=http://github.com/api/{version}/{format}/organizations/{organizationName}/public_members +com.github.api.v2.services.organizationService.getOwners=http://github.com/api/{version}/{format}/organizations/{organizationName}/owners com.github.api.v2.services.organizationService.getTeams=http://github.com/api/{version}/{format}/organizations/{organizationName}/teams com.github.api.v2.services.organizationService.createTeam=http://github.com/api/{version}/{format}/organizations/{organizationName}/teams com.github.api.v2.services.organizationService.getTeam=http://github.com/api/{version}/{format}/teams/{teamId} From fece1f78dea9d8efce96598720e434a76b83501e Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Fri, 15 Apr 2011 14:33:10 +0500 Subject: [PATCH 91/95] Gist comments. --- .../java/com/github/api/v2/schema/Gist.java | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/schema/src/main/java/com/github/api/v2/schema/Gist.java b/schema/src/main/java/com/github/api/v2/schema/Gist.java index ebd1def..b994314 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Gist.java +++ b/schema/src/main/java/com/github/api/v2/schema/Gist.java @@ -16,6 +16,7 @@ */ package com.github.api.v2.schema; +import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -99,7 +100,10 @@ public static Visibility fromValue(String value) { private Date createdAt; /** The files. */ - private List files; + private List files = new ArrayList(); + + /** The comments. */ + private List comments = new ArrayList(); /** The owner. */ private String owner; @@ -218,6 +222,25 @@ public void setOwner(String owner) { this.owner = owner; } + /** + * Gets the comments. + * + * @return the comments + */ + public List getComments() { + return comments; + } + + /** + * Sets the comments. + * + * @param comments + * the new comments + */ + public void setComments(List comments) { + this.comments = comments; + } + /* (non-Javadoc) * @see java.lang.Object#toString() */ From 5ac8802d7155daa346dfff725e16c04b332df580 Mon Sep 17 00:00:00 2001 From: Nabeel Mukhtar Date: Fri, 15 Apr 2011 14:35:37 +0500 Subject: [PATCH 92/95] Latest jar file. --- dist/github-java-sdk.jar | Bin 173525 -> 187175 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/github-java-sdk.jar b/dist/github-java-sdk.jar index 7006ef7ece26b1747d2bd26630b0f388c1bd301d..649da3a01f43af06e1990d775acdfe9e1db752a3 100644 GIT binary patch delta 57607 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� z=6O|ZP`|~X-gSU==P4_>cn#^C{V~^xkGuJB;%(9yahnreDpjI22gH~mGQ@^+RO0!= zAiglnk<{f}eE%U3fBr8{>^p?OkUKXzCWlf15R1W`m3O#Kd_Cnhk?hp!x>L}x z+2BItD0ks(uIfT>F2t9Q5z&5i*v!K7RK1?mw6#v`biT5fZA05;l5^AlSw2i={bN4{dQx8HVQ^D3@@4IfIq2FX7bd~e{MpCm$4kH62g7?UAd}U|4{=OT^{aG z?o_72_2u(rxGll~$9E8f>-s|NGQ8+n2mExE3fETym*M%54!CEr3a>9*?^l5B$!3p< zYfag6ET>Re#=H30B6RV=Xd*0R*+pu4T`HuUSR$x*X*r^#8>Mtej}_F!LN#mkrA?!x znP6``^RnT_qn1xeHYoV-3Zh0bZF;hmg8D_GpbnO*SrhpAF1G??*#oSu@>2QrO9Dy@ z75A&h3I)Tf1(jz0DU=xB-Dt8MWt(l-h+KbF@MyW@5@BTWufGsf8h@Pnq!`rxb%Kf- zsbUm!RwsFWHc7Df`a~xBJX(+0;3IwWLiX|P4FnY-PA-9L%_bp>BC2Bk?U*|<(u(eB z!X;RFb*8sc2LSKxU?SiZxce%UZ^EA0ek^KGcO zE2m^xhKA==V#Pcca}=g)vNV=IU$|!Bx^QgBt;|m;>~vfZrwh8tWY3|=E|H`3wMu1F zYaXGZ87 zK)v)f_4W+yHn|U74rf`!>N}~iT-l#+dz_n1ai1JGgz>rpPfqgM`t{#5yc@%9^B|6Y zv22<34)CiDPlwS18a|Bg=xeKC_3#kuuElv;f3@-yr`{v#@=pYnE~c}EHHtrHCDwrT z;-?zRo4KVTI&}OnDOB;jfc|O2@kf}HUT$9rJZ`ZEaxJ5zW!?ip#XWWp!y{-{#o*94 zn13(f=_W){w&)unhWqY*+-~oMz(zXT_#@!*vD(2$1hoj0XrWU2Sjgg!Kr`Kj7Yg(@ zWS^02^?uLs(efqviI0Z*n`5&j`MV19YEYhz((czz6kTWc+PwtFV1v^qHZ#nHi!$6h z6J8#7{_a;B(ZtU&yU134?poL*_z~o z=R!%Vxf?0R}Q$2;?jb5*Izbe;%JyW0b< zp{afdsJz?T8bSD_++ZCUtc)bW95z(19yRFS8eb1ijs$ro*Us zw}rpjB17NAc7&jK^-yF^i|(Is+1D`aI0%~6s0d&Gp0cH=9|^V&$H?K51FJW%)6F=c)29Ceia0}% delta 45205 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 From 6cec744af358e692d30decc3af766f5b5eb03924 Mon Sep 17 00:00:00 2001 From: slapperwan Date: Sat, 16 Apr 2011 00:46:26 +0800 Subject: [PATCH 93/95] New service to get all jobs with pagination --- .../com/github/api/v2/services/JobService.java | 10 +++++++++- .../api/v2/services/constant/GitHubApiUrls.java | 3 +++ .../api/v2/services/impl/JobServiceImpl.java | 14 ++++++++++++-- .../v2/services/constant/GitHubApiUrls.properties | 1 + 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/JobService.java b/core/src/main/java/com/github/api/v2/services/JobService.java index c2a2b5c..8df6eb7 100644 --- a/core/src/main/java/com/github/api/v2/services/JobService.java +++ b/core/src/main/java/com/github/api/v2/services/JobService.java @@ -47,7 +47,7 @@ public interface JobService extends GitHubService { * * @return the list< job> */ - public List searchJobs(String query, String location); + public List searchJobs(String query, String location, int page); /** * Search jobs. @@ -104,4 +104,12 @@ public interface JobService extends GitHubService { * @return the job */ public Job getJob(String id); + + /** + * Gets the all jobs. + * + * @param page the page + * @return the all jobs + */ + public List getAllJobs(int page); } diff --git a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java index 8b34fe2..13e5057 100644 --- a/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java +++ b/core/src/main/java/com/github/api/v2/services/constant/GitHubApiUrls.java @@ -392,6 +392,9 @@ public static interface JobApiUrls { /** The Constant GET_JOB_URL. */ public static final String GET_JOB_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.jobService.getJob"); + + /** The Constant SEARCH_ALL_JOBS_URL. */ + public static final String SEARCH_ALL_JOBS_URL = gitHubApiUrls.getProperty("com.github.api.v2.services.jobService.searchAllJobs"); } /** diff --git a/core/src/main/java/com/github/api/v2/services/impl/JobServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/JobServiceImpl.java index 81ba390..a1f9745 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/JobServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/JobServiceImpl.java @@ -96,9 +96,11 @@ public List searchJobs(String query) { * @see com.github.api.v2.services.JobService#searchJobs(java.lang.String, java.lang.String) */ @Override - public List searchJobs(String query, String location) { + public List searchJobs(String query, String location, int page) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.JobApiUrls.SEARCH_JOBS_URL); - String apiUrl = builder.withParameter(ParameterNames.SEARCH, query).withParameter(ParameterNames.LOCATION, location).buildUrl(); + String apiUrl = builder.withParameter(ParameterNames.SEARCH, query) + .withParameter(ParameterNames.LOCATION, location) + .withParameter(ParameterNames.PAGE, String.valueOf(page)).buildUrl(); JsonElement json = unmarshallList(callApiGet(apiUrl)); return unmarshall(new TypeToken>(){}, json); } @@ -141,5 +143,13 @@ protected GsonBuilder getGsonBuilder() { gson.setDateFormat("EEE MMM d HH:mm:ss z yyyy"); return gson; } + + @Override + public List getAllJobs(int page) { + GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.JobApiUrls.SEARCH_ALL_JOBS_URL); + String apiUrl = builder.withParameter(ParameterNames.PAGE, String.valueOf(page)).buildUrl(); + JsonElement json = unmarshallList(callApiGet(apiUrl)); + return unmarshall(new TypeToken>(){}, json); + } } diff --git a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties index c51f6ec..90b94be 100644 --- a/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties +++ b/core/src/main/resources/com/github/api/v2/services/constant/GitHubApiUrls.properties @@ -117,6 +117,7 @@ com.github.api.v2.services.pullRequestService.getPullRequests=http://github.com/ # Job API com.github.api.v2.services.jobService.searchJobs=http://jobs.github.com/positions.{format}?{search}{location}{lat}{long}{full_time} com.github.api.v2.services.jobService.getJob=http://jobs.github.com/positions/{id}.{format} +com.github.api.v2.services.jobService.searchAllJobs=http://jobs.github.com/positions.{format}?{page} # Feed com.github.api.v2.services.feedService.getPublicUserFeed=http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&{num}&q=https%3A%2F%2Fround-lake.dustinice.workers.dev%3A443%2Fhttp%2Fgithub.com%2F{userName}.atom&key=ABQIAAAAvQycN2a0eBLRB8DGrLfzQRTQV5l3ALoWoSA9wfMrLZSV0Qnu4RQ6x1TgR7d8ayIoK_hqJWsqLImnDg From de6f44f55d2da1fc3bb1d4701d3098e7843aae53 Mon Sep 17 00:00:00 2001 From: slapperwan Date: Wed, 1 Jun 2011 14:30:22 +0800 Subject: [PATCH 94/95] Json from changed --- .../v2/services/impl/BaseGitHubService.java | 21 +++++++++++++++++++ .../com/github/api/v2/schema/Payload.java | 6 +++--- .../java/com/github/api/v2/schema/User.java | 2 +- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java index 3b4ad39..91e0633 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java +++ b/core/src/main/java/com/github/api/v2/services/impl/BaseGitHubService.java @@ -32,6 +32,7 @@ import com.github.api.v2.schema.Issue; import com.github.api.v2.schema.Job; import com.github.api.v2.schema.Language; +import com.github.api.v2.schema.Member; import com.github.api.v2.schema.ObjectPayloadPullRequest; import com.github.api.v2.schema.ObjectPayloadTarget; import com.github.api.v2.schema.Organization; @@ -40,8 +41,10 @@ import com.github.api.v2.schema.Permission; import com.github.api.v2.schema.Repository; import com.github.api.v2.schema.SchemaEntity; +import com.github.api.v2.schema.StringMember; import com.github.api.v2.schema.StringPayloadTarget; import com.github.api.v2.schema.Tree; +import com.github.api.v2.schema.User; import com.github.api.v2.schema.UserFeed; import com.github.api.v2.services.AsyncResponseHandler; import com.github.api.v2.services.GitHubException; @@ -177,6 +180,8 @@ public Date deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext }); builder.registerTypeAdapter(PayloadPullRequest.class, new PayloadPullRequestDeserializer()); + builder.registerTypeAdapter(Member.class, new MemberDeserializer()); + builder.registerTypeAdapter(PayloadTarget.class, new PayloadTargetDeserializer()); builder.registerTypeAdapter(Issue.State.class, new JsonDeserializer() { @@ -326,6 +331,22 @@ else if (json.isJsonObject()) { } } + private class MemberDeserializer implements JsonDeserializer { + public Member deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) + throws JsonParseException { + if (json.isJsonPrimitive()) { + StringMember member = new StringMember(); + member.setLogin(json.getAsString()); + return member; + } + else if (json.isJsonObject()) { + User member = context.deserialize(json, new TypeToken(){}.getType()); + return member; + } + return null; + } + } + private class PayloadTargetDeserializer implements JsonDeserializer { public PayloadTarget deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { diff --git a/schema/src/main/java/com/github/api/v2/schema/Payload.java b/schema/src/main/java/com/github/api/v2/schema/Payload.java index 6a55f58..cb309b0 100644 --- a/schema/src/main/java/com/github/api/v2/schema/Payload.java +++ b/schema/src/main/java/com/github/api/v2/schema/Payload.java @@ -48,7 +48,7 @@ public class Payload extends SchemaEntity { private String objectName; /** The member */ - private String member; + private Member member; /** The target id */ private String targetId; @@ -172,11 +172,11 @@ public void setObjectName(String objectName) { this.objectName = objectName; } - public String getMember() { + public Member getMember() { return member; } - public void setMember(String member) { + public void setMember(Member member) { this.member = member; } diff --git a/schema/src/main/java/com/github/api/v2/schema/User.java b/schema/src/main/java/com/github/api/v2/schema/User.java index 4c17907..17d823a 100644 --- a/schema/src/main/java/com/github/api/v2/schema/User.java +++ b/schema/src/main/java/com/github/api/v2/schema/User.java @@ -21,7 +21,7 @@ /** * The Class User. */ -public class User extends SchemaEntity { +public class User extends SchemaEntity implements Member { /** The Constant serialVersionUID. */ private static final long serialVersionUID = 9155892708485181542L; From c9f98243886c05aacc24052c610cf69298be8485 Mon Sep 17 00:00:00 2001 From: slapperwan Date: Wed, 1 Jun 2011 14:46:58 +0800 Subject: [PATCH 95/95] Fixed search repo phrases with a dot fail --- .../api/v2/services/impl/RepositoryServiceImpl.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java index fdfee29..e44aa00 100644 --- a/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java +++ b/core/src/main/java/com/github/api/v2/services/impl/RepositoryServiceImpl.java @@ -362,7 +362,7 @@ public void removeDeployKey(String repositoryName, String id) { @Override public List searchRepositories(String query) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); - String apiUrl = builder.withField(ParameterNames.KEYWORD, query, true).buildUrl(); + String apiUrl = builder.withField(ParameterNames.KEYWORD, query, false).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); try { @@ -379,7 +379,7 @@ public List searchRepositories(String query) { @Override public List searchRepositories(String query, Language language) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); - String apiUrl = builder.withField(ParameterNames.KEYWORD, query, true).withParameterEnum(ParameterNames.LANGUAGE, language).buildUrl(); + String apiUrl = builder.withField(ParameterNames.KEYWORD, query, false).withParameterEnum(ParameterNames.LANGUAGE, language).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); try { @@ -396,7 +396,7 @@ public List searchRepositories(String query, Language language) { @Override public List searchRepositories(String query, int pageNumber) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); - String apiUrl = builder.withField(ParameterNames.KEYWORD, query, true).withParameter(ParameterNames.START_PAGE, String.valueOf(pageNumber)).buildUrl(); + String apiUrl = builder.withField(ParameterNames.KEYWORD, query, false).withParameter(ParameterNames.START_PAGE, String.valueOf(pageNumber)).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); try { @@ -414,7 +414,7 @@ public List searchRepositories(String query, int pageNumber) { public List searchRepositories(String query, Language language, int pageNumber) { GitHubApiUrlBuilder builder = createGitHubApiUrlBuilder(GitHubApiUrls.RepositoryApiUrls.SEARCH_REPOSITORIES_URL); - String apiUrl = builder.withField(ParameterNames.KEYWORD, query, true).withParameterEnum(ParameterNames.LANGUAGE, language).withParameter(ParameterNames.START_PAGE, String.valueOf(pageNumber)).buildUrl(); + String apiUrl = builder.withField(ParameterNames.KEYWORD, query, false).withParameterEnum(ParameterNames.LANGUAGE, language).withParameter(ParameterNames.START_PAGE, String.valueOf(pageNumber)).buildUrl(); JsonObject json = unmarshall(callApiGet(apiUrl)); try {