package fr.openwide.core.wicket.more.jqplot.data.provider;
import java.util.AbstractCollection;
import java.util.Collection;
import java.util.Iterator;
import java.util.NoSuchElementException;
import com.google.common.collect.UnmodifiableIterator;
public abstract class AbstractJQPlotDataProvider<S, K, V> implements IJQPlotDataProvider<S, K, V> {
private static final long serialVersionUID = -5736008017437085384L;
@Override
public abstract void detach();
@Override
public abstract V getValue(S serie, K key);
@Override
public abstract Collection<S> getSeries();
@Override
public abstract Collection<K> getKeys();
@Override
public Collection<V> getValues() {
return new ValuesCollection();
}
private class ValuesCollection extends AbstractCollection<V> {
protected V getValue(S series, K key) {
return AbstractJQPlotDataProvider.this.getValue(series, key);
}
protected Collection<? extends S> getSeries() {
return AbstractJQPlotDataProvider.this.getSeries();
}
protected Collection<? extends K> getKeys() {
return AbstractJQPlotDataProvider.this.getKeys();
}
@Override
public Iterator<V> iterator() {
return new UnmodifiableIterator<V>() {
private final Iterator<? extends S> seriesIterator = getSeries().iterator();
private final boolean hasSerie = seriesIterator.hasNext();
private S serie = hasSerie ? seriesIterator.next() : null;
private Iterator<? extends K> keysIterator = getKeys().iterator();
@Override
public boolean hasNext() {
return keysIterator.hasNext() || seriesIterator.hasNext();
}
@Override
public V next() {
if (hasSerie) {
if (keysIterator.hasNext()) {
return getValue(serie, keysIterator.next());
} else if (seriesIterator.hasNext()) {
serie = seriesIterator.next();
keysIterator = getKeys().iterator();
if (keysIterator.hasNext()) {
return getValue(serie, keysIterator.next());
}
}
}
throw new NoSuchElementException();
}
};
}
@Override
public int size() {
return getSeries().size() * getKeys().size();
}
};
}