/*
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */
/*
 * This code was generated by https://github.com/googleapis/google-api-java-client-services/
 * Modify at your own risk.
 */

package com.google.api.services.books.v1.model;

/**
 * Model definition for Volume.
 *
 * <p> This is the Java data model class that specifies how to parse/serialize into the JSON that is
 * transmitted over HTTP when working with the Books API. For a detailed explanation see:
 * <a href="https://developers.google.com/api-client-library/java/google-http-java-client/json">https://developers.google.com/api-client-library/java/google-http-java-client/json</a>
 * </p>
 *
 * @author Google, Inc.
 */
@SuppressWarnings("javadoc")
public final class Volume extends com.google.api.client.json.GenericJson {

  /**
   * Any information about a volume related to reading or obtaining that volume text. This
   * information can depend on country (books may be public domain in one country but not in
   * another, e.g.).
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private AccessInfo accessInfo;

  /**
   * Opaque identifier for a specific version of a volume resource. (In LITE projection)
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String etag;

  /**
   * Unique identifier for a volume. (In LITE projection.)
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String id;

  /**
   * Resource type for a volume. (In LITE projection.)
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String kind;

  /**
   * What layers exist in this volume and high level information about them.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private LayerInfo layerInfo;

  /**
   * Recommendation related information for this volume.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private RecommendedInfo recommendedInfo;

  /**
   * Any information about a volume related to the eBookstore and/or purchaseability. This
   * information can depend on the country where the request originates from (i.e. books may not be
   * for sale in certain countries).
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private SaleInfo saleInfo;

  /**
   * Search result information related to this volume.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private SearchInfo searchInfo;

  /**
   * URL to this resource. (In LITE projection.)
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String selfLink;

  /**
   * User specific information related to this volume. (e.g. page this user last read or whether
   * they purchased this book)
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private UserInfo userInfo;

  /**
   * General volume information.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private VolumeInfo volumeInfo;

  /**
   * Any information about a volume related to reading or obtaining that volume text. This
   * information can depend on country (books may be public domain in one country but not in
   * another, e.g.).
   * @return value or {@code null} for none
   */
  public AccessInfo getAccessInfo() {
    return accessInfo;
  }

  /**
   * Any information about a volume related to reading or obtaining that volume text. This
   * information can depend on country (books may be public domain in one country but not in
   * another, e.g.).
   * @param accessInfo accessInfo or {@code null} for none
   */
  public Volume setAccessInfo(AccessInfo accessInfo) {
    this.accessInfo = accessInfo;
    return this;
  }

  /**
   * Opaque identifier for a specific version of a volume resource. (In LITE projection)
   * @return value or {@code null} for none
   */
  public java.lang.String getEtag() {
    return etag;
  }

  /**
   * Opaque identifier for a specific version of a volume resource. (In LITE projection)
   * @param etag etag or {@code null} for none
   */
  public Volume setEtag(java.lang.String etag) {
    this.etag = etag;
    return this;
  }

  /**
   * Unique identifier for a volume. (In LITE projection.)
   * @return value or {@code null} for none
   */
  public java.lang.String getId() {
    return id;
  }

  /**
   * Unique identifier for a volume. (In LITE projection.)
   * @param id id or {@code null} for none
   */
  public Volume setId(java.lang.String id) {
    this.id = id;
    return this;
  }

  /**
   * Resource type for a volume. (In LITE projection.)
   * @return value or {@code null} for none
   */
  public java.lang.String getKind() {
    return kind;
  }

  /**
   * Resource type for a volume. (In LITE projection.)
   * @param kind kind or {@code null} for none
   */
  public Volume setKind(java.lang.String kind) {
    this.kind = kind;
    return this;
  }

  /**
   * What layers exist in this volume and high level information about them.
   * @return value or {@code null} for none
   */
  public LayerInfo getLayerInfo() {
    return layerInfo;
  }

  /**
   * What layers exist in this volume and high level information about them.
   * @param layerInfo layerInfo or {@code null} for none
   */
  public Volume setLayerInfo(LayerInfo layerInfo) {
    this.layerInfo = layerInfo;
    return this;
  }

  /**
   * Recommendation related information for this volume.
   * @return value or {@code null} for none
   */
  public RecommendedInfo getRecommendedInfo() {
    return recommendedInfo;
  }

  /**
   * Recommendation related information for this volume.
   * @param recommendedInfo recommendedInfo or {@code null} for none
   */
  public Volume setRecommendedInfo(RecommendedInfo recommendedInfo) {
    this.recommendedInfo = recommendedInfo;
    return this;
  }

  /**
   * Any information about a volume related to the eBookstore and/or purchaseability. This
   * information can depend on the country where the request originates from (i.e. books may not be
   * for sale in certain countries).
   * @return value or {@code null} for none
   */
  public SaleInfo getSaleInfo() {
    return saleInfo;
  }

  /**
   * Any information about a volume related to the eBookstore and/or purchaseability. This
   * information can depend on the country where the request originates from (i.e. books may not be
   * for sale in certain countries).
   * @param saleInfo saleInfo or {@code null} for none
   */
  public Volume setSaleInfo(SaleInfo saleInfo) {
    this.saleInfo = saleInfo;
    return this;
  }

  /**
   * Search result information related to this volume.
   * @return value or {@code null} for none
   */
  public SearchInfo getSearchInfo() {
    return searchInfo;
  }

  /**
   * Search result information related to this volume.
   * @param searchInfo searchInfo or {@code null} for none
   */
  public Volume setSearchInfo(SearchInfo searchInfo) {
    this.searchInfo = searchInfo;
    return this;
  }

  /**
   * URL to this resource. (In LITE projection.)
   * @return value or {@code null} for none
   */
  public java.lang.String getSelfLink() {
    return selfLink;
  }

  /**
   * URL to this resource. (In LITE projection.)
   * @param selfLink selfLink or {@code null} for none
   */
  public Volume setSelfLink(java.lang.String selfLink) {
    this.selfLink = selfLink;
    return this;
  }

  /**
   * User specific information related to this volume. (e.g. page this user last read or whether
   * they purchased this book)
   * @return value or {@code null} for none
   */
  public UserInfo getUserInfo() {
    return userInfo;
  }

  /**
   * User specific information related to this volume. (e.g. page this user last read or whether
   * they purchased this book)
   * @param userInfo userInfo or {@code null} for none
   */
  public Volume setUserInfo(UserInfo userInfo) {
    this.userInfo = userInfo;
    return this;
  }

  /**
   * General volume information.
   * @return value or {@code null} for none
   */
  public VolumeInfo getVolumeInfo() {
    return volumeInfo;
  }

  /**
   * General volume information.
   * @param volumeInfo volumeInfo or {@code null} for none
   */
  public Volume setVolumeInfo(VolumeInfo volumeInfo) {
    this.volumeInfo = volumeInfo;
    return this;
  }

  @Override
  public Volume set(String fieldName, Object value) {
    return (Volume) super.set(fieldName, value);
  }

  @Override
  public Volume clone() {
    return (Volume) super.clone();
  }

  /**
   * Any information about a volume related to reading or obtaining that volume text. This information
   * can depend on country (books may be public domain in one country but not in another, e.g.).
   */
  public static final class AccessInfo extends com.google.api.client.json.GenericJson {

    /**
     * Combines the access and viewability of this volume into a single status field for this user.
     * Values can be FULL_PURCHASED, FULL_PUBLIC_DOMAIN, SAMPLE or NONE. (In LITE projection.)
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String accessViewStatus;

    /**
     * The two-letter ISO_3166-1 country code for which this access information is valid. (In LITE
     * projection.)
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String country;

    /**
     * Information about a volume's download license access restrictions.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private DownloadAccessRestriction downloadAccess;

    /**
     * URL to the Google Drive viewer if this volume is uploaded by the user by selecting the file
     * from Google Drive.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String driveImportedContentLink;

    /**
     * Whether this volume can be embedded in a viewport using the Embedded Viewer API.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.Boolean embeddable;

    /**
     * Information about epub content. (In LITE projection.)
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private Epub epub;

    /**
     * Whether this volume requires that the client explicitly request offline download license rather
     * than have it done automatically when loading the content, if the client supports it.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.Boolean explicitOfflineLicenseManagement;

    /**
     * Information about pdf content. (In LITE projection.)
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private Pdf pdf;

    /**
     * Whether or not this book is public domain in the country listed above.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.Boolean publicDomain;

    /**
     * Whether quote sharing is allowed for this volume.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.Boolean quoteSharingAllowed;

    /**
     * Whether text-to-speech is permitted for this volume. Values can be ALLOWED,
     * ALLOWED_FOR_ACCESSIBILITY, or NOT_ALLOWED.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String textToSpeechPermission;

    /**
     * For ordered but not yet processed orders, we give a URL that can be used to go to the
     * appropriate Google Wallet page.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String viewOrderUrl;

    /**
     * The read access of a volume. Possible values are PARTIAL, ALL_PAGES, NO_PAGES or UNKNOWN. This
     * value depends on the country listed above. A value of PARTIAL means that the publisher has
     * allowed some portion of the volume to be viewed publicly, without purchase. This can apply to
     * eBooks as well as non-eBooks. Public domain books will always have a value of ALL_PAGES.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String viewability;

    /**
     * URL to read this volume on the Google Books site. Link will not allow users to read non-
     * viewable volumes.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String webReaderLink;

    /**
     * Combines the access and viewability of this volume into a single status field for this user.
     * Values can be FULL_PURCHASED, FULL_PUBLIC_DOMAIN, SAMPLE or NONE. (In LITE projection.)
     * @return value or {@code null} for none
     */
    public java.lang.String getAccessViewStatus() {
      return accessViewStatus;
    }

    /**
     * Combines the access and viewability of this volume into a single status field for this user.
     * Values can be FULL_PURCHASED, FULL_PUBLIC_DOMAIN, SAMPLE or NONE. (In LITE projection.)
     * @param accessViewStatus accessViewStatus or {@code null} for none
     */
    public AccessInfo setAccessViewStatus(java.lang.String accessViewStatus) {
      this.accessViewStatus = accessViewStatus;
      return this;
    }

    /**
     * The two-letter ISO_3166-1 country code for which this access information is valid. (In LITE
     * projection.)
     * @return value or {@code null} for none
     */
    public java.lang.String getCountry() {
      return country;
    }

    /**
     * The two-letter ISO_3166-1 country code for which this access information is valid. (In LITE
     * projection.)
     * @param country country or {@code null} for none
     */
    public AccessInfo setCountry(java.lang.String country) {
      this.country = country;
      return this;
    }

    /**
     * Information about a volume's download license access restrictions.
     * @return value or {@code null} for none
     */
    public DownloadAccessRestriction getDownloadAccess() {
      return downloadAccess;
    }

    /**
     * Information about a volume's download license access restrictions.
     * @param downloadAccess downloadAccess or {@code null} for none
     */
    public AccessInfo setDownloadAccess(DownloadAccessRestriction downloadAccess) {
      this.downloadAccess = downloadAccess;
      return this;
    }

    /**
     * URL to the Google Drive viewer if this volume is uploaded by the user by selecting the file
     * from Google Drive.
     * @return value or {@code null} for none
     */
    public java.lang.String getDriveImportedContentLink() {
      return driveImportedContentLink;
    }

    /**
     * URL to the Google Drive viewer if this volume is uploaded by the user by selecting the file
     * from Google Drive.
     * @param driveImportedContentLink driveImportedContentLink or {@code null} for none
     */
    public AccessInfo setDriveImportedContentLink(java.lang.String driveImportedContentLink) {
      this.driveImportedContentLink = driveImportedContentLink;
      return this;
    }

    /**
     * Whether this volume can be embedded in a viewport using the Embedded Viewer API.
     * @return value or {@code null} for none
     */
    public java.lang.Boolean getEmbeddable() {
      return embeddable;
    }

    /**
     * Whether this volume can be embedded in a viewport using the Embedded Viewer API.
     * @param embeddable embeddable or {@code null} for none
     */
    public AccessInfo setEmbeddable(java.lang.Boolean embeddable) {
      this.embeddable = embeddable;
      return this;
    }

    /**
     * Information about epub content. (In LITE projection.)
     * @return value or {@code null} for none
     */
    public Epub getEpub() {
      return epub;
    }

    /**
     * Information about epub content. (In LITE projection.)
     * @param epub epub or {@code null} for none
     */
    public AccessInfo setEpub(Epub epub) {
      this.epub = epub;
      return this;
    }

    /**
     * Whether this volume requires that the client explicitly request offline download license rather
     * than have it done automatically when loading the content, if the client supports it.
     * @return value or {@code null} for none
     */
    public java.lang.Boolean getExplicitOfflineLicenseManagement() {
      return explicitOfflineLicenseManagement;
    }

    /**
     * Whether this volume requires that the client explicitly request offline download license rather
     * than have it done automatically when loading the content, if the client supports it.
     * @param explicitOfflineLicenseManagement explicitOfflineLicenseManagement or {@code null} for none
     */
    public AccessInfo setExplicitOfflineLicenseManagement(java.lang.Boolean explicitOfflineLicenseManagement) {
      this.explicitOfflineLicenseManagement = explicitOfflineLicenseManagement;
      return this;
    }

    /**
     * Information about pdf content. (In LITE projection.)
     * @return value or {@code null} for none
     */
    public Pdf getPdf() {
      return pdf;
    }

    /**
     * Information about pdf content. (In LITE projection.)
     * @param pdf pdf or {@code null} for none
     */
    public AccessInfo setPdf(Pdf pdf) {
      this.pdf = pdf;
      return this;
    }

    /**
     * Whether or not this book is public domain in the country listed above.
     * @return value or {@code null} for none
     */
    public java.lang.Boolean getPublicDomain() {
      return publicDomain;
    }

    /**
     * Whether or not this book is public domain in the country listed above.
     * @param publicDomain publicDomain or {@code null} for none
     */
    public AccessInfo setPublicDomain(java.lang.Boolean publicDomain) {
      this.publicDomain = publicDomain;
      return this;
    }

    /**
     * Whether quote sharing is allowed for this volume.
     * @return value or {@code null} for none
     */
    public java.lang.Boolean getQuoteSharingAllowed() {
      return quoteSharingAllowed;
    }

    /**
     * Whether quote sharing is allowed for this volume.
     * @param quoteSharingAllowed quoteSharingAllowed or {@code null} for none
     */
    public AccessInfo setQuoteSharingAllowed(java.lang.Boolean quoteSharingAllowed) {
      this.quoteSharingAllowed = quoteSharingAllowed;
      return this;
    }

    /**
     * Whether text-to-speech is permitted for this volume. Values can be ALLOWED,
     * ALLOWED_FOR_ACCESSIBILITY, or NOT_ALLOWED.
     * @return value or {@code null} for none
     */
    public java.lang.String getTextToSpeechPermission() {
      return textToSpeechPermission;
    }

    /**
     * Whether text-to-speech is permitted for this volume. Values can be ALLOWED,
     * ALLOWED_FOR_ACCESSIBILITY, or NOT_ALLOWED.
     * @param textToSpeechPermission textToSpeechPermission or {@code null} for none
     */
    public AccessInfo setTextToSpeechPermission(java.lang.String textToSpeechPermission) {
      this.textToSpeechPermission = textToSpeechPermission;
      return this;
    }

    /**
     * For ordered but not yet processed orders, we give a URL that can be used to go to the
     * appropriate Google Wallet page.
     * @return value or {@code null} for none
     */
    public java.lang.String getViewOrderUrl() {
      return viewOrderUrl;
    }

    /**
     * For ordered but not yet processed orders, we give a URL that can be used to go to the
     * appropriate Google Wallet page.
     * @param viewOrderUrl viewOrderUrl or {@code null} for none
     */
    public AccessInfo setViewOrderUrl(java.lang.String viewOrderUrl) {
      this.viewOrderUrl = viewOrderUrl;
      return this;
    }

    /**
     * The read access of a volume. Possible values are PARTIAL, ALL_PAGES, NO_PAGES or UNKNOWN. This
     * value depends on the country listed above. A value of PARTIAL means that the publisher has
     * allowed some portion of the volume to be viewed publicly, without purchase. This can apply to
     * eBooks as well as non-eBooks. Public domain books will always have a value of ALL_PAGES.
     * @return value or {@code null} for none
     */
    public java.lang.String getViewability() {
      return viewability;
    }

    /**
     * The read access of a volume. Possible values are PARTIAL, ALL_PAGES, NO_PAGES or UNKNOWN. This
     * value depends on the country listed above. A value of PARTIAL means that the publisher has
     * allowed some portion of the volume to be viewed publicly, without purchase. This can apply to
     * eBooks as well as non-eBooks. Public domain books will always have a value of ALL_PAGES.
     * @param viewability viewability or {@code null} for none
     */
    public AccessInfo setViewability(java.lang.String viewability) {
      this.viewability = viewability;
      return this;
    }

    /**
     * URL to read this volume on the Google Books site. Link will not allow users to read non-
     * viewable volumes.
     * @return value or {@code null} for none
     */
    public java.lang.String getWebReaderLink() {
      return webReaderLink;
    }

    /**
     * URL to read this volume on the Google Books site. Link will not allow users to read non-
     * viewable volumes.
     * @param webReaderLink webReaderLink or {@code null} for none
     */
    public AccessInfo setWebReaderLink(java.lang.String webReaderLink) {
      this.webReaderLink = webReaderLink;
      return this;
    }

    @Override
    public AccessInfo set(String fieldName, Object value) {
      return (AccessInfo) super.set(fieldName, value);
    }

    @Override
    public AccessInfo clone() {
      return (AccessInfo) super.clone();
    }

    /**
     * Information about epub content. (In LITE projection.)
     */
    public static final class Epub extends com.google.api.client.json.GenericJson {

      /**
       * URL to retrieve ACS token for epub download. (In LITE projection.)
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.String acsTokenLink;

      /**
       * URL to download epub. (In LITE projection.)
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.String downloadLink;

      /**
       * Is a flowing text epub available either as public domain or for purchase. (In LITE projection.)
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.Boolean isAvailable;

      /**
       * URL to retrieve ACS token for epub download. (In LITE projection.)
       * @return value or {@code null} for none
       */
      public java.lang.String getAcsTokenLink() {
        return acsTokenLink;
      }

      /**
       * URL to retrieve ACS token for epub download. (In LITE projection.)
       * @param acsTokenLink acsTokenLink or {@code null} for none
       */
      public Epub setAcsTokenLink(java.lang.String acsTokenLink) {
        this.acsTokenLink = acsTokenLink;
        return this;
      }

      /**
       * URL to download epub. (In LITE projection.)
       * @return value or {@code null} for none
       */
      public java.lang.String getDownloadLink() {
        return downloadLink;
      }

      /**
       * URL to download epub. (In LITE projection.)
       * @param downloadLink downloadLink or {@code null} for none
       */
      public Epub setDownloadLink(java.lang.String downloadLink) {
        this.downloadLink = downloadLink;
        return this;
      }

      /**
       * Is a flowing text epub available either as public domain or for purchase. (In LITE projection.)
       * @return value or {@code null} for none
       */
      public java.lang.Boolean getIsAvailable() {
        return isAvailable;
      }

      /**
       * Is a flowing text epub available either as public domain or for purchase. (In LITE projection.)
       * @param isAvailable isAvailable or {@code null} for none
       */
      public Epub setIsAvailable(java.lang.Boolean isAvailable) {
        this.isAvailable = isAvailable;
        return this;
      }

      @Override
      public Epub set(String fieldName, Object value) {
        return (Epub) super.set(fieldName, value);
      }

      @Override
      public Epub clone() {
        return (Epub) super.clone();
      }

    }
    /**
     * Information about pdf content. (In LITE projection.)
     */
    public static final class Pdf extends com.google.api.client.json.GenericJson {

      /**
       * URL to retrieve ACS token for pdf download. (In LITE projection.)
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.String acsTokenLink;

      /**
       * URL to download pdf. (In LITE projection.)
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.String downloadLink;

      /**
       * Is a scanned image pdf available either as public domain or for purchase. (In LITE projection.)
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.Boolean isAvailable;

      /**
       * URL to retrieve ACS token for pdf download. (In LITE projection.)
       * @return value or {@code null} for none
       */
      public java.lang.String getAcsTokenLink() {
        return acsTokenLink;
      }

      /**
       * URL to retrieve ACS token for pdf download. (In LITE projection.)
       * @param acsTokenLink acsTokenLink or {@code null} for none
       */
      public Pdf setAcsTokenLink(java.lang.String acsTokenLink) {
        this.acsTokenLink = acsTokenLink;
        return this;
      }

      /**
       * URL to download pdf. (In LITE projection.)
       * @return value or {@code null} for none
       */
      public java.lang.String getDownloadLink() {
        return downloadLink;
      }

      /**
       * URL to download pdf. (In LITE projection.)
       * @param downloadLink downloadLink or {@code null} for none
       */
      public Pdf setDownloadLink(java.lang.String downloadLink) {
        this.downloadLink = downloadLink;
        return this;
      }

      /**
       * Is a scanned image pdf available either as public domain or for purchase. (In LITE projection.)
       * @return value or {@code null} for none
       */
      public java.lang.Boolean getIsAvailable() {
        return isAvailable;
      }

      /**
       * Is a scanned image pdf available either as public domain or for purchase. (In LITE projection.)
       * @param isAvailable isAvailable or {@code null} for none
       */
      public Pdf setIsAvailable(java.lang.Boolean isAvailable) {
        this.isAvailable = isAvailable;
        return this;
      }

      @Override
      public Pdf set(String fieldName, Object value) {
        return (Pdf) super.set(fieldName, value);
      }

      @Override
      public Pdf clone() {
        return (Pdf) super.clone();
      }

    }
  }

  /**
   * What layers exist in this volume and high level information about them.
   */
  public static final class LayerInfo extends com.google.api.client.json.GenericJson {

    /**
     * A layer should appear here if and only if the layer exists for this book.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.util.List<Layers> layers;

    static {
      // hack to force ProGuard to consider Layers used, since otherwise it would be stripped out
      // see https://github.com/google/google-api-java-client/issues/543
      com.google.api.client.util.Data.nullOf(Layers.class);
    }

    /**
     * A layer should appear here if and only if the layer exists for this book.
     * @return value or {@code null} for none
     */
    public java.util.List<Layers> getLayers() {
      return layers;
    }

    /**
     * A layer should appear here if and only if the layer exists for this book.
     * @param layers layers or {@code null} for none
     */
    public LayerInfo setLayers(java.util.List<Layers> layers) {
      this.layers = layers;
      return this;
    }

    @Override
    public LayerInfo set(String fieldName, Object value) {
      return (LayerInfo) super.set(fieldName, value);
    }

    @Override
    public LayerInfo clone() {
      return (LayerInfo) super.clone();
    }

    /**
     * Model definition for VolumeLayerInfoLayers.
     */
    public static final class Layers extends com.google.api.client.json.GenericJson {

      /**
       * The layer id of this layer (e.g. "geo").
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.String layerId;

      /**
       * The current version of this layer's volume annotations. Note that this version applies only to
       * the data in the books.layers.volumeAnnotations.* responses. The actual annotation data is
       * versioned separately.
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.String volumeAnnotationsVersion;

      /**
       * The layer id of this layer (e.g. "geo").
       * @return value or {@code null} for none
       */
      public java.lang.String getLayerId() {
        return layerId;
      }

      /**
       * The layer id of this layer (e.g. "geo").
       * @param layerId layerId or {@code null} for none
       */
      public Layers setLayerId(java.lang.String layerId) {
        this.layerId = layerId;
        return this;
      }

      /**
       * The current version of this layer's volume annotations. Note that this version applies only to
       * the data in the books.layers.volumeAnnotations.* responses. The actual annotation data is
       * versioned separately.
       * @return value or {@code null} for none
       */
      public java.lang.String getVolumeAnnotationsVersion() {
        return volumeAnnotationsVersion;
      }

      /**
       * The current version of this layer's volume annotations. Note that this version applies only to
       * the data in the books.layers.volumeAnnotations.* responses. The actual annotation data is
       * versioned separately.
       * @param volumeAnnotationsVersion volumeAnnotationsVersion or {@code null} for none
       */
      public Layers setVolumeAnnotationsVersion(java.lang.String volumeAnnotationsVersion) {
        this.volumeAnnotationsVersion = volumeAnnotationsVersion;
        return this;
      }

      @Override
      public Layers set(String fieldName, Object value) {
        return (Layers) super.set(fieldName, value);
      }

      @Override
      public Layers clone() {
        return (Layers) super.clone();
      }

    }
  }

  /**
   * Recommendation related information for this volume.
   */
  public static final class RecommendedInfo extends com.google.api.client.json.GenericJson {

    /**
     * A text explaining why this volume is recommended.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String explanation;

    /**
     * A text explaining why this volume is recommended.
     * @return value or {@code null} for none
     */
    public java.lang.String getExplanation() {
      return explanation;
    }

    /**
     * A text explaining why this volume is recommended.
     * @param explanation explanation or {@code null} for none
     */
    public RecommendedInfo setExplanation(java.lang.String explanation) {
      this.explanation = explanation;
      return this;
    }

    @Override
    public RecommendedInfo set(String fieldName, Object value) {
      return (RecommendedInfo) super.set(fieldName, value);
    }

    @Override
    public RecommendedInfo clone() {
      return (RecommendedInfo) super.clone();
    }

  }

  /**
   * Any information about a volume related to the eBookstore and/or purchaseability. This information
   * can depend on the country where the request originates from (i.e. books may not be for sale in
   * certain countries).
   */
  public static final class SaleInfo extends com.google.api.client.json.GenericJson {

    /**
     * URL to purchase this volume on the Google Books site. (In LITE projection)
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String buyLink;

    /**
     * The two-letter ISO_3166-1 country code for which this sale information is valid. (In LITE
     * projection.)
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String country;

    /**
     * Whether or not this volume is an eBook (can be added to the My eBooks shelf).
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.Boolean isEbook;

    /**
     * Suggested retail price. (In LITE projection.)
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private ListPrice listPrice;

    /**
     * Offers available for this volume (sales and rentals).
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.util.List<Offers> offers;

    static {
      // hack to force ProGuard to consider Offers used, since otherwise it would be stripped out
      // see https://github.com/google/google-api-java-client/issues/543
      com.google.api.client.util.Data.nullOf(Offers.class);
    }

    /**
     * The date on which this book is available for sale.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String onSaleDate;

    /**
     * The actual selling price of the book. This is the same as the suggested retail or list price
     * unless there are offers or discounts on this volume. (In LITE projection.)
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private RetailPrice retailPrice;

    /**
     * Whether or not this book is available for sale or offered for free in the Google eBookstore for
     * the country listed above. Possible values are FOR_SALE, FOR_RENTAL_ONLY, FOR_SALE_AND_RENTAL,
     * FREE, NOT_FOR_SALE, or FOR_PREORDER.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String saleability;

    /**
     * URL to purchase this volume on the Google Books site. (In LITE projection)
     * @return value or {@code null} for none
     */
    public java.lang.String getBuyLink() {
      return buyLink;
    }

    /**
     * URL to purchase this volume on the Google Books site. (In LITE projection)
     * @param buyLink buyLink or {@code null} for none
     */
    public SaleInfo setBuyLink(java.lang.String buyLink) {
      this.buyLink = buyLink;
      return this;
    }

    /**
     * The two-letter ISO_3166-1 country code for which this sale information is valid. (In LITE
     * projection.)
     * @return value or {@code null} for none
     */
    public java.lang.String getCountry() {
      return country;
    }

    /**
     * The two-letter ISO_3166-1 country code for which this sale information is valid. (In LITE
     * projection.)
     * @param country country or {@code null} for none
     */
    public SaleInfo setCountry(java.lang.String country) {
      this.country = country;
      return this;
    }

    /**
     * Whether or not this volume is an eBook (can be added to the My eBooks shelf).
     * @return value or {@code null} for none
     */
    public java.lang.Boolean getIsEbook() {
      return isEbook;
    }

    /**
     * Whether or not this volume is an eBook (can be added to the My eBooks shelf).
     * @param isEbook isEbook or {@code null} for none
     */
    public SaleInfo setIsEbook(java.lang.Boolean isEbook) {
      this.isEbook = isEbook;
      return this;
    }

    /**
     * Suggested retail price. (In LITE projection.)
     * @return value or {@code null} for none
     */
    public ListPrice getListPrice() {
      return listPrice;
    }

    /**
     * Suggested retail price. (In LITE projection.)
     * @param listPrice listPrice or {@code null} for none
     */
    public SaleInfo setListPrice(ListPrice listPrice) {
      this.listPrice = listPrice;
      return this;
    }

    /**
     * Offers available for this volume (sales and rentals).
     * @return value or {@code null} for none
     */
    public java.util.List<Offers> getOffers() {
      return offers;
    }

    /**
     * Offers available for this volume (sales and rentals).
     * @param offers offers or {@code null} for none
     */
    public SaleInfo setOffers(java.util.List<Offers> offers) {
      this.offers = offers;
      return this;
    }

    /**
     * The date on which this book is available for sale.
     * @return value or {@code null} for none
     */
    public java.lang.String getOnSaleDate() {
      return onSaleDate;
    }

    /**
     * The date on which this book is available for sale.
     * @param onSaleDate onSaleDate or {@code null} for none
     */
    public SaleInfo setOnSaleDate(java.lang.String onSaleDate) {
      this.onSaleDate = onSaleDate;
      return this;
    }

    /**
     * The actual selling price of the book. This is the same as the suggested retail or list price
     * unless there are offers or discounts on this volume. (In LITE projection.)
     * @return value or {@code null} for none
     */
    public RetailPrice getRetailPrice() {
      return retailPrice;
    }

    /**
     * The actual selling price of the book. This is the same as the suggested retail or list price
     * unless there are offers or discounts on this volume. (In LITE projection.)
     * @param retailPrice retailPrice or {@code null} for none
     */
    public SaleInfo setRetailPrice(RetailPrice retailPrice) {
      this.retailPrice = retailPrice;
      return this;
    }

    /**
     * Whether or not this book is available for sale or offered for free in the Google eBookstore for
     * the country listed above. Possible values are FOR_SALE, FOR_RENTAL_ONLY, FOR_SALE_AND_RENTAL,
     * FREE, NOT_FOR_SALE, or FOR_PREORDER.
     * @return value or {@code null} for none
     */
    public java.lang.String getSaleability() {
      return saleability;
    }

    /**
     * Whether or not this book is available for sale or offered for free in the Google eBookstore for
     * the country listed above. Possible values are FOR_SALE, FOR_RENTAL_ONLY, FOR_SALE_AND_RENTAL,
     * FREE, NOT_FOR_SALE, or FOR_PREORDER.
     * @param saleability saleability or {@code null} for none
     */
    public SaleInfo setSaleability(java.lang.String saleability) {
      this.saleability = saleability;
      return this;
    }

    @Override
    public SaleInfo set(String fieldName, Object value) {
      return (SaleInfo) super.set(fieldName, value);
    }

    @Override
    public SaleInfo clone() {
      return (SaleInfo) super.clone();
    }

    /**
     * Suggested retail price. (In LITE projection.)
     */
    public static final class ListPrice extends com.google.api.client.json.GenericJson {

      /**
       * Amount in the currency listed below. (In LITE projection.)
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.Double amount;

      /**
       * An ISO 4217, three-letter currency code. (In LITE projection.)
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.String currencyCode;

      /**
       * Amount in the currency listed below. (In LITE projection.)
       * @return value or {@code null} for none
       */
      public java.lang.Double getAmount() {
        return amount;
      }

      /**
       * Amount in the currency listed below. (In LITE projection.)
       * @param amount amount or {@code null} for none
       */
      public ListPrice setAmount(java.lang.Double amount) {
        this.amount = amount;
        return this;
      }

      /**
       * An ISO 4217, three-letter currency code. (In LITE projection.)
       * @return value or {@code null} for none
       */
      public java.lang.String getCurrencyCode() {
        return currencyCode;
      }

      /**
       * An ISO 4217, three-letter currency code. (In LITE projection.)
       * @param currencyCode currencyCode or {@code null} for none
       */
      public ListPrice setCurrencyCode(java.lang.String currencyCode) {
        this.currencyCode = currencyCode;
        return this;
      }

      @Override
      public ListPrice set(String fieldName, Object value) {
        return (ListPrice) super.set(fieldName, value);
      }

      @Override
      public ListPrice clone() {
        return (ListPrice) super.clone();
      }

    }
    /**
     * Model definition for VolumeSaleInfoOffers.
     */
    public static final class Offers extends com.google.api.client.json.GenericJson {

      /**
       * The finsky offer type (e.g., PURCHASE=0 RENTAL=3)
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.Integer finskyOfferType;

      /**
       * Indicates whether the offer is giftable.
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.Boolean giftable;

      /**
       * Offer list (=undiscounted) price in Micros.
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private ListPrice listPrice;

      /**
       * The rental duration (for rental offers only).
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private RentalDuration rentalDuration;

      /**
       * Offer retail (=discounted) price in Micros
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private RetailPrice retailPrice;

      /**
       * The finsky offer type (e.g., PURCHASE=0 RENTAL=3)
       * @return value or {@code null} for none
       */
      public java.lang.Integer getFinskyOfferType() {
        return finskyOfferType;
      }

      /**
       * The finsky offer type (e.g., PURCHASE=0 RENTAL=3)
       * @param finskyOfferType finskyOfferType or {@code null} for none
       */
      public Offers setFinskyOfferType(java.lang.Integer finskyOfferType) {
        this.finskyOfferType = finskyOfferType;
        return this;
      }

      /**
       * Indicates whether the offer is giftable.
       * @return value or {@code null} for none
       */
      public java.lang.Boolean getGiftable() {
        return giftable;
      }

      /**
       * Indicates whether the offer is giftable.
       * @param giftable giftable or {@code null} for none
       */
      public Offers setGiftable(java.lang.Boolean giftable) {
        this.giftable = giftable;
        return this;
      }

      /**
       * Offer list (=undiscounted) price in Micros.
       * @return value or {@code null} for none
       */
      public ListPrice getListPrice() {
        return listPrice;
      }

      /**
       * Offer list (=undiscounted) price in Micros.
       * @param listPrice listPrice or {@code null} for none
       */
      public Offers setListPrice(ListPrice listPrice) {
        this.listPrice = listPrice;
        return this;
      }

      /**
       * The rental duration (for rental offers only).
       * @return value or {@code null} for none
       */
      public RentalDuration getRentalDuration() {
        return rentalDuration;
      }

      /**
       * The rental duration (for rental offers only).
       * @param rentalDuration rentalDuration or {@code null} for none
       */
      public Offers setRentalDuration(RentalDuration rentalDuration) {
        this.rentalDuration = rentalDuration;
        return this;
      }

      /**
       * Offer retail (=discounted) price in Micros
       * @return value or {@code null} for none
       */
      public RetailPrice getRetailPrice() {
        return retailPrice;
      }

      /**
       * Offer retail (=discounted) price in Micros
       * @param retailPrice retailPrice or {@code null} for none
       */
      public Offers setRetailPrice(RetailPrice retailPrice) {
        this.retailPrice = retailPrice;
        return this;
      }

      @Override
      public Offers set(String fieldName, Object value) {
        return (Offers) super.set(fieldName, value);
      }

      @Override
      public Offers clone() {
        return (Offers) super.clone();
      }

      /**
       * Offer list (=undiscounted) price in Micros.
       */
      public static final class ListPrice extends com.google.api.client.json.GenericJson {

        /**
         * The value may be {@code null}.
         */
        @com.google.api.client.util.Key
        private java.lang.Double amountInMicros;

        /**
         * The value may be {@code null}.
         */
        @com.google.api.client.util.Key
        private java.lang.String currencyCode;

        /**
         * @return value or {@code null} for none
         */
        public java.lang.Double getAmountInMicros() {
          return amountInMicros;
        }

        /**
         * @param amountInMicros amountInMicros or {@code null} for none
         */
        public ListPrice setAmountInMicros(java.lang.Double amountInMicros) {
          this.amountInMicros = amountInMicros;
          return this;
        }

        /**
         * @return value or {@code null} for none
         */
        public java.lang.String getCurrencyCode() {
          return currencyCode;
        }

        /**
         * @param currencyCode currencyCode or {@code null} for none
         */
        public ListPrice setCurrencyCode(java.lang.String currencyCode) {
          this.currencyCode = currencyCode;
          return this;
        }

        @Override
        public ListPrice set(String fieldName, Object value) {
          return (ListPrice) super.set(fieldName, value);
        }

        @Override
        public ListPrice clone() {
          return (ListPrice) super.clone();
        }

      }
      /**
       * The rental duration (for rental offers only).
       */
      public static final class RentalDuration extends com.google.api.client.json.GenericJson {

        /**
         * The value may be {@code null}.
         */
        @com.google.api.client.util.Key
        private java.lang.Double count;

        /**
         * The value may be {@code null}.
         */
        @com.google.api.client.util.Key
        private java.lang.String unit;

        /**
         * @return value or {@code null} for none
         */
        public java.lang.Double getCount() {
          return count;
        }

        /**
         * @param count count or {@code null} for none
         */
        public RentalDuration setCount(java.lang.Double count) {
          this.count = count;
          return this;
        }

        /**
         * @return value or {@code null} for none
         */
        public java.lang.String getUnit() {
          return unit;
        }

        /**
         * @param unit unit or {@code null} for none
         */
        public RentalDuration setUnit(java.lang.String unit) {
          this.unit = unit;
          return this;
        }

        @Override
        public RentalDuration set(String fieldName, Object value) {
          return (RentalDuration) super.set(fieldName, value);
        }

        @Override
        public RentalDuration clone() {
          return (RentalDuration) super.clone();
        }

      }
      /**
       * Offer retail (=discounted) price in Micros
       */
      public static final class RetailPrice extends com.google.api.client.json.GenericJson {

        /**
         * The value may be {@code null}.
         */
        @com.google.api.client.util.Key
        private java.lang.Double amountInMicros;

        /**
         * The value may be {@code null}.
         */
        @com.google.api.client.util.Key
        private java.lang.String currencyCode;

        /**
         * @return value or {@code null} for none
         */
        public java.lang.Double getAmountInMicros() {
          return amountInMicros;
        }

        /**
         * @param amountInMicros amountInMicros or {@code null} for none
         */
        public RetailPrice setAmountInMicros(java.lang.Double amountInMicros) {
          this.amountInMicros = amountInMicros;
          return this;
        }

        /**
         * @return value or {@code null} for none
         */
        public java.lang.String getCurrencyCode() {
          return currencyCode;
        }

        /**
         * @param currencyCode currencyCode or {@code null} for none
         */
        public RetailPrice setCurrencyCode(java.lang.String currencyCode) {
          this.currencyCode = currencyCode;
          return this;
        }

        @Override
        public RetailPrice set(String fieldName, Object value) {
          return (RetailPrice) super.set(fieldName, value);
        }

        @Override
        public RetailPrice clone() {
          return (RetailPrice) super.clone();
        }

      }
    }
    /**
     * The actual selling price of the book. This is the same as the suggested retail or list price
     * unless there are offers or discounts on this volume. (In LITE projection.)
     */
    public static final class RetailPrice extends com.google.api.client.json.GenericJson {

      /**
       * Amount in the currency listed below. (In LITE projection.)
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.Double amount;

      /**
       * An ISO 4217, three-letter currency code. (In LITE projection.)
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.String currencyCode;

      /**
       * Amount in the currency listed below. (In LITE projection.)
       * @return value or {@code null} for none
       */
      public java.lang.Double getAmount() {
        return amount;
      }

      /**
       * Amount in the currency listed below. (In LITE projection.)
       * @param amount amount or {@code null} for none
       */
      public RetailPrice setAmount(java.lang.Double amount) {
        this.amount = amount;
        return this;
      }

      /**
       * An ISO 4217, three-letter currency code. (In LITE projection.)
       * @return value or {@code null} for none
       */
      public java.lang.String getCurrencyCode() {
        return currencyCode;
      }

      /**
       * An ISO 4217, three-letter currency code. (In LITE projection.)
       * @param currencyCode currencyCode or {@code null} for none
       */
      public RetailPrice setCurrencyCode(java.lang.String currencyCode) {
        this.currencyCode = currencyCode;
        return this;
      }

      @Override
      public RetailPrice set(String fieldName, Object value) {
        return (RetailPrice) super.set(fieldName, value);
      }

      @Override
      public RetailPrice clone() {
        return (RetailPrice) super.clone();
      }

    }
  }

  /**
   * Search result information related to this volume.
   */
  public static final class SearchInfo extends com.google.api.client.json.GenericJson {

    /**
     * A text snippet containing the search query.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String textSnippet;

    /**
     * A text snippet containing the search query.
     * @return value or {@code null} for none
     */
    public java.lang.String getTextSnippet() {
      return textSnippet;
    }

    /**
     * A text snippet containing the search query.
     * @param textSnippet textSnippet or {@code null} for none
     */
    public SearchInfo setTextSnippet(java.lang.String textSnippet) {
      this.textSnippet = textSnippet;
      return this;
    }

    @Override
    public SearchInfo set(String fieldName, Object value) {
      return (SearchInfo) super.set(fieldName, value);
    }

    @Override
    public SearchInfo clone() {
      return (SearchInfo) super.clone();
    }

  }

  /**
   * User specific information related to this volume. (e.g. page this user last read or whether they
   * purchased this book)
   */
  public static final class UserInfo extends com.google.api.client.json.GenericJson {

    /**
     * Timestamp when this volume was acquired by the user. (RFC 3339 UTC date-time format) Acquiring
     * includes purchase, user upload, receiving family sharing, etc.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String acquiredTime;

    /**
     * How this volume was acquired.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.Integer acquisitionType;

    /**
     * Copy/Paste accounting information.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private Copy copy;

    /**
     * Whether this volume is purchased, sample, pd download etc.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.Integer entitlementType;

    /**
     * Information on the ability to share with the family.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private FamilySharing familySharing;

    /**
     * Whether or not the user shared this volume with the family.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.Boolean isFamilySharedFromUser;

    /**
     * Whether or not the user received this volume through family sharing.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.Boolean isFamilySharedToUser;

    /**
     * Deprecated: Replaced by familySharing.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.Boolean isFamilySharingAllowed;

    /**
     * Deprecated: Replaced by familySharing.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.Boolean isFamilySharingDisabledByFop;

    /**
     * Whether or not this volume is currently in "my books."
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.Boolean isInMyBooks;

    /**
     * Whether or not this volume was pre-ordered by the authenticated user making the request. (In
     * LITE projection.)
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.Boolean isPreordered;

    /**
     * Whether or not this volume was purchased by the authenticated user making the request. (In LITE
     * projection.)
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.Boolean isPurchased;

    /**
     * Whether or not this volume was user uploaded.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.Boolean isUploaded;

    /**
     * The user's current reading position in the volume, if one is available. (In LITE projection.)
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private ReadingPosition readingPosition;

    /**
     * Period during this book is/was a valid rental.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private RentalPeriod rentalPeriod;

    /**
     * Whether this book is an active or an expired rental.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String rentalState;

    /**
     * This user's review of this volume, if one exists.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private Review review;

    /**
     * Timestamp when this volume was last modified by a user action, such as a reading position
     * update, volume purchase or writing a review. (RFC 3339 UTC date-time format).
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String updated;

    /**
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private UserUploadedVolumeInfo userUploadedVolumeInfo;

    /**
     * Timestamp when this volume was acquired by the user. (RFC 3339 UTC date-time format) Acquiring
     * includes purchase, user upload, receiving family sharing, etc.
     * @return value or {@code null} for none
     */
    public java.lang.String getAcquiredTime() {
      return acquiredTime;
    }

    /**
     * Timestamp when this volume was acquired by the user. (RFC 3339 UTC date-time format) Acquiring
     * includes purchase, user upload, receiving family sharing, etc.
     * @param acquiredTime acquiredTime or {@code null} for none
     */
    public UserInfo setAcquiredTime(java.lang.String acquiredTime) {
      this.acquiredTime = acquiredTime;
      return this;
    }

    /**
     * How this volume was acquired.
     * @return value or {@code null} for none
     */
    public java.lang.Integer getAcquisitionType() {
      return acquisitionType;
    }

    /**
     * How this volume was acquired.
     * @param acquisitionType acquisitionType or {@code null} for none
     */
    public UserInfo setAcquisitionType(java.lang.Integer acquisitionType) {
      this.acquisitionType = acquisitionType;
      return this;
    }

    /**
     * Copy/Paste accounting information.
     * @return value or {@code null} for none
     */
    public Copy getCopy() {
      return copy;
    }

    /**
     * Copy/Paste accounting information.
     * @param copy copy or {@code null} for none
     */
    public UserInfo setCopy(Copy copy) {
      this.copy = copy;
      return this;
    }

    /**
     * Whether this volume is purchased, sample, pd download etc.
     * @return value or {@code null} for none
     */
    public java.lang.Integer getEntitlementType() {
      return entitlementType;
    }

    /**
     * Whether this volume is purchased, sample, pd download etc.
     * @param entitlementType entitlementType or {@code null} for none
     */
    public UserInfo setEntitlementType(java.lang.Integer entitlementType) {
      this.entitlementType = entitlementType;
      return this;
    }

    /**
     * Information on the ability to share with the family.
     * @return value or {@code null} for none
     */
    public FamilySharing getFamilySharing() {
      return familySharing;
    }

    /**
     * Information on the ability to share with the family.
     * @param familySharing familySharing or {@code null} for none
     */
    public UserInfo setFamilySharing(FamilySharing familySharing) {
      this.familySharing = familySharing;
      return this;
    }

    /**
     * Whether or not the user shared this volume with the family.
     * @return value or {@code null} for none
     */
    public java.lang.Boolean getIsFamilySharedFromUser() {
      return isFamilySharedFromUser;
    }

    /**
     * Whether or not the user shared this volume with the family.
     * @param isFamilySharedFromUser isFamilySharedFromUser or {@code null} for none
     */
    public UserInfo setIsFamilySharedFromUser(java.lang.Boolean isFamilySharedFromUser) {
      this.isFamilySharedFromUser = isFamilySharedFromUser;
      return this;
    }

    /**
     * Whether or not the user received this volume through family sharing.
     * @return value or {@code null} for none
     */
    public java.lang.Boolean getIsFamilySharedToUser() {
      return isFamilySharedToUser;
    }

    /**
     * Whether or not the user received this volume through family sharing.
     * @param isFamilySharedToUser isFamilySharedToUser or {@code null} for none
     */
    public UserInfo setIsFamilySharedToUser(java.lang.Boolean isFamilySharedToUser) {
      this.isFamilySharedToUser = isFamilySharedToUser;
      return this;
    }

    /**
     * Deprecated: Replaced by familySharing.
     * @return value or {@code null} for none
     */
    public java.lang.Boolean getIsFamilySharingAllowed() {
      return isFamilySharingAllowed;
    }

    /**
     * Deprecated: Replaced by familySharing.
     * @param isFamilySharingAllowed isFamilySharingAllowed or {@code null} for none
     */
    public UserInfo setIsFamilySharingAllowed(java.lang.Boolean isFamilySharingAllowed) {
      this.isFamilySharingAllowed = isFamilySharingAllowed;
      return this;
    }

    /**
     * Deprecated: Replaced by familySharing.
     * @return value or {@code null} for none
     */
    public java.lang.Boolean getIsFamilySharingDisabledByFop() {
      return isFamilySharingDisabledByFop;
    }

    /**
     * Deprecated: Replaced by familySharing.
     * @param isFamilySharingDisabledByFop isFamilySharingDisabledByFop or {@code null} for none
     */
    public UserInfo setIsFamilySharingDisabledByFop(java.lang.Boolean isFamilySharingDisabledByFop) {
      this.isFamilySharingDisabledByFop = isFamilySharingDisabledByFop;
      return this;
    }

    /**
     * Whether or not this volume is currently in "my books."
     * @return value or {@code null} for none
     */
    public java.lang.Boolean getIsInMyBooks() {
      return isInMyBooks;
    }

    /**
     * Whether or not this volume is currently in "my books."
     * @param isInMyBooks isInMyBooks or {@code null} for none
     */
    public UserInfo setIsInMyBooks(java.lang.Boolean isInMyBooks) {
      this.isInMyBooks = isInMyBooks;
      return this;
    }

    /**
     * Whether or not this volume was pre-ordered by the authenticated user making the request. (In
     * LITE projection.)
     * @return value or {@code null} for none
     */
    public java.lang.Boolean getIsPreordered() {
      return isPreordered;
    }

    /**
     * Whether or not this volume was pre-ordered by the authenticated user making the request. (In
     * LITE projection.)
     * @param isPreordered isPreordered or {@code null} for none
     */
    public UserInfo setIsPreordered(java.lang.Boolean isPreordered) {
      this.isPreordered = isPreordered;
      return this;
    }

    /**
     * Whether or not this volume was purchased by the authenticated user making the request. (In LITE
     * projection.)
     * @return value or {@code null} for none
     */
    public java.lang.Boolean getIsPurchased() {
      return isPurchased;
    }

    /**
     * Whether or not this volume was purchased by the authenticated user making the request. (In LITE
     * projection.)
     * @param isPurchased isPurchased or {@code null} for none
     */
    public UserInfo setIsPurchased(java.lang.Boolean isPurchased) {
      this.isPurchased = isPurchased;
      return this;
    }

    /**
     * Whether or not this volume was user uploaded.
     * @return value or {@code null} for none
     */
    public java.lang.Boolean getIsUploaded() {
      return isUploaded;
    }

    /**
     * Whether or not this volume was user uploaded.
     * @param isUploaded isUploaded or {@code null} for none
     */
    public UserInfo setIsUploaded(java.lang.Boolean isUploaded) {
      this.isUploaded = isUploaded;
      return this;
    }

    /**
     * The user's current reading position in the volume, if one is available. (In LITE projection.)
     * @return value or {@code null} for none
     */
    public ReadingPosition getReadingPosition() {
      return readingPosition;
    }

    /**
     * The user's current reading position in the volume, if one is available. (In LITE projection.)
     * @param readingPosition readingPosition or {@code null} for none
     */
    public UserInfo setReadingPosition(ReadingPosition readingPosition) {
      this.readingPosition = readingPosition;
      return this;
    }

    /**
     * Period during this book is/was a valid rental.
     * @return value or {@code null} for none
     */
    public RentalPeriod getRentalPeriod() {
      return rentalPeriod;
    }

    /**
     * Period during this book is/was a valid rental.
     * @param rentalPeriod rentalPeriod or {@code null} for none
     */
    public UserInfo setRentalPeriod(RentalPeriod rentalPeriod) {
      this.rentalPeriod = rentalPeriod;
      return this;
    }

    /**
     * Whether this book is an active or an expired rental.
     * @return value or {@code null} for none
     */
    public java.lang.String getRentalState() {
      return rentalState;
    }

    /**
     * Whether this book is an active or an expired rental.
     * @param rentalState rentalState or {@code null} for none
     */
    public UserInfo setRentalState(java.lang.String rentalState) {
      this.rentalState = rentalState;
      return this;
    }

    /**
     * This user's review of this volume, if one exists.
     * @return value or {@code null} for none
     */
    public Review getReview() {
      return review;
    }

    /**
     * This user's review of this volume, if one exists.
     * @param review review or {@code null} for none
     */
    public UserInfo setReview(Review review) {
      this.review = review;
      return this;
    }

    /**
     * Timestamp when this volume was last modified by a user action, such as a reading position
     * update, volume purchase or writing a review. (RFC 3339 UTC date-time format).
     * @return value or {@code null} for none
     */
    public java.lang.String getUpdated() {
      return updated;
    }

    /**
     * Timestamp when this volume was last modified by a user action, such as a reading position
     * update, volume purchase or writing a review. (RFC 3339 UTC date-time format).
     * @param updated updated or {@code null} for none
     */
    public UserInfo setUpdated(java.lang.String updated) {
      this.updated = updated;
      return this;
    }

    /**
     * @return value or {@code null} for none
     */
    public UserUploadedVolumeInfo getUserUploadedVolumeInfo() {
      return userUploadedVolumeInfo;
    }

    /**
     * @param userUploadedVolumeInfo userUploadedVolumeInfo or {@code null} for none
     */
    public UserInfo setUserUploadedVolumeInfo(UserUploadedVolumeInfo userUploadedVolumeInfo) {
      this.userUploadedVolumeInfo = userUploadedVolumeInfo;
      return this;
    }

    @Override
    public UserInfo set(String fieldName, Object value) {
      return (UserInfo) super.set(fieldName, value);
    }

    @Override
    public UserInfo clone() {
      return (UserInfo) super.clone();
    }

    /**
     * Copy/Paste accounting information.
     */
    public static final class Copy extends com.google.api.client.json.GenericJson {

      /**
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.Integer allowedCharacterCount;

      /**
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.String limitType;

      /**
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.Integer remainingCharacterCount;

      /**
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.String updated;

      /**
       * @return value or {@code null} for none
       */
      public java.lang.Integer getAllowedCharacterCount() {
        return allowedCharacterCount;
      }

      /**
       * @param allowedCharacterCount allowedCharacterCount or {@code null} for none
       */
      public Copy setAllowedCharacterCount(java.lang.Integer allowedCharacterCount) {
        this.allowedCharacterCount = allowedCharacterCount;
        return this;
      }

      /**
       * @return value or {@code null} for none
       */
      public java.lang.String getLimitType() {
        return limitType;
      }

      /**
       * @param limitType limitType or {@code null} for none
       */
      public Copy setLimitType(java.lang.String limitType) {
        this.limitType = limitType;
        return this;
      }

      /**
       * @return value or {@code null} for none
       */
      public java.lang.Integer getRemainingCharacterCount() {
        return remainingCharacterCount;
      }

      /**
       * @param remainingCharacterCount remainingCharacterCount or {@code null} for none
       */
      public Copy setRemainingCharacterCount(java.lang.Integer remainingCharacterCount) {
        this.remainingCharacterCount = remainingCharacterCount;
        return this;
      }

      /**
       * @return value or {@code null} for none
       */
      public java.lang.String getUpdated() {
        return updated;
      }

      /**
       * @param updated updated or {@code null} for none
       */
      public Copy setUpdated(java.lang.String updated) {
        this.updated = updated;
        return this;
      }

      @Override
      public Copy set(String fieldName, Object value) {
        return (Copy) super.set(fieldName, value);
      }

      @Override
      public Copy clone() {
        return (Copy) super.clone();
      }

    }
    /**
     * Information on the ability to share with the family.
     */
    public static final class FamilySharing extends com.google.api.client.json.GenericJson {

      /**
       * The role of the user in the family.
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.String familyRole;

      /**
       * Whether or not this volume can be shared with the family by the user. This includes sharing
       * eligibility of both the volume and the user. If the value is true, the user can initiate a
       * family sharing action.
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.Boolean isSharingAllowed;

      /**
       * Whether or not sharing this volume is temporarily disabled due to issues with the Family
       * Wallet.
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.Boolean isSharingDisabledByFop;

      /**
       * The role of the user in the family.
       * @return value or {@code null} for none
       */
      public java.lang.String getFamilyRole() {
        return familyRole;
      }

      /**
       * The role of the user in the family.
       * @param familyRole familyRole or {@code null} for none
       */
      public FamilySharing setFamilyRole(java.lang.String familyRole) {
        this.familyRole = familyRole;
        return this;
      }

      /**
       * Whether or not this volume can be shared with the family by the user. This includes sharing
       * eligibility of both the volume and the user. If the value is true, the user can initiate a
       * family sharing action.
       * @return value or {@code null} for none
       */
      public java.lang.Boolean getIsSharingAllowed() {
        return isSharingAllowed;
      }

      /**
       * Whether or not this volume can be shared with the family by the user. This includes sharing
       * eligibility of both the volume and the user. If the value is true, the user can initiate a
       * family sharing action.
       * @param isSharingAllowed isSharingAllowed or {@code null} for none
       */
      public FamilySharing setIsSharingAllowed(java.lang.Boolean isSharingAllowed) {
        this.isSharingAllowed = isSharingAllowed;
        return this;
      }

      /**
       * Whether or not sharing this volume is temporarily disabled due to issues with the Family
       * Wallet.
       * @return value or {@code null} for none
       */
      public java.lang.Boolean getIsSharingDisabledByFop() {
        return isSharingDisabledByFop;
      }

      /**
       * Whether or not sharing this volume is temporarily disabled due to issues with the Family
       * Wallet.
       * @param isSharingDisabledByFop isSharingDisabledByFop or {@code null} for none
       */
      public FamilySharing setIsSharingDisabledByFop(java.lang.Boolean isSharingDisabledByFop) {
        this.isSharingDisabledByFop = isSharingDisabledByFop;
        return this;
      }

      @Override
      public FamilySharing set(String fieldName, Object value) {
        return (FamilySharing) super.set(fieldName, value);
      }

      @Override
      public FamilySharing clone() {
        return (FamilySharing) super.clone();
      }

    }
    /**
     * Period during this book is/was a valid rental.
     */
    public static final class RentalPeriod extends com.google.api.client.json.GenericJson {

      /**
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key @com.google.api.client.json.JsonString
      private java.lang.Long endUtcSec;

      /**
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key @com.google.api.client.json.JsonString
      private java.lang.Long startUtcSec;

      /**
       * @return value or {@code null} for none
       */
      public java.lang.Long getEndUtcSec() {
        return endUtcSec;
      }

      /**
       * @param endUtcSec endUtcSec or {@code null} for none
       */
      public RentalPeriod setEndUtcSec(java.lang.Long endUtcSec) {
        this.endUtcSec = endUtcSec;
        return this;
      }

      /**
       * @return value or {@code null} for none
       */
      public java.lang.Long getStartUtcSec() {
        return startUtcSec;
      }

      /**
       * @param startUtcSec startUtcSec or {@code null} for none
       */
      public RentalPeriod setStartUtcSec(java.lang.Long startUtcSec) {
        this.startUtcSec = startUtcSec;
        return this;
      }

      @Override
      public RentalPeriod set(String fieldName, Object value) {
        return (RentalPeriod) super.set(fieldName, value);
      }

      @Override
      public RentalPeriod clone() {
        return (RentalPeriod) super.clone();
      }

    }
    /**
     * Model definition for VolumeUserInfoUserUploadedVolumeInfo.
     */
    public static final class UserUploadedVolumeInfo extends com.google.api.client.json.GenericJson {

      /**
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.String processingState;

      /**
       * @return value or {@code null} for none
       */
      public java.lang.String getProcessingState() {
        return processingState;
      }

      /**
       * @param processingState processingState or {@code null} for none
       */
      public UserUploadedVolumeInfo setProcessingState(java.lang.String processingState) {
        this.processingState = processingState;
        return this;
      }

      @Override
      public UserUploadedVolumeInfo set(String fieldName, Object value) {
        return (UserUploadedVolumeInfo) super.set(fieldName, value);
      }

      @Override
      public UserUploadedVolumeInfo clone() {
        return (UserUploadedVolumeInfo) super.clone();
      }

    }
  }

  /**
   * General volume information.
   */
  public static final class VolumeInfo extends com.google.api.client.json.GenericJson {

    /**
     * Whether anonymous logging should be allowed.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.Boolean allowAnonLogging;

    /**
     * The names of the authors and/or editors for this volume. (In LITE projection)
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.util.List<java.lang.String> authors;

    /**
     * The mean review rating for this volume. (min = 1.0, max = 5.0)
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.Double averageRating;

    /**
     * Canonical URL for a volume. (In LITE projection.)
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String canonicalVolumeLink;

    /**
     * A list of subject categories, such as "Fiction", "Suspense", etc.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.util.List<java.lang.String> categories;

    /**
     * Whether the volume has comics content.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.Boolean comicsContent;

    /**
     * An identifier for the version of the volume content (text & images). (In LITE projection)
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String contentVersion;

    /**
     * A synopsis of the volume. The text of the description is formatted in HTML and includes simple
     * formatting elements, such as b, i, and br tags. (In LITE projection.)
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String description;

    /**
     * Physical dimensions of this volume.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private Dimensions dimensions;

    /**
     * A list of image links for all the sizes that are available. (In LITE projection.)
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private ImageLinks imageLinks;

    /**
     * Industry standard identifiers for this volume.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.util.List<IndustryIdentifiers> industryIdentifiers;

    static {
      // hack to force ProGuard to consider IndustryIdentifiers used, since otherwise it would be stripped out
      // see https://github.com/google/google-api-java-client/issues/543
      com.google.api.client.util.Data.nullOf(IndustryIdentifiers.class);
    }

    /**
     * URL to view information about this volume on the Google Books site. (In LITE projection)
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String infoLink;

    /**
     * Best language for this volume (based on content). It is the two-letter ISO 639-1 code such as
     * 'fr', 'en', etc.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String language;

    /**
     * The main category to which this volume belongs. It will be the category from the categories
     * list returned below that has the highest weight.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String mainCategory;

    /**
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String maturityRating;

    /**
     * Total number of pages as per publisher metadata.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.Integer pageCount;

    /**
     * A top-level summary of the panelization info in this volume.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private PanelizationSummary panelizationSummary;

    /**
     * URL to preview this volume on the Google Books site.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String previewLink;

    /**
     * Type of publication of this volume. Possible values are BOOK or MAGAZINE.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String printType;

    /**
     * Total number of printed pages in generated pdf representation.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.Integer printedPageCount;

    /**
     * Date of publication. (In LITE projection.)
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String publishedDate;

    /**
     * Publisher of this volume. (In LITE projection.)
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String publisher;

    /**
     * The number of review ratings for this volume.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.Integer ratingsCount;

    /**
     * The reading modes available for this volume.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private ReadingModes readingModes;

    /**
     * Total number of sample pages as per publisher metadata.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.Integer samplePageCount;

    /**
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private Volumeseriesinfo seriesInfo;

    /**
     * Volume subtitle. (In LITE projection.)
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String subtitle;

    /**
     * Volume title. (In LITE projection.)
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.lang.String title;

    /**
     * Whether anonymous logging should be allowed.
     * @return value or {@code null} for none
     */
    public java.lang.Boolean getAllowAnonLogging() {
      return allowAnonLogging;
    }

    /**
     * Whether anonymous logging should be allowed.
     * @param allowAnonLogging allowAnonLogging or {@code null} for none
     */
    public VolumeInfo setAllowAnonLogging(java.lang.Boolean allowAnonLogging) {
      this.allowAnonLogging = allowAnonLogging;
      return this;
    }

    /**
     * The names of the authors and/or editors for this volume. (In LITE projection)
     * @return value or {@code null} for none
     */
    public java.util.List<java.lang.String> getAuthors() {
      return authors;
    }

    /**
     * The names of the authors and/or editors for this volume. (In LITE projection)
     * @param authors authors or {@code null} for none
     */
    public VolumeInfo setAuthors(java.util.List<java.lang.String> authors) {
      this.authors = authors;
      return this;
    }

    /**
     * The mean review rating for this volume. (min = 1.0, max = 5.0)
     * @return value or {@code null} for none
     */
    public java.lang.Double getAverageRating() {
      return averageRating;
    }

    /**
     * The mean review rating for this volume. (min = 1.0, max = 5.0)
     * @param averageRating averageRating or {@code null} for none
     */
    public VolumeInfo setAverageRating(java.lang.Double averageRating) {
      this.averageRating = averageRating;
      return this;
    }

    /**
     * Canonical URL for a volume. (In LITE projection.)
     * @return value or {@code null} for none
     */
    public java.lang.String getCanonicalVolumeLink() {
      return canonicalVolumeLink;
    }

    /**
     * Canonical URL for a volume. (In LITE projection.)
     * @param canonicalVolumeLink canonicalVolumeLink or {@code null} for none
     */
    public VolumeInfo setCanonicalVolumeLink(java.lang.String canonicalVolumeLink) {
      this.canonicalVolumeLink = canonicalVolumeLink;
      return this;
    }

    /**
     * A list of subject categories, such as "Fiction", "Suspense", etc.
     * @return value or {@code null} for none
     */
    public java.util.List<java.lang.String> getCategories() {
      return categories;
    }

    /**
     * A list of subject categories, such as "Fiction", "Suspense", etc.
     * @param categories categories or {@code null} for none
     */
    public VolumeInfo setCategories(java.util.List<java.lang.String> categories) {
      this.categories = categories;
      return this;
    }

    /**
     * Whether the volume has comics content.
     * @return value or {@code null} for none
     */
    public java.lang.Boolean getComicsContent() {
      return comicsContent;
    }

    /**
     * Whether the volume has comics content.
     * @param comicsContent comicsContent or {@code null} for none
     */
    public VolumeInfo setComicsContent(java.lang.Boolean comicsContent) {
      this.comicsContent = comicsContent;
      return this;
    }

    /**
     * An identifier for the version of the volume content (text & images). (In LITE projection)
     * @return value or {@code null} for none
     */
    public java.lang.String getContentVersion() {
      return contentVersion;
    }

    /**
     * An identifier for the version of the volume content (text & images). (In LITE projection)
     * @param contentVersion contentVersion or {@code null} for none
     */
    public VolumeInfo setContentVersion(java.lang.String contentVersion) {
      this.contentVersion = contentVersion;
      return this;
    }

    /**
     * A synopsis of the volume. The text of the description is formatted in HTML and includes simple
     * formatting elements, such as b, i, and br tags. (In LITE projection.)
     * @return value or {@code null} for none
     */
    public java.lang.String getDescription() {
      return description;
    }

    /**
     * A synopsis of the volume. The text of the description is formatted in HTML and includes simple
     * formatting elements, such as b, i, and br tags. (In LITE projection.)
     * @param description description or {@code null} for none
     */
    public VolumeInfo setDescription(java.lang.String description) {
      this.description = description;
      return this;
    }

    /**
     * Physical dimensions of this volume.
     * @return value or {@code null} for none
     */
    public Dimensions getDimensions() {
      return dimensions;
    }

    /**
     * Physical dimensions of this volume.
     * @param dimensions dimensions or {@code null} for none
     */
    public VolumeInfo setDimensions(Dimensions dimensions) {
      this.dimensions = dimensions;
      return this;
    }

    /**
     * A list of image links for all the sizes that are available. (In LITE projection.)
     * @return value or {@code null} for none
     */
    public ImageLinks getImageLinks() {
      return imageLinks;
    }

    /**
     * A list of image links for all the sizes that are available. (In LITE projection.)
     * @param imageLinks imageLinks or {@code null} for none
     */
    public VolumeInfo setImageLinks(ImageLinks imageLinks) {
      this.imageLinks = imageLinks;
      return this;
    }

    /**
     * Industry standard identifiers for this volume.
     * @return value or {@code null} for none
     */
    public java.util.List<IndustryIdentifiers> getIndustryIdentifiers() {
      return industryIdentifiers;
    }

    /**
     * Industry standard identifiers for this volume.
     * @param industryIdentifiers industryIdentifiers or {@code null} for none
     */
    public VolumeInfo setIndustryIdentifiers(java.util.List<IndustryIdentifiers> industryIdentifiers) {
      this.industryIdentifiers = industryIdentifiers;
      return this;
    }

    /**
     * URL to view information about this volume on the Google Books site. (In LITE projection)
     * @return value or {@code null} for none
     */
    public java.lang.String getInfoLink() {
      return infoLink;
    }

    /**
     * URL to view information about this volume on the Google Books site. (In LITE projection)
     * @param infoLink infoLink or {@code null} for none
     */
    public VolumeInfo setInfoLink(java.lang.String infoLink) {
      this.infoLink = infoLink;
      return this;
    }

    /**
     * Best language for this volume (based on content). It is the two-letter ISO 639-1 code such as
     * 'fr', 'en', etc.
     * @return value or {@code null} for none
     */
    public java.lang.String getLanguage() {
      return language;
    }

    /**
     * Best language for this volume (based on content). It is the two-letter ISO 639-1 code such as
     * 'fr', 'en', etc.
     * @param language language or {@code null} for none
     */
    public VolumeInfo setLanguage(java.lang.String language) {
      this.language = language;
      return this;
    }

    /**
     * The main category to which this volume belongs. It will be the category from the categories
     * list returned below that has the highest weight.
     * @return value or {@code null} for none
     */
    public java.lang.String getMainCategory() {
      return mainCategory;
    }

    /**
     * The main category to which this volume belongs. It will be the category from the categories
     * list returned below that has the highest weight.
     * @param mainCategory mainCategory or {@code null} for none
     */
    public VolumeInfo setMainCategory(java.lang.String mainCategory) {
      this.mainCategory = mainCategory;
      return this;
    }

    /**
     * @return value or {@code null} for none
     */
    public java.lang.String getMaturityRating() {
      return maturityRating;
    }

    /**
     * @param maturityRating maturityRating or {@code null} for none
     */
    public VolumeInfo setMaturityRating(java.lang.String maturityRating) {
      this.maturityRating = maturityRating;
      return this;
    }

    /**
     * Total number of pages as per publisher metadata.
     * @return value or {@code null} for none
     */
    public java.lang.Integer getPageCount() {
      return pageCount;
    }

    /**
     * Total number of pages as per publisher metadata.
     * @param pageCount pageCount or {@code null} for none
     */
    public VolumeInfo setPageCount(java.lang.Integer pageCount) {
      this.pageCount = pageCount;
      return this;
    }

    /**
     * A top-level summary of the panelization info in this volume.
     * @return value or {@code null} for none
     */
    public PanelizationSummary getPanelizationSummary() {
      return panelizationSummary;
    }

    /**
     * A top-level summary of the panelization info in this volume.
     * @param panelizationSummary panelizationSummary or {@code null} for none
     */
    public VolumeInfo setPanelizationSummary(PanelizationSummary panelizationSummary) {
      this.panelizationSummary = panelizationSummary;
      return this;
    }

    /**
     * URL to preview this volume on the Google Books site.
     * @return value or {@code null} for none
     */
    public java.lang.String getPreviewLink() {
      return previewLink;
    }

    /**
     * URL to preview this volume on the Google Books site.
     * @param previewLink previewLink or {@code null} for none
     */
    public VolumeInfo setPreviewLink(java.lang.String previewLink) {
      this.previewLink = previewLink;
      return this;
    }

    /**
     * Type of publication of this volume. Possible values are BOOK or MAGAZINE.
     * @return value or {@code null} for none
     */
    public java.lang.String getPrintType() {
      return printType;
    }

    /**
     * Type of publication of this volume. Possible values are BOOK or MAGAZINE.
     * @param printType printType or {@code null} for none
     */
    public VolumeInfo setPrintType(java.lang.String printType) {
      this.printType = printType;
      return this;
    }

    /**
     * Total number of printed pages in generated pdf representation.
     * @return value or {@code null} for none
     */
    public java.lang.Integer getPrintedPageCount() {
      return printedPageCount;
    }

    /**
     * Total number of printed pages in generated pdf representation.
     * @param printedPageCount printedPageCount or {@code null} for none
     */
    public VolumeInfo setPrintedPageCount(java.lang.Integer printedPageCount) {
      this.printedPageCount = printedPageCount;
      return this;
    }

    /**
     * Date of publication. (In LITE projection.)
     * @return value or {@code null} for none
     */
    public java.lang.String getPublishedDate() {
      return publishedDate;
    }

    /**
     * Date of publication. (In LITE projection.)
     * @param publishedDate publishedDate or {@code null} for none
     */
    public VolumeInfo setPublishedDate(java.lang.String publishedDate) {
      this.publishedDate = publishedDate;
      return this;
    }

    /**
     * Publisher of this volume. (In LITE projection.)
     * @return value or {@code null} for none
     */
    public java.lang.String getPublisher() {
      return publisher;
    }

    /**
     * Publisher of this volume. (In LITE projection.)
     * @param publisher publisher or {@code null} for none
     */
    public VolumeInfo setPublisher(java.lang.String publisher) {
      this.publisher = publisher;
      return this;
    }

    /**
     * The number of review ratings for this volume.
     * @return value or {@code null} for none
     */
    public java.lang.Integer getRatingsCount() {
      return ratingsCount;
    }

    /**
     * The number of review ratings for this volume.
     * @param ratingsCount ratingsCount or {@code null} for none
     */
    public VolumeInfo setRatingsCount(java.lang.Integer ratingsCount) {
      this.ratingsCount = ratingsCount;
      return this;
    }

    /**
     * The reading modes available for this volume.
     * @return value or {@code null} for none
     */
    public ReadingModes getReadingModes() {
      return readingModes;
    }

    /**
     * The reading modes available for this volume.
     * @param readingModes readingModes or {@code null} for none
     */
    public VolumeInfo setReadingModes(ReadingModes readingModes) {
      this.readingModes = readingModes;
      return this;
    }

    /**
     * Total number of sample pages as per publisher metadata.
     * @return value or {@code null} for none
     */
    public java.lang.Integer getSamplePageCount() {
      return samplePageCount;
    }

    /**
     * Total number of sample pages as per publisher metadata.
     * @param samplePageCount samplePageCount or {@code null} for none
     */
    public VolumeInfo setSamplePageCount(java.lang.Integer samplePageCount) {
      this.samplePageCount = samplePageCount;
      return this;
    }

    /**
     * @return value or {@code null} for none
     */
    public Volumeseriesinfo getSeriesInfo() {
      return seriesInfo;
    }

    /**
     * @param seriesInfo seriesInfo or {@code null} for none
     */
    public VolumeInfo setSeriesInfo(Volumeseriesinfo seriesInfo) {
      this.seriesInfo = seriesInfo;
      return this;
    }

    /**
     * Volume subtitle. (In LITE projection.)
     * @return value or {@code null} for none
     */
    public java.lang.String getSubtitle() {
      return subtitle;
    }

    /**
     * Volume subtitle. (In LITE projection.)
     * @param subtitle subtitle or {@code null} for none
     */
    public VolumeInfo setSubtitle(java.lang.String subtitle) {
      this.subtitle = subtitle;
      return this;
    }

    /**
     * Volume title. (In LITE projection.)
     * @return value or {@code null} for none
     */
    public java.lang.String getTitle() {
      return title;
    }

    /**
     * Volume title. (In LITE projection.)
     * @param title title or {@code null} for none
     */
    public VolumeInfo setTitle(java.lang.String title) {
      this.title = title;
      return this;
    }

    @Override
    public VolumeInfo set(String fieldName, Object value) {
      return (VolumeInfo) super.set(fieldName, value);
    }

    @Override
    public VolumeInfo clone() {
      return (VolumeInfo) super.clone();
    }

    /**
     * Physical dimensions of this volume.
     */
    public static final class Dimensions extends com.google.api.client.json.GenericJson {

      /**
       * Height or length of this volume (in cm).
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.String height;

      /**
       * Thickness of this volume (in cm).
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.String thickness;

      /**
       * Width of this volume (in cm).
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.String width;

      /**
       * Height or length of this volume (in cm).
       * @return value or {@code null} for none
       */
      public java.lang.String getHeight() {
        return height;
      }

      /**
       * Height or length of this volume (in cm).
       * @param height height or {@code null} for none
       */
      public Dimensions setHeight(java.lang.String height) {
        this.height = height;
        return this;
      }

      /**
       * Thickness of this volume (in cm).
       * @return value or {@code null} for none
       */
      public java.lang.String getThickness() {
        return thickness;
      }

      /**
       * Thickness of this volume (in cm).
       * @param thickness thickness or {@code null} for none
       */
      public Dimensions setThickness(java.lang.String thickness) {
        this.thickness = thickness;
        return this;
      }

      /**
       * Width of this volume (in cm).
       * @return value or {@code null} for none
       */
      public java.lang.String getWidth() {
        return width;
      }

      /**
       * Width of this volume (in cm).
       * @param width width or {@code null} for none
       */
      public Dimensions setWidth(java.lang.String width) {
        this.width = width;
        return this;
      }

      @Override
      public Dimensions set(String fieldName, Object value) {
        return (Dimensions) super.set(fieldName, value);
      }

      @Override
      public Dimensions clone() {
        return (Dimensions) super.clone();
      }

    }
    /**
     * A list of image links for all the sizes that are available. (In LITE projection.)
     */
    public static final class ImageLinks extends com.google.api.client.json.GenericJson {

      /**
       * Image link for extra large size (width of ~1280 pixels). (In LITE projection)
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.String extraLarge;

      /**
       * Image link for large size (width of ~800 pixels). (In LITE projection)
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.String large;

      /**
       * Image link for medium size (width of ~575 pixels). (In LITE projection)
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.String medium;

      /**
       * Image link for small size (width of ~300 pixels). (In LITE projection)
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.String small;

      /**
       * Image link for small thumbnail size (width of ~80 pixels). (In LITE projection)
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.String smallThumbnail;

      /**
       * Image link for thumbnail size (width of ~128 pixels). (In LITE projection)
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.String thumbnail;

      /**
       * Image link for extra large size (width of ~1280 pixels). (In LITE projection)
       * @return value or {@code null} for none
       */
      public java.lang.String getExtraLarge() {
        return extraLarge;
      }

      /**
       * Image link for extra large size (width of ~1280 pixels). (In LITE projection)
       * @param extraLarge extraLarge or {@code null} for none
       */
      public ImageLinks setExtraLarge(java.lang.String extraLarge) {
        this.extraLarge = extraLarge;
        return this;
      }

      /**
       * Image link for large size (width of ~800 pixels). (In LITE projection)
       * @return value or {@code null} for none
       */
      public java.lang.String getLarge() {
        return large;
      }

      /**
       * Image link for large size (width of ~800 pixels). (In LITE projection)
       * @param large large or {@code null} for none
       */
      public ImageLinks setLarge(java.lang.String large) {
        this.large = large;
        return this;
      }

      /**
       * Image link for medium size (width of ~575 pixels). (In LITE projection)
       * @return value or {@code null} for none
       */
      public java.lang.String getMedium() {
        return medium;
      }

      /**
       * Image link for medium size (width of ~575 pixels). (In LITE projection)
       * @param medium medium or {@code null} for none
       */
      public ImageLinks setMedium(java.lang.String medium) {
        this.medium = medium;
        return this;
      }

      /**
       * Image link for small size (width of ~300 pixels). (In LITE projection)
       * @return value or {@code null} for none
       */
      public java.lang.String getSmall() {
        return small;
      }

      /**
       * Image link for small size (width of ~300 pixels). (In LITE projection)
       * @param small small or {@code null} for none
       */
      public ImageLinks setSmall(java.lang.String small) {
        this.small = small;
        return this;
      }

      /**
       * Image link for small thumbnail size (width of ~80 pixels). (In LITE projection)
       * @return value or {@code null} for none
       */
      public java.lang.String getSmallThumbnail() {
        return smallThumbnail;
      }

      /**
       * Image link for small thumbnail size (width of ~80 pixels). (In LITE projection)
       * @param smallThumbnail smallThumbnail or {@code null} for none
       */
      public ImageLinks setSmallThumbnail(java.lang.String smallThumbnail) {
        this.smallThumbnail = smallThumbnail;
        return this;
      }

      /**
       * Image link for thumbnail size (width of ~128 pixels). (In LITE projection)
       * @return value or {@code null} for none
       */
      public java.lang.String getThumbnail() {
        return thumbnail;
      }

      /**
       * Image link for thumbnail size (width of ~128 pixels). (In LITE projection)
       * @param thumbnail thumbnail or {@code null} for none
       */
      public ImageLinks setThumbnail(java.lang.String thumbnail) {
        this.thumbnail = thumbnail;
        return this;
      }

      @Override
      public ImageLinks set(String fieldName, Object value) {
        return (ImageLinks) super.set(fieldName, value);
      }

      @Override
      public ImageLinks clone() {
        return (ImageLinks) super.clone();
      }

    }
    /**
     * Model definition for VolumeVolumeInfoIndustryIdentifiers.
     */
    public static final class IndustryIdentifiers extends com.google.api.client.json.GenericJson {

      /**
       * Industry specific volume identifier.
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.String identifier;

      /**
       * Identifier type. Possible values are ISBN_10, ISBN_13, ISSN and OTHER.
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.String type;

      /**
       * Industry specific volume identifier.
       * @return value or {@code null} for none
       */
      public java.lang.String getIdentifier() {
        return identifier;
      }

      /**
       * Industry specific volume identifier.
       * @param identifier identifier or {@code null} for none
       */
      public IndustryIdentifiers setIdentifier(java.lang.String identifier) {
        this.identifier = identifier;
        return this;
      }

      /**
       * Identifier type. Possible values are ISBN_10, ISBN_13, ISSN and OTHER.
       * @return value or {@code null} for none
       */
      public java.lang.String getType() {
        return type;
      }

      /**
       * Identifier type. Possible values are ISBN_10, ISBN_13, ISSN and OTHER.
       * @param type type or {@code null} for none
       */
      public IndustryIdentifiers setType(java.lang.String type) {
        this.type = type;
        return this;
      }

      @Override
      public IndustryIdentifiers set(String fieldName, Object value) {
        return (IndustryIdentifiers) super.set(fieldName, value);
      }

      @Override
      public IndustryIdentifiers clone() {
        return (IndustryIdentifiers) super.clone();
      }

    }
    /**
     * A top-level summary of the panelization info in this volume.
     */
    public static final class PanelizationSummary extends com.google.api.client.json.GenericJson {

      /**
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.Boolean containsEpubBubbles;

      /**
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.Boolean containsImageBubbles;

      /**
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.String epubBubbleVersion;

      /**
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.String imageBubbleVersion;

      /**
       * @return value or {@code null} for none
       */
      public java.lang.Boolean getContainsEpubBubbles() {
        return containsEpubBubbles;
      }

      /**
       * @param containsEpubBubbles containsEpubBubbles or {@code null} for none
       */
      public PanelizationSummary setContainsEpubBubbles(java.lang.Boolean containsEpubBubbles) {
        this.containsEpubBubbles = containsEpubBubbles;
        return this;
      }

      /**
       * @return value or {@code null} for none
       */
      public java.lang.Boolean getContainsImageBubbles() {
        return containsImageBubbles;
      }

      /**
       * @param containsImageBubbles containsImageBubbles or {@code null} for none
       */
      public PanelizationSummary setContainsImageBubbles(java.lang.Boolean containsImageBubbles) {
        this.containsImageBubbles = containsImageBubbles;
        return this;
      }

      /**
       * @return value or {@code null} for none
       */
      public java.lang.String getEpubBubbleVersion() {
        return epubBubbleVersion;
      }

      /**
       * @param epubBubbleVersion epubBubbleVersion or {@code null} for none
       */
      public PanelizationSummary setEpubBubbleVersion(java.lang.String epubBubbleVersion) {
        this.epubBubbleVersion = epubBubbleVersion;
        return this;
      }

      /**
       * @return value or {@code null} for none
       */
      public java.lang.String getImageBubbleVersion() {
        return imageBubbleVersion;
      }

      /**
       * @param imageBubbleVersion imageBubbleVersion or {@code null} for none
       */
      public PanelizationSummary setImageBubbleVersion(java.lang.String imageBubbleVersion) {
        this.imageBubbleVersion = imageBubbleVersion;
        return this;
      }

      @Override
      public PanelizationSummary set(String fieldName, Object value) {
        return (PanelizationSummary) super.set(fieldName, value);
      }

      @Override
      public PanelizationSummary clone() {
        return (PanelizationSummary) super.clone();
      }

    }
    /**
     * The reading modes available for this volume.
     */
    public static final class ReadingModes extends com.google.api.client.json.GenericJson {

      /**
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.Boolean image;

      /**
       * The value may be {@code null}.
       */
      @com.google.api.client.util.Key
      private java.lang.Boolean text;

      /**
       * @return value or {@code null} for none
       */
      public java.lang.Boolean getImage() {
        return image;
      }

      /**
       * @param image image or {@code null} for none
       */
      public ReadingModes setImage(java.lang.Boolean image) {
        this.image = image;
        return this;
      }

      /**
       * @return value or {@code null} for none
       */
      public java.lang.Boolean getText() {
        return text;
      }

      /**
       * @param text text or {@code null} for none
       */
      public ReadingModes setText(java.lang.Boolean text) {
        this.text = text;
        return this;
      }

      @Override
      public ReadingModes set(String fieldName, Object value) {
        return (ReadingModes) super.set(fieldName, value);
      }

      @Override
      public ReadingModes clone() {
        return (ReadingModes) super.clone();
      }

    }
  }
}
