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