/******************************************************************************* * 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 java.net.HttpURLConnection.HTTP_NOT_FOUND; import static org.eclipse.egit.github.core.client.PagedRequest.PAGE_FIRST; import static org.eclipse.egit.github.core.client.PagedRequest.PAGE_SIZE; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.eclipse.egit.github.core.IRepositoryIdProvider; import org.eclipse.egit.github.core.client.GitHubClient; import org.eclipse.egit.github.core.client.GitHubRequest; import org.eclipse.egit.github.core.client.NoSuchPageException; import org.eclipse.egit.github.core.client.PageIterator; import org.eclipse.egit.github.core.client.PagedRequest; import org.eclipse.egit.github.core.client.RequestException; /** * Base GitHub service class. */ public abstract class GitHubService { /** * Accept header for full response */ protected static final String ACCEPT_FULL = "application/vnd.github.beta.full+json"; //$NON-NLS-1$ /** * Accept header for HTML response */ protected static final String ACCEPT_HTML = "application/vnd.github.beta.html+json"; //$NON-NLS-1$ /** * Accept header for text response */ protected static final String ACCEPT_TEXT = "application/vnd.github.beta.text+json"; //$NON-NLS-1$ /** * Client field */ protected final GitHubClient client; /** * Create service using a default {@link GitHubClient} */ public GitHubService() { this(new GitHubClient()); } /** * Create service for client * * @param client * must be non-null */ public GitHubService(GitHubClient client) { if (client == null) throw new IllegalArgumentException("Client cannot be null"); //$NON-NLS-1$ this.client = client; } /** * Get configured client * * @return non-null client */ public GitHubClient getClient() { return client; } /** * Unified request creation method that all sub-classes should use so * overriding classes can extend and configure the default request. * * @return request */ protected GitHubRequest createRequest() { return new GitHubRequest(); } /** * Unified paged request creation method that all sub-classes should use so * overriding classes can extend and configure the default request. * * @return request */ protected <V> PagedRequest<V> createPagedRequest() { return createPagedRequest(PAGE_FIRST, PAGE_SIZE); } /** * Unified paged request creation method that all sub-classes should use so * overriding classes can extend and configure the default request. * * @param start * @param size * @return request */ protected <V> PagedRequest<V> createPagedRequest(int start, int size) { return new PagedRequest<V>(start, size); } /** * Unified page iterator creation method that all sub-classes should use so * overriding classes can extend and configure the default iterator. * * @param request * @return iterator */ protected <V> PageIterator<V> createPageIterator(PagedRequest<V> request) { return new PageIterator<V>(request, client); } /** * Get paged request by performing multiple requests until no more pages are * available or an exception occurs. * * @param <V> * @param request * @return list of all elements * @throws IOException */ protected <V> List<V> getAll(PagedRequest<V> request) throws IOException { return getAll(createPageIterator(request)); } /** * Get paged request by performing multiple requests until no more pages are * available or an exception occurs. * * @param <V> * @param iterator * @return list of all elements * @throws IOException */ protected <V> List<V> getAll(PageIterator<V> iterator) throws IOException { List<V> elements = new ArrayList<V>(); try { while (iterator.hasNext()) elements.addAll(iterator.next()); } catch (NoSuchPageException pageException) { throw pageException.getCause(); } return elements; } /** * Check if the uri returns a non-404 * * @param uri * @return true if no exception, false if 404 * @throws IOException */ protected boolean check(String uri) throws IOException { try { client.get(createRequest().setUri(uri)); return true; } catch (RequestException e) { if (e.getStatus() == HTTP_NOT_FOUND) return false; throw e; } } /** * Get id for repository * * @param provider * @return non-null id */ protected String getId(IRepositoryIdProvider provider) { if (provider == null) throw new IllegalArgumentException( "Repository provider cannot be null"); //$NON-NLS-1$ final String id = provider.generateId(); if (id == null) throw new IllegalArgumentException("Repository id cannot be null"); //$NON-NLS-1$ if (id.length() == 0) throw new IllegalArgumentException("Repository id cannot be empty"); //$NON-NLS-1$ return id; } /** * Verify user and repository name * * @param user * @param repository * @return this service */ protected GitHubService verifyRepository(String user, String repository) { 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$ if (repository == null) throw new IllegalArgumentException("Repository cannot be null"); //$NON-NLS-1$ if (repository.length() == 0) throw new IllegalArgumentException("Repository cannot be empty"); //$NON-NLS-1$ return this; } }