tim@113: /** tim@113: * tim@113: */ tim@113: package de.intevation.gnv.transition.profile.horizontal; tim@113: ingo@331: import com.vividsolutions.jts.geom.Point; ingo@331: import com.vividsolutions.jts.io.WKTReader; ingo@331: import com.vividsolutions.jts.io.ParseException; ingo@331: tim@113: import java.io.IOException; tim@113: import java.io.OutputStream; tim@177: import java.io.UnsupportedEncodingException; ingo@331: import java.text.SimpleDateFormat; tim@113: import java.util.Collection; ingo@331: import java.util.Date; ingo@331: import java.util.Iterator; ingo@300: import java.util.Locale; ingo@300: tim@177: import org.apache.log4j.Logger; tim@177: ingo@300: import de.intevation.gnv.chart.Chart; tim@113: import de.intevation.gnv.chart.ChartLabels; ingo@300: import de.intevation.gnv.chart.HorizontalProfileChart; tim@177: import de.intevation.gnv.geobackend.base.Result; tim@113: import de.intevation.gnv.statistics.HorizontalProfileStatistics; tim@113: import de.intevation.gnv.statistics.Statistics; tim@177: import de.intevation.gnv.transition.exception.TransitionException; tim@113: import de.intevation.gnv.transition.timeseries.TimeSeriesOutputTransition; tim@113: ingo@234: import de.intevation.gnv.exports.DefaultExport; ingo@235: import de.intevation.gnv.exports.ShapeDataCollector; ingo@234: import de.intevation.gnv.exports.DefaultProfile; ingo@234: import de.intevation.gnv.exports.Export.Profile; ingo@331: import de.intevation.gnv.transition.describedata.KeyValueDescibeData; ingo@234: tim@113: /** tim@113: * @author Tim Englich tim@171: * tim@113: */ tim@171: public class HorizontalProfileOutputTransition extends tim@171: TimeSeriesOutputTransition { tim@113: /** tim@113: * The UID of this class tim@113: */ tim@113: private static final long serialVersionUID = 4401516087492028840L; tim@113: tim@177: private static Logger log = Logger tim@177: .getLogger(HorizontalProfileOutputTransition.class); ingo@234: ingo@331: public static final String DATE_FORMAT = "yyyy.MM.dd HH:mm:ss"; ingo@331: ingo@331: public static final String [] CHART_TITLE_META = { ingo@331: "CRUISE", ingo@331: "DEPTH", ingo@331: "SHAPE" ingo@331: }; ingo@331: ingo@331: ingo@331: public static final String [] CHART_TITLE_META_RESSOURCES = { ingo@331: "cruiseid", ingo@331: "depth", ingo@331: "coordinate" ingo@331: }; ingo@331: ingo@234: public static final String [] TIMESERIES_CSV_PROFILE_NAMES = { ingo@234: "SHAPE", ingo@234: "YORDINATE", ingo@234: "GROUP1", ingo@234: "GROUP2", ingo@234: "GROUP3" ingo@234: }; ingo@234: ingo@234: public static final Profile TIMESERIES_CSV_PROFILE = ingo@234: new DefaultProfile( ingo@239: null, ingo@234: ',', ingo@234: '"', ingo@234: '"', ingo@234: "CSV", ingo@234: "ISO-8859-1"); ingo@234: tim@113: /** tim@113: * Constructor tim@113: */ tim@113: public HorizontalProfileOutputTransition() { tim@113: super(); tim@185: super.domainLable = "Distance [km]"; tim@113: } ingo@310: ingo@310: tim@307: @Override ingo@300: protected Chart getChart( ingo@300: ChartLabels chartLables, ingo@300: Collection parameters, ingo@300: Collection measurements, ingo@310: Collection dates, ingo@300: Collection result, ingo@300: Locale locale, ingo@327: String uuid, ingo@327: boolean linesVisible, ingo@327: boolean shapesVisible ingo@300: ) { ingo@300: Chart chart = null; ingo@300: ingo@300: if (CACHE_CHART) { ingo@300: log.info("Try to get horizontalprofile chart from cache."); ingo@300: chart = (Chart) getChartFromCache(uuid); ingo@300: } ingo@300: ingo@300: if (chart != null) ingo@300: return chart; ingo@300: ingo@300: log.info("Chart not in cache yet."); ingo@300: chart = new HorizontalProfileChart( ingo@300: chartLables, tim@307: createStyle(), ingo@300: parameters, ingo@300: measurements, ingo@310: dates, ingo@300: result, ingo@310: null, ingo@327: locale, ingo@327: linesVisible, ingo@327: shapesVisible ingo@300: ); ingo@300: chart.generateChart(); ingo@300: ingo@300: if (CACHE_CHART) { ingo@300: log.info("Put chart into cache."); ingo@300: purifyChart(chart, uuid); ingo@300: } ingo@300: ingo@300: return chart; tim@113: } tim@113: ingo@300: tim@113: /** tim@113: * @see de.intevation.gnv.transition.timeseries.TimeSeriesOutputTransition#getStatisticsGenerator() tim@113: */ tim@113: @Override tim@113: protected Statistics getStatisticsGenerator() { tim@171: return new HorizontalProfileStatistics(); tim@113: } tim@113: tim@177: @Override tim@177: protected void createCSV(OutputStream outputStream, tim@177: Collection chartResult) tim@177: throws UnsupportedEncodingException, tim@177: IOException, tim@177: TransitionException { tim@177: ingo@234: log.debug("createCSV for HorizontalProfileOutputTransition."); ingo@234: DefaultExport export = new DefaultExport( ingo@235: new ShapeDataCollector(TIMESERIES_CSV_PROFILE_NAMES)); ingo@234: ingo@234: export.create(TIMESERIES_CSV_PROFILE, outputStream, chartResult); tim@177: } ingo@331: ingo@331: ingo@331: protected String createChartTitle(Locale locale, String uuid) { ingo@331: String fisName = getFisName(locale); ingo@331: log.debug("created title for horizontal profile chart: " + fisName); ingo@331: ingo@331: return fisName; ingo@331: } ingo@331: ingo@331: ingo@331: protected String createChartSubtitle(Locale locale, String uuid) { ingo@331: log.debug("create chart subtitle."); ingo@331: String subtitle = createTimePeriod(locale, uuid); ingo@331: ingo@331: // ODV results contain meta information about cruise, station and so on ingo@331: Collection results = getODVResult(uuid); ingo@331: if (results != null) { ingo@331: Iterator iter = results.iterator(); ingo@331: Result result = iter.hasNext() ? (Result) iter.next() : null; ingo@331: ingo@331: subtitle += subtitle.length() != 0 ? "\n" : ""; ingo@331: subtitle += createMetaChartSubtitle(locale, result); ingo@331: } ingo@331: ingo@331: return subtitle; ingo@331: } ingo@331: ingo@331: ingo@331: protected String createMetaChartSubtitle(Locale locale, Result result) { ingo@331: log.debug("Fetch meta information and put it into subtitle."); ingo@331: if (result == null) ingo@331: return ""; ingo@331: ingo@331: StringBuilder meta = new StringBuilder(); ingo@331: WKTReader wktReader = new WKTReader(); ingo@331: ingo@331: ingo@331: for (int i = 0; i < CHART_TITLE_META.length; i++) { ingo@331: String qry = CHART_TITLE_META[i]; ingo@331: ingo@331: if (qry.equals("SHAPE")) { ingo@331: try { ingo@331: Point p = (Point) wktReader.read(result.getString(qry)); ingo@331: ingo@331: meta.append(getMessage(locale,"coordinate","coordinate")); ingo@331: meta.append(": "); ingo@331: ingo@331: log.debug( ingo@331: "Add " + qry + " to meta information of subtitle: " ingo@331: + p.toString() ingo@331: ); ingo@331: meta.append(p.getX() + ", " + p.getY()); ingo@331: } ingo@331: catch (ParseException pe) { ingo@331: log.warn("Error while parsing point.", pe); ingo@331: } ingo@331: } ingo@331: else { ingo@331: log.debug( ingo@331: "Add " + qry + " to meta information of subtitle: " ingo@331: + result.getString(qry) ingo@331: ); ingo@331: meta.append(getMessage( ingo@331: locale, ingo@331: CHART_TITLE_META_RESSOURCES[i], ingo@331: CHART_TITLE_META_RESSOURCES[i] ingo@331: )); ingo@331: meta.append(": "); ingo@331: meta.append(result.getString(qry)); ingo@331: } ingo@331: ingo@331: if (i != CHART_TITLE_META.length-1) ingo@331: meta.append("\n"); ingo@331: } ingo@331: ingo@331: log.debug("Meta title for chart: " + meta.toString()); ingo@331: return meta.toString(); ingo@331: } ingo@331: ingo@331: ingo@331: protected String createTimePeriod(Locale locale, String uuid) { ingo@331: log.debug("create time period for chart subtitle."); ingo@331: String subTitle = null; ingo@331: Date startDate = null; ingo@331: Date endDate = null; ingo@331: ingo@331: Collection dates = getDates(uuid); ingo@331: if (dates == null) { ingo@331: log.debug("No time period for subtitle."); ingo@331: return ""; ingo@331: } ingo@331: ingo@331: SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT); ingo@331: KeyValueDescibeData data = null; ingo@331: ingo@331: Iterator iter = dates.iterator(); ingo@331: while (iter.hasNext()) { ingo@331: try { ingo@331: data = (KeyValueDescibeData)iter.next(); ingo@331: ingo@331: if (!data.isSelected()) ingo@331: continue; ingo@331: ingo@331: Date current = format.parse(data.getValue()); ingo@331: long time = current.getTime(); ingo@331: ingo@331: if (startDate == null) { ingo@331: startDate = current; ingo@331: endDate = current; ingo@331: } ingo@331: else if (time < startDate.getTime()) { ingo@331: startDate = current; ingo@331: } ingo@331: else if (time > endDate.getTime()) { ingo@331: endDate = current; ingo@331: } ingo@331: } ingo@331: catch (java.text.ParseException pe) { ingo@331: log.warn("Error while parsing date: " + data.getValue(), pe); ingo@331: } ingo@331: } ingo@331: ingo@331: subTitle = format.format(startDate) + " - " + format.format(endDate); ingo@331: log.debug("created title for horizontal profile chart: " + subTitle); ingo@331: ingo@331: return subTitle; ingo@331: } tim@113: }