/******************************************************************************* * Copyright (c) 2006, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation * ******************************************************************************/ package org.eclipse.persistence.jpa.jpql.tools.utility.iterator; import java.util.ListIterator; import java.util.NoSuchElementException; /** * A <code>SingleElementListIterator</code> holds a single element and returns it with the first * call to {@link #next()}, at which point it will return <code>false</code> to any subsequent call * to {@link #hasNext()}. Likewise, it will return <code>false</code> to a call to {@link #hasPrevious()} * until a call to {@link #next()}, at which point a call to {@link #previous()} will return the * single element. * * @version 2.4 * @since 2.4 */ @SuppressWarnings("nls") public class SingleElementListIterator<E> implements ListIterator<E> { /** * The only element of this <code>Iterator</code>. */ private E element; /** * The element that can be returned by {@link #next()}. */ private E next; /** * A constant used to determine if we are at the end of the iteration. */ private static final Object END = new Object(); /** * Creates a new <code>SingleElementListIterator</code> that returns only the specified element. * * @param element The only element of this <code>Iterator</code> */ public SingleElementListIterator(E element) { super(); this.next = element; this.element = element; } /** * {@inheritDoc} */ public void add(E item) { throw new UnsupportedOperationException("This SingleElementListIterator is read-only."); } /** * {@inheritDoc} */ public boolean hasNext() { return next == element; } /** * {@inheritDoc} */ public boolean hasPrevious() { return next == END; } /** * {@inheritDoc} */ public ListIterator<E> iterator() { return this; } /** * {@inheritDoc} */ @SuppressWarnings("unchecked") public E next() { if (next == END) { throw new NoSuchElementException("No more elements can be retrieved."); } next = (E) END; return element; } /** * {@inheritDoc} */ public int nextIndex() { return (next == element) ? 0 : 1; } /** * {@inheritDoc} */ public E previous() { if (next == element) { throw new NoSuchElementException("No more elements can be retrieved."); } next = element; return element; } /** * {@inheritDoc} */ public int previousIndex() { return (next == END) ? 0 : -1; } /** * {@inheritDoc} */ public void remove() { throw new UnsupportedOperationException("This SingleElementListIterator is read-only."); } /** * {@inheritDoc} */ public void set(E item) { throw new UnsupportedOperationException("This SingleElementListIterator is read-only."); } /** * @see Object#toString() */ @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(getClass().getSimpleName()); sb.append("("); sb.append(element); sb.append(")"); return sb.toString(); } }