/******************************************************************************* * Copyright (c) 2011 GitHub Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Kevin Sawicki (GitHub Inc.) - initial API and implementation *******************************************************************************/ package org.eclipse.egit.github.core.service; import static org.eclipse.egit.github.core.client.IGitHubConstants.SEGMENT_COMMENTS; import static org.eclipse.egit.github.core.client.IGitHubConstants.SEGMENT_FORK; import static org.eclipse.egit.github.core.client.IGitHubConstants.SEGMENT_GISTS; import static org.eclipse.egit.github.core.client.IGitHubConstants.SEGMENT_PUBLIC; import static org.eclipse.egit.github.core.client.IGitHubConstants.SEGMENT_STAR; import static org.eclipse.egit.github.core.client.IGitHubConstants.SEGMENT_STARRED; import static org.eclipse.egit.github.core.client.IGitHubConstants.SEGMENT_USERS; import static org.eclipse.egit.github.core.client.PagedRequest.PAGE_FIRST; import static org.eclipse.egit.github.core.client.PagedRequest.PAGE_SIZE; import com.google.gson.reflect.TypeToken; import java.io.IOException; import java.util.Collections; import java.util.List; import java.util.Map; import org.eclipse.egit.github.core.Comment; import org.eclipse.egit.github.core.Gist; import org.eclipse.egit.github.core.client.GitHubClient; import org.eclipse.egit.github.core.client.GitHubRequest; import org.eclipse.egit.github.core.client.PageIterator; import org.eclipse.egit.github.core.client.PagedRequest; /** * Service class for interacting with Gists and Gist comments. * * @see <a href="http://developer.github.com/v3/gists">GitHub Gist API * documentation</a> * @see <a href="http://developer.github.com/v3/gists/comments">GitHub Gist * comments API documentation</a> */ public class GistService extends GitHubService { /** * Create gist service */ public GistService() { super(); } /** * Create gist service * * @param client */ public GistService(GitHubClient client) { super(client); } /** * Check that gist id is non-null and non-empty * * @param gistId * @return gist id */ protected String checkGistId(String gistId) { if (gistId == null) throw new IllegalArgumentException("Gist id cannot be null"); //$NON-NLS-1$ if (gistId.length() == 0) throw new IllegalArgumentException("Gist id cannot be empty"); //$NON-NLS-1$ return gistId; } /** * Get gist * * @param id * @return gist * @throws IOException */ public Gist getGist(String id) throws IOException { checkGistId(id); StringBuilder uri = new StringBuilder(SEGMENT_GISTS); uri.append('/').append(id); GitHubRequest request = createRequest(); request.setUri(uri); request.setType(Gist.class); return (Gist) client.get(request).getBody(); } /** * Create page iterator for the current user's starred gists * * @return gist page iterator */ public PageIterator<Gist> pageStarredGists() { return pageStarredGists(PAGE_SIZE); } /** * Create page iterator for the current user's starred gists * * @param size * size of page * @return gist page iterator */ public PageIterator<Gist> pageStarredGists(final int size) { return pageStarredGists(PAGE_FIRST, size); } /** * Create page iterator for the current user's starred gists * * @param size * size of page * @param start * starting page * @return gist page iterator */ public PageIterator<Gist> pageStarredGists(final int start, final int size) { PagedRequest<Gist> request = createPagedRequest(start, size); request.setUri(SEGMENT_GISTS + SEGMENT_STARRED); request.setType(new TypeToken<List<Gist>>() { }.getType()); return createPageIterator(request); } /** * Get starred gists for currently authenticated user * * @return list of gists * @throws IOException */ public List<Gist> getStarredGists() throws IOException { return getAll(pageStarredGists()); } /** * Create user gist paged request * * @param user * @param start * @param size * @return request */ protected PagedRequest<Gist> createUserGistRequest(String user, int start, int size) { if (user == null) throw new IllegalArgumentException("User cannot be null"); //$NON-NLS-1$ if (user.length() == 0) throw new IllegalArgumentException("User cannot be empty"); //$NON-NLS-1$ StringBuilder uri = new StringBuilder(SEGMENT_USERS); uri.append('/').append(user); uri.append(SEGMENT_GISTS); PagedRequest<Gist> request = createPagedRequest(start, size); request.setUri(uri).setType(new TypeToken<List<Gist>>() { }.getType()); return request; } /** * Get gists for specified user * * @param user * @return list of gists * @throws IOException */ public List<Gist> getGists(String user) throws IOException { return getAll(pageGists(user)); } /** * Create page iterator for given user's gists * * @param user * @return gist page iterator */ public PageIterator<Gist> pageGists(final String user) { return pageGists(user, PAGE_SIZE); } /** * Create page iterator for given user's gists * * @param user * @param size * size of page * @return gist page iterator */ public PageIterator<Gist> pageGists(final String user, final int size) { return pageGists(user, PAGE_FIRST, size); } /** * Create page iterator for given user's gists * * @param user * @param size * size of page * @param start * starting page * @return gist page iterator */ public PageIterator<Gist> pageGists(final String user, final int start, final int size) { PagedRequest<Gist> request = createUserGistRequest(user, start, size); return createPageIterator(request); } /** * Create page iterator for all public gists * * @return gist page iterator */ public PageIterator<Gist> pagePublicGists() { return pagePublicGists(PAGE_SIZE); } /** * Create page iterator for all public gists * * @param size * size of page * @return gist page iterator */ public PageIterator<Gist> pagePublicGists(final int size) { return pagePublicGists(PAGE_FIRST, size); } /** * Create page iterator for all public gists * * @param start * starting page number * @param size * size of page * @return gist page iterator */ public PageIterator<Gist> pagePublicGists(final int start, final int size) { PagedRequest<Gist> request = createPagedRequest(start, size); request.setUri(SEGMENT_GISTS + SEGMENT_PUBLIC); request.setType(new TypeToken<List<Gist>>() { }.getType()); return createPageIterator(request); } /** * Create a gist * * @param gist * @return created gist * @throws IOException */ public Gist createGist(Gist gist) throws IOException { if (gist == null) throw new IllegalArgumentException("Gist cannot be null"); //$NON-NLS-1$ return client.post(SEGMENT_GISTS, gist, Gist.class); } /** * Update a gist * * @param gist * @return updated gist * @throws IOException */ public Gist updateGist(Gist gist) throws IOException { if (gist == null) throw new IllegalArgumentException("Gist cannot be null"); //$NON-NLS-1$ String id = gist.getId(); checkGistId(id); StringBuilder uri = new StringBuilder(SEGMENT_GISTS); uri.append('/').append(id); return client.post(uri.toString(), gist, Gist.class); } /** * Create comment on specified gist id * * @param gistId * @param comment * @return created issue * @throws IOException */ public Comment createComment(String gistId, String comment) throws IOException { checkGistId(gistId); if (comment == null) throw new IllegalArgumentException("Gist comment cannot be null"); //$NON-NLS-1$ StringBuilder uri = new StringBuilder(SEGMENT_GISTS); uri.append('/').append(gistId); uri.append(SEGMENT_COMMENTS); Map<String, String> params = Collections.singletonMap( IssueService.FIELD_BODY, comment); return client.post(uri.toString(), params, Comment.class); } /** * Get comments for specified gist id * * @param gistId * @return list of comments * @throws IOException */ public List<Comment> getComments(String gistId) throws IOException { checkGistId(gistId); StringBuilder uri = new StringBuilder(SEGMENT_GISTS); uri.append('/').append(gistId); uri.append(SEGMENT_COMMENTS); PagedRequest<Comment> request = createPagedRequest(); request.setUri(uri).setType(new TypeToken<List<Comment>>() { }.getType()); return getAll(request); } /** * Delete the Gist with the given id * * @param gistId * @throws IOException */ public void deleteGist(String gistId) throws IOException { checkGistId(gistId); StringBuilder uri = new StringBuilder(SEGMENT_GISTS); uri.append('/').append(gistId); client.delete(uri.toString()); } /** * Get gist comment with id * * @param commentId * @return comment * @throws IOException */ public Comment getComment(long commentId) throws IOException { StringBuilder uri = new StringBuilder(SEGMENT_GISTS + SEGMENT_COMMENTS); uri.append('/').append(commentId); GitHubRequest request = createRequest(); request.setUri(uri); request.setType(Comment.class); return (Comment) client.get(request).getBody(); } /** * Edit gist comment * * @param comment * @return edited comment * @throws IOException */ public Comment editComment(Comment comment) throws IOException { if (comment == null) throw new IllegalArgumentException("Comment cannot be null"); //$NON-NLS-1$ StringBuilder uri = new StringBuilder(SEGMENT_GISTS + SEGMENT_COMMENTS); uri.append('/').append(comment.getId()); return client.post(uri.toString(), comment, Comment.class); } /** * Delete the Gist comment with the given id * * @param commentId * @throws IOException */ public void deleteComment(long commentId) throws IOException { StringBuilder uri = new StringBuilder(SEGMENT_GISTS + SEGMENT_COMMENTS); uri.append('/').append(commentId); client.delete(uri.toString()); } /** * Star the gist with the given id * * @param gistId * @throws IOException */ public void starGist(String gistId) throws IOException { checkGistId(gistId); StringBuilder uri = new StringBuilder(SEGMENT_GISTS); uri.append('/').append(gistId); uri.append(SEGMENT_STAR); client.put(uri.toString()); } /** * Unstar the gist with the given id * * @param gistId * @throws IOException */ public void unstarGist(String gistId) throws IOException { checkGistId(gistId); StringBuilder uri = new StringBuilder(SEGMENT_GISTS); uri.append('/').append(gistId); uri.append(SEGMENT_STAR); client.delete(uri.toString()); } /** * Check if a gist is starred * * @param gistId * @return true if starred, false if not starred * @throws IOException */ public boolean isStarred(String gistId) throws IOException { checkGistId(gistId); StringBuilder uri = new StringBuilder(SEGMENT_GISTS); uri.append('/').append(gistId); uri.append(SEGMENT_STAR); return check(uri.toString()); } /** * Fork gist with given id * * @param gistId * @return forked gist * @throws IOException */ public Gist forkGist(String gistId) throws IOException { checkGistId(gistId); StringBuilder uri = new StringBuilder(SEGMENT_GISTS); uri.append('/').append(gistId); uri.append(SEGMENT_FORK); return client.post(uri.toString(), null, Gist.class); } }