mirror of
https://github.com/jlengrand/github-api.git
synced 2026-03-24 08:21:27 +00:00
579 lines
22 KiB
HTML
579 lines
22 KiB
HTML
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>ReadOnlyObjects.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">GitHub API for Java</a> > <a href="index.source.html" class="el_package">org.kohsuke.github.example.dataobject</a> > <span class="el_source">ReadOnlyObjects.java</span></div><h1>ReadOnlyObjects.java</h1><pre class="source lang-java linenums">package org.kohsuke.github.example.dataobject;
|
|
|
|
import com.fasterxml.jackson.annotation.JsonCreator;
|
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
|
import com.fasterxml.jackson.annotation.JsonSetter;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.Collections;
|
|
import java.util.List;
|
|
import java.util.Objects;
|
|
|
|
import javax.annotation.Nonnull;
|
|
|
|
/**
|
|
* {@link org.kohsuke.github.GHMeta} wraps the list of GitHub's IP addresses.
|
|
* <p>
|
|
* This class is used to show examples of different ways to create simple read-only data objects. For data objects that
|
|
* can be modified, perform actions, or get other objects we'll need other examples.
|
|
* <p>
|
|
* IMPORTANT: There is no one right way to do this, but there are better and worse.
|
|
* <ul>
|
|
* <li>Better: {@link GHMetaGettersUnmodifiable} is a good balance of clarity and brevity</li>
|
|
* <li>Worse: {@link GHMetaPublic} exposes setters that are not needed, making it unclear that fields are actually
|
|
* read-only</li>
|
|
* </ul>
|
|
*
|
|
* @author Liam Newman
|
|
* @see org.kohsuke.github.GHMeta
|
|
* @see <a href="https://developer.github.com/v3/meta/#meta">Get Meta</a>
|
|
*/
|
|
<span class="nc" id="L31">public final class ReadOnlyObjects {</span>
|
|
|
|
/**
|
|
* All GHMeta data objects should expose these values.
|
|
*
|
|
* @author Liam Newman
|
|
*/
|
|
public interface GHMetaExample {
|
|
/**
|
|
* Is verifiable password authentication boolean.
|
|
*
|
|
* @return the boolean
|
|
*/
|
|
boolean isVerifiablePasswordAuthentication();
|
|
|
|
/**
|
|
* Gets hooks.
|
|
*
|
|
* @return the hooks
|
|
*/
|
|
List<String> getHooks();
|
|
|
|
/**
|
|
* Gets git.
|
|
*
|
|
* @return the git
|
|
*/
|
|
List<String> getGit();
|
|
|
|
/**
|
|
* Gets web.
|
|
*
|
|
* @return the web
|
|
*/
|
|
List<String> getWeb();
|
|
|
|
/**
|
|
* Gets api.
|
|
*
|
|
* @return the api
|
|
*/
|
|
List<String> getApi();
|
|
|
|
/**
|
|
* Gets pages.
|
|
*
|
|
* @return the pages
|
|
*/
|
|
List<String> getPages();
|
|
|
|
/**
|
|
* Gets importer.
|
|
*
|
|
* @return the importer
|
|
*/
|
|
List<String> getImporter();
|
|
}
|
|
|
|
/**
|
|
* This version uses public getters and setters and leaves it up to Jackson how it wants to fill them.
|
|
* <p>
|
|
* Pro:
|
|
* <ul>
|
|
* <li>Easy to create</li>
|
|
* <li>Not much code</li>
|
|
* <li>Mininal annotations</li>
|
|
* </ul>
|
|
* Con:
|
|
* <ul>
|
|
* <li>Exposes public setters for fields that should not be changed</li>
|
|
* <li>Lists modifiable when they should not be changed</li>
|
|
* <li>Jackson generally doesn't call the setters, it just sets the fields directly</li>
|
|
* </ul>
|
|
*
|
|
* @author Paulo Miguel Almeida
|
|
* @see org.kohsuke.github.GHMeta
|
|
*/
|
|
<span class="fc" id="L108"> public static class GHMetaPublic implements GHMetaExample {</span>
|
|
|
|
@JsonProperty("verifiable_password_authentication")
|
|
private boolean verifiablePasswordAuthentication;
|
|
private List<String> hooks;
|
|
private List<String> git;
|
|
private List<String> web;
|
|
private List<String> api;
|
|
private List<String> pages;
|
|
private List<String> importer;
|
|
|
|
public boolean isVerifiablePasswordAuthentication() {
|
|
<span class="fc" id="L120"> return verifiablePasswordAuthentication;</span>
|
|
}
|
|
|
|
/**
|
|
* Sets verifiable password authentication.
|
|
*
|
|
* @param verifiablePasswordAuthentication
|
|
* the verifiable password authentication
|
|
*/
|
|
public void setVerifiablePasswordAuthentication(boolean verifiablePasswordAuthentication) {
|
|
<span class="nc" id="L130"> this.verifiablePasswordAuthentication = verifiablePasswordAuthentication;</span>
|
|
<span class="nc" id="L131"> }</span>
|
|
|
|
public List<String> getHooks() {
|
|
<span class="fc" id="L134"> return hooks;</span>
|
|
}
|
|
|
|
/**
|
|
* Sets hooks.
|
|
*
|
|
* @param hooks
|
|
* the hooks
|
|
*/
|
|
public void setHooks(List<String> hooks) {
|
|
<span class="nc" id="L144"> this.hooks = hooks;</span>
|
|
<span class="nc" id="L145"> }</span>
|
|
|
|
public List<String> getGit() {
|
|
<span class="fc" id="L148"> return git;</span>
|
|
}
|
|
|
|
/**
|
|
* Sets git.
|
|
*
|
|
* @param git
|
|
* the git
|
|
*/
|
|
public void setGit(List<String> git) {
|
|
<span class="nc" id="L158"> this.git = git;</span>
|
|
<span class="nc" id="L159"> }</span>
|
|
|
|
public List<String> getWeb() {
|
|
<span class="fc" id="L162"> return web;</span>
|
|
}
|
|
|
|
/**
|
|
* Sets web.
|
|
*
|
|
* @param web
|
|
* the web
|
|
*/
|
|
public void setWeb(List<String> web) {
|
|
<span class="nc" id="L172"> this.web = web;</span>
|
|
<span class="nc" id="L173"> }</span>
|
|
|
|
public List<String> getApi() {
|
|
<span class="fc" id="L176"> return api;</span>
|
|
}
|
|
|
|
/**
|
|
* Sets api.
|
|
*
|
|
* @param api
|
|
* the api
|
|
*/
|
|
public void setApi(List<String> api) {
|
|
<span class="nc" id="L186"> this.api = api;</span>
|
|
<span class="nc" id="L187"> }</span>
|
|
|
|
public List<String> getPages() {
|
|
<span class="fc" id="L190"> return pages;</span>
|
|
}
|
|
|
|
/**
|
|
* Sets pages.
|
|
*
|
|
* @param pages
|
|
* the pages
|
|
*/
|
|
public void setPages(List<String> pages) {
|
|
<span class="nc" id="L200"> this.pages = pages;</span>
|
|
<span class="nc" id="L201"> }</span>
|
|
|
|
public List<String> getImporter() {
|
|
<span class="fc" id="L204"> return importer;</span>
|
|
}
|
|
|
|
/**
|
|
* Sets importer.
|
|
*
|
|
* @param importer
|
|
* the importer
|
|
*/
|
|
public void setImporter(List<String> importer) {
|
|
<span class="nc" id="L214"> this.importer = importer;</span>
|
|
<span class="nc" id="L215"> }</span>
|
|
|
|
}
|
|
|
|
/**
|
|
* This version uses public getters and shows that package or private setters both can be used by jackson. You can
|
|
* check this by running in debug and setting break points in the setters.
|
|
*
|
|
* <p>
|
|
* Pro:
|
|
* <ul>
|
|
* <li>Easy to create</li>
|
|
* <li>Not much code</li>
|
|
* <li>Some annotations</li>
|
|
* </ul>
|
|
* Con:
|
|
* <ul>
|
|
* <li>Exposes some package setters for fields that should not be changed, better than public</li>
|
|
* <li>Lists modifiable when they should not be changed</li>
|
|
* </ul>
|
|
*
|
|
* @author Liam Newman
|
|
* @see org.kohsuke.github.GHMeta
|
|
*/
|
|
<span class="fc" id="L239"> public static class GHMetaPackage implements GHMetaExample {</span>
|
|
|
|
private boolean verifiablePasswordAuthentication;
|
|
private List<String> hooks;
|
|
private List<String> git;
|
|
private List<String> web;
|
|
private List<String> api;
|
|
private List<String> pages;
|
|
|
|
/**
|
|
* Missing {@link JsonProperty} or having it on the field will cause Jackson to ignore getters and setters.
|
|
*/
|
|
@JsonProperty
|
|
private List<String> importer;
|
|
|
|
@JsonProperty("verifiable_password_authentication")
|
|
public boolean isVerifiablePasswordAuthentication() {
|
|
<span class="fc" id="L256"> return verifiablePasswordAuthentication;</span>
|
|
}
|
|
|
|
private void setVerifiablePasswordAuthentication(boolean verifiablePasswordAuthentication) {
|
|
<span class="fc" id="L260"> this.verifiablePasswordAuthentication = verifiablePasswordAuthentication;</span>
|
|
<span class="fc" id="L261"> }</span>
|
|
|
|
@JsonProperty
|
|
public List<String> getHooks() {
|
|
<span class="fc" id="L265"> return hooks;</span>
|
|
}
|
|
|
|
/**
|
|
* Setters can be private (or package local) and will still be called by Jackson. The {@link JsonProperty} can
|
|
* got on the getter or setter and still work.
|
|
*
|
|
* @param hooks
|
|
* list of hooks
|
|
*/
|
|
private void setHooks(List<String> hooks) {
|
|
<span class="fc" id="L276"> this.hooks = hooks;</span>
|
|
<span class="fc" id="L277"> }</span>
|
|
|
|
public List<String> getGit() {
|
|
<span class="fc" id="L280"> return git;</span>
|
|
}
|
|
|
|
/**
|
|
* Since we mostly use Jackson for deserialization, {@link JsonSetter} is also okay, but {@link JsonProperty} is
|
|
* preferred.
|
|
*
|
|
* @param git
|
|
* list of git addresses
|
|
*/
|
|
@JsonSetter
|
|
void setGit(List<String> git) {
|
|
<span class="fc" id="L292"> this.git = git;</span>
|
|
<span class="fc" id="L293"> }</span>
|
|
|
|
public List<String> getWeb() {
|
|
<span class="fc" id="L296"> return web;</span>
|
|
}
|
|
|
|
/**
|
|
* The {@link JsonProperty} can got on the getter or setter and still work.
|
|
*
|
|
* @param web
|
|
* list of web addresses
|
|
*/
|
|
void setWeb(List<String> web) {
|
|
<span class="nc" id="L306"> this.web = web;</span>
|
|
<span class="nc" id="L307"> }</span>
|
|
|
|
@JsonProperty
|
|
public List<String> getApi() {
|
|
<span class="fc" id="L311"> return api;</span>
|
|
}
|
|
|
|
void setApi(List<String> api) {
|
|
<span class="fc" id="L315"> this.api = api;</span>
|
|
<span class="fc" id="L316"> }</span>
|
|
|
|
@JsonProperty
|
|
public List<String> getPages() {
|
|
<span class="fc" id="L320"> return pages;</span>
|
|
}
|
|
|
|
void setPages(List<String> pages) {
|
|
<span class="fc" id="L324"> this.pages = pages;</span>
|
|
<span class="fc" id="L325"> }</span>
|
|
|
|
/**
|
|
* Missing {@link JsonProperty} or having it on the field will cause Jackson to ignore getters and setters.
|
|
*
|
|
* @return list of importer addresses
|
|
*/
|
|
public List<String> getImporter() {
|
|
<span class="fc" id="L333"> return importer;</span>
|
|
}
|
|
|
|
/**
|
|
* Missing {@link JsonProperty} or having it on the field will cause Jackson to ignore getters and setters.
|
|
*
|
|
* @param importer
|
|
* list of importer addresses
|
|
*/
|
|
void setImporter(List<String> importer) {
|
|
<span class="nc" id="L343"> this.importer = importer;</span>
|
|
<span class="nc" id="L344"> }</span>
|
|
|
|
}
|
|
|
|
/**
|
|
* This version uses only public getters and returns unmodifiable lists.
|
|
*
|
|
*
|
|
* <p>
|
|
* Pro:
|
|
* <ul>
|
|
* <li>Very Easy to create</li>
|
|
* <li>Minimal code</li>
|
|
* <li>Mininal annotations</li>
|
|
* <li>Fields effectively final and lists unmodifiable</li>
|
|
* </ul>
|
|
* Con:
|
|
* <ul>
|
|
* <li>Effectively final is not quite really final</li>
|
|
* <li>If one of the lists were missing (an option member, for example), it will throw NPE but we could mitigate by
|
|
* checking for null or assigning a default.</li>
|
|
* </ul>
|
|
*
|
|
* @author Liam Newman
|
|
* @see org.kohsuke.github.GHMeta
|
|
*/
|
|
<span class="fc" id="L370"> public static class GHMetaGettersUnmodifiable implements GHMetaExample {</span>
|
|
|
|
@JsonProperty("verifiable_password_authentication")
|
|
private boolean verifiablePasswordAuthentication;
|
|
private List<String> hooks;
|
|
private List<String> git;
|
|
private List<String> web;
|
|
private List<String> api;
|
|
private List<String> pages;
|
|
/**
|
|
* If this were an optional member, we could fill it with an empty list by default.
|
|
*/
|
|
<span class="fc" id="L382"> private List<String> importer = new ArrayList<>();</span>
|
|
|
|
public boolean isVerifiablePasswordAuthentication() {
|
|
<span class="fc" id="L385"> return verifiablePasswordAuthentication;</span>
|
|
}
|
|
|
|
public List<String> getHooks() {
|
|
<span class="fc" id="L389"> return Collections.unmodifiableList(hooks);</span>
|
|
}
|
|
|
|
public List<String> getGit() {
|
|
<span class="fc" id="L393"> return Collections.unmodifiableList(git);</span>
|
|
}
|
|
|
|
public List<String> getWeb() {
|
|
<span class="fc" id="L397"> return Collections.unmodifiableList(web);</span>
|
|
}
|
|
|
|
public List<String> getApi() {
|
|
<span class="fc" id="L401"> return Collections.unmodifiableList(api);</span>
|
|
}
|
|
|
|
public List<String> getPages() {
|
|
<span class="fc" id="L405"> return Collections.unmodifiableList(pages);</span>
|
|
}
|
|
|
|
public List<String> getImporter() {
|
|
<span class="fc" id="L409"> return Collections.unmodifiableList(importer);</span>
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This version uses only public getters and returns unmodifiable lists and has final fields
|
|
* <p>
|
|
* Pro:
|
|
* <ul>
|
|
* <li>Moderate amount of code</li>
|
|
* <li>More annotations</li>
|
|
* <li>Fields final and lists unmodifiable</li>
|
|
* </ul>
|
|
* Con:
|
|
* <ul>
|
|
* <li>Extra allocations - default array lists will be replaced by Jackson (yes, even though they are final)</li>
|
|
* <li>Added constructor is annoying</li>
|
|
* <li>If this object could be refreshed or populated, then the final is misleading (and possibly buggy)</li>
|
|
* </ul>
|
|
*
|
|
* @author Liam Newman
|
|
* @see org.kohsuke.github.GHMeta
|
|
*/
|
|
public static class GHMetaGettersFinal implements GHMetaExample {
|
|
|
|
private final boolean verifiablePasswordAuthentication;
|
|
<span class="fc" id="L435"> private final List<String> hooks = new ArrayList<>();</span>
|
|
<span class="fc" id="L436"> private final List<String> git = new ArrayList<>();</span>
|
|
<span class="fc" id="L437"> private final List<String> web = new ArrayList<>();</span>
|
|
<span class="fc" id="L438"> private final List<String> api = new ArrayList<>();</span>
|
|
<span class="fc" id="L439"> private final List<String> pages = new ArrayList<>();</span>
|
|
<span class="fc" id="L440"> private final List<String> importer = new ArrayList<>();</span>
|
|
|
|
@JsonCreator
|
|
private GHMetaGettersFinal(
|
|
<span class="fc" id="L444"> @JsonProperty("verifiable_password_authentication") boolean verifiablePasswordAuthentication) {</span>
|
|
// boolean fields when final seem to be really final, so we have to switch to constructor
|
|
<span class="fc" id="L446"> this.verifiablePasswordAuthentication = verifiablePasswordAuthentication;</span>
|
|
<span class="fc" id="L447"> }</span>
|
|
|
|
public boolean isVerifiablePasswordAuthentication() {
|
|
<span class="fc" id="L450"> return verifiablePasswordAuthentication;</span>
|
|
}
|
|
|
|
public List<String> getHooks() {
|
|
<span class="fc" id="L454"> return Collections.unmodifiableList(hooks);</span>
|
|
}
|
|
|
|
public List<String> getGit() {
|
|
<span class="fc" id="L458"> return Collections.unmodifiableList(git);</span>
|
|
}
|
|
|
|
public List<String> getWeb() {
|
|
<span class="fc" id="L462"> return Collections.unmodifiableList(web);</span>
|
|
}
|
|
|
|
public List<String> getApi() {
|
|
<span class="fc" id="L466"> return Collections.unmodifiableList(api);</span>
|
|
}
|
|
|
|
public List<String> getPages() {
|
|
<span class="fc" id="L470"> return Collections.unmodifiableList(pages);</span>
|
|
}
|
|
|
|
public List<String> getImporter() {
|
|
<span class="fc" id="L474"> return Collections.unmodifiableList(importer);</span>
|
|
}
|
|
}
|
|
|
|
/**
|
|
* This version uses only public getters and returns unmodifiable lists
|
|
* <p>
|
|
* Pro:
|
|
* <ul>
|
|
* <li>Fields final and lists unmodifiable</li>
|
|
* <li>Construction behavior can be controlled - if values depended on each other or needed to be set in a specific
|
|
* order, this could do that.</li>
|
|
* <li>JsonProrperty "required" works on JsonCreator constructors - lets annotation define required values</li>
|
|
* </ul>
|
|
* Con:
|
|
* <ul>
|
|
* <li>There is no way you'd know about this without some research</li>
|
|
* <li>Specific annotations needed</li>
|
|
* <li>Nonnull annotations are misleading - null value is not checked even for "required" constructor
|
|
* parameters</li>
|
|
* <li>Brittle and verbose - not friendly to large number of fields</li>
|
|
* </ul>
|
|
*
|
|
* @author Liam Newman
|
|
* @see org.kohsuke.github.GHMeta
|
|
*/
|
|
public static class GHMetaGettersFinalCreator implements GHMetaExample {
|
|
|
|
private final boolean verifiablePasswordAuthentication;
|
|
private final List<String> hooks;
|
|
private final List<String> git;
|
|
private final List<String> web;
|
|
private final List<String> api;
|
|
private final List<String> pages;
|
|
private final List<String> importer;
|
|
|
|
/**
|
|
*
|
|
* @param hooks
|
|
* the hooks - required property works, but only on creator json properties like this, ignores
|
|
* Nonnull, checked manually
|
|
* @param git
|
|
* the git list - required property works, but only on creator json properties like this, misleading
|
|
* Nonnull annotation
|
|
* @param web
|
|
* the web list - misleading Nonnull annotation
|
|
* @param api
|
|
* the api list - misleading Nonnull annotation
|
|
* @param pages
|
|
* the pages list - misleading Nonnull annotation
|
|
* @param importer
|
|
* the importer list - misleading Nonnull annotation
|
|
* @param verifiablePasswordAuthentication
|
|
* true or false
|
|
*/
|
|
@JsonCreator
|
|
private GHMetaGettersFinalCreator(@Nonnull @JsonProperty(value = "hooks", required = true) List<String> hooks,
|
|
@Nonnull @JsonProperty(value = "git", required = true) List<String> git,
|
|
@Nonnull @JsonProperty("web") List<String> web,
|
|
@Nonnull @JsonProperty("api") List<String> api,
|
|
@Nonnull @JsonProperty("pages") List<String> pages,
|
|
@Nonnull @JsonProperty("importer") List<String> importer,
|
|
<span class="fc" id="L536"> @JsonProperty("verifiable_password_authentication") boolean verifiablePasswordAuthentication) {</span>
|
|
|
|
// to ensure a value is actually not null we still have to do a null check
|
|
<span class="fc" id="L539"> Objects.requireNonNull(hooks);</span>
|
|
|
|
<span class="fc" id="L541"> this.verifiablePasswordAuthentication = verifiablePasswordAuthentication;</span>
|
|
<span class="fc" id="L542"> this.hooks = Collections.unmodifiableList(hooks);</span>
|
|
<span class="fc" id="L543"> this.git = Collections.unmodifiableList(git);</span>
|
|
<span class="fc" id="L544"> this.web = Collections.unmodifiableList(web);</span>
|
|
<span class="fc" id="L545"> this.api = Collections.unmodifiableList(api);</span>
|
|
<span class="fc" id="L546"> this.pages = Collections.unmodifiableList(pages);</span>
|
|
<span class="fc" id="L547"> this.importer = Collections.unmodifiableList(importer);</span>
|
|
<span class="fc" id="L548"> }</span>
|
|
|
|
public boolean isVerifiablePasswordAuthentication() {
|
|
<span class="fc" id="L551"> return verifiablePasswordAuthentication;</span>
|
|
}
|
|
|
|
public List<String> getHooks() {
|
|
<span class="fc" id="L555"> return hooks;</span>
|
|
}
|
|
|
|
public List<String> getGit() {
|
|
<span class="fc" id="L559"> return git;</span>
|
|
}
|
|
|
|
public List<String> getWeb() {
|
|
<span class="fc" id="L563"> return web;</span>
|
|
}
|
|
|
|
public List<String> getApi() {
|
|
<span class="fc" id="L567"> return api;</span>
|
|
}
|
|
|
|
public List<String> getPages() {
|
|
<span class="fc" id="L571"> return pages;</span>
|
|
}
|
|
|
|
public List<String> getImporter() {
|
|
<span class="fc" id="L575"> return importer;</span>
|
|
}
|
|
}
|
|
}
|
|
</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.7.202105040129</span></div></body></html> |