package org.jboss.util.collection;
import java.util.Iterator;
import java.util.Enumeration;
import java.util.NoSuchElementException;
import java.util.Map;
import java.util.HashMap;
import org.jboss.util.Null;
public final class Iterators
{
private static final class Enum2Iterator
implements Iterator
{
private final Enumeration enum;
public Enum2Iterator(final Enumeration enum) {
this.enum = enum;
}
public boolean hasNext() {
return enum.hasMoreElements();
}
public Object next() {
return enum.nextElement();
}
public void remove() {
throw new UnsupportedOperationException("Enumerations are immutable");
}
}
public static Iterator forEnumeration(final Enumeration enum) {
return new Enum2Iterator(enum);
}
private static final class Iter2Enumeration
implements Enumeration
{
private final Iterator iter;
public Iter2Enumeration(final Iterator iter) {
this.iter = iter;
}
public boolean hasMoreElements() {
return iter.hasNext();
}
public Object nextElement() {
return iter.next();
}
}
public static Enumeration toEnumeration(final Iterator iter) {
return new Iter2Enumeration(iter);
}
private static final class ImmutableIterator
implements Iterator
{
private final Iterator iter;
public ImmutableIterator(final Iterator iter) {
this.iter = iter;
}
public boolean hasNext() {
return iter.hasNext();
}
public Object next() {
return iter.next();
}
public void remove() {
throw new UnsupportedOperationException("iterator is immutable");
}
}
public static Iterator makeImmutable(final Iterator iter) {
return new ImmutableIterator(iter);
}
private static final class SyncIterator
implements Iterator
{
private final Iterator iter;
public SyncIterator(final Iterator iter) {
this.iter = iter;
}
public synchronized boolean hasNext() {
return iter.hasNext();
}
public synchronized Object next() {
return iter.next();
}
public synchronized void remove() {
iter.remove();
}
}
public static Iterator makeSynchronized(final Iterator iter) {
return new SyncIterator(iter);
}
private static final class SyncEnumeration
implements Enumeration
{
private final Enumeration enum;
public SyncEnumeration(final Enumeration enum) {
this.enum = enum;
}
public synchronized boolean hasMoreElements() {
return enum.hasMoreElements();
}
public synchronized Object nextElement() {
return enum.nextElement();
}
}
public static Enumeration makeSynchronized(final Enumeration enum) {
return new SyncEnumeration(enum);
}
public static final Iterator EMPTY_ITERATOR = new EmptyIterator();
private static final class EmptyIterator
implements Iterator
{
public boolean hasNext() {
return false;
}
public Object next() {
throw new NoSuchElementException("no more elements");
}
public void remove() {
throw new IllegalStateException("no more elements");
}
}
public static Iterator union(final Iterator iters[]) {
Map map = new HashMap();
for (int i=0; i < iters.length; i++) {
if (iters[i] != null) {
while (iters[i].hasNext()) {
Object obj = iters[i].next();
if (!map.containsKey(obj)) {
map.put(obj, Null.VALUE);
}
}
}
}
return map.keySet().iterator();
}
public static String toString(final Iterator iter, final String delim) {
StringBuffer buff = new StringBuffer();
while (iter.hasNext()) {
buff.append(iter.next());
if (iter.hasNext()) {
buff.append(delim);
}
}
return buff.toString();
}
public static String toString(final Iterator iter) {
return toString(iter, ",");
}
}