ingo@2706: package de.intevation.flys.exports; ingo@2706: ingo@2706: import org.apache.log4j.Logger; ingo@2706: ingo@2706: import org.jfree.data.xy.XYSeries; ingo@2706: ingo@2706: import org.w3c.dom.Document; ingo@2706: ingo@2706: import de.intevation.artifactdatabase.state.ArtifactAndFacet; ingo@2706: import de.intevation.artifactdatabase.state.Facet; ingo@2706: ingo@2706: import de.intevation.flys.artifacts.FLYSArtifact; ingo@2706: ingo@2706: import de.intevation.flys.artifacts.model.FacetTypes; ingo@2706: import de.intevation.flys.artifacts.model.FlowVelocityData; ingo@2706: ingo@2706: import de.intevation.flys.jfree.FLYSAnnotation; ingo@2706: import de.intevation.flys.jfree.StyledXYSeries; ingo@2706: ingo@2706: import de.intevation.flys.utils.FLYSUtils; ingo@2706: ingo@2706: ingo@2706: ingo@2706: /** ingo@2706: * An OutGenerator that generates flow velocity curves. ingo@2706: * ingo@2706: * @author Ingo Weinzierl ingo@2706: */ ingo@2706: public class FlowVelocityGenerator ingo@2706: extends XYChartGenerator ingo@2706: implements FacetTypes ingo@2706: { ingo@2706: public enum YAXIS { ingo@2706: V(0), ingo@2706: T(1); ingo@2706: protected int idx; ingo@2706: private YAXIS(int c) { ingo@2706: idx = c; ingo@2706: } ingo@2706: } ingo@2706: ingo@2706: /** The logger that is used in this generator. */ ingo@2706: private static Logger logger = Logger.getLogger(FlowVelocityGenerator.class); ingo@2706: ingo@2706: /** Key to look up internationalized String for annotations label. */ ingo@2706: public static final String I18N_ANNOTATIONS_LABEL = ingo@2706: "chart.flow_velocity.annotations.label"; ingo@2706: ingo@2706: /** ingo@2706: * Key to look up internationalized String for LongitudinalSection diagrams ingo@2706: * titles. ingo@2706: */ ingo@2706: public static final String I18N_CHART_TITLE = ingo@2706: "chart.flow_velocity.section.title"; ingo@2706: ingo@2706: /** ingo@2706: * Key to look up internationalized String for LongitudinalSection diagrams ingo@2706: * subtitles. ingo@2706: */ ingo@2706: public static final String I18N_CHART_SUBTITLE = ingo@2706: "chart.flow_velocity.section.subtitle"; ingo@2706: ingo@2706: /** ingo@2706: * Key to look up internationalized String for LongitudinalSection diagrams ingo@2706: * short subtitles. ingo@2706: */ ingo@2706: public static final String I18N_CHART_SHORT_SUBTITLE = ingo@2706: "chart.flow_velocity.section.shortsubtitle"; ingo@2706: ingo@2706: public static final String I18N_XAXIS_LABEL = ingo@2706: "chart.flow_velocity.section.xaxis.label"; ingo@2706: ingo@2706: public static final String I18N_YAXIS_LABEL = ingo@2706: "chart.flow_velocity.section.yaxis.label"; ingo@2706: ingo@2706: public static final String I18N_2YAXIS_LABEL = ingo@2706: "chart.flow_velocity.section.yaxis.second.label"; ingo@2706: ingo@2706: public static final String I18N_CHART_TITLE_DEFAULT = "Geschwindigkeit- und Schubspannung"; ingo@2706: public static final String I18N_XAXIS_LABEL_DEFAULT = "km"; ingo@2706: public static final String I18N_YAXIS_LABEL_DEFAULT = "Geschwindigkeit v [m/s]"; ingo@2706: public static final String I18N_2YAXIS_LABEL_DEFAULT = "Schubspannung Tau [N]"; ingo@2706: ingo@2706: ingo@2706: ingo@2706: @Override ingo@2706: protected YAxisWalker getYAxisWalker() { ingo@2706: return new YAxisWalker() { ingo@2706: @Override ingo@2706: public int length() { ingo@2706: return YAXIS.values().length; ingo@2706: } ingo@2706: ingo@2706: @Override ingo@2706: public String getId(int idx) { ingo@2706: YAXIS[] yaxes = YAXIS.values(); ingo@2706: return yaxes[idx].toString(); ingo@2706: } ingo@2706: }; ingo@2706: } ingo@2706: ingo@2706: ingo@2706: /** ingo@2706: * Returns the default title for this chart. ingo@2706: * ingo@2706: * @return the default title for this chart. ingo@2706: */ ingo@2706: @Override ingo@2706: public String getDefaultChartTitle() { ingo@2706: Object[] args = new Object[] { ingo@2706: getRiverName() ingo@2706: }; ingo@2706: ingo@2706: return msg(I18N_CHART_TITLE, I18N_CHART_TITLE_DEFAULT, args); ingo@2706: } ingo@2706: ingo@2706: ingo@2706: /** ingo@2706: * Get internationalized label for the x axis. ingo@2706: */ ingo@2706: @Override ingo@2706: protected String getDefaultXAxisLabel() { ingo@2706: FLYSArtifact flys = (FLYSArtifact) master; ingo@2706: ingo@2706: return msg( ingo@2706: I18N_XAXIS_LABEL, ingo@2706: I18N_XAXIS_LABEL_DEFAULT, ingo@2706: new Object[] { FLYSUtils.getRiver(flys).getName() }); ingo@2706: } ingo@2706: ingo@2706: ingo@2706: @Override ingo@2706: protected String getDefaultYAxisLabel(int index) { ingo@2706: String label = "default"; ingo@2706: ingo@2706: if (index == YAXIS.V.idx) { ingo@2706: label = getVAxisLabel(); ingo@2706: } ingo@2706: else if (index == YAXIS.T.idx) { ingo@2706: label = getTAxisLabel(); ingo@2706: } ingo@2706: ingo@2706: return label; ingo@2706: } ingo@2706: ingo@2706: ingo@2706: /** ingo@2706: * Get internationalized label for the y axis. ingo@2706: */ ingo@2706: protected String getVAxisLabel() { ingo@2706: return msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL_DEFAULT); ingo@2706: } ingo@2706: ingo@2706: ingo@2706: /** ingo@2706: * Get internationalized label for the y axis. ingo@2706: */ ingo@2706: protected String getTAxisLabel() { ingo@2706: return msg(I18N_2YAXIS_LABEL, I18N_2YAXIS_LABEL_DEFAULT); ingo@2706: } ingo@2706: ingo@2706: ingo@2706: /** ingo@2706: * Produce output. felix@3270: * @param artifactAndFacet current facet. ingo@2706: * @param attr theme for facet felix@3270: * @param visible Whether this facets data is actually visible or not. ingo@2706: */ ingo@2706: public void doOut( ingo@2706: ArtifactAndFacet artifactAndFacet, ingo@2706: Document attr, ingo@2706: boolean visible ingo@2706: ) { ingo@2706: String name = artifactAndFacet.getFacetName(); ingo@2706: ingo@2706: logger.debug("FlowVelocityGenerator.doOut: " + name); ingo@2706: ingo@2706: if (name == null) { ingo@2706: logger.error("No facet name for doOut(). No output generated!"); ingo@2706: return; ingo@2706: } ingo@2706: ingo@2706: Facet facet = artifactAndFacet.getFacet(); ingo@2706: ingo@2706: if (facet == null) { ingo@2706: return; ingo@2706: } ingo@2706: ingo@2706: if (name.equals(FLOW_VELOCITY_MAINCHANNEL)) { ingo@2706: doMainChannelOut( ingo@2706: (FlowVelocityData) artifactAndFacet.getData(context), ingo@2706: artifactAndFacet, ingo@2706: attr, ingo@2706: visible); ingo@2706: } ingo@2706: else if (name.equals(FLOW_VELOCITY_TOTALCHANNEL)) { ingo@2706: doTotalChannelOut( ingo@2706: (FlowVelocityData) artifactAndFacet.getData(context), ingo@2706: artifactAndFacet, ingo@2706: attr, ingo@2706: visible); ingo@2706: } ingo@2706: else if (name.equals(FLOW_VELOCITY_TAU)) { ingo@2706: doTauOut( ingo@2706: (FlowVelocityData) artifactAndFacet.getData(context), ingo@2706: artifactAndFacet, ingo@2706: attr, ingo@2706: visible); ingo@2706: } ingo@2706: else if (name.equals(FLOW_VELOCITY_ANNOTATION)) { ingo@2706: doAnnotations( ingo@2706: (FLYSAnnotation) artifactAndFacet.getData(context), ingo@2706: artifactAndFacet, ingo@2706: attr, ingo@2706: visible); ingo@2706: } ingo@2706: else if (FacetTypes.IS.AREA(name)) { ingo@2706: doArea( ingo@2706: artifactAndFacet.getData(context), ingo@2706: artifactAndFacet, ingo@2706: attr, ingo@2706: visible); ingo@2706: } ingo@2706: else if (FacetTypes.IS.MANUALPOINTS(name)) { ingo@2706: doPoints( ingo@2706: artifactAndFacet.getData(context), ingo@2706: artifactAndFacet, ingo@2706: attr, ingo@2706: visible, ingo@2706: YAXIS.V.idx); ingo@2706: } ingo@2706: else { ingo@2706: logger.warn("Unknown facet name: " + name); ingo@2706: return; ingo@2706: } ingo@2706: } ingo@2706: ingo@2706: ingo@2706: /** ingo@2706: * Process the output for W facets in a longitudinal section curve. ingo@2706: * ingo@2706: * @param data A FlowVelocityData object felix@3270: * @param aandf The facet. This facet does NOT support any data objects. Use ingo@2706: * FLYSArtifact.getNativeFacet() instead to retrieve a Facet which supports ingo@2706: * data. ingo@2706: * @param theme The theme that contains styling information. ingo@2706: * @param visible The visibility of the curve. ingo@2706: */ ingo@2706: protected void doMainChannelOut( ingo@2706: FlowVelocityData data, ingo@2706: ArtifactAndFacet aandf, ingo@2706: Document theme, ingo@2706: boolean visible ingo@2706: ) { ingo@2706: logger.debug("FlowVelocityGenerator.doMainChannelOut"); ingo@2706: ingo@2706: XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme); ingo@2706: ingo@2706: StyledSeriesBuilder.addPoints(series, data.getMainChannelPoints(), true); ingo@2706: ingo@2706: addAxisSeries(series, YAXIS.V.idx, visible); ingo@2706: } ingo@2706: ingo@2706: ingo@2706: /** ingo@2706: * Add items to dataseries which describes the differences. ingo@2706: */ ingo@2706: protected void doTotalChannelOut( ingo@2706: FlowVelocityData data, ingo@2706: ArtifactAndFacet aandf, ingo@2706: Document theme, ingo@2706: boolean visible ingo@2706: ) { ingo@2706: logger.debug("FlowVelocityGenerator.doTotalChannelOut"); ingo@2706: ingo@2706: if (data == null) { ingo@2706: logger.warn("No data to add to FlowVelocity chart."); ingo@2706: return; ingo@2706: } ingo@2706: ingo@2706: XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme); ingo@2706: ingo@2706: StyledSeriesBuilder.addPoints(series, data.getTotalChannelPoints(), true); ingo@2706: ingo@2706: addAxisSeries(series, YAXIS.V.idx, visible); ingo@2706: } ingo@2706: ingo@2706: ingo@2706: ingo@2706: /** ingo@2706: * @param data A FlowVelocityData object felix@3270: * @param aandf The facet. This facet does NOT support any data objects. Use ingo@2706: * FLYSArtifact.getNativeFacet() instead to retrieve a Facet which supports ingo@2706: * data. ingo@2706: * @param theme The theme that contains styling information. ingo@2706: * @param visible The visibility of the curve. ingo@2706: */ ingo@2706: protected void doTauOut( ingo@2706: FlowVelocityData data, ingo@2706: ArtifactAndFacet aandf, ingo@2706: Document theme, ingo@2706: boolean visible ingo@2706: ) { ingo@2706: logger.debug("FlowVelocityGenerator.doTauOut"); ingo@2706: ingo@2706: XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme); ingo@2706: ingo@2706: StyledSeriesBuilder.addPoints(series, data.getTauPoints(), true); ingo@2706: ingo@2706: addAxisSeries(series, YAXIS.T.idx, visible); ingo@2706: } ingo@2706: ingo@2706: ingo@2706: /** Look up the axis identifier for a given facet type. */ ingo@2706: public int axisIdxForFacet(String facetName) { ingo@2706: if (FacetTypes.IS.V(facetName)) { ingo@2706: return YAXIS.V.idx; ingo@2706: } ingo@2706: else if (FacetTypes.IS.T(facetName)) { ingo@2706: return YAXIS.T.idx; ingo@2706: } ingo@2706: else { ingo@2706: logger.warn("Could not find axis for facet " + facetName); ingo@2706: return YAXIS.V.idx; ingo@2706: } ingo@2706: } ingo@2706: ingo@2706: ingo@2706: /** ingo@2706: * Do Area out. ingo@2706: * @param theme styling information. ingo@2706: * @param visible whether or not visible. ingo@2706: */ ingo@2706: protected void doArea( ingo@2706: Object o, ingo@2706: ArtifactAndFacet aandf, ingo@2706: Document theme, ingo@2706: boolean visible ingo@2706: ) { ingo@2706: logger.debug("FlowVelocityGenerator.doArea"); ingo@2706: logger.warn("TODO: Implement FlowVelocityGenerator.doArea"); ingo@2706: } ingo@2706: } ingo@2706: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :