ingo@1040: package de.intevation.gnv.state.timeseries;
ingo@1040:
ingo@1041: import au.com.bytecode.opencsv.CSVWriter;
ingo@1041:
ingo@1040: import de.intevation.artifacts.CallContext;
ingo@1040:
ingo@1041: import de.intevation.gnv.artifacts.cache.CacheFactory;
ingo@1041:
ingo@1040: import de.intevation.gnv.chart.Chart;
ingo@1040: import de.intevation.gnv.chart.ChartLabels;
ingo@1040: import de.intevation.gnv.chart.TimeSeriesVectorChart;
ingo@1040:
ingo@1041: import de.intevation.gnv.exports.DefaultExport;
ingo@1041: import de.intevation.gnv.exports.DefaultProfile;
ingo@1041: import de.intevation.gnv.exports.Export;
ingo@1041: import de.intevation.gnv.exports.Export.Profile;
ingo@1041: import de.intevation.gnv.exports.SimpleOdvDataCollector;
ingo@1041:
ingo@1040: import de.intevation.gnv.geobackend.base.Result;
ingo@1040:
ingo@1040: import de.intevation.gnv.utils.VectorDataProcessor;
ingo@1040:
ingo@1041: import de.intevation.gnv.state.exception.StateException;
ingo@1041:
ingo@1041: import java.io.IOException;
ingo@1041: import java.io.OutputStream;
ingo@1041:
ingo@1040: import java.util.Collection;
ingo@1040: import java.util.Locale;
ingo@1040:
ingo@1041: import net.sf.ehcache.Cache;
ingo@1041:
ingo@1040: import org.apache.log4j.Logger;
ingo@1040:
ingo@1040: import org.jfree.chart.ChartTheme;
ingo@1040:
ingo@1040: /**
ingo@1040: * @author Ingo Weinzierl
ingo@1040: */
ingo@1040: public class TimeSeriesVectorOutputState extends TimeSeriesOutputState {
ingo@1040:
ingo@1040: private static Logger logger =
ingo@1040: Logger.getLogger(TimeSeriesVectorOutputState.class);
ingo@1040:
ingo@1041: public static final String[] ODV_COLUMN_HEADERS = {
ingo@1041: "Cruise",
ingo@1041: "Station",
ingo@1041: "Type",
ingo@1041: "yyyy-mm-dd hh:mm",
ingo@1041: "Lon (°E)",
ingo@1041: "Lat (°N)",
ingo@1041: "Bot. Depth [m]",
ingo@1041: "Depth [m]",
ingo@1041: "QF",
ingo@1041: "XComponent",
ingo@1041: "QF",
ingo@1041: "YComponent",
ingo@1041: "QF",
ingo@1041: "ZComponent",
ingo@1041: "QF",
ingo@1041: "Speed",
ingo@1041: "QF",
ingo@1041: "Direction",
ingo@1041: "QF"
ingo@1041: };
ingo@1041:
ingo@1041: public static final String[] ODV_PROFILE_NAMES = {
ingo@1041: "CRUISE",
ingo@1041: "STATION",
ingo@1041: "TYPE",
ingo@1041: "TIMEVALUE",
ingo@1041: "SHAPE",
ingo@1041: "BOTDEPTH",
ingo@1041: "DEPTH",
ingo@1041: "QF",
ingo@1041: "XCOMPONENT",
ingo@1041: "QF",
ingo@1041: "YCOMPONENT",
ingo@1041: "QF",
ingo@1041: "ZCOMPONENT",
ingo@1041: "QF",
ingo@1041: "SPEED",
ingo@1041: "QF",
ingo@1041: "DIRECTION",
ingo@1041: "QF"};
ingo@1041:
ingo@1040: public TimeSeriesVectorOutputState() {
ingo@1040: }
ingo@1040:
ingo@1040:
ingo@1040: @Override
ingo@1041: protected Object getChartResult(String uuid, CallContext callContext) {
ingo@1041: logger.debug("OutputStateBase.getChartResult");
ingo@1041: CacheFactory factory = CacheFactory.getInstance();
ingo@1040:
ingo@1041: if (factory.isInitialized()) {
ingo@1041: // we use a cache
ingo@1041: logger.info("Using cache.");
ingo@1041: Cache cache = factory.getCache();
ingo@1060: String key = "chart_" + getHash();
ingo@1041:
ingo@1041: net.sf.ehcache.Element value = cache.get(key);
ingo@1041: if (value != null) {
ingo@1041: logger.debug("Found element in cache.");
ingo@1041: return value.getObjectValue();
ingo@1041: }
ingo@1041: else {
ingo@1041: logger.debug("Element not in cache, we ask the database");
ingo@1041: Collection res = (Collection)getData(queryID);
ingo@1041: res = VectorDataProcessor.process(res);
ingo@1041: cache.put(new net.sf.ehcache.Element(key, res));
ingo@1041:
ingo@1041: return res;
ingo@1041: }
ingo@1040: }
ingo@1041: else {
ingo@1041: // we don't use a cache, so we have to query the database every
ingo@1041: // single time
ingo@1041: logger.info("Not using a cache.");
ingo@1041: return VectorDataProcessor.process(getData(queryID));
ingo@1040: }
ingo@1040: }
ingo@1040:
ingo@1040:
ingo@1040: @Override
ingo@1040: protected Chart getChart(
ingo@1040: ChartLabels chartLables,
ingo@1040: ChartTheme theme,
ingo@1040: Collection parameters,
ingo@1040: Collection measurements,
ingo@1040: Collection dates,
ingo@1040: Object result,
ingo@1040: Locale locale,
ingo@1040: String uuid,
ingo@1040: boolean linesVisible,
ingo@1040: boolean shapesVisible,
ingo@1040: CallContext callContext
ingo@1040: ) {
ingo@1040: Chart chart = new TimeSeriesVectorChart(
ingo@1040: chartLables,
ingo@1040: theme,
ingo@1040: parameters,
ingo@1040: measurements,
ingo@1040: dates,
ingo@1040: (Collection)result,
ingo@1040: timeGapDefinitions,
ingo@1040: locale,
ingo@1040: linesVisible,
ingo@1040: shapesVisible
ingo@1040: );
ingo@1040: chart.generateChart();
ingo@1040:
ingo@1040: return chart;
ingo@1040: }
ingo@1041:
ingo@1041:
ingo@1041: @Override
ingo@1041: protected void createODV(
ingo@1041: OutputStream outputStream, Collection result, String uuid)
ingo@1041: throws IOException, StateException
ingo@1041: {
ingo@1041: logger.info("Start exporting " + result.size() + " items to odv.");
ingo@1041: Export export = new DefaultExport(
ingo@1041: new SimpleOdvDataCollector(ODV_PROFILE_NAMES));
ingo@1041:
ingo@1041: Profile profile = new DefaultProfile(
ingo@1041: ODV_COLUMN_HEADERS,
ingo@1041: '\t',
ingo@1041: CSVWriter.NO_QUOTE_CHARACTER,
ingo@1041: CSVWriter.NO_ESCAPE_CHARACTER,
ingo@1041: "ODV",
ingo@1041: "ISO-8859-1");
ingo@1041:
ingo@1041: export.create(profile, outputStream, result);
ingo@1041: }
ingo@1040: }
ingo@1040: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :