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