/*
* Created on 13.04.2003
*/
package de.laures.cewolf.taglib;
import java.io.Serializable;
import java.util.Date;
import java.util.Map;
import org.jfree.data.general.Dataset;
import de.laures.cewolf.DatasetProduceException;
import de.laures.cewolf.DatasetProducer;
import de.laures.cewolf.taglib.util.DatasetProductionTimeStore;
import de.laures.cewolf.taglib.util.KeyGenerator;
import de.laures.cewolf.util.Assert;
/**
* @author guido
*/
public class DataContainer implements DataAware, Serializable {
static final long serialVersionUID = 8018224798228025683L;
private transient Dataset data;
private transient DatasetProducer producer;
private Map datasetProductionParams;
private long datasetProduceTime;
private boolean useCache = true;
public void setDataProductionConfig(DatasetProducer dsp, Map params, boolean useCache) {
producer = dsp;
datasetProductionParams = params;
this.useCache = useCache;
checkDataProductionNeed();
}
public Dataset getDataset() throws DatasetProduceException {
Assert.check(producer != null, "you need to specifiy a producer for the data of the chart.");
if (data == null) {
data = (Dataset) producer.produceDataset(datasetProductionParams);
DatasetProductionTimeStore dataCache = DatasetProductionTimeStore.getInstance();
dataCache.addEntry(producer.getProducerId(), datasetProductionParams, new Date(datasetProduceTime));
}
Assert.check(data != null, "your producer of type " + producer.getClass().getName() + " produced a null dataset.");
return data;
}
/**
* This method checks if there has been a dataset production
* for the same DatasetProvider and parameters. If so the DatasetProducer
* is consulted to check the expiry of this data.
* If the data has expired the retrieval of a cached image of this
* ChartDefinition is avoided by setting the datasetProduceTime to the
* actual time. After this the hash code of this object can not be
* present in the image cache and so a new image with new data will be rendered.
* If the data did not expire the last dataset production time is stored
* as a memeber to reach the same hash code for this object as the one before if possible.
* This method is called during serialization to ensure the same serialized
* representation of this and a eventually formally stored object.
*/
private void checkDataProductionNeed() {
final String prodId = producer.getProducerId();
DatasetProductionTimeStore dataCache = DatasetProductionTimeStore.getInstance();
if (useCache && dataCache.containsEntry(prodId, datasetProductionParams)) {
Date produceTime = dataCache.getProductionTime(prodId, datasetProductionParams);
// cached data available
if (!producer.hasExpired(datasetProductionParams, produceTime)) {
this.datasetProduceTime = produceTime.getTime();
return;
}
dataCache.removeEntry(prodId, datasetProductionParams);
}
datasetProduceTime = System.currentTimeMillis();
}
}