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 :