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 :