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