ingo@1115: /*
ingo@1115: * Copyright (c) 2010 by Intevation GmbH
ingo@1115: *
ingo@1115: * This program is free software under the LGPL (>=v2.1)
ingo@1115: * Read the file LGPL.txt coming with the software for details
ingo@1115: * or visit http://www.gnu.org/licenses/ if it does not exist.
ingo@1115: */
ingo@1115:
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@1081: import de.intevation.gnv.state.describedata.KeyValueDescibeData;
ingo@1041: import de.intevation.gnv.state.exception.StateException;
ingo@1041:
ingo@1077: import de.intevation.gnv.statistics.Statistics;
ingo@1077: import de.intevation.gnv.statistics.TimeseriesVectorStatistics;
ingo@1077:
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@1081: import java.util.Map;
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@1071: public static final String[] RESULT_COLUMNS = {
ingo@1071: "YORDINATE", "XORDINATE", "GROUP1", "GROUP2", "GROUP3", "GAPID", "SERIES"
ingo@1071: };
ingo@1071:
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@1071: res = VectorDataProcessor.process(res, RESULT_COLUMNS);
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@1071: return VectorDataProcessor.process(
ingo@1071: getData(queryID), RESULT_COLUMNS);
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@1081: protected Chart[] getHistograms(
ingo@1081: String uuid,
ingo@1081: CallContext callContext,
ingo@1081: Collection parameters,
ingo@1081: Collection measurements,
ingo@1081: Collection dates,
ingo@1081: Map requestParameter
ingo@1081: ) {
ingo@1081: Collection results = (Collection) getChartResult(uuid, callContext);
ingo@1081: ChartTheme theme = createStyle(callContext);
ingo@1081:
ingo@1081: return VectorDataProcessor.getHistograms(
ingo@1081: uuid, callContext, results, theme, requestParameter);
ingo@1081: }
ingo@1081:
ingo@1081:
ingo@1081: @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@1077:
ingo@1077:
ingo@1077: protected Statistics getStatisticsGenerator() {
ingo@1077: return new TimeseriesVectorStatistics();
ingo@1077: }
ingo@1040: }
ingo@1040: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :