1 /**
2 * Copyright (c) 2013-2023, jcabi.com
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met: 1) Redistributions of source code must retain the above
8 * copyright notice, this list of conditions and the following
9 * disclaimer. 2) Redistributions in binary form must reproduce the above
10 * copyright notice, this list of conditions and the following
11 * disclaimer in the documentation and/or other materials provided
12 * with the distribution. 3) Neither the name of the jcabi.com nor
13 * the names of its contributors may be used to endorse or promote
14 * products derived from this software without specific prior written
15 * permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
19 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21 * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
22 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
28 * OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30 package com.jcabi.github;
31
32 import com.jcabi.aspects.Immutable;
33 import com.jcabi.aspects.Loggable;
34 import java.io.IOException;
35 import java.net.URL;
36 import java.text.ParseException;
37 import java.util.Date;
38 import javax.json.Json;
39 import javax.json.JsonObject;
40 import lombok.EqualsAndHashCode;
41 import lombok.ToString;
42
43 /**
44 * Github organization.
45 *
46 * <p>Use a supplementary "smart" decorator to get other properties
47 * from an organization, for example:
48 *
49 * <pre> Organization.Smart org = new Organization.Smart(origin);
50 * if (org.name() == null) {
51 * name = "new_name";
52 * }</pre>
53 * @author Paul Polishchuk (ppol@ua.fm)
54 * @version $Id: 85b1360c0501acf10b77ccb997efe306a5ad9038 $
55 * @checkstyle MultipleStringLiterals (500 lines)
56 * @see <a href="https://developer.github.com/v3/orgs/">Organizations API</a>
57 * @since 0.7
58 */
59 @Immutable
60 @SuppressWarnings("PMD.TooManyMethods")
61 public interface Organization extends Comparable<Organization>,
62 JsonReadable, JsonPatchable {
63
64 /**
65 * Github we're in.
66 * @return Github
67 */
68 Github github();
69
70 /**
71 * Get this organization's login.
72 * @return Login name
73 */
74 String login();
75
76 /**
77 * Get this organization's public members.
78 * @return Public members
79 */
80 PublicMembers publicMembers();
81
82 /**
83 * Smart Organization with extra features.
84 */
85 @Immutable
86 @ToString
87 @Loggable(Loggable.DEBUG)
88 @EqualsAndHashCode(of = { "org", "jsn" })
89 final class Smart implements Organization {
90
91 /**
92 * Encapsulated org.
93 */
94 private final transient Organization org;
95
96 /**
97 * SmartJson object for convenient JSON parsing.
98 */
99 private final transient SmartJson jsn;
100
101 /**
102 * Public ctor.
103 * @param orgn Organization
104 */
105 public Smart(
106 final Organization orgn
107 ) {
108 this.org = orgn;
109 this.jsn = new SmartJson(orgn);
110 }
111
112 /**
113 * Get this organization's ID.
114 * @return Unique organization ID
115 * @throws IOException If it fails
116 */
117 public int number() throws IOException {
118 return this.org.json().getJsonNumber("id").intValue();
119 }
120
121 /**
122 * Get its company.
123 * @return Company of organization
124 * @throws IOException If there is any I/O problem
125 */
126 public String company() throws IOException {
127 return this.jsn.text("company");
128 }
129
130 /**
131 * Change its company.
132 * @param company Company of organization
133 * @throws IOException If there is any I/O problem
134 */
135 public void company(
136 final String company
137 ) throws IOException {
138 this.org.patch(
139 Json.createObjectBuilder().add("company", company).build()
140 );
141 }
142
143 /**
144 * Get its location.
145 * @return Location of organization
146 * @throws IOException If there is any I/O problem
147 */
148 public String location() throws IOException {
149 return this.jsn.text("location");
150 }
151
152 /**
153 * Change its location.
154 * @param location Location of organization
155 * @throws IOException If there is any I/O problem
156 */
157 public void location(
158 final String location
159 ) throws IOException {
160 this.org.patch(
161 Json.createObjectBuilder().add("location", location).build()
162 );
163 }
164
165 /**
166 * Get its name.
167 * @return Name of organization
168 * @throws IOException If there is any I/O problem
169 */
170 public String name() throws IOException {
171 return this.jsn.text("name");
172 }
173
174 /**
175 * Change its name.
176 * @param name Company of organization
177 * @throws IOException If there is any I/O problem
178 */
179 public void name(
180 final String name
181 ) throws IOException {
182 this.org.patch(
183 Json.createObjectBuilder().add("name", name).build()
184 );
185 }
186
187 /**
188 * Get its email.
189 * @return Email of organization
190 * @throws IOException If there is any I/O problem
191 */
192 public String email() throws IOException {
193 return this.jsn.text("email");
194 }
195
196 /**
197 * Change its email.
198 * @param email Email of organization
199 * @throws IOException If there is any I/O problem
200 */
201 public void email(
202 final String email
203 ) throws IOException {
204 this.org.patch(
205 Json.createObjectBuilder().add("email", email).build()
206 );
207 }
208
209 /**
210 * Get its billingEmail.
211 * @return BillingEmail of organization
212 * @throws IOException If there is any I/O problem
213 */
214 public String billingEmail() throws IOException {
215 return this.jsn.text("billing_email");
216 }
217
218 /**
219 * Change its billingEmail.
220 * @param billingemail BillingEmail of organization
221 * @throws IOException If there is any I/O problem
222 */
223 public void billingEmail(
224 final String billingemail
225 )
226 throws IOException {
227 this.org.patch(
228 Json.createObjectBuilder()
229 .add("billing_email", billingemail).build()
230 );
231 }
232
233 /**
234 * Get its blog.
235 * @return Blog of organization
236 * @throws IOException If there is any I/O problem
237 */
238 public String blog() throws IOException {
239 return this.jsn.text("blog");
240 }
241
242 /**
243 * Get its URL.
244 * @return URL of organization
245 * @throws IOException If there is any I/O problem
246 */
247 public URL url() throws IOException {
248 return new URL(this.jsn.text("url"));
249 }
250
251 /**
252 * Get its HTML URL.
253 * @return HTML URL of organization
254 * @throws IOException If there is any I/O problem
255 */
256 public URL htmlUrl() throws IOException {
257 return new URL(this.jsn.text("html_url"));
258 }
259
260 /**
261 * Get its avatar URL.
262 * @return Avatar URL of organization
263 * @throws IOException If there is any I/O problem
264 */
265 public URL avatarUrl() throws IOException {
266 return new URL(this.jsn.text("avatar_url"));
267 }
268
269 /**
270 * When this organisation was created.
271 * @return Date of creation
272 * @throws IOException If there is any I/O problem
273 */
274 public Date createdAt() throws IOException {
275 try {
276 return new Github.Time(
277 this.jsn.text("created_at")
278 ).date();
279 } catch (final ParseException ex) {
280 throw new IllegalStateException(ex);
281 }
282 }
283
284 /**
285 * Get its public repos count.
286 * @return Count of public repos of organization
287 * @throws IOException If there is any I/O problem
288 */
289 public int publicRepos() throws IOException {
290 return this.jsn.number("public_repos");
291 }
292
293 /**
294 * Get its public gists count.
295 * @return Count of public gists of organization
296 * @throws IOException If there is any I/O problem
297 */
298 public int publicGists() throws IOException {
299 return this.jsn.number("public_gists");
300 }
301
302 /**
303 * Get its followers count.
304 * @return Count of followers of organization
305 * @throws IOException If there is any I/O problem
306 */
307 public int followers() throws IOException {
308 return this.jsn.number("followers");
309 }
310
311 /**
312 * Get its following count.
313 * @return Count of following of organization
314 * @throws IOException If there is any I/O problem
315 */
316 public int following() throws IOException {
317 return this.jsn.number("following");
318 }
319
320 /**
321 * Get its type.
322 * @return Type of organization
323 * @throws IOException If there is any I/O problem
324 */
325 public String type() throws IOException {
326 return this.jsn.text("type");
327 }
328
329 @Override
330 public String login() {
331 return this.org.login();
332 }
333
334 @Override
335 public Github github() {
336 return this.org.github();
337 }
338
339 @Override
340 public PublicMembers publicMembers() {
341 return this.org.publicMembers();
342 }
343
344 @Override
345 public JsonObject json() throws IOException {
346 return this.org.json();
347 }
348
349 @Override
350 public void patch(
351 final JsonObject json
352 ) throws IOException {
353 this.org.patch(json);
354 }
355
356 @Override
357 public int compareTo(
358 final Organization obj
359 ) {
360 return this.org.compareTo(obj);
361 }
362 }
363
364 }