/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is NetBeans. The Initial Developer of the Original
* Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.openide.util.enums;
import java.util.Enumeration;
import java.util.NoSuchElementException;
/** Abstract class that takes an enumeration and filters its elements.
* To get this class fully work one must override <CODE>accept</CODE> method.
* Objects in the enumeration must not be <CODE>null</CODE>.
*
* @author Jaroslav Tulach
*/
public class FilterEnumeration extends Object implements Enumeration {
/** marker object stating there is no nexte element prepared */
private static final Object EMPTY = new Object();
/** enumeration to filter */
private Enumeration en;
/** element to be returned next time or {@link #EMPTY} if there is
* no such element prepared */
private Object next = EMPTY;
/**
* @param en enumeration to filter
*/
public FilterEnumeration (Enumeration en) {
this.en = en;
}
/** Filters objects. Overwrite this to decide which objects should be
* included in enumeration and which not.
* <P>
* Default implementation accepts all non-null objects
*
* @param o the object to decide on
* @return true if it should be in enumeration and false if it should not
*/
protected boolean accept (Object o) {
return o != null;
}
/** @return true if there is more elements in the enumeration
*/
public boolean hasMoreElements () {
if (next != EMPTY) {
// there is a object already prepared
return true;
}
while (en.hasMoreElements ()) {
// read next
next = en.nextElement ();
if (accept (next)) {
// if the object is accepted
return true;
};
}
next = EMPTY;
return false;
}
/** @return next object in the enumeration
* @exception NoSuchElementException can be thrown if there is no next object
* in the enumeration
*/
public Object nextElement () {
if( next == EMPTY && !hasMoreElements() ) {
throw new NoSuchElementException ();
}
Object res = next;
next = EMPTY;
return res;
}
}