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 :