All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jclouds.googlecompute.domain.ListPage Maven / Gradle / Ivy

/*
 * Licensed to jclouds, Inc. (jclouds) under one or more
 * contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  jclouds licenses this file
 * to you 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.
 */

package org.jclouds.googlecompute.domain;

import com.google.common.base.Objects;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableSet;
import org.jclouds.collect.IterableWithMarker;

import java.beans.ConstructorProperties;
import java.net.URI;
import java.util.Iterator;

import static com.google.common.base.Objects.equal;
import static com.google.common.base.Objects.toStringHelper;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.jclouds.googlecompute.domain.Resource.Kind;

/**
 * The collection returned from any listFirstPage() method.
 *
 * @author David Alves
 */
public class ListPage extends IterableWithMarker {

   private final Kind kind;
   private final String id;
   private final URI selfLink;
   private final String nextPageToken;
   private final Iterable items;

   @ConstructorProperties({
           "kind", "id", "selfLink", "nextPageToken", "items"
   })
   protected ListPage(Kind kind, String id, URI selfLink, String nextPageToken, Iterable items) {
      this.id = checkNotNull(id, "id");
      this.kind = checkNotNull(kind, "kind of %id", id);
      this.selfLink = checkNotNull(selfLink, "selfLink of %id", id);
      this.nextPageToken = nextPageToken;
      this.items = items != null ? ImmutableSet.copyOf(items) : ImmutableSet.of();
   }

   public Kind getKind() {
      return kind;
   }

   public String getId() {
      return id;
   }

   public URI getSelfLink() {
      return selfLink;
   }

   @Override
   public Optional nextMarker() {
      return Optional.fromNullable(nextPageToken);
   }

   @Override
   public Iterator iterator() {
      return checkNotNull(items, "items").iterator();
   }

   /**
    * {@inheritDoc}
    */
   @Override
   public int hashCode() {
      return Objects.hashCode(kind, id);
   }

   /**
    * {@inheritDoc}
    */
   @Override
   public boolean equals(Object obj) {
      if (this == obj) return true;
      if (obj == null || getClass() != obj.getClass()) return false;
      ListPage that = ListPage.class.cast(obj);
      return equal(this.kind, that.kind)
              && equal(this.id, that.id);
   }

   /**
    * {@inheritDoc}
    */
   protected Objects.ToStringHelper string() {
      return toStringHelper(this)
              .omitNullValues()
              .add("kind", kind)
              .add("id", id)
              .add("selfLink", selfLink)
              .add("nextPageToken", nextPageToken)
              .add("items", items);
   }

   /**
    * {@inheritDoc}
    */
   @Override
   public String toString() {
      return string().toString();
   }

   public static  Builder builder() {
      return new Builder();
   }

   public Builder toBuilder() {
      return new Builder().fromPagedList(this);
   }

   public static final class Builder {

      private Kind kind;
      private String id;
      private URI selfLink;
      private String nextPageToken;
      private ImmutableSet.Builder items = ImmutableSet.builder();

      public Builder kind(Kind kind) {
         this.kind = kind;
         return this;
      }

      public Builder id(String id) {
         this.id = id;
         return this;
      }

      public Builder selfLink(URI selfLink) {
         this.selfLink = selfLink;
         return this;
      }

      public Builder addItem(T item) {
         this.items.add(item);
         return this;
      }

      public Builder items(Iterable items) {
         this.items.addAll(items);
         return this;
      }

      public Builder nextPageToken(String nextPageToken) {
         this.nextPageToken = nextPageToken;
         return this;
      }

      public ListPage build() {
         return new ListPage(kind, id, selfLink, nextPageToken, items.build());
      }

      public Builder fromPagedList(ListPage in) {
         return this
                 .kind(in.getKind())
                 .id(in.getId())
                 .selfLink(in.getSelfLink())
                 .nextPageToken((String) in.nextMarker().orNull())
                 .items(in);

      }
   }
}