001    package com.softnetConsult.utils.collections;
002    
003    import java.util.Iterator;
004    import java.util.NoSuchElementException;
005    
006    
007    /**
008     * Provides an Null Iterator: the methods of this class perform no action and no elements
009     * are ever returned - this class can be used when a non-{@code null} {@code Iterator} object
010     * must be specified, but no actual iteration indended.
011     * 
012     * <p style="font-size:smaller;">This product includes software developed by the
013     *    <strong>SoftNet-Consult Java Utility Library</strong> project and its contributors.<br />
014     *    (<a href="http://java-tools.sourceforge.net" target="_blank">http://java-tools.sourceforge.net</a>)<br />
015     *    Copyright (c) 2007-2008 SoftNet-Consult.<br />
016     *    Copyright (c) 2007-2008 G. Paperin.<br />
017     *    All rights reserved.
018     * </p>
019     * <p style="font-size:smaller;">File: NullIterator.java<br />
020     *    Library API version: {@value com.softnetConsult.utils.APIProperties#apiVersion}<br />
021     *    Java compliance version: {@value com.softnetConsult.utils.APIProperties#javaComplianceVersion}
022     * </p>
023     * <p style="font-size:smaller;">Redistribution and use in source and binary forms, with or
024     *    without modification, are permitted provided that the following terms and conditions are met:
025     * </p>
026     * <p style="font-size:smaller;">1. Redistributions of source code must retain the above
027     *    acknowledgement of the SoftNet-Consult Java Utility Library project, the above copyright
028     *    notice, this list of conditions and the following disclaimer.<br />
029     *    2. Redistributions in binary form must reproduce the above acknowledgement of the
030     *    SoftNet-Consult Java Utility Library project, the above copyright notice, this list of
031     *    conditions and the following disclaimer in the documentation and/or other materials
032     *    provided with the distribution.<br />
033     *    3. All advertising materials mentioning features or use of this software or any derived
034     *    software must display the following acknowledgement:<br />
035     *    <em>This product includes software developed by the SoftNet-Consult Java Utility Library
036     *    project and its contributors.</em>
037     * </p>
038     * <p style="font-size:smaller;">THIS SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY
039     *    OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
040     *    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND  NONINFRINGEMENT. IN NO EVENT SHALL
041     *    THE AUTHORS, CONTRIBUTORS OR COPYRIGHT  HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
042     *    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING  FROM, OUT OF OR
043     *    IN CONNECTION WITH THE SOFTWARE OR THE USE OR  OTHER DEALINGS IN THE SOFTWARE.
044     * </p> 
045     * @author Greg Paperin (<a href="http://www.paperin.org" target="_blank">http://www.paperin.org</a>)
046     * @version {@value com.softnetConsult.utils.APIProperties#apiVersion}
047     *
048     * @param <ET>
049     */
050    public final class NullIterator<ET> implements Iterator<ET> {
051    
052    /**
053     * A singleton instance of the {@code NullIterator}.
054     */
055    private static NullIterator<?> singeltonInstance = null;
056    
057    /**
058     * Returns a singleton instance of {@code NullIterator}.
059     * 
060     * @param <T> The type for the hypothetically iterated items.
061     * @return A singleton {@code NullIterator} instance.
062     */
063    @SuppressWarnings("unchecked")
064    public static <T> NullIterator<T> getSingeltonInstance() {
065            if (null == singeltonInstance)
066                    singeltonInstance = new NullIterator<Object>();
067            return (NullIterator<T>) singeltonInstance;
068    }
069    
070    /**
071     * Returns a singleton instance of {@code NullIterator}.
072     * This method works in the same way as {@link #getSingeltonInstance()}, the
073     * parameter can be used to explicity specify the iterator type.
074     * 
075     * @param <T> The type for the hypothetically iterated items.
076     * @param iteratorElementType The type for the hypothetically iterated items.
077     * @return A singleton {@code NullIterator} instance.
078     */
079    @SuppressWarnings("unchecked")
080    public static <T> NullIterator<T> getSingeltonInstance(Class<T> iteratorElementType) {
081            if (null == singeltonInstance)
082                    singeltonInstance = new NullIterator<Object>();
083            return (NullIterator<T>) singeltonInstance;
084    }
085    
086    /**
087     * Constructs a new {@code NullIterator}.
088     */
089    public NullIterator() { }
090    
091    /**
092     * Returns {@code false} as the {@code NullIterator} has nothing to iterate over.
093     * 
094     * @return {@code false}.
095     */
096    public boolean hasNext() {
097            return false;
098    }
099    
100    /**
101     * Always throws a {@code NoSuchElementException} as the {@code NullIterator} has
102     * nothing to iterate over.
103     * 
104     * @return Never returns normally as an exception is always thrown.
105     * @throws NoSuchElementException Always, as the {@code NullIterator} has nothing
106     * to iterate over.
107     */
108    public ET next() {
109            throw new NoSuchElementException("Null iterator has no elements");
110    }
111    
112    /**
113     * Always throws a {@code IllegalStateException} as the {@code NullIterator} has
114     * nothing to remove.
115     * 
116     * @throws IllegalStateException Always, as the {@code NullIterator} has nothing
117     * to remove.
118     */
119    public void remove() {
120            throw new IllegalStateException("Null iterator has no elements to return");
121    }
122    
123    } // public final class NullIterator<ET>