/*******************************************************************************
* Copyright (c) 2010-2011 VIVO Harvester Team. For full list of contributors, please see the AUTHORS file provided.
* All rights reserved.
* This program and the accompanying materials are made available under the terms of the new BSD license which accompanies this distribution, and is available at http://www.opensource.org/licenses/bsd-license.html
******************************************************************************/
package org.vivoweb.harvester.util;
import java.util.Enumeration;
import java.util.Iterator;
/**
* Adapts Enumerations and Iterators to be Iterable
* @param <T> type
*/
public class IterableAdaptor<T> implements Iterable<T> {
/**
* enumeration
*/
private final Enumeration<T> en;
/**
* iterator
*/
private final Iterator<T> it;
/**
* sometimes you have an Enumeration and you want an Iterable
* @param en enumeration to adapt
*/
public IterableAdaptor(Enumeration<T> en) {
this.en = en;
this.it = null;
}
/**
* Accessor for en
* @return en
*/
protected final Enumeration<T> getEn() {
return this.en;
}
/**
* sometimes you have an Iterator but you want to use a for
* @param it iterator to adapt
*/
public IterableAdaptor(Iterator<T> it) {
this.it = it;
this.en = null;
}
// return an adaptor for the Enumeration
@Override
public Iterator<T> iterator() {
if(this.en != null) {
return new Iterator<T>() {
@Override
public boolean hasNext() {
return getEn().hasMoreElements();
}
@Override
public T next() {
return getEn().nextElement();
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
} else if(this.it != null) {
return this.it;
} else {
return new Iterator<T>() {
@Override
public boolean hasNext() {
return false;
}
@Override
public T next() {
return null;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
}
/**
* sometimes you have an Enumeration and you want an Iterable
* @param <T> type
* @param enin enumeration to adapt
* @return an iterable adapter for the enumeration
*/
public static <T> Iterable<T> adapt(Enumeration<T> enin) {
return new IterableAdaptor<T>(enin);
}
/**
* sometimes you have an Iterator but you want to use a for
* @param <T> type
* @param itin iterator to adapt
* @return an iterable adapter for the iterator
*/
public static <T> Iterable<T> adapt(Iterator<T> itin) {
return new IterableAdaptor<T>(itin);
}
}