# HG changeset patch # User Ingo Weinzierl # Date 1274348839 0 # Node ID 8a8ee5abc084cb6457ea4bb160a643738949a77d # Parent 70653c29fc1d89b9d1170ae46cc52fa806e7008c Implemented the odv export for timeseries using vector data (Issue27). gnv-artifacts/trunk@1113 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r 70653c29fc1d -r 8a8ee5abc084 gnv-artifacts/ChangeLog --- a/gnv-artifacts/ChangeLog Wed May 19 14:05:33 2010 +0000 +++ b/gnv-artifacts/ChangeLog Thu May 20 09:47:19 2010 +0000 @@ -1,3 +1,14 @@ +2010-05-20 Ingo Weinzierl + + Issue27 - Implemented odv export for vector data of timeseriespoints. + + * src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesVectorOutputState.java: + Implemented the odv export for vector data on timeseriespoints.Therefore, + the getData(.) method for processing vector data has been removed. The + processing needs to take place after getData(.) fetched the data from + database, because it's not necessary to process vector data used for an + odv export (which is fetched via getData(.) as well). + 2010-05-19 Ingo Weinzierl Issue27 - Vector data support for timeseriespoints finished. diff -r 70653c29fc1d -r 8a8ee5abc084 gnv-artifacts/src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesVectorOutputState.java --- a/gnv-artifacts/src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesVectorOutputState.java Wed May 19 14:05:33 2010 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/state/timeseries/TimeSeriesVectorOutputState.java Thu May 20 09:47:19 2010 +0000 @@ -1,21 +1,35 @@ package de.intevation.gnv.state.timeseries; +import au.com.bytecode.opencsv.CSVWriter; + import de.intevation.artifacts.CallContext; +import de.intevation.gnv.artifacts.cache.CacheFactory; + import de.intevation.gnv.chart.Chart; import de.intevation.gnv.chart.ChartLabels; import de.intevation.gnv.chart.TimeSeriesVectorChart; +import de.intevation.gnv.exports.DefaultExport; +import de.intevation.gnv.exports.DefaultProfile; +import de.intevation.gnv.exports.Export; +import de.intevation.gnv.exports.Export.Profile; +import de.intevation.gnv.exports.SimpleOdvDataCollector; + import de.intevation.gnv.geobackend.base.Result; -import de.intevation.gnv.geobackend.base.query.QueryExecutor; -import de.intevation.gnv.geobackend.base.query.QueryExecutorFactory; -import de.intevation.gnv.geobackend.base.query.exception.QueryException; import de.intevation.gnv.utils.VectorDataProcessor; +import de.intevation.gnv.state.exception.StateException; + +import java.io.IOException; +import java.io.OutputStream; + import java.util.Collection; import java.util.Locale; +import net.sf.ehcache.Cache; + import org.apache.log4j.Logger; import org.jfree.chart.ChartTheme; @@ -28,29 +42,83 @@ private static Logger logger = Logger.getLogger(TimeSeriesVectorOutputState.class); + public static final String[] ODV_COLUMN_HEADERS = { + "Cruise", + "Station", + "Type", + "yyyy-mm-dd hh:mm", + "Lon (°E)", + "Lat (°N)", + "Bot. Depth [m]", + "Depth [m]", + "QF", + "XComponent", + "QF", + "YComponent", + "QF", + "ZComponent", + "QF", + "Speed", + "QF", + "Direction", + "QF" + }; + + public static final String[] ODV_PROFILE_NAMES = { + "CRUISE", + "STATION", + "TYPE", + "TIMEVALUE", + "SHAPE", + "BOTDEPTH", + "DEPTH", + "QF", + "XCOMPONENT", + "QF", + "YCOMPONENT", + "QF", + "ZCOMPONENT", + "QF", + "SPEED", + "QF", + "DIRECTION", + "QF"}; + public TimeSeriesVectorOutputState() { } @Override - protected Collection getData(String queryID) { - logger.debug("Fetch chart data from database and convert it."); - try { - String[] filter = generateFilterValuesFromInputData(); - QueryExecutor queryExecutor = - QueryExecutorFactory.getInstance().getQueryExecutor(); + protected Object getChartResult(String uuid, CallContext callContext) { + logger.debug("OutputStateBase.getChartResult"); + CacheFactory factory = CacheFactory.getInstance(); - Collection res = queryExecutor.executeQuery(queryID,filter); - return VectorDataProcessor.process(res); + if (factory.isInitialized()) { + // we use a cache + logger.info("Using cache."); + Cache cache = factory.getCache(); + String key = "chart_" + getHash(uuid); + + net.sf.ehcache.Element value = cache.get(key); + if (value != null) { + logger.debug("Found element in cache."); + return value.getObjectValue(); + } + else { + logger.debug("Element not in cache, we ask the database"); + Collection res = (Collection)getData(queryID); + res = VectorDataProcessor.process(res); + cache.put(new net.sf.ehcache.Element(key, res)); + + return res; + } } - catch (RuntimeException e) { - logger.error(e, e); + else { + // we don't use a cache, so we have to query the database every + // single time + logger.info("Not using a cache."); + return VectorDataProcessor.process(getData(queryID)); } - catch (QueryException e) { - logger.error(e, e); - } - - return null; } @@ -84,5 +152,26 @@ return chart; } + + + @Override + protected void createODV( + OutputStream outputStream, Collection result, String uuid) + throws IOException, StateException + { + logger.info("Start exporting " + result.size() + " items to odv."); + Export export = new DefaultExport( + new SimpleOdvDataCollector(ODV_PROFILE_NAMES)); + + Profile profile = new DefaultProfile( + ODV_COLUMN_HEADERS, + '\t', + CSVWriter.NO_QUOTE_CHARACTER, + CSVWriter.NO_ESCAPE_CHARACTER, + "ODV", + "ISO-8859-1"); + + export.create(profile, outputStream, result); + } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :