package fr.openwide.core.wicket.more.jqplot.data.adapter;
import java.util.Collection;
import java.util.Locale;
import java.util.Map;
import org.apache.wicket.model.IModel;
import com.google.common.collect.Lists;
import fr.openwide.core.commons.util.rendering.IRenderer;
import fr.openwide.core.wicket.more.jqplot.data.provider.IJQPlotDataProvider;
import nl.topicus.wqplot.data.StringNumberSeries;
import nl.topicus.wqplot.options.PlotOptions;
import nl.topicus.wqplot.options.PlotSeries;
import nl.topicus.wqplot.options.PlotTick;
/**
* Adapter for the pie charts data.
* <p>
* Features:
* <ul>
* <li>displays automatically all the series, even the ones without data
* <li>integrates the value in the form [[['label',value],['label2',value3]]], as it's the only way to associate
* correct labels to the pie charts data.
* </ul>
*/
public class JQPlotPieChartDataAdapter<S, K, V extends Number & Comparable<V>>
extends AbstractMissingValuesJQPlotDataAdapter<S, K, V> {
private static final long serialVersionUID = 3961697302069579609L;
private final IRenderer<? super K> keyRenderer;
public JQPlotPieChartDataAdapter(
IJQPlotDataProvider<S, K, V> dataProvider,
IModel<? extends Collection<? extends S>> seriesModel,
IModel<? extends Collection<? extends K>> keysModel,
IRenderer<? super K> keyRenderer) {
this(dataProvider, seriesModel, keysModel, null, keyRenderer);
}
public JQPlotPieChartDataAdapter(
IJQPlotDataProvider<S, K, V> dataProvider,
IModel<? extends Collection<? extends S>> seriesModel,
IModel<? extends Collection<? extends K>> keysModel,
IModel<? extends V> missingValueReplacementModel,
IRenderer<? super K> keyRenderer) {
super(dataProvider, seriesModel, keysModel, missingValueReplacementModel);
this.keyRenderer = keyRenderer;
}
@Override
public Collection<StringNumberSeries<V>> getObject(Locale locale) {
Iterable<? extends K> keysTicks = getKeysTicks();
Collection<StringNumberSeries<V>> result = Lists.newArrayList();
for (S series : getSeriesTicks()) {
StringNumberSeries<V> seriesData = createSeriesData(locale, series, keysTicks);
result.add(seriesData);
}
return result;
}
private StringNumberSeries<V> createSeriesData(Locale locale, S series, Iterable<? extends K> keys) {
StringNumberSeries<V> seriesData = new StringNumberSeries<V>();
for (K key : keys) {
V value = getValue(series, key);
seriesData.addEntry(keyRenderer.render(key, locale), value);
}
return seriesData;
}
@Override
public void configure(PlotOptions options, Map<? extends S, PlotSeries> seriesMap,
Map<? extends K, PlotTick> keysMap, Locale locale) {
// Is only so that we don't serialize the keys.
for (Map.Entry<? extends K, PlotTick> entry : keysMap.entrySet()) {
K key = entry.getKey();
PlotTick tick = entry.getValue();
tick.setVal(keyRenderer.render(key, locale));
}
}
}