Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: 9d9ebc2845fa251855f5642009545d88f709fd99 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
/*******************************************************************************
 *  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 raw response (only body)
	 */
	public static final String ACCEPT_RAW = "application/vnd.github.v3.raw+json"; //$NON-NLS-1$

	/**
	 * Accept header for HTML response (only bodyHtml)
	 */
	public static final String ACCEPT_HTML = "application/vnd.github.v3.html+json"; //$NON-NLS-1$

	/**
	 * Accept header for text response (only bodyText)
	 */
	public static final String ACCEPT_TEXT = "application/vnd.github.v3.text+json"; //$NON-NLS-1$

	/**
	 * Accept header for full response (body, bodyText and bodyHtml)
	 */
	public static final String ACCEPT_FULL = "application/vnd.github.v3.full+json"; //$NON-NLS-1$

	/**
	 * Accept header for diff response
	 */
	public static final String ACCEPT_DIFF = "application/vnd.github.v3.diff"; //$NON-NLS-1$

	/**
	 * Accept header for patch response
	 */
	public static final String ACCEPT_PATCH = "application/vnd.github.v3.patch"; //$NON-NLS-1$

	/**
	 * Accept header to use preview features of the 'ironman' release.
	 * @see <a href="https://developer.github.com/changes">https://developer.github.com/changes</a>
	 * @since 4.2
	 */
	public static final String ACCEPT_PREVIEW_IRONMAN = "application/vnd.github.ironman-preview+json"; //$NON-NLS-1$

	/**
	 * Accept header to use preview features of the 'loki' release.
	 * @see <a href="https://developer.github.com/changes">https://developer.github.com/changes</a>
	 * @since 4.2
	 */
	public static final String ACCEPT_PREVIEW_LOKI = "application/vnd.github.loki-preview+json"; //$NON-NLS-1$

	/**
	 * Accept header to use preview features of the 'drax' release.
	 * @see <a href="https://developer.github.com/changes">https://developer.github.com/changes</a>
	 * @since 4.2
	 */
	public static final String ACCEPT_PREVIEW_DRAX = "application/vnd.github.drax-preview+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;
	}
}

Back to the top