java/cewolf-1.0/src/main/java/de/laures/cewolf/taglib/DataContainer.java
author František Kučera <franta-hg@frantovo.cz>
Sat Feb 28 21:31:02 2009 +0100 (2009-02-28)
changeset 1 639991d0808a
permissions -rw-r--r--
Rozbalená knihovna verze 1.0
franta-hg@1
     1
/*
franta-hg@1
     2
 * Created on 13.04.2003
franta-hg@1
     3
 *
franta-hg@1
     4
 * To change the template for this generated file go to
franta-hg@1
     5
 * Window>Preferences>Java>Code Generation>Code and Comments
franta-hg@1
     6
 */
franta-hg@1
     7
package de.laures.cewolf.taglib;
franta-hg@1
     8
franta-hg@1
     9
import java.io.Serializable;
franta-hg@1
    10
import java.util.Date;
franta-hg@1
    11
import java.util.Map;
franta-hg@1
    12
franta-hg@1
    13
import org.apache.commons.logging.Log;
franta-hg@1
    14
import org.apache.commons.logging.LogFactory;
franta-hg@1
    15
import org.jfree.data.general.Dataset;
franta-hg@1
    16
franta-hg@1
    17
import de.laures.cewolf.DatasetProduceException;
franta-hg@1
    18
import de.laures.cewolf.DatasetProducer;
franta-hg@1
    19
import de.laures.cewolf.taglib.util.DatasetProductionTimeStore;
franta-hg@1
    20
import de.laures.cewolf.taglib.util.KeyGenerator;
franta-hg@1
    21
import de.laures.cewolf.util.Assert;
franta-hg@1
    22
franta-hg@1
    23
/**
franta-hg@1
    24
 * @author guido
franta-hg@1
    25
 *
franta-hg@1
    26
 * To change the template for this generated type comment go to
franta-hg@1
    27
 * Window>Preferences>Java>Code Generation>Code and Comments
franta-hg@1
    28
 */
franta-hg@1
    29
public class DataContainer implements DataAware, Serializable {
franta-hg@1
    30
franta-hg@1
    31
    private static transient final Log log = LogFactory.getLog(ChartImageDefinition.class);
franta-hg@1
    32
franta-hg@1
    33
    private transient Dataset data;
franta-hg@1
    34
    private transient DatasetProducer producer;
franta-hg@1
    35
franta-hg@1
    36
    private Map datasetProductionParams;
franta-hg@1
    37
    private long datasetProduceTime;
franta-hg@1
    38
    private boolean useCache = true;
franta-hg@1
    39
franta-hg@1
    40
    public void setDataProductionConfig(DatasetProducer dsp, Map params, boolean useCache) {
franta-hg@1
    41
        log.debug("setDataProductionConfig");
franta-hg@1
    42
        producer = dsp;
franta-hg@1
    43
        datasetProductionParams = params;
franta-hg@1
    44
        this.useCache = useCache;
franta-hg@1
    45
        checkDataProductionNeed();
franta-hg@1
    46
    }
franta-hg@1
    47
franta-hg@1
    48
    public Object getDataset() throws DatasetProduceException {
franta-hg@1
    49
        Assert.check(producer != null, "you need to specifiy a producer for the data of the chart.");
franta-hg@1
    50
        log.debug("getting data..");
franta-hg@1
    51
        if (data == null) {
franta-hg@1
    52
            log.debug("producing new dataset for " + producer.getProducerId());
franta-hg@1
    53
            data = (Dataset) producer.produceDataset(datasetProductionParams);
franta-hg@1
    54
            DatasetProductionTimeStore dataCache = DatasetProductionTimeStore.getInstance();
franta-hg@1
    55
            dataCache.addEntry(producer.getProducerId(), datasetProductionParams, new Date(datasetProduceTime));
franta-hg@1
    56
        }
franta-hg@1
    57
        Assert.check(data != null, "your producer of type " + producer.getClass().getName() + " produced a null dataset.");
franta-hg@1
    58
        return data;
franta-hg@1
    59
    }
franta-hg@1
    60
franta-hg@1
    61
    /**
franta-hg@1
    62
     * This method checks if there has been a dataset production 
franta-hg@1
    63
     * for the same DatasetProvider and parameters. If so the DatasetProducer
franta-hg@1
    64
     * is consulted to check the expiry of this data.
franta-hg@1
    65
     * If the data has expired the retrieval of a cached image of this
franta-hg@1
    66
     * ChartDefinition is avoided by setting the datasetProduceTime to the
franta-hg@1
    67
     * actual time. After this the hash code of this object can not be
franta-hg@1
    68
     * present in the image cache and so a new image with new data will
franta-hg@1
    69
     * be rendered.
franta-hg@1
    70
     * If the data did not expire the last dataset production time is stored
franta-hg@1
    71
     * as a memeber to reach the same hash code for this object as the one
franta-hg@1
    72
     * before if possible.
franta-hg@1
    73
     * This method is called during serialization to ensure the same serialized
franta-hg@1
    74
     * representation of this and a eventually formally stored object.
franta-hg@1
    75
     */
franta-hg@1
    76
    private void checkDataProductionNeed() {
franta-hg@1
    77
        log.debug("checking data actuality..." + producer + ", " + datasetProductionParams);
franta-hg@1
    78
        final String prodId = producer.getProducerId();
franta-hg@1
    79
        log.debug(prodId + ", " + KeyGenerator.generateKey((Serializable)datasetProductionParams));
franta-hg@1
    80
        log.debug("useCache = " + useCache);
franta-hg@1
    81
        DatasetProductionTimeStore dataCache = DatasetProductionTimeStore.getInstance();
franta-hg@1
    82
        if (useCache && dataCache.containsEntry(prodId, datasetProductionParams)) {
franta-hg@1
    83
            Date produceTime = dataCache.getProductionTime(prodId, datasetProductionParams);
franta-hg@1
    84
            log.debug("cached data available.");
franta-hg@1
    85
            // cached data available
franta-hg@1
    86
            if (!producer.hasExpired(datasetProductionParams, produceTime)) {
franta-hg@1
    87
                log.debug("cached data is still valid.");
franta-hg@1
    88
                this.datasetProduceTime = produceTime.getTime();
franta-hg@1
    89
                return;
franta-hg@1
    90
            }
franta-hg@1
    91
            dataCache.removeEntry(prodId, datasetProductionParams);
franta-hg@1
    92
        }
franta-hg@1
    93
        datasetProduceTime = System.currentTimeMillis();
franta-hg@1
    94
    }
franta-hg@1
    95
franta-hg@1
    96
}