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

org.hbase.async.SingletonList Maven / Gradle / Ivy

Go to download

An alternative HBase client library for applications requiring fully asynchronous, non-blocking and thread-safe HBase connectivity.

There is a newer version: 1.8.2
Show newest version
/*
 * Copyright (C) 2010-2012  The Async HBase Authors.  All rights reserved.
 * This file is part of Async HBase.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *   - Redistributions of source code must retain the above copyright notice,
 *     this list of conditions and the following disclaimer.
 *   - Redistributions in binary form must reproduce the above copyright notice,
 *     this list of conditions and the following disclaimer in the documentation
 *     and/or other materials provided with the distribution.
 *   - Neither the name of the StumbleUpon nor the names of its contributors
 *     may be used to endorse or promote products derived from this software
 *     without specific prior written permission.
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
package org.hbase.async;

import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.NoSuchElementException;

/**
 * An immutable {@link List} that holds only a single non-{@code null} value.
 * @param  The type of the singleton element.
 */
final class SingletonList implements List {

  private final E element;

  /**
   * Constructor.
   * @param element The only element that will ever be in this list.
   * Must not be {@code null}.
   */
  public SingletonList(final E element) {
    if (element == null) {
      throw new NullPointerException("element");
    }
    this.element = element;
  }

  public String toString() {
    return "[" + element + ']';
  }

  @Override
  public int size() {
    return 1;
  }

  @Override
  public boolean isEmpty() {
    return false;
  }

  @Override
  public boolean contains(final Object o) {
    return element.equals(o);
  }

  @Override
  public Iterator iterator() {
    return new Iter(element);
  }

  @Override
  public Object[] toArray() {
    final Object[] array = new Object[1];
    array[0] = element;
    return array;
  }

  @Override
  @SuppressWarnings("unchecked")
  public  T[] toArray(final T[] a) {
    if (a.length < 1) {
      return (T[]) toArray();
    }
    a[0] = (T) element;
    if (a.length > 1) {
      a[1] = null;
    }
    return a;
  }

  @Override
  public boolean add(final E e) {
    throw new UnsupportedOperationException();
  }

  @Override
  public boolean remove(final Object o) {
    throw new UnsupportedOperationException();
  }

  @Override
  public boolean containsAll(final Collection c) {
    if (c.size() != 1) {
      return false;
    }
    return c.contains(element);
  }

  @Override
  public boolean addAll(final Collection c) {
    throw new UnsupportedOperationException();
  }

  @Override
  public boolean addAll(final int index, final Collection c) {
    throw new UnsupportedOperationException();
  }

  @Override
  public boolean removeAll(final Collection c) {
    throw new UnsupportedOperationException();
  }

  @Override
  public boolean retainAll(final Collection c) {
    throw new UnsupportedOperationException();
  }

  @Override
  public void clear() {
    throw new UnsupportedOperationException();
  }

  @Override
  public boolean equals(final Object other) {
    if (other == null || !(other instanceof SingletonList)) {
      return false;
    }
    return element.equals(((SingletonList) other).element);
  }

  @Override
  public int hashCode() {
    return 31 + element.hashCode();
  }

  @Override
  public E get(final int index) {
    if (index != 0) {
      throw new IndexOutOfBoundsException("only 1 element but index=" + index);
    }
    return element;
  }

  @Override
  public E set(final int index, final E element) {
    throw new UnsupportedOperationException();
  }

  @Override
  public void add(final int index, final E element) {
    throw new UnsupportedOperationException();
  }

  @Override
  public E remove(final int index) {
    throw new UnsupportedOperationException();
  }

  @Override
  public int indexOf(final Object o) {
    return o.equals(element) ? 0 : -1;
  }

  @Override
  public int lastIndexOf(Object o) {
    return o.equals(element) ? 0 : -1;
  }

  @Override
  public ListIterator listIterator() {
    return new Iter(element);
  }

  @Override
  public ListIterator listIterator(final int index) {
    if (index != 0) {
      throw new IndexOutOfBoundsException("only 1 element but index=" + index);
    }
    return new Iter(element);
  }

  @Override
  public List subList(final int fromIndex, final int toIndex) {
    if (fromIndex == 0 && toIndex == 1) {
      return this;
    }
    throw new IndexOutOfBoundsException("only 1 element but requested ["
                                        + fromIndex + "; " + toIndex + ']');
  }

  private static final class Iter implements ListIterator {

    private final E element;
    private boolean returned = false;

    public Iter(final E element) {
      this.element = element;
    }

    @Override
    public boolean hasNext() {
      return !returned;
    }

    @Override
    public E next() {
      if (returned) {
        throw new NoSuchElementException();
      }
      returned = true;
      return element;
    }

    @Override
    public boolean hasPrevious() {
      return returned;
    }

    @Override
    public E previous() {
      if (!returned) {
        throw new NoSuchElementException();
      }
      returned = false;
      return element;
    }

    @Override
    public int nextIndex() {
      return returned ? 0 : 1;
    }

    @Override
    public int previousIndex() {
      return returned ? -1 : 0;
    }

    @Override
    public void remove() {
      throw new UnsupportedOperationException();
    }

    @Override
    public void set(final E e) {
      throw new UnsupportedOperationException();
    }

    @Override
    public void add(final E e) {
      throw new UnsupportedOperationException();
    }

  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy