[PATCH 2 of 2] Zusammenführen
Wald Commits
scm-commit at wald.intevation.org
Thu Sep 27 17:41:42 CEST 2018
# HG changeset patch
# User gernotbelger
# Date 1538062904 -7200
# Node ID 7b4b66c7b3038972d2b7d66c36a7a23725fa2ca3
# Parent d6d5ca6d4af0ed0ab6f0f5b663f148de13a26e3b
# Parent d8e753d0fdb9e773d02f10af2a8e5f2dab8e3580
Zusammenführen
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/doc/conf/jasper/templates/sinfo.floodduration.jrxml
--- a/artifacts/doc/conf/jasper/templates/sinfo.floodduration.jrxml Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/doc/conf/jasper/templates/sinfo.floodduration.jrxml Thu Sep 27 17:41:44 2018 +0200
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Created with Jaspersoft Studio version 6.5.1.final using JasperReports Library version 4.5.0 -->
-<!-- 2018-07-31T13:53:40 -->
+<!-- Created with Jaspersoft Studio version 6.6.0.final using JasperReports Library version 4.5.0 -->
+<!-- 2018-09-20T13:25:41 -->
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="flysreport" language="groovy" pageWidth="842" pageHeight="595" orientation="Landscape" columnWidth="762" leftMargin="60" rightMargin="20" topMargin="20" bottomMargin="20">
<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
@@ -219,7 +219,7 @@
<textFieldExpression><![CDATA[$F{meta:bezeichnung_1_header}]]></textFieldExpression>
</textField>
<textField isStretchWithOverflow="true">
- <reportElement key="" style="htmlStyle" positionType="Float" stretchType="RelativeToBandHeight" x="600" y="0" width="70" height="24"/>
+ <reportElement key="gauge_header" style="htmlStyle" positionType="Float" stretchType="RelativeToBandHeight" x="600" y="0" width="70" height="24"/>
<box padding="5"/>
<textElement textAlignment="Left" verticalAlignment="Bottom"/>
<textFieldExpression><![CDATA[$F{meta:gauge_header}]]></textFieldExpression>
@@ -345,7 +345,7 @@
<textFieldExpression><![CDATA[$F{data:9}]]></textFieldExpression>
</textField>
<textField isStretchWithOverflow="true" isBlankWhenNull="true">
- <reportElement key="" style="htmlStyle" positionType="Float" stretchType="RelativeToBandHeight" x="600" y="0" width="70" height="15"/>
+ <reportElement key="gauge_header" style="htmlStyle" positionType="Float" stretchType="RelativeToBandHeight" x="600" y="0" width="70" height="15"/>
<box topPadding="2" leftPadding="5" bottomPadding="0" rightPadding="5">
<topPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/>
<leftPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/>
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/doc/conf/jasper/templates/sinfo.floodduration2.jrxml
--- a/artifacts/doc/conf/jasper/templates/sinfo.floodduration2.jrxml Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/doc/conf/jasper/templates/sinfo.floodduration2.jrxml Thu Sep 27 17:41:44 2018 +0200
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Created with Jaspersoft Studio version 6.5.1.final using JasperReports Library version 4.5.0 -->
-<!-- 2018-07-31T13:53:38 -->
+<!-- Created with Jaspersoft Studio version 6.6.0.final using JasperReports Library version 4.5.0 -->
+<!-- 2018-09-20T13:27:46 -->
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="flysreport" language="groovy" pageWidth="842" pageHeight="595" orientation="Landscape" columnWidth="762" leftMargin="60" rightMargin="20" topMargin="20" bottomMargin="20">
<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
@@ -267,7 +267,7 @@
<textFieldExpression><![CDATA[$F{meta:bezeichnung_3_header}]]></textFieldExpression>
</textField>
<textField isStretchWithOverflow="true">
- <reportElement key="" style="htmlStyle" positionType="Float" stretchType="RelativeToBandHeight" x="684" y="0" width="50" height="24"/>
+ <reportElement key="gauge_header" style="htmlStyle" positionType="Float" stretchType="RelativeToBandHeight" x="684" y="0" width="50" height="24"/>
<box padding="2"/>
<textElement textAlignment="Left" verticalAlignment="Bottom"/>
<textFieldExpression><![CDATA[$F{meta:gauge_header}]]></textFieldExpression>
@@ -481,7 +481,7 @@
<textFieldExpression><![CDATA[$F{data:17}]]></textFieldExpression>
</textField>
<textField isStretchWithOverflow="true" isBlankWhenNull="true">
- <reportElement key="" style="htmlStyle" positionType="Float" stretchType="RelativeToBandHeight" x="684" y="0" width="50" height="15"/>
+ <reportElement key="gauge_header" style="htmlStyle" positionType="Float" stretchType="RelativeToBandHeight" x="684" y="0" width="50" height="15"/>
<box padding="2">
<topPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/>
<leftPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/>
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/doc/conf/meta-data.xml
--- a/artifacts/doc/conf/meta-data.xml Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/doc/conf/meta-data.xml Thu Sep 27 17:41:44 2018 +0200
@@ -142,10 +142,10 @@
<dc:when test="$out = 'sinfo_flood_height'">
<dc:call-macro name="annotations" />
</dc:when>
- <!--TODO sinfo_floodduration_curve: mainvalues wie in winfo-duration_curve unterstuetzen-->
+ <!--TODO sinfo_floodduration_curve: mainvalues wie in winfo-duration_curve unterstuetzen -->
<!--dc:when test="$out = 'sinfo_floodduration_curve'">
<dc:call-macro name="mainvalues" />
- </dc:when-->
+ </dc:when -->
<dc:when test="$out = 'uinfo_salix_line'">
<dc:call-macro name="annotations" />
</dc:when>
@@ -328,13 +328,13 @@
<dc:when test="$out = 'sinfo_flood_height'">
<dc:call-macro name="longitudinal-section-prototype" />
</dc:when>
- <!--TODO sinfo_floodduration_curve: mainvalues wie in winfo-duration_curve unterstuetzen-->
+ <!--TODO sinfo_floodduration_curve: mainvalues wie in winfo-duration_curve unterstuetzen -->
<!--dc:when test="$out = 'sinfo_floodduration_curve'">
<dc:call-macro name="mainvalues" />
<dc:call-macro name="basedata_2_fixations_relative_point" />
<dc:call-macro name="basedata_4_heightmarks-points-relative_points" />
<dc:call-macro name="basedata_5_flood-protections_relative_points" />
- </dc:when-->
+ </dc:when -->
<dc:when test="$out = 'uinfo_salix_line'">
<dc:call-macro name="longitudinal-section-prototype" />
@@ -348,8 +348,8 @@
</dc:when>
<dc:when test="$out = 'bundu_depth_longitudinal_section'">
<dc:call-macro name="longitudinal-section-prototype" />
- </dc:when>
- </dc:choose>
+ </dc:when>
+ </dc:choose>
</dc:iterate>
</dc:otherwise>
</dc:choose>
@@ -465,6 +465,8 @@
<dc:when test="$out = 'bundu_depth_longitudinal_section'">
<dc:call-macro name="longitudinal-section-user-prototype" />
</dc:when>
+
+
<dc:comment> Discharge curves </dc:comment>
<dc:when test="$out = 'computed_discharge_curve'">
<dc:call-macro name="discharge-curve-user-prototype" />
@@ -1718,6 +1720,7 @@
</sinfo_predefined_depthevol>
</sinfo>
+
</dc:macro>
<dc:macro name="longitudinal-section-user-prototype">
@@ -1742,9 +1745,12 @@
<dc:call-macro name="bedquality" />
<dc:call-macro name="flow-velocity" />
<dc:call-macro name="sediment-load" />
-
+
<dc:comment> UINFO </dc:comment>
<dc:call-macro name="uinfo_salix_line" />
+
+ <dc:comment> BUNDU </dc:comment>
+ <dc:call-macro name="bundu_bezugswst" />
</dc:macro>
<!-- porosities -->
@@ -3527,7 +3533,7 @@
</dc:if>
</dc:filter>
</dc:macro>
-
+
<!-- channel size imported from CSV-files for S-INFO -->
<dc:macro name="sinfo_predefined_channel">
<dc:context>
@@ -3775,5 +3781,68 @@
</dc:filter>
</dc:macro>
+
+ <!-- U-INFO -->
+ <dc:macro name="bundu_bezugswst">
+ <dc:filter
+ expr="$a_state = 'state.bundu.wst'
+
+ and ($facet_name = 'longitudinal_section.w'
+ or $facet_name = 'bundu_facet_bedheight'
+ or $facet_name = 'bundu_facet_channelmin'
+ or $facet_name = 'bundu_facet_bedheight_01'
+ or $facet_name = 'bundu_facet_bedheight_02'
+ or $facet_name = 'bundu_facet_bedheight_03'
+ or $facet_name = 'bundu_facet_bedheight_04'
+ or $facet_name = 'bundu_facet_bedheight_05'
+ or $facet_name = 'bundu_facet_bedheight_06'
+ or $facet_name = 'bundu_facet_bedheight_07'
+ or $facet_name = 'bundu_facet_bedheight_08'
+ or $facet_name = 'bundu_facet_bedheight_09'
+ or $facet_name = 'bundu_facet_bedheight_10'
+ or $facet_name = 'bundu_facet_bedheight_01'
+ or $facet_name = 'bundu_facet_bedheight_01'
+ or $facet_name = 'longitudinal_section.q'
+ or $facet_name = 'longitudinal_section.area'
+ or $facet_name = 'longitudinal_section.manualpoints'
+ or $facet_name = 'bundu_facet_flowdepth.filtered'
+ or $facet_name = 'bundu_facet_channeldepth'
+ or $facet_name = 'bundu_facet_depth_01.filtered'
+ or $facet_name = 'bundu_facet_depth_02.filtered'
+ or $facet_name = 'bundu_facet_depth_03.filtered'
+ or $facet_name = 'bundu_facet_depth_04.filtered'
+ or $facet_name = 'bundu_facet_depth_05.filtered'
+ or $facet_name = 'bundu_facet_depth_06.filtered'
+ or $facet_name = 'bundu_facet_depth_07.filtered'
+ or $facet_name = 'bundu_facet_depth_08.filtered'
+ or $facet_name = 'bundu_facet_depth_09.filtered'
+ or $facet_name = 'bundu_facet_depth_10.filtered'
+ or $facet_name = 'longitudinal_section.area'
+ or $facet_name = 'longitudinal_section.manualpoints'
+ )" >
+
+ <dc:if test="dc:has-result()">
+ <bundu_bezugswsts>
+ <dc:call-macro name="collection-group">
+ <bundu_bezugswst description="{dc:group-key()}">
+ <dc:for-each>
+ <dc:element name="${facet_name}">
+ <dc:attribute name="factory" value="bundu" />
+ <dc:attribute name="target_out" value="${out}" />
+ <dc:attribute name="description" value="${facet_description}" />
+ <dc:attribute name="ids" value="${facet_num}" />
+ <dc:attribute name="artifact-id" value="${a_gid}" />
+ <dc:attribute name="out" value="${out_name}" />
+ </dc:element>
+ </dc:for-each>
+ </bundu_bezugswst>
+ </dc:call-macro>
+ </bundu_bezugswsts>
+ </dc:if>
+ </dc:filter>
+ </dc:macro>
+
+
+
</datacage>
</dc:template>
\ No newline at end of file
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/doc/conf/themes/default.xml
--- a/artifacts/doc/conf/themes/default.xml Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/doc/conf/themes/default.xml Thu Sep 27 17:41:44 2018 +0200
@@ -2971,16 +2971,9 @@
</fields>
</theme>
<theme name="UInfoSalixRank">
- <inherits>
- <inherit from="Areas"/>
- </inherits>
- <fields>
- <field name="areashowbg" type="boolean" display="Hintergrund anzeigen" default="true" hints="hidden"/>
- <field name="areashowborder" type="boolean" display="Begrenzung" default="false" hints="hidden"/>
- <field name="areabordercolor" type="Color" default="0, 0, 0" display="Begrenzungslinienfarbe" hints="hidden"/>
- <field name="showarea" type="boolean" display="Flaeche anzeigen" default="true" hints="hidden"/>
- <field name="showarealabel" type="boolean" display="Flächenbeschriftung anzeigen" default="false"/>
- </fields>
+ <fields>
+ <field name="areatransparency" type="int" default="50" display="Transparenz" />
+ </fields>
</theme>
<theme name="UInfoSalixCrossSectionWaterLine">
<inherits>
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/doc/conf/themes/second.xml
--- a/artifacts/doc/conf/themes/second.xml Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/doc/conf/themes/second.xml Thu Sep 27 17:41:44 2018 +0200
@@ -2959,16 +2959,9 @@
</fields>
</theme>
<theme name="UInfoSalixRank">
- <inherits>
- <inherit from="Areas"/>
- </inherits>
- <fields>
- <field name="areashowbg" type="boolean" display="Hintergrund anzeigen" default="true" hints="hidden"/>
- <field name="areashowborder" type="boolean" display="Begrenzung" default="false" hints="hidden"/>
- <field name="areabordercolor" type="Color" default="0, 0, 0" display="Begrenzungslinienfarbe" hints="hidden"/>
- <field name="showarea" type="boolean" display="Flaeche anzeigen" default="true" hints="hidden"/>
- <field name="showarealabel" type="boolean" display="Flächenbeschriftung anzeigen" default="false"/>
- </fields>
+ <fields>
+ <field name="areatransparency" type="int" default="50" display="Transparenz" />
+ </fields>
</theme>
<theme name="UInfoSalixCrossSectionWaterLine">
<inherits>
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BezugswstCalculation.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BezugswstCalculation.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BezugswstCalculation.java Thu Sep 27 17:41:44 2018 +0200
@@ -86,7 +86,8 @@
this.missKmFrom = access.getMissingVolFrom();
this.missKmTo = access.getMissingVolTo();
- final BezugswstCalculationResults results = new BezugswstCalculationResults(calcModeLabel, user, riverInfo, access.getRange());
+ final BezugswstCalculationResults results = new BezugswstCalculationResults(calcModeLabel, user, riverInfo, access.getRange(),
+ access.isCalculateMissingVolume());
final Calculation problems = new Calculation();
@@ -117,7 +118,7 @@
}
// Compute the missing volumes
- if (access.isCalculateMissingValue()) {
+ if (access.isCalculateMissingVolume()) {
if ((bedHeightsFinder == null) || bedHeightsFinder.isNull())
return new CalculationResult(results, problems);
computeMissingVolumes(problems);
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BezugswstCalculationResults.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BezugswstCalculationResults.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BezugswstCalculationResults.java Thu Sep 27 17:41:44 2018 +0200
@@ -22,8 +22,16 @@
private static final long serialVersionUID = 1L;
- public BezugswstCalculationResults(final String calcModeLabel, final String user, final RiverInfo river, final DoubleRange calcRange) {
+ private final boolean hasSounding;
+
+ public BezugswstCalculationResults(final String calcModeLabel, final String user, final RiverInfo river, final DoubleRange calcRange,
+ final boolean hasSounding) {
super(calcModeLabel, user, river, calcRange);
+ this.hasSounding = hasSounding;
+ }
+
+ public boolean hasSounding() {
+ return this.hasSounding;
}
}
\ No newline at end of file
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BezugswstFixationFacet.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BezugswstFixationFacet.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BezugswstFixationFacet.java Thu Sep 27 17:41:44 2018 +0200
@@ -11,6 +11,7 @@
import java.util.List;
+import org.dive4elements.artifactdatabase.state.Facet;
import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult;
import org.dive4elements.river.artifacts.model.CalculationResult;
import org.dive4elements.river.artifacts.model.WQKms;
@@ -19,6 +20,8 @@
public class BezugswstFixationFacet extends FixWaterlevelFacet {
+ private static final long serialVersionUID = 1L;
+
public BezugswstFixationFacet() {
}
@@ -39,4 +42,14 @@
return null;
}
+ /** Copy deeply. */
+ @Override
+ public Facet deepCopy() {
+ final BezugswstFixationFacet copy = new BezugswstFixationFacet();
+ copy.set(this);
+ copy.type = this.type;
+ copy.hash = this.hash;
+ copy.stateId = this.stateId;
+ return copy;
+ }
}
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BezugswstState.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BezugswstState.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BezugswstState.java Thu Sep 27 17:41:44 2018 +0200
@@ -89,19 +89,26 @@
if (!resultList.isEmpty()) {
final BezugswstMainCalculationResult result = (BezugswstMainCalculationResult) resultList.get(0);
- facets.add(BezugswstHeightProcessor.createChannelminFacet(context, hash, this.id, facetIndex++, 0));
- facets.add(BezugswstHeightProcessor.createBedheightFacet(context, hash, this.id, facetIndex++, 0, result.getBedHeightLabel()));
+
+ final boolean hasSounding = results.hasSounding();
+
final String nameQ = result.getWstLabel();
final String nameW = "W(" + nameQ + ")";
facets.add(new BezugswstFixationFacet(0, LONGITUDINAL_W, nameW, ComputeType.ADVANCE, hash, this.id));
facets.add(new BezugswstFixationFacet(0, LONGITUDINAL_Q, nameQ, ComputeType.ADVANCE, hash, this.id));
- for (int i = BedHeightValueType.FIELD_FIRST_INDEX; i <= BedHeightValueType.FIELD_LAST_INDEX; i++)
- facets.add(BezugswstHeightProcessor.createFieldBedheightFacet(context, hash, this.id, facetIndex++, 0, i));
- facets.add(BezugswstDepthProcessor.createFlowdepthFilteredFacet(context, hash, this.id, facetIndex++, 0, result.getBedHeightLabel()));
- facets.add(BezugswstDepthProcessor.createChanneldepthFacet(context, hash, this.id, facetIndex++, 0));
- for (int i = BedHeightValueType.FIELD_FIRST_INDEX; i <= BedHeightValueType.FIELD_LAST_INDEX; i++)
- facets.add(BezugswstDepthProcessor.createFieldDepthFacet(context, hash, this.id, facetIndex++, 0, i));
+ if (hasSounding) {
+ facets.add(BezugswstHeightProcessor.createChannelminFacet(context, hash, this.id, facetIndex++, 0));
+ facets.add(BezugswstHeightProcessor.createBedheightFacet(context, hash, this.id, facetIndex++, 0, result.getBedHeightLabel()));
+
+ for (int i = BedHeightValueType.FIELD_FIRST_INDEX; i <= BedHeightValueType.FIELD_LAST_INDEX; i++)
+ facets.add(BezugswstHeightProcessor.createFieldBedheightFacet(context, hash, this.id, facetIndex++, 0, i));
+
+ facets.add(BezugswstDepthProcessor.createFlowdepthFilteredFacet(context, hash, this.id, facetIndex++, 0, result.getBedHeightLabel()));
+ facets.add(BezugswstDepthProcessor.createChanneldepthFacet(context, hash, this.id, facetIndex++, 0));
+ for (int i = BedHeightValueType.FIELD_FIRST_INDEX; i <= BedHeightValueType.FIELD_LAST_INDEX; i++)
+ facets.add(BezugswstDepthProcessor.createFieldDepthFacet(context, hash, this.id, facetIndex++, 0, i));
+ }
final Facet csv = new DataFacet(FacetTypes.CSV, "CSV data", ComputeType.ADVANCE, hash, this.id);
final Facet pdf = new DataFacet(FacetTypes.PDF, "PDF data", ComputeType.ADVANCE, hash, this.id);
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BunduAccess.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BunduAccess.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BunduAccess.java Thu Sep 27 17:41:44 2018 +0200
@@ -72,20 +72,20 @@
}
public Double getMissingVolFrom() {
- if (isCalculateMissingValue())
+ if (isCalculateMissingVolume())
return getDouble("ld_from_part");
else
return null;
}
public Double getMissingVolTo() {
- if (isCalculateMissingValue())
+ if (isCalculateMissingVolume())
return getDouble("ld_to_part");
else
return null;
}
- public boolean isCalculateMissingValue() {
+ public boolean isCalculateMissingVolume() {
return getBoolean("missing_volume");
}
@@ -93,7 +93,7 @@
final String data = getString("soundings");
- if (data == null || !isCalculateMissingValue()) {
+ if (data == null || !isCalculateMissingVolume()) {
log.warn("No 'soundings' parameter specified!");
return null;
} else {
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractProcessor.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractProcessor.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractProcessor.java Thu Sep 27 17:41:44 2018 +0200
@@ -30,6 +30,8 @@
import org.dive4elements.river.exports.DiagramGenerator;
import org.dive4elements.river.exports.StyledSeriesBuilder;
import org.dive4elements.river.exports.process.DefaultProcessor;
+import org.dive4elements.river.jfree.StripedAreaDataset;
+import org.dive4elements.river.jfree.StripedAreaDataset.Stripe;
import org.dive4elements.river.jfree.StyledAreaSeriesCollection;
import org.dive4elements.river.jfree.StyledXYSeries;
import org.dive4elements.river.themes.ThemeDocument;
@@ -164,7 +166,20 @@
area.addSeries(seriesUp);
area.addSeries(seriesDown);
- generator.addAreaSeries(area, getAxisName(), visible);
+ generator.addAxisDataset(area, getAxisName(), visible);
+
+ return null;
+ }
+
+ protected final String buildStripedAreaSeries(final Stripe[] stripes, final DiagramGenerator generator, final ArtifactAndFacet bundle,
+ final ThemeDocument theme, final boolean visible) {
+
+ final StripedAreaDataset dataset = new StripedAreaDataset(theme);
+
+ for (final Stripe stripe : stripes)
+ dataset.addStripe(stripe);
+
+ generator.addAxisDataset(dataset, getAxisName(), visible);
return null;
}
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractResultType.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractResultType.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractResultType.java Thu Sep 27 17:41:44 2018 +0200
@@ -98,7 +98,7 @@
return formatter.format(value);
}
- private NumberFormat getFormatter(final CallContext context) {
+ protected NumberFormat getFormatter(final CallContext context) {
final CallMeta meta = context.getMeta();
final Locale locale = Resources.getLocale(meta);
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixWaterlevelFacet.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixWaterlevelFacet.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixWaterlevelFacet.java Thu Sep 27 17:41:44 2018 +0200
@@ -9,51 +9,44 @@
package org.dive4elements.river.artifacts.model.fixings;
import org.dive4elements.artifactdatabase.state.Facet;
-
import org.dive4elements.river.artifacts.model.CalculationResult;
import org.dive4elements.river.artifacts.model.WQKms;
+import org.dive4elements.river.artifacts.model.WQKmsResult;
import org.dive4elements.river.artifacts.model.WaterlevelFacet;
-
import org.dive4elements.river.artifacts.states.DefaultState.ComputeType;
/** Waterlevel from fix realize compute. */
-public class FixWaterlevelFacet
-extends WaterlevelFacet
-{
+public class FixWaterlevelFacet extends WaterlevelFacet {
public FixWaterlevelFacet() {
}
- public FixWaterlevelFacet(int index, String name, String description) {
+ public FixWaterlevelFacet(final int index, final String name, final String description) {
super(index, name, description, ComputeType.ADVANCE, null, null);
}
- public FixWaterlevelFacet(
- int index,
- String name,
- String description,
- ComputeType type,
- String hash,
- String stateID
- ) {
+ public FixWaterlevelFacet(final int index, final String name, final String description, final ComputeType type, final String hash, final String stateID) {
// Note that in super, hash and stateID are on switched positions.
// on super.super it is this way around again.
super(index, name, description, type, stateID, hash);
}
@Override
- protected WQKms [] getWQKms(CalculationResult res) {
- FixRealizingResult fr = (FixRealizingResult)res.getData();
- return fr != null ? fr.getWQKms() : null;
+ protected WQKms[] getWQKms(final CalculationResult res) {
+ if (res.getData() instanceof WQKmsResult) {
+ final WQKmsResult fr = (WQKmsResult) res.getData();
+ return fr != null ? fr.getWQKms() : null;
+ }
+ return null;
}
/** Copy deeply. */
@Override
public Facet deepCopy() {
- FixWaterlevelFacet copy = new FixWaterlevelFacet();
+ final FixWaterlevelFacet copy = new FixWaterlevelFacet();
copy.set(this);
- copy.type = type;
- copy.hash = hash;
- copy.stateId = stateId;
+ copy.type = this.type;
+ copy.hash = this.hash;
+ copy.stateId = this.stateId;
return copy;
}
}
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/artifacts/services/DynamicMainValuesService.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/services/DynamicMainValuesService.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/services/DynamicMainValuesService.java Thu Sep 27 17:41:44 2018 +0200
@@ -61,12 +61,14 @@
throws MainValuesServiceException {
// Query the gauge's daily Q values
- final List<DailyDischargeValue> qdvs = DailyDischargeValue.getValues(gauge, startTime, endTime, OrderByField.DAY);
+ final Date qStartTime = DateUtils.getAbflussYear(startTime)[0];
+ final List<DailyDischargeValue> qdvs = DailyDischargeValue.getValues(gauge, qStartTime, endTime, OrderByField.DAY);
if (qdvs.isEmpty())
throw new MainValuesServiceException("no daily discharge values for gauge " + gauge.getName() + " in the requested time period");
// return;
// Build yearly aggregates
+ final Date qYearEnd = DateUtils.getPreviousAbflussYear(endTime)[1];
final TDoubleArrayList mnqs = new TDoubleArrayList();
final TDoubleArrayList mqs = new TDoubleArrayList();
int mqcnt = 0;
@@ -87,6 +89,8 @@
mqs.set(j, mqs.get(j) / mqcnt);
j++;
}
+ if (qdv.getDay().after(qYearEnd))
+ break;
// Start next year
mnqs.add(qdv.getDischarge().doubleValue());
mhqs.add(qdv.getDischarge().doubleValue());
@@ -115,10 +119,12 @@
if (hsq2 != null)
mainValues.add(hsq2);
- // Query the gauge's daily Q values and build a list sorted by ascending Q
+ // Query the gauge's daily Q values from the first new year on, and build a list sorted by ascending Q
final TDoubleArrayList qs = new TDoubleArrayList();
- for (final DailyDischargeValue qdv : qdvs)
- qs.add(qdv.getDischarge().doubleValue());
+ for (final DailyDischargeValue qdv : qdvs) {
+ if (qdv.getDay().compareTo(startTime) >= 0)
+ qs.add(qdv.getDischarge().doubleValue());
+ }
qs.sort();
// Step through the sorted Q list and get the duration discharges
@@ -137,14 +143,22 @@
}
/**
- * Checks year equality of two dates (calendar year)
+ * Checks year equality of two dates (Abflussjahr)
*/
private boolean isSameQYear(final Date a, final Date b) {
- final Calendar ca = Calendar.getInstance();
- ca.setTime(a);
- final Calendar cb = Calendar.getInstance();
- cb.setTime(b);
- return (ca.get(Calendar.YEAR) == cb.get(Calendar.YEAR));
+ return (qYear(a) == qYear(b));
+ }
+
+ /**
+ * Gets the q year (Abflussjahr) of a date
+ */
+ private int qYear(final Date day) {
+ final Calendar cal = Calendar.getInstance();
+ cal.setTime(day);
+ if (cal.get(Calendar.MONTH) >= 10)
+ return cal.get(Calendar.YEAR) + 1;
+ else
+ return cal.get(Calendar.YEAR);
}
/**
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/artifacts/services/DynamicMainValuesTimeRangeDeterminationService.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/services/DynamicMainValuesTimeRangeDeterminationService.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/services/DynamicMainValuesTimeRangeDeterminationService.java Thu Sep 27 17:41:44 2018 +0200
@@ -60,6 +60,10 @@
private static class GaugeInfo {
protected final String errorMsg;
protected final Gauge gauge;
+ /**
+ * New year of the first year for which the gauge has complete discharge data, including november+december of the year
+ * before
+ */
protected final Date startdate;
protected final Date enddate;
@@ -83,12 +87,13 @@
// Query the gauge's daily Q values
String globalErrorMsg = "";
final List<GaugeInfoResult.GaugeInfo> gaugeResults = new ArrayList<>();
- Date min = startTime;
+ final Date qStartTime = DateUtils.getAbflussYear(startTime)[0];
+ Date min = qStartTime;
Date max = endTime;
for (final Gauge gauge : gauges) {
- final Date[] gaugeDates = DailyDischargeValue.getTimePeriod(gauge, startTime, endTime);
+ final Date[] gaugeDates = DailyDischargeValue.getTimePeriod(gauge, qStartTime, endTime);
if (gaugeDates[0] == null) {
final String msg = Resources.getMsg(meta, "bundu.wst_no_data_at_all", "bundu.wst_no_data_at_all", gauge.getName());
final GaugeInfoResult.GaugeInfo gi = new GaugeInfoResult.GaugeInfo(msg, gauge, null, null);
@@ -98,24 +103,26 @@
continue;
}
+ final Date gaugeCalcStartDate = DateUtils.getNextAbflussYear(gaugeDates[0])[0];
if (gaugeDates[0].getTime() > min.getTime())
- min = gaugeDates[0];
+ min = gaugeCalcStartDate;
if (gaugeDates[1].getTime() < max.getTime())
max = gaugeDates[1];
String errormsg = null;
- if ((gaugeDates[1].getTime() < endTime.getTime()) || (gaugeDates[0].getTime() > startTime.getTime()))
- errormsg = makeDoesNotCoverErrorMsg(gaugeDates[0], gaugeDates[1], meta);
+ if ((gaugeDates[1].getTime() < endTime.getTime()) || (gaugeDates[0].getTime() > qStartTime.getTime()))
+ errormsg = makeDoesNotCoverErrorMsg(DateUtils.getAbflussYearFromDate(gaugeCalcStartDate), DateUtils.getYearFromDate(gaugeDates[1]), meta);
- gaugeResults.add(new GaugeInfoResult.GaugeInfo(errormsg, gauge, gaugeDates[0], gaugeDates[1]));
+ gaugeResults.add(new GaugeInfoResult.GaugeInfo(errormsg, gauge, DateUtils.getNextNewYear(gaugeCalcStartDate), gaugeDates[1]));
}
// common Range and correct errorMsg
+ min = DateUtils.getNextNewYear(min);
final List<GaugeInfoResult.GaugeInfo> gaugeResultsSecondTurn = new ArrayList<>();
for (final GaugeInfoResult.GaugeInfo gi : gaugeResults) {
gaugeResultsSecondTurn
- .add(new GaugeInfoResult.GaugeInfo(gi.errorMsg, gi.gauge, gi.startdate != null ? min : null, gi.enddate != null ? max : null));
+ .add(new GaugeInfoResult.GaugeInfo(gi.errorMsg, gi.gauge, gi.startdate != null ? min : null, gi.enddate != null ? max : null));
}
if (globalErrorMsg.isEmpty() && (min.getTime() > max.getTime()))
globalErrorMsg = getMsg(meta, "bundu.wst.gauge_timeranges_disjoint");
@@ -130,9 +137,9 @@
return result;
}
- private String makeDoesNotCoverErrorMsg(final Date start, final Date end, final CallMeta meta) {
+ private String makeDoesNotCoverErrorMsg(final int startYear, final int endYear, final CallMeta meta) {
final String msgkey = "bundu.wst.range_does_not_cover";
- return Resources.getMsg(meta, msgkey, msgkey, DateUtils.getYearFromDate(start), DateUtils.getYearFromDate(end));
+ return Resources.getMsg(meta, msgkey, msgkey, startYear, endYear);
}
@Override
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcFacet.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcFacet.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcFacet.java Thu Sep 27 17:41:44 2018 +0200
@@ -22,22 +22,22 @@
public class CollisionCalcFacet extends ResultFacet {
private static final long serialVersionUID = 1;
- private int year;
+ private String years;
private CollisionCalcFacet() {
super();
// required for clone operation deepCopy()
}
- public CollisionCalcFacet(final int facetIndex, final int resultIndex, final int year, final String name, final String description,
+ public CollisionCalcFacet(final int facetIndex, final int resultIndex, final String years, final String name, final String description,
final String yAxisLabelKey, final ComputeType type, final String hash, final String stateId) {
+
super(facetIndex, resultIndex, name, description, yAxisLabelKey, type, stateId, hash);
-
- this.year = year;
+ this.years = years;
}
- public int getYear() {
- return this.year;
+ public String getYears() {
+ return this.years;
}
/** Copy deeply. */
@@ -50,7 +50,7 @@
copy.type = this.type;
copy.hash = this.hash;
copy.stateId = this.stateId;
- copy.year = this.year;
+ copy.years = this.years;
return copy;
}
}
\ No newline at end of file
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcOverviewResult.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcOverviewResult.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcOverviewResult.java Thu Sep 27 17:41:44 2018 +0200
@@ -11,6 +11,7 @@
import java.util.ArrayList;
import java.util.Collection;
+import java.util.List;
import org.apache.commons.collections.Predicate;
import org.dive4elements.river.artifacts.common.AbstractCalculationExportableResult;
@@ -20,6 +21,7 @@
import org.dive4elements.river.artifacts.common.IResultType;
import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource;
import org.dive4elements.river.artifacts.common.ResultRow;
+import org.dive4elements.river.artifacts.model.DateRange;
import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType;
import org.dive4elements.river.artifacts.sinfo.util.RiverInfo;
@@ -34,24 +36,31 @@
private static final String JASPER_FILE = "/jasper/templates/sinfo.collision.overview.jrxml";
- private final int[] singleYears;
+ private final boolean isEpochs;
- public CollisionCalcOverviewResult(final String label, final int[] singleYears, final Collection<ResultRow> rows) {
+ private final List<DateRange> years;
+
+ public CollisionCalcOverviewResult(final String label, final boolean isEpochs, final Collection<DateRange> years, final Collection<ResultRow> rows) {
super(label, rows);
- this.singleYears = singleYears;
+ this.isEpochs = isEpochs;
+ this.years = new ArrayList<>(years);
}
- public int[] getSingleYears() {
- return this.singleYears;
+ public boolean getIsEpochs() {
+ return this.isEpochs;
}
- public double[][] getStationPointsByYear(final IResultType type, final int year) {
+ public List<DateRange> getYears() {
+ return this.years;
+ }
+
+ public double[][] getStationPointsByYear(final IResultType type, final String years) {
final Predicate filter = new Predicate() {
@Override
public boolean evaluate(final Object object) {
final ResultRow row = (ResultRow) object;
- return getSingleYears() == null || Integer.valueOf(row.getValue(SInfoResultType.years).toString()) == year;
+ return row.getValue(SInfoResultType.years).toString().equals(years);
}
};
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcProcessor.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcProcessor.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcProcessor.java Thu Sep 27 17:41:44 2018 +0200
@@ -60,11 +60,10 @@
protected String generateSeries(final DiagramGenerator generator, final ArtifactAndFacet bundle, final ThemeDocument theme, final boolean visible) {
final CollisionCalcFacet facet = (CollisionCalcFacet) bundle.getFacet();
- final int year = facet.getYear();
final CollisionCalcOverviewResult result = (CollisionCalcOverviewResult) getResult(generator, bundle);
- final double[][] points = result.getStationPointsByYear(SInfoResultType.collisionCount, year);
+ final double[][] points = result.getStationPointsByYear(SInfoResultType.collisionCount, facet.getYears());
return buildSeriesForPoints(points, generator, bundle, theme, visible, null);
}
@@ -76,14 +75,9 @@
// result index; however name and index are used on client side as unique id.
final CollisionCalcOverviewResult ccoResult = (CollisionCalcOverviewResult) result;
- if (ccoResult.getSingleYears() == null) {
- final String facetDescription = Resources.getMsg(context.getMeta(), I18N_SERIES_NAME_PATTERN, I18N_SERIES_NAME_PATTERN, result.getLabel());
- return new CollisionCalcFacet(themeCount, resultIndex, -1, FACET_COLLISION_CALC_COUNT, facetDescription, I18N_AXIS_LABEL, ComputeType.ADVANCE, hash,
- id);
- } else {
- final String facetDescription = Resources.getMsg(context.getMeta(), I18N_SERIES_NAME_PATTERN, I18N_SERIES_NAME_PATTERN, Integer.toString(year));
- return new CollisionCalcFacet(themeCount, resultIndex, year, COLLISION_FACETS[themeCount % 3], facetDescription, I18N_AXIS_LABEL,
- ComputeType.ADVANCE, hash, id);
- }
+ final String years = CollisionCalculation.yearsToString(ccoResult.getIsEpochs(), ccoResult.getYears().get(themeCount));
+ final String facetDescription = Resources.getMsg(context.getMeta(), I18N_SERIES_NAME_PATTERN, I18N_SERIES_NAME_PATTERN, years);
+ return new CollisionCalcFacet(themeCount, resultIndex, years, COLLISION_FACETS[themeCount % 3], facetDescription, I18N_AXIS_LABEL,
+ ComputeType.ADVANCE, hash, id);
}
}
\ No newline at end of file
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalculation.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalculation.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalculation.java Thu Sep 27 17:41:44 2018 +0200
@@ -12,7 +12,10 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
+import java.util.NavigableSet;
+import java.util.TreeSet;
import org.apache.commons.lang.math.DoubleRange;
import org.dive4elements.artifacts.CallContext;
@@ -66,14 +69,23 @@
final Collection<ResultRow> overViewRows = new ArrayList<>();
+ final List<DateRange> years = new ArrayList<>();
+ final NavigableSet<Integer> detailYears = new TreeSet<>();
if (access.getYears() != null) {
- for (final int year : access.getYears())
+ for (final int year : access.getYears()) {
calculateOverview(overViewRows, river, access.getLowerKm(), access.getUpperKm(), year, year, false);
+ years.add(new DateRange(DateUtil.getStartDateFromYear(year), DateUtil.getEndDateFromYear(year)));
+ detailYears.add(Integer.valueOf(year));
+ }
} else {
- for (final DateRange dr : access.getEpochs())
+ for (final DateRange dr : access.getEpochs()) {
calculateOverview(overViewRows, river, access.getLowerKm(), access.getUpperKm(), dr.getFromYear(), dr.getToYear(), true);
+ years.add(dr);
+ detailYearsAdd(detailYears, dr);
+ }
}
- final CollisionCalcOverviewResult overviewResult = new CollisionCalcOverviewResult(access.getYearsHeader(), access.getYears(), overViewRows);
+ final CollisionCalcOverviewResult overviewResult = new CollisionCalcOverviewResult(access.getYearsHeader(), (access.getYears() == null), years,
+ overViewRows);
results.addResult(overviewResult, problems);
// create q-for-w-finders for all gauges of the calculation km range
@@ -86,14 +98,9 @@
}
final Collection<ResultRow> detailsRows = new ArrayList<>();
- // calculate secondary results for each year or epoch
- if (access.getYears() != null) {
- for (final int year : access.getYears())
- calculateDetails(detailsRows, infoProvider, access.getLowerKm(), access.getUpperKm(), year, year, qFinders, zoneFinders);
- } else {
- for (final DateRange dr : access.getEpochs())
- calculateDetails(detailsRows, infoProvider, access.getLowerKm(), access.getUpperKm(), dr.getFromYear(), dr.getToYear(), qFinders, zoneFinders);
- }
+ // calculate secondary results for each year
+ for (final Integer year : detailYears)
+ calculateDetails(detailsRows, infoProvider, access.getLowerKm(), access.getUpperKm(), year, qFinders, zoneFinders);
final CollisionCalcDetailResult detailResult = new CollisionCalcDetailResult("Details", detailsRows);
results.addResult(detailResult, problems);
@@ -101,6 +108,14 @@
}
/**
+ * Adds all years of an epoch to a set
+ */
+ private void detailYearsAdd(final NavigableSet<Integer> detailYears, final DateRange epoch) {
+ for (int year = epoch.getFromYear(); year <= epoch.getToYear(); year++)
+ detailYears.add(Integer.valueOf(year));
+ }
+
+ /**
* Calculates the collision counts for a km range of a river and a year or year range (epoch),
* and adds them to a ResultRow collection
*/
@@ -108,19 +123,32 @@
final int toYear, final boolean isEpoch) {
for (final CollisionAggregateValue aggregate : CollisionAggregateValue.getValuesByKm(river, fromKm, toKm, fromYear, toYear)) {
rows.add(ResultRow.create().putValue(GeneralResultType.station, aggregate.getStation())
- .putValue(SInfoResultType.years, (isEpoch ? String.format("%d-%d", fromYear, toYear) : Integer.toString(fromYear)))
+ .putValue(SInfoResultType.years, yearsToString(isEpoch, fromYear, toYear))
.putValue(SInfoResultType.collisionCount, aggregate.getCount()));
}
}
/**
- * Calculates the collision details for a km range of a river and a year or year range (epoch),
- * and adds them to a ResultRow collection
+ * Returns the string representation of a year or epoch
+ */
+ public static String yearsToString(final boolean isEpoch, final DateRange years) {
+ return yearsToString(isEpoch, years.getFromYear(), years.getToYear());
+ }
+
+ /**
+ * Returns the string representation of a year or epoch
+ */
+ public static String yearsToString(final boolean isEpoch, final int fromYear, final int toYear) {
+ return (isEpoch ? String.format("%d-%d", fromYear, toYear) : Integer.toString(fromYear));
+ }
+
+ /**
+ * Calculates the collision details for a km range of a river and a year, and adds them to a ResultRow collection
*/
private void calculateDetails(final Collection<ResultRow> rows, final RiverInfoProvider riverInfo, final double fromKm, final double toKm,
- final int fromYear, final int toYear, final Map<Gauge, GaugeDischargeValuesFinder> qFinders, final Map<Gauge, GaugeMainValueFinder> zoneFinders) {
- for (final CollisionValue collision : CollisionValue.getValues(riverInfo.getRiver(), fromKm, toKm, DateUtil.getStartDateFromYear(fromYear),
- DateUtil.getEndDateFromYear(toYear))) {
+ final int year, final Map<Gauge, GaugeDischargeValuesFinder> qFinders, final Map<Gauge, GaugeMainValueFinder> zoneFinders) {
+ for (final CollisionValue collision : CollisionValue.getValues(riverInfo.getRiver(), fromKm, toKm, DateUtil.getStartDateFromYear(year),
+ DateUtil.getEndDateFromYear(year))) {
final Gauge gauge = riverInfo.getGauge(collision.getStation(), true);
final double q = qFinders.get(gauge).getDischarge(collision.getGaugeW());
final double qOut = Double.isInfinite(q) ? Double.NaN : q;
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionState.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionState.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionState.java Thu Sep 27 17:41:44 2018 +0200
@@ -18,6 +18,7 @@
import org.dive4elements.river.artifacts.model.Calculation;
import org.dive4elements.river.artifacts.model.CalculationResult;
import org.dive4elements.river.artifacts.model.DataFacet;
+import org.dive4elements.river.artifacts.model.DateRange;
import org.dive4elements.river.artifacts.model.EmptyFacet;
import org.dive4elements.river.artifacts.model.FacetTypes;
import org.dive4elements.river.artifacts.model.ReportFacet;
@@ -81,15 +82,8 @@
for (int index = 0; index < resultList.size(); index++) {
if (resultList.get(index) instanceof CollisionCalcOverviewResult) {
final CollisionCalcOverviewResult result = (CollisionCalcOverviewResult) resultList.get(index);
-
- final int[] singleYears = result.getSingleYears();
-
- if (singleYears == null)
- facets.add(CollisionCalcProcessor.createFacet(context, hash, this.id, result, index, -1, themeCount++));
- else {
- for (final int singleYear : singleYears)
- facets.add(CollisionCalcProcessor.createFacet(context, hash, this.id, result, index, singleYear, themeCount++));
- }
+ for (final DateRange dr : result.getYears())
+ facets.add(CollisionCalcProcessor.createFacet(context, hash, this.id, result, index, dr.getFromYear(), themeCount++));
}
}
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/SInfoResultType.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/SInfoResultType.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/SInfoResultType.java Thu Sep 27 17:41:44 2018 +0200
@@ -12,6 +12,7 @@
import java.text.NumberFormat;
import org.apache.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
import org.dive4elements.artifacts.CallContext;
import org.dive4elements.river.artifacts.common.AbstractResultType;
import org.dive4elements.river.artifacts.common.I18NStrings;
@@ -30,6 +31,8 @@
private static final long serialVersionUID = 1L;
+ protected static Logger log = Logger.getLogger(SInfoResultType.class);
+
protected SInfoResultType(final String unit, final String csvHeader) {
super(unit, csvHeader, csvHeader);
}
@@ -209,6 +212,15 @@
@Override
public String exportValue(final CallContext context, final Object value) {
final double doubleValue = asDouble(value);
+ String rm;
+ try {
+ rm = getFormatter(context).getRoundingMode().toString();
+ }
+ catch (final Exception e) {
+ rm = "?";
+ }
+ log.trace(String.format("meanBedHeight.exportValue roundingmode: %s value: %f doubleValue: %f formatted to: %s",
+ rm, value, doubleValue, exportDoubleValue(context, doubleValue)));
return exportDoubleValue(context, doubleValue);
}
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculationResult.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculationResult.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculationResult.java Thu Sep 27 17:41:44 2018 +0200
@@ -55,6 +55,8 @@
private static final long serialVersionUID = 1L;
+ private final boolean isUseWspl;
+
private final String[] waterlevelLabels;
private final int maxWaterlevelPdf = 3;
@@ -67,9 +69,10 @@
pdf, csv
}
- public FloodDurationCalculationResult(final String label, final String[] mainvalueLabels, final Collection<ResultRow> rows) {
+ public FloodDurationCalculationResult(final String label, final String[] mainvalueLabels, final Collection<ResultRow> rows, final boolean isUseWspl) {
super(label, rows);
this.waterlevelLabels = mainvalueLabels;
+ this.isUseWspl = isUseWspl;
}
/**
@@ -112,7 +115,7 @@
protected String[] formatRow(final AbstractExportContext exportContextCSV, final ResultRow row, final ExportMode mode) {
- final Collection<String> lines = new ArrayList<>(10);
+ final Collection<String> lines = new ArrayList<>(20);
lines.add(exportContextCSV.formatRowValue(row, GeneralResultType.station));
lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.riverside));
@@ -122,25 +125,33 @@
lines.add(exportContextCSV.formatRowValue(row, SInfoResultType.infrastructuretype));
final List<DurationWaterlevel> waterlevelList = (List<DurationWaterlevel>) row.getValue(SInfoResultType.customMultiRowColWaterlevel);
- if (waterlevelList != null) {
- final NumberFormat wFormatter = exportContextCSV.getFlowDepthFormatter();
- final NumberFormat qFormatter = exportContextCSV.getQFormatter();
- final NumberFormat durFormatter = exportContextCSV.getFloodDurationFormatter();
- for (int i = 0; i < waterlevelList.size(); i++) {
+ final int expectedSizetoGaugelabel = lines.size() + (waterlevelList.size() < 2 ? 4 : 12); // removing columns only works for fixed
+ // indices
- if (i == this.maxWaterlevelPdf && mode == ExportMode.pdf)
- break;
+ final NumberFormat wFormatter = exportContextCSV.getFlowDepthFormatter();
+ final NumberFormat qFormatter = exportContextCSV.getQFormatter();
+ final NumberFormat durFormatter = exportContextCSV.getFloodDurationFormatter();
- final DurationWaterlevel item = waterlevelList.get(i);
- lines.add(item.getWFormatted(wFormatter));
- lines.add(item.getFloodDurDaysPerYearFormatted(durFormatter));
- lines.add(item.getQFormatted(qFormatter));
- lines.add(item.getBezeichnung());
- }
+ for (int i = 0; i < waterlevelList.size(); i++) {
+
+ if (i == this.maxWaterlevelPdf && mode == ExportMode.pdf)
+ break;
+
+ final DurationWaterlevel item = waterlevelList.get(i);
+ lines.add(item.getWFormatted(wFormatter));
+ lines.add(item.getFloodDurDaysPerYearFormatted(durFormatter));
+ lines.add(item.getQFormatted(qFormatter));
+ lines.add(item.getBezeichnung());
}
- lines.add(exportContextCSV.formatRowValue(row, GeneralResultType.gaugeLabel));
+ final int lineSize = lines.size();
+ while (mode == ExportMode.pdf && lines.size() < expectedSizetoGaugelabel)
+ lines.add("");
+
+ if (isUseWspl() || mode == ExportMode.pdf)
+ lines.add(exportContextCSV.formatRowValue(row, GeneralResultType.gaugeLabel)); // PDF: necessary, because if removed, location would not be shown!
+
lines.add(exportContextCSV.formatRowValue(row, GeneralResultType.location));
return lines.toArray(new String[lines.size()]);
@@ -169,7 +180,9 @@
header.add(exportContextCSV.msg(DurationWaterlevel.getHeaderBezeichnCsv(), appendIndex));
}
- header.add(exportContextCSV.formatCsvHeader(GeneralResultType.gaugeLabel));
+ if (isUseWspl())
+ header.add(exportContextCSV.formatCsvHeader(GeneralResultType.gaugeLabel));
+
header.add(exportContextCSV.formatCsvHeader(GeneralResultType.location));
exportContextCSV.writeCSVLine(header.toArray(new String[header.size()]));
@@ -265,4 +278,8 @@
return new double[][] { xPoints.toNativeArray(), yPoints.toNativeArray() };
}
+
+ public boolean isUseWspl() {
+ return this.isUseWspl;
+ }
}
\ No newline at end of file
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculator.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculator.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculator.java Thu Sep 27 17:41:44 2018 +0200
@@ -66,8 +66,8 @@
/**
* Calculate the infrastructures flood duration result rows
*/
- public void execute(final Calculation problems, final String label, final DoubleRange calcRange, final RiversideChoiceKey riverside,
- final boolean withWspl, final WINFOArtifact winfo, final FloodDurationCalculationResults results) {
+ public void execute(final Calculation problems, final String label, final DoubleRange calcRange, final RiversideChoiceKey riverside, final boolean withWspl,
+ final WINFOArtifact winfo, final FloodDurationCalculationResults results) {
// Find all gauges of the calc range, and create the duration finders
final Map<Gauge, GaugeDurationValuesFinder> durFinders = new HashMap<>();
@@ -121,7 +121,7 @@
for (int i = 0; i <= wqkmsArray.length - 1; i++)
wstLabels[i] = wqkmsArray[i].getName();
- results.addResult(new FloodDurationCalculationResult(label, wstLabels, this.rows), problems);
+ results.addResult(new FloodDurationCalculationResult(label, wstLabels, this.rows, withWspl), problems);
}
/**
@@ -141,12 +141,14 @@
final double[] ows = new double[udays.length];
for (int i = 0, j = udays.length - 1; i <= udays.length - 1; i++, j--) {
odays[j] = 365 - udays[i];
- oqs[j] = qs[i];
final QPosition qpos = wst.getQPosition(gauge.getStation().doubleValue(), qs[i]);
- if (qpos != null)
+ if (qpos != null) {
ows[j] = wst.interpolateW(station, qpos, problems);
- else
+ oqs[j] = wst.getQ(qpos, station);
+ } else {
ows[j] = Double.NaN;
+ oqs[j] = qs[i];
+ }
}
return new WQDay(odays, ows, oqs);
}
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationExporter.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationExporter.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationExporter.java Thu Sep 27 17:41:44 2018 +0200
@@ -75,5 +75,8 @@
design.removeColumn("bezOpt");
design.removeColumn("durOpt");
}
+
+ if (!result.isUseWspl())
+ design.removeColumn("gauge_header");
}
}
\ No newline at end of file
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java Thu Sep 27 17:41:44 2018 +0200
@@ -167,16 +167,18 @@
row.putValue(UInfoResultType.waterlevelMH5, hw5);
// Calc salix-line and mw-mnw
- row.putValue(UInfoResultType.salixline, calcSalix(mhw, mw));
+ row.putValue(UInfoResultType.salixline, calcSalix(mhw, mw, 0.0));
row.putValue(UInfoResultType.salix_mw_mnw, calcMwmnw(mw, mnw));
- row.putValue(UInfoResultType.salixw, mhw - SALIX_DISTANCE.doubleValue());
+ final double salixw = Formatter.roundW(mhw).subtract(SALIX_DISTANCE).doubleValue();
+ row.putValue(UInfoResultType.salixw, salixw);
// Calc scenario values (always all scenario types set, Result variant extracts the fields needed)
final List<SalixScenario> scenarios = new ArrayList<>();
final List<Double> deltaws = getDeltaWs(station, rangeScenarios);
for (final Double deltaw : deltaws) {
if (deltaw != null) {
- final double salix = calcSalix(mhw, mw + deltaw);
- scenarios.add(new SalixScenario((int) (deltaw * 100), salix, mhw + deltaw - SALIX_DISTANCE.doubleValue()));
+ final double salix = calcSalix(mhw, mw, deltaw.doubleValue());
+ final double scen = calcSalix(mhw, 0.0, deltaw.doubleValue());
+ scenarios.add(new SalixScenario((int) (deltaw * 100), salix, scen));
}
else {
scenarios.add(null);
@@ -199,10 +201,10 @@
/**
* Calculates the salix value
*/
- private double calcSalix(final double mhw, final double mw) {
+ private double calcSalix(final double mhw, final double mw, final double deltamw) {
if (Double.isNaN(mw) || Double.isInfinite(mw) || Double.isNaN(mhw) || Double.isInfinite(mhw))
- return mw; // preserving NaN or Infinity
- return Formatter.roundW(mhw).subtract(SALIX_DISTANCE).subtract(Formatter.roundW(mw)).doubleValue();
+ return mhw - mw; // preserving NaN or Infinity
+ return Formatter.roundW(mhw).subtract(SALIX_DISTANCE).subtract(Formatter.roundW(mw).add(Formatter.roundW(deltamw))).doubleValue();
}
/**
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineProcessor.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineProcessor.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineProcessor.java Thu Sep 27 17:41:44 2018 +0200
@@ -10,14 +10,14 @@
package org.dive4elements.river.artifacts.uinfo.salix;
+import java.awt.Color;
import java.util.HashSet;
import java.util.Set;
import org.dive4elements.artifactdatabase.state.ArtifactAndFacet;
import org.dive4elements.artifactdatabase.state.Facet;
import org.dive4elements.artifacts.CallContext;
-import org.dive4elements.river.artifacts.D4EArtifact;
-import org.dive4elements.river.artifacts.access.RangeAccess;
+import org.dive4elements.artifacts.CallMeta;
import org.dive4elements.river.artifacts.common.AbstractProcessor;
import org.dive4elements.river.artifacts.model.CrossSectionWaterLineFacet;
import org.dive4elements.river.artifacts.model.FacetTypes;
@@ -26,6 +26,7 @@
import org.dive4elements.river.artifacts.uinfo.common.UInfoResultType;
import org.dive4elements.river.artifacts.uinfo.salix.SalixLineCrossSectionIndexData.SalixWaterlevel;
import org.dive4elements.river.exports.DiagramGenerator;
+import org.dive4elements.river.jfree.StripedAreaDataset.Stripe;
import org.dive4elements.river.themes.ThemeDocument;
/**
@@ -167,9 +168,6 @@
@Override
protected String generateSeries(final DiagramGenerator generator, final ArtifactAndFacet bundle, final ThemeDocument theme, final boolean visible) {
-
- // log.debug("Processing facet: " + bundle.getFacetName());
-
if (bundle.getFacetName().equals(FACET_SALIX_SCENARIO_FILTERED) || bundle.getFacetName().equals(FACET_SALIX_SCENARIO_RAW)) {
final CallContext context = generator.getContext();
final SalixLineCalculationResult data = (SalixLineCalculationResult) bundle.getData(context);
@@ -179,19 +177,24 @@
}
if (bundle.getFacetName().equals(FACET_SALIX_RANK)) {
- final RangeAccess kmRange = new RangeAccess((D4EArtifact) bundle.getArtifact());
- // TODO get all rank data (5 ranks) from database
- final double[][] points = new double[2][2];
- points[0][0] = kmRange.getLowerKm();
- points[0][1] = kmRange.getUpperKm();
- points[1][0] = 1.5;
- points[1][1] = 1.5;
- return buildSeriesForPoints(points, generator, bundle, theme, visible, null);
+ final CallMeta meta = generator.getContext().getMeta();
+ final Stripe[] stripes = new Stripe[] { //
+ new Stripe(getSimpleMsg("uinfo_salix_rank.excellent", meta), Color.decode("#00B0F0"), -0.3, 0.3), //
+ new Stripe(getSimpleMsg("uinfo_salix_rank.good", meta), Color.decode("#00B050"), 0.3, 0.5), //
+ new Stripe(getSimpleMsg("uinfo_salix_rank.moderate", meta), Color.decode("#FFFF00"), 0.5, 1.0), //
+ new Stripe(getSimpleMsg("uinfo_salix_rank.bad", meta), Color.decode("#FFC000"), 1.0, 1.5), //
+ new Stripe(getSimpleMsg("uinfo_salix_rank.very_bad", meta), Color.decode("#FF0000"), 1.5, Double.NaN) };
+
+ return buildStripedAreaSeries(stripes, generator, bundle, theme, visible);
}
return buildSeriesForType(generator, bundle, theme, visible, doGetType(bundle.getFacetName()), GAP_DISTANCE);
}
+ private String getSimpleMsg(final String code, final CallMeta meta) {
+ return Resources.getMsg(meta, code);
+ }
+
protected UInfoResultType doGetType(final String facetName) {
if (FACET_SALIX_LINE_FILTERED.contentEquals(facetName))
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixScenario.java
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixScenario.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixScenario.java Thu Sep 27 17:41:44 2018 +0200
@@ -58,11 +58,11 @@
return this.salixW;
}
- public String getSalixWFormatted() {
+ public String getSalixWFormatted(final NumberFormat formatter) {
if (Double.isNaN(this.salixW))
return StringUtils.EMPTY;
- return String.valueOf(this.salixW);
+ return formatter.format(this.salixW);
}
public static final String getScenarioValueHeader() {
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/exports/AbstractChartGenerator.java
--- a/artifacts/src/main/java/org/dive4elements/river/exports/AbstractChartGenerator.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/AbstractChartGenerator.java Thu Sep 27 17:41:44 2018 +0200
@@ -12,11 +12,7 @@
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
-import java.awt.Paint;
import java.awt.Stroke;
-import java.awt.TexturePaint;
-import java.awt.geom.Rectangle2D;
-import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.text.DateFormat;
@@ -38,7 +34,6 @@
import org.dive4elements.artifactdatabase.state.ArtifactAndFacet;
import org.dive4elements.artifactdatabase.state.Settings;
import org.dive4elements.artifacts.Artifact;
-import org.dive4elements.artifacts.ArtifactCollection;
import org.dive4elements.artifacts.ArtifactNamespaceContext;
import org.dive4elements.artifacts.CallContext;
import org.dive4elements.artifacts.CallMeta;
@@ -56,12 +51,10 @@
import org.dive4elements.river.jfree.DoubleBounds;
import org.dive4elements.river.jfree.EnhancedLineAndShapeRenderer;
import org.dive4elements.river.jfree.RiverAnnotation;
-import org.dive4elements.river.jfree.StableXYDifferenceRenderer;
import org.dive4elements.river.jfree.Style;
-import org.dive4elements.river.jfree.StyledAreaSeriesCollection;
import org.dive4elements.river.jfree.StyledSeries;
+import org.dive4elements.river.jfree.StyledXYDataset;
import org.dive4elements.river.themes.ThemeDocument;
-import org.dive4elements.river.utils.Formatter;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.LegendItem;
import org.jfree.chart.LegendItemCollection;
@@ -478,7 +471,7 @@
addMetadataSubtitle(chart);
/* add the real chart title, but as subtitle after the metadata */
- final String chartTitle = getChartTitle(this.context);
+ final String chartTitle = getChartTitle(this.context);
if (chartTitle != null) {
final TextTitle title = new TextTitle(chartTitle, JFreeChart.DEFAULT_TITLE_FONT);
chart.addSubtitle(title);
@@ -487,7 +480,6 @@
addSubtitles(this.context, chart);
}
-
/**
* Adds a metadata sub-title to the chart if it gets exported
*/
@@ -503,7 +495,7 @@
final TextTitle subtitle = new TextTitle(text, titleFont);
subtitle.setHorizontalAlignment(HorizontalAlignment.LEFT);
- subtitle.setMargin(new RectangleInsets(10,10,10,10));
+ subtitle.setMargin(new RectangleInsets(10, 10, 10, 10));
chart.addSubtitle(subtitle);
}
@@ -517,9 +509,6 @@
return Collections.emptyList();
}
- final CollectionCallContext ccc = (CollectionCallContext) this.context;
- final ArtifactCollection collection = ccc.getCollection();
-
final List<String> subtitles = new ArrayList<>();
/* version */
@@ -817,7 +806,7 @@
plot.setDataset(datasetIndex, dataset);
plot.mapDatasetToRangeAxis(datasetIndex, axisIndex);
- applyThemes(plot, dataset, datasetIndex, axisDataset.isArea(dataset));
+ applyThemes(plot, dataset, datasetIndex);
datasetIndex++;
}
@@ -839,18 +828,21 @@
protected abstract NumberAxis createYAxis(final int index);
/**
- * @param idx
+ * @param datasetIndex
* "index" of dataset/series (first dataset to be drawn has
* index 0), correlates with renderer index.
* @param isArea
* true if the series describes an area and shall be rendered
* as such.
*/
- private void applyThemes(final XYPlot plot, final XYDataset series, final int idx, final boolean isArea) {
- if (isArea)
- applyAreaTheme(plot, (StyledAreaSeriesCollection) series, idx);
+ private void applyThemes(final XYPlot plot, final XYDataset dataset, final int datasetIndex) {
+
+ final Font legendFont = createLegendLabelFont();
+
+ if (dataset instanceof StyledXYDataset)
+ ((StyledXYDataset) dataset).applyTheme(this.context.getMeta(), plot, datasetIndex, legendFont);
else
- applyLineTheme(plot, series, idx);
+ applyLineTheme(plot, dataset, datasetIndex, legendFont);
}
/**
@@ -883,12 +875,8 @@
* @return a new instance of EnhancedLineAndShapeRenderer.
*/
private XYLineAndShapeRenderer createRenderer(final XYPlot plot, final int idx) {
- log.debug("Create EnhancedLineAndShapeRenderer for idx: " + idx);
-
final EnhancedLineAndShapeRenderer r = new EnhancedLineAndShapeRenderer(true, false);
-
r.setPlot(plot);
-
return r;
}
@@ -903,15 +891,14 @@
* The XYDataset which needs to support Series objects.
* @param idx
* The index of the renderer / dataset.
+ * @param legendFont2
*/
- private void applyLineTheme(final XYPlot plot, final XYDataset dataset, final int idx) {
+ private void applyLineTheme(final XYPlot plot, final XYDataset dataset, final int idx, final Font legendFont) {
log.debug("Apply LineTheme for dataset at index: " + idx);
final LegendItemCollection lic = new LegendItemCollection();
final LegendItemCollection anno = plot.getFixedLegendItems();
- final Font legendFont = createLegendLabelFont();
-
final XYLineAndShapeRenderer renderer = createRenderer(plot, idx);
for (int s = 0, num = dataset.getSeriesCount(); s < num; s++) {
@@ -951,64 +938,6 @@
plot.setRenderer(idx, renderer);
}
- /**
- * @param plot
- * The plot.
- * @param area
- * A StyledAreaSeriesCollection object.
- * @param idx
- * The index of the dataset.
- */
- private final void applyAreaTheme(final XYPlot plot, final StyledAreaSeriesCollection area, final int idx) {
- final LegendItemCollection lic = new LegendItemCollection();
- final LegendItemCollection anno = plot.getFixedLegendItems();
-
- final Font legendFont = createLegendLabelFont();
-
- log.debug("Registering an 'area'renderer at idx: " + idx);
-
- final StableXYDifferenceRenderer dRenderer = new StableXYDifferenceRenderer();
-
- if (area.getMode() == StyledAreaSeriesCollection.FILL_MODE.UNDER) {
- dRenderer.setPositivePaint(createTransparentPaint());
- }
-
- plot.setRenderer(idx, dRenderer);
-
- area.applyTheme(dRenderer);
-
- // i18n
- dRenderer.setAreaLabelNumberFormat(Formatter.getFormatter(this.context.getMeta(), 2, 4));
-
- dRenderer.setAreaLabelTemplate(Resources.getMsg(this.context.getMeta(), "area.label.template", "Area=%sm2"));
-
- final LegendItem legendItem = dRenderer.getLegendItem(idx, 0);
- if (legendItem != null) {
- legendItem.setLabelFont(legendFont);
- lic.add(legendItem);
- } else {
- log.warn("Could not get LegentItem for renderer: " + idx + ", series-idx " + 0);
- }
-
- if (anno != null) {
- lic.addAll(anno);
- }
-
- plot.setFixedLegendItems(lic);
- }
-
- /**
- * Returns a transparently textured paint.
- *
- * @return a transparently textured paint.
- */
- private static Paint createTransparentPaint() {
- // TODO why not use a transparent color?
- final BufferedImage texture = new BufferedImage(1, 1, BufferedImage.TYPE_4BYTE_ABGR);
-
- return new TexturePaint(texture, new Rectangle2D.Double(0d, 0d, 0d, 0d));
- }
-
private void preparePDFContext(final CallContext context) {
final int[] dimension = getExportDimension();
@@ -1069,21 +998,27 @@
final Bounds[] xyBounds = ChartHelper.getBounds(dataset);
- if (xyBounds == null) {
- log.warn("Skip XYDataset for Axis (invalid ranges): " + idx);
- return;
- }
+ // if (xyBounds == null) {
+ // log.warn("Skip XYDataset for Axis (invalid ranges): " + idx);
+ // return;
+ // }
if (visible) {
if (log.isDebugEnabled()) {
log.debug("Add new AxisDataset at index: " + idx);
- log.debug("X extent: " + xyBounds[0]);
- log.debug("Y extent: " + xyBounds[1]);
+ if (xyBounds != null) {
+ log.debug("X extent: " + xyBounds[0]);
+ log.debug("Y extent: " + xyBounds[1]);
+ }
}
axisDataset.addDataset(dataset);
}
+ /* No range merging, for areas extending to infinity this causes problems. */
+ if (xyBounds == null || StyledSeriesBuilder.isBigDoubleValue(xyBounds[1].getLower()) || StyledSeriesBuilder.isBigDoubleValue(xyBounds[1].getLower()))
+ return;
+
combineXBounds(xyBounds[0], 0);
combineYBounds(xyBounds[1], idx);
}
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/exports/DiagramGenerator.java
--- a/artifacts/src/main/java/org/dive4elements/river/exports/DiagramGenerator.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/DiagramGenerator.java Thu Sep 27 17:41:44 2018 +0200
@@ -37,7 +37,6 @@
import org.dive4elements.river.jfree.Bounds;
import org.dive4elements.river.jfree.DoubleBounds;
import org.dive4elements.river.jfree.RiverAnnotation;
-import org.dive4elements.river.jfree.StyledAreaSeriesCollection;
import org.dive4elements.river.jfree.XYMetaSeriesCollection;
import org.dive4elements.river.themes.ThemeDocument;
import org.jfree.chart.ChartFactory;
@@ -51,7 +50,6 @@
import org.jfree.chart.plot.Marker;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
-import org.jfree.chart.title.TextTitle;
import org.jfree.data.Range;
import org.jfree.data.general.Series;
import org.jfree.data.xy.XYDataset;
@@ -442,67 +440,6 @@
}
/**
- * Registers an area to be drawn.
- * @param area Area to be drawn.
- * @param axisName Name of the axis.
- * @param visible Whether or not to be visible
- * (important for range calculations).
- */
- public void addAreaSeries(
- StyledAreaSeriesCollection area,
- String axisName,
- boolean visible
- ) {
- addAreaSeries(area, diagramAttributes.getAxisIndex(axisName), visible);
- }
-
- /**
- * Registers an area to be drawn.
- * @param area Area to be drawn.
- * @param index 'axis index'
- * @param visible Whether or not to be visible
- * (important for range calculations).
- */
- public void addAreaSeries(
- StyledAreaSeriesCollection area,
- int index,
- boolean visible
- ) {
- if (area == null) {
- log.warn("Cannot yet render above/under curve.");
- return;
- }
-
- AxisDataset axisDataset = (AxisDataset) getAxisDataset(index);
-
- Bounds[] xyBounds = ChartHelper.getBounds(area);
-
- if (xyBounds == null) {
- log.warn("Skip XYDataset for Axis (invalid ranges): " + index);
- return;
- }
-
-
- if (visible) {
- if (log.isDebugEnabled()) {
- log.debug("Add new AxisDataset at index: " + index);
- log.debug("X extent: " + xyBounds[0]);
- log.debug("Y extent: " + xyBounds[1]);
- }
-
- axisDataset.addArea(area);
- }
-
- /* No range merging, for areas extending to infinity this causes problems. */
- /* No range merging, for areas extending to infinity this causes problems. */
- if( StyledSeriesBuilder.isBigDoubleValue( xyBounds[1].getLower() ) || StyledSeriesBuilder.isBigDoubleValue( xyBounds[1].getLower() ) )
- return;
-
- combineXBounds(xyBounds[0], 0);
- combineYBounds(xyBounds[1], index);
- }
-
- /**
* Add given series if visible, if not visible adjust ranges (such that
* all points in data would be plotted once visible).
* @param series the data series to include in plot.
@@ -1134,7 +1071,7 @@
}
protected final String getDefaultYAxisLabel(String axisName) {
- Set labelSet = axesLabels.get(diagramAttributes.getAxisIndex(axisName));
+ Set<String> labelSet = axesLabels.get(diagramAttributes.getAxisIndex(axisName));
log.debug("Labels for axis: " + labelSet);
if (labelSet != null && !labelSet.isEmpty()) {
String label = StringUtils.join(labelSet, ", ");
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/exports/LegendProcessor.java
--- a/artifacts/src/main/java/org/dive4elements/river/exports/LegendProcessor.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/LegendProcessor.java Thu Sep 27 17:41:44 2018 +0200
@@ -19,25 +19,23 @@
import org.jfree.chart.LegendItemCollection;
import org.jfree.chart.plot.XYPlot;
-
/** Class to process Plots legends. */
public abstract class LegendProcessor {
/** (Empty) shape for aggregated Legend Items. */
- private static final Line2D.Double SPACE = new Line2D.Double(0,0,0,0);
-
+ private static final Line2D.Double SPACE = new Line2D.Double(0, 0, 0, 0);
/** Prevent instantiations. */
private LegendProcessor() {
}
-
/**
* Create a hash from a legenditem.
* This hash can then be used to merge legend items labels.
+ *
* @return hash for given legenditem to identify mergeables.
*/
- protected static String legendItemHash(LegendItem li) {
+ protected static String legendItemHash(final LegendItem li) {
// TODO Do proper implementation.
// Ensure that only mergable sets are created.
// getFillPaint()
@@ -55,46 +53,52 @@
// boolean isShapeFilled()
// boolean isShapeOutlineVisible()
// boolean isShapeVisible()
- String hash = li.getLinePaint().toString();
+ final String hash = li.getLinePaint().toString();
// XXX: DEAD CODE // String label = li.getLabel();
- /*if (label.startsWith("W (") || label.startsWith("W(")) {
- hash += "-W-";
- }
- else if (label.startsWith("Q(") || label.startsWith("Q (")) {
- hash += "-Q-";
- }*/
+ /*
+ * if (label.startsWith("W (") || label.startsWith("W(")) {
+ * hash += "-W-";
+ * }
+ * else if (label.startsWith("Q(") || label.startsWith("Q (")) {
+ * hash += "-Q-";
+ * }
+ */
// WQ.java holds example of using regex Matcher/Pattern.
return hash;
}
-
/**
* Create new legend entries, dependent on settings.
- * @param plot The plot for which to modify the legend.
- * @param threshold How many items are needed for aggregation to
- * be triggered?
+ *
+ * @param plot
+ * The plot for which to modify the legend.
+ * @param threshold
+ * How many items are needed for aggregation to
+ * be triggered?
*/
- public static void aggregateLegendEntries(XYPlot plot, int threshold) {
- LegendItemCollection old = plot.getLegendItems();
+ public static void aggregateLegendEntries(final XYPlot plot, final int threshold) {
+ final LegendItemCollection old = plot.getLegendItems();
// Find "similar" entries if aggregation is enabled.
int maxListSize = 0;
- int AGGR_THRESHOLD = threshold;
+ final int AGGR_THRESHOLD = threshold;
- if (AGGR_THRESHOLD > old.getItemCount() || AGGR_THRESHOLD <= 0){
+ if (AGGR_THRESHOLD > old.getItemCount() || AGGR_THRESHOLD <= 0) {
return;
}
- HashMap<String, List<LegendItem>> entries =
- new LinkedHashMap<String, List<LegendItem>>();
- for (Iterator<LegendItem> i = old.iterator(); i.hasNext();) {
- LegendItem item = i.next();
- String hash = legendItemHash(item);
+ final HashMap<String, List<LegendItem>> entries = new LinkedHashMap<>();
+ // for (Iterator<LegendItem> i = old.iterator(); i.hasNext();) {
+
+ final Iterator<LegendItem> iterator = old.iterator();
+ while (iterator.hasNext()) {
+ final LegendItem item = iterator.next();
+ final String hash = legendItemHash(item);
List<LegendItem> itemList = entries.get(hash);
if (itemList == null) {
- itemList = new ArrayList<LegendItem>();
+ itemList = new ArrayList<>();
entries.put(hash, itemList);
}
itemList.add(item);
@@ -111,8 +115,8 @@
// Run over collected entries, merge their names and create new
// entry if needed.
- LegendItemCollection newLegend = new LegendItemCollection();
- for (List<LegendItem> itemList: entries.values()) {
+ final LegendItemCollection newLegend = new LegendItemCollection();
+ for (final List<LegendItem> itemList : entries.values()) {
if (itemList.size() >= AGGR_THRESHOLD) {
// Now do merging.
// XXX: DEAD CODE // LegendItem item = itemList.get(0);
@@ -124,41 +128,26 @@
// to prevent "overfill" of legenditemblock.
for (int i = 0, I = itemList.size(); i < I; i++) {
if (i != 0) {
- LegendItem litem = itemList.get(i);
+ final LegendItem litem = itemList.get(i);
// Make shape and line really small.
- LegendItem merged = new LegendItem(
- "," + litem.getLabel(),
- litem.getDescription(),
- litem.getToolTipText(),
- litem.getURLText(),
- false,
- SPACE,
- false,
- litem.getFillPaint(),
- false,
- litem.getOutlinePaint(),
- litem.getOutlineStroke(),
- false,
- SPACE,
- litem.getLineStroke(),
- litem.getLinePaint());
+ final LegendItem merged = new LegendItem("," + litem.getLabel(), litem.getDescription(), litem.getToolTipText(), litem.getURLText(),
+ false, SPACE, false, litem.getFillPaint(), false, litem.getOutlinePaint(), litem.getOutlineStroke(), false, SPACE,
+ litem.getLineStroke(), litem.getLinePaint());
newLegend.add(merged);
- }
- else {
+ } else {
newLegend.add(itemList.get(i));
}
}
- }
- else {
+ } else {
// Do not merge entries.
- for (LegendItem li: itemList) {
+ for (final LegendItem li : itemList) {
newLegend.add(li);
}
}
}
- plot.setFixedLegendItems (newLegend);
+ plot.setFixedLegendItems(newLegend);
}
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/exports/XYChartGenerator.java
--- a/artifacts/src/main/java/org/dive4elements/river/exports/XYChartGenerator.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/XYChartGenerator.java Thu Sep 27 17:41:44 2018 +0200
@@ -392,7 +392,7 @@
AxisDataset axisDataset = (AxisDataset) getAxisDataset(index);
if (visible) {
- axisDataset.addArea(area);
+ axisDataset.addDataset(area);
}
else {
/* No range merging, for areas extending to infinity this
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/exports/process/AreaProcessor.java
--- a/artifacts/src/main/java/org/dive4elements/river/exports/process/AreaProcessor.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/process/AreaProcessor.java Thu Sep 27 17:41:44 2018 +0200
@@ -129,7 +129,7 @@
? upperFacetName
: lowerFacetName;
/* Decide axis name based on facet name */
- generator.addAreaSeries(area,
+ generator.addAxisDataset(area,
axisNameForFacet(facetNameForAxis), visible);
}
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/exports/process/DeltaWProcessor.java
--- a/artifacts/src/main/java/org/dive4elements/river/exports/process/DeltaWProcessor.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/process/DeltaWProcessor.java Thu Sep 27 17:41:44 2018 +0200
@@ -213,7 +213,7 @@
area.addSeries(upper);
area.addSeries(lower);
- generator.addAreaSeries(area, axisName, visible);
+ generator.addAxisDataset(area, axisName, visible);
}
protected void doReferenceDeviationOut(
@@ -255,7 +255,7 @@
marker.setStroke(new BasicStroke(2));
marker.setPaint(Color.BLACK);
generator.addValueMarker(marker);
- generator.addAreaSeries(area, axisName, visible);
+ generator.addAxisDataset(area, axisName, visible);
}
@Override
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/exports/process/FixDeltaWAProcessor.java
--- a/artifacts/src/main/java/org/dive4elements/river/exports/process/FixDeltaWAProcessor.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/process/FixDeltaWAProcessor.java Thu Sep 27 17:41:44 2018 +0200
@@ -66,7 +66,7 @@
area.addSeries(seriesUp);
area.addSeries(seriesDown);
area.setMode(StyledAreaSeriesCollection.FILL_MODE.BETWEEN);
- generator.addAreaSeries(area, axisName, visible);
+ generator.addAxisDataset(area, axisName, visible);
}
}
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/exports/process/FixDeltaWProcessor.java
--- a/artifacts/src/main/java/org/dive4elements/river/exports/process/FixDeltaWProcessor.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/process/FixDeltaWProcessor.java Thu Sep 27 17:41:44 2018 +0200
@@ -66,7 +66,7 @@
area.addSeries(seriesUp);
area.addSeries(seriesDown);
area.setMode(StyledAreaSeriesCollection.FILL_MODE.BETWEEN);
- generator.addAreaSeries(area, axisName, visible);
+ generator.addAxisDataset(area, axisName, visible);
}
}
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/exports/process/WOutProcessor.java
--- a/artifacts/src/main/java/org/dive4elements/river/exports/process/WOutProcessor.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/process/WOutProcessor.java Thu Sep 27 17:41:44 2018 +0200
@@ -101,7 +101,7 @@
area.addSeries(seriesUp);
area.addSeries(seriesDown);
area.setMode(StyledAreaSeriesCollection.FILL_MODE.BETWEEN);
- generator.addAreaSeries(area, axisName, visible);
+ generator.addAxisDataset(area, axisName, visible);
}
if (bundle.getFacetName().equals(FacetTypes.LONGITUDINAL_W)
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/java2d/ShapeUtils.java
--- a/artifacts/src/main/java/org/dive4elements/river/java2d/ShapeUtils.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/java2d/ShapeUtils.java Thu Sep 27 17:41:44 2018 +0200
@@ -8,6 +8,7 @@
package org.dive4elements.river.java2d;
+import java.awt.Color;
import java.awt.Shape;
import java.awt.geom.Area;
import java.awt.geom.Ellipse2D;
@@ -24,7 +25,7 @@
private static Map<Long, Shape> scaledShapesCache = new HashMap<>();
- private static final Shape createCross(float size) {
+ private static final Shape createCross(final float size) {
final GeneralPath p = new GeneralPath();
@@ -38,15 +39,15 @@
return p;
}
- private static Shape createBox(float size) {
+ private static Shape createBox(final float size) {
return new Rectangle2D.Double(-size, -size, size * 2, size * 2);
}
- private static Shape createCircle(float size) {
+ private static Shape createCircle(final float size) {
return new Ellipse2D.Float(-size, -size, size * 2, size * 2);
}
- private static final Shape createTriangle(float size) {
+ private static final Shape createTriangle(final float size) {
final GeneralPath p = new GeneralPath();
p.moveTo(-size, size);
@@ -57,7 +58,7 @@
return new Area(p);
}
- public static synchronized Shape getScaledShape(final ShapeType type, float size) {
+ public static synchronized Shape getScaledShape(final ShapeType type, final float size) {
final Long hash = Long.valueOf((((long) type.ordinal()) << 32) | Float.floatToIntBits(size));
@@ -70,7 +71,7 @@
return newShape;
}
- private static Shape createScaledShape(ShapeType type, float size) {
+ private static Shape createScaledShape(final ShapeType type, final float size) {
switch (type) {
case measured:
return createBox(size);
@@ -86,4 +87,12 @@
return createCircle(size);
}
}
+
+ public static Color withAlpha(final Color color, final int transparencyPercent) {
+
+ if (transparencyPercent <= 0 || transparencyPercent > 100 || color == null)
+ return color;
+
+ return new Color(color.getRed(), color.getGreen(), color.getBlue(), (int) ((100 - transparencyPercent) * 2.55f));
+ }
}
\ No newline at end of file
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/jfree/AxisDataset.java
--- a/artifacts/src/main/java/org/dive4elements/river/jfree/AxisDataset.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/jfree/AxisDataset.java Thu Sep 27 17:41:44 2018 +0200
@@ -8,24 +8,18 @@
package org.dive4elements.river.jfree;
+import java.util.ArrayList;
import java.util.List;
-import java.util.ArrayList;
import org.jfree.data.Range;
import org.jfree.data.RangeInfo;
+import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
-import org.jfree.data.xy.XYSeries;
-import org.jfree.data.xy.XYSeriesCollection;
-import org.jfree.data.time.TimeSeriesCollection;
-
-import org.apache.log4j.Logger;
/**
* Axis datasets.
*/
-public class AxisDataset
-{
- private static Logger log = Logger.getLogger(AxisDataset.class);
+public class AxisDataset {
/** Symbolic integer, but also coding the priority (0 goes first). */
protected int axisSymbol;
@@ -42,42 +36,39 @@
protected boolean rangeDirty;
/** Create AxisDataset. */
- public AxisDataset(int symb) {
- axisSymbol = symb;
- datasets = new ArrayList<XYDataset>();
+ public AxisDataset(final int symb) {
+ this.axisSymbol = symb;
+ this.datasets = new ArrayList<>();
}
/** Add a dataset to internal list for this axis. */
- public void addDataset(XYDataset dataset) {
- datasets.add(dataset);
- rangeDirty = true;
+ public void addDataset(final XYDataset dataset) {
+ this.datasets.add(dataset);
+ this.rangeDirty = true;
}
- /** Add a dataset. */
- public void addDataset(XYSeries series) {
- addDataset(new XYSeriesCollection(series));
- }
-
- public void setRange(Range val) {
- range = val;
+ public void setRange(final Range val) {
+ this.range = val;
}
/** Get Range for the range axis of this dataset. */
public Range getRange() {
- if (range != null && !rangeDirty) {
- return range;
+ if (this.range != null && !this.rangeDirty) {
+ return this.range;
}
/* Calculate the min / max of all series */
- for (XYDataset dataset: datasets) {
+ for (final XYDataset dataset : this.datasets) {
Range newRange = null;
if (dataset instanceof StyledAreaSeriesCollection) {
final StyledAreaSeriesCollection areaSeries = (StyledAreaSeriesCollection) dataset;
- if( areaSeries.shouldCalculateRange() )
+ if (areaSeries.shouldCalculateRange())
newRange = areaSeries.getRangeBounds(false);
else {
- /* For most area themes, we do not include areas in the range calculation because
+ /*
+ * For most area themes, we do not include areas in the range calculation because
* they are used with very large / small values to draw areas
- * with axis boundaries */
+ * with axis boundaries
+ */
continue;
}
} else if (dataset instanceof RangeInfo) {
@@ -85,49 +76,37 @@
newRange = ((RangeInfo) dataset).getRangeBounds(false);
} else if (dataset instanceof TimeSeriesCollection) {
/* Lalala <3 Jfreechart's class hirarchy */
- newRange = ((TimeSeriesCollection)dataset)
- .getRangeBounds(false);
+ newRange = ((TimeSeriesCollection) dataset).getRangeBounds(false);
}
/* Now we only expand as we also only add new data */
- if (range == null) {
- range = newRange;
+ if (this.range == null) {
+ this.range = newRange;
} else {
- range = Range.combine(range, newRange);
+ this.range = Range.combine(this.range, newRange);
}
}
- rangeDirty = false;
- return range;
+ this.rangeDirty = false;
+ return this.range;
}
/** Get Array of Datasets. */
public XYDataset[] getDatasets() {
- return datasets.toArray(new XYDataset[datasets.size()]);
- }
-
- /** True if to be rendered as area. */
- public boolean isArea(XYDataset series) {
- return (series instanceof StyledAreaSeriesCollection);
+ return this.datasets.toArray(new XYDataset[this.datasets.size()]);
}
/** True if no datasets given. */
public boolean isEmpty() {
- return datasets.isEmpty();
+ return this.datasets.isEmpty();
}
/** Set the 'real' axis index that this axis is mapped to. */
- public void setPlotAxisIndex(int axisIndex) {
- plotAxisIndex = axisIndex;
+ public void setPlotAxisIndex(final int axisIndex) {
+ this.plotAxisIndex = axisIndex;
}
/** Get the 'real' axis index that this axis is mapped to. */
public int getPlotAxisIndex() {
- return plotAxisIndex;
+ return this.plotAxisIndex;
}
-
- /** Add a Dataset that describes an area. */
- public void addArea(StyledAreaSeriesCollection series) {
- addDataset(series);
- }
-
-}
+}
\ No newline at end of file
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/jfree/StripedAreaDataset.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/artifacts/src/main/java/org/dive4elements/river/jfree/StripedAreaDataset.java Thu Sep 27 17:41:44 2018 +0200
@@ -0,0 +1,133 @@
+/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
+ * Software engineering by
+ * Björnsen Beratende Ingenieure GmbH
+ * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
+ *
+ * This file is Free Software under the GNU AGPL (>=v3)
+ * and comes with ABSOLUTELY NO WARRANTY! Check out the
+ * documentation coming with Dive4Elements River for details.
+ */
+package org.dive4elements.river.jfree;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.dive4elements.artifacts.CallMeta;
+import org.dive4elements.river.java2d.ShapeUtils;
+import org.dive4elements.river.themes.ThemeDocument;
+import org.jfree.chart.LegendItem;
+import org.jfree.chart.LegendItemCollection;
+import org.jfree.chart.plot.XYPlot;
+import org.jfree.data.xy.XYSeries;
+import org.jfree.data.xy.XYSeriesCollection;
+
+/**
+ * @author Domenico Nardi Tironi
+ */
+public class StripedAreaDataset extends XYSeriesCollection implements StyledXYDataset {
+
+ public static final class Stripe {
+
+ private final String label;
+
+ private final Color color;
+
+ private final double lower;
+
+ private final double upper;
+
+ public Stripe(final String label, final Color color, final double lower, final double upper) {
+ this.label = label;
+ this.color = color;
+ this.lower = lower;
+ this.upper = upper;
+ }
+
+ public String getLabel() {
+ return this.label;
+ }
+
+ public Color getColor() {
+ return this.color;
+ }
+
+ public double getLower() {
+ return this.lower;
+ }
+
+ public double getUpper() {
+ return this.upper;
+ }
+
+ }
+
+ private static final long serialVersionUID = 1L;
+
+ private final List<Stripe> stripes = new ArrayList<>();
+
+ private final ThemeDocument theme;
+
+ public StripedAreaDataset(final ThemeDocument theme) {
+ this.theme = theme;
+ }
+
+ public void addStripe(final Stripe stripe) {
+
+ this.stripes.add(stripe);
+
+ final XYSeries stripeSeries = new XYSeries(stripe.getLabel());
+ // REMARK: we need at least one item, so the renderer method is called
+ stripeSeries.add(Double.NaN, Double.NaN);
+ super.addSeries(stripeSeries);
+ }
+
+ @Override
+ public void addSeries(final XYSeries series) {
+ throw new UnsupportedOperationException();
+ }
+
+ Stripe getStripe(final int series) {
+ return this.stripes.get(series);
+ }
+
+ @Override
+ public void applyTheme(final CallMeta callMeta, final XYPlot plot, final int datasetIndex, final Font legendFont) {
+
+ final StripedAreaDatasetRenderer renderer = createRenderer();
+
+ plot.setRenderer(datasetIndex, renderer);
+
+ final LegendItemCollection newItems = new LegendItemCollection();
+ final LegendItemCollection oldItems = plot.getFixedLegendItems();
+
+ final int seriesCount = getSeriesCount();
+ for (int i = 0; i < seriesCount; i++) {
+ final LegendItem legendItem = renderer.getLegendItem(datasetIndex, i);
+ if (legendItem != null) {
+ legendItem.setLabelFont(legendFont);
+ newItems.add(legendItem);
+ }
+ }
+
+ if (oldItems != null)
+ newItems.addAll(oldItems);
+
+ plot.setFixedLegendItems(newItems);
+ }
+
+ private StripedAreaDatasetRenderer createRenderer() {
+
+ final int transparency = this.theme.parseAreaTransparency();
+
+ final StripedAreaDatasetRenderer renderer = new StripedAreaDatasetRenderer();
+ for (int i = 0; i < this.stripes.size(); i++) {
+
+ final Color alphaPaint = ShapeUtils.withAlpha(this.stripes.get(i).getColor(), transparency);
+ renderer.setSeriesPaint(i, alphaPaint);
+ }
+
+ return renderer;
+ }
+}
\ No newline at end of file
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/jfree/StripedAreaDatasetRenderer.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/artifacts/src/main/java/org/dive4elements/river/jfree/StripedAreaDatasetRenderer.java Thu Sep 27 17:41:44 2018 +0200
@@ -0,0 +1,69 @@
+/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
+ * Software engineering by
+ * Björnsen Beratende Ingenieure GmbH
+ * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
+ *
+ * This file is Free Software under the GNU AGPL (>=v3)
+ * and comes with ABSOLUTELY NO WARRANTY! Check out the
+ * documentation coming with Dive4Elements River for details.
+ */
+package org.dive4elements.river.jfree;
+
+import java.awt.Graphics2D;
+import java.awt.Paint;
+import java.awt.Stroke;
+import java.awt.geom.GeneralPath;
+import java.awt.geom.Rectangle2D;
+
+import org.dive4elements.river.jfree.StripedAreaDataset.Stripe;
+import org.jfree.chart.axis.ValueAxis;
+import org.jfree.chart.plot.CrosshairState;
+import org.jfree.chart.plot.PlotRenderingInfo;
+import org.jfree.chart.plot.XYPlot;
+import org.jfree.chart.renderer.xy.AbstractXYItemRenderer;
+import org.jfree.chart.renderer.xy.XYItemRendererState;
+import org.jfree.data.xy.XYDataset;
+
+/**
+ * @author Domenico Nardi Tironi
+ */
+final class StripedAreaDatasetRenderer extends AbstractXYItemRenderer {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void drawItem(final Graphics2D g2, final XYItemRendererState state, final Rectangle2D dataArea, final PlotRenderingInfo info, final XYPlot plot,
+ final ValueAxis domainAxis, final ValueAxis rangeAxis, final XYDataset dataset, final int series, final int item,
+ final CrosshairState crosshairState, final int pass) {
+
+ if (item != 0)
+ return;
+
+ final StripedAreaDataset stripedDataset = (StripedAreaDataset) dataset;
+ final Stripe stripe = stripedDataset.getStripe(series);
+
+ final double lower = stripe.getLower();
+ final double upper = stripe.getUpper();
+
+ final double transLower = Double.isNaN(lower) ? dataArea.getMaxY() : rangeAxis.valueToJava2D(lower, dataArea, plot.getRangeAxisEdge());
+ final double transUpper = Double.isNaN(upper) ? dataArea.getMinY() : rangeAxis.valueToJava2D(upper, dataArea, plot.getRangeAxisEdge());
+
+ final double transLeft = dataArea.getMinX();
+ final double transRight = dataArea.getMaxX();
+
+ final GeneralPath area = new GeneralPath();
+
+ area.moveTo(transLeft, transLower);
+ area.lineTo(transRight, transLower);
+ area.lineTo(transRight, transUpper);
+ area.lineTo(transLeft, transUpper);
+ area.closePath();
+
+ final Paint paint = getItemPaint(series, item);
+ final Stroke stroke = getItemStroke(series, item);
+ g2.setPaint(paint);
+ g2.setStroke(stroke);
+
+ g2.fill(area);
+ }
+}
\ No newline at end of file
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/jfree/StyledAreaSeriesCollection.java
--- a/artifacts/src/main/java/org/dive4elements/river/jfree/StyledAreaSeriesCollection.java Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/jfree/StyledAreaSeriesCollection.java Thu Sep 27 17:41:44 2018 +0200
@@ -10,6 +10,7 @@
import java.awt.BasicStroke;
import java.awt.Color;
+import java.awt.Font;
import java.awt.Paint;
import java.awt.Stroke;
import java.awt.TexturePaint;
@@ -17,7 +18,15 @@
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
+import org.apache.log4j.Logger;
+import org.dive4elements.artifacts.CallMeta;
+import org.dive4elements.river.artifacts.resources.Resources;
+import org.dive4elements.river.java2d.ShapeUtils;
import org.dive4elements.river.themes.ThemeDocument;
+import org.dive4elements.river.utils.Formatter;
+import org.jfree.chart.LegendItem;
+import org.jfree.chart.LegendItemCollection;
+import org.jfree.chart.plot.XYPlot;
import org.jfree.data.xy.XYSeriesCollection;
/**
@@ -27,12 +36,17 @@
* The display options can be used to control the z-order and the axis of the
* dataset.
*/
-// FIXME: bad abstraction: the only purpose of this derivation is to apply specific styles. This should rather be solved similar to the XYSTyle.
-public class StyledAreaSeriesCollection extends XYSeriesCollection {
+// FIXME: bad abstraction: the only purpose of this derivation is to apply specific styles. This should rather be solved
+// similar to the XYSTyle.
+public class StyledAreaSeriesCollection extends XYSeriesCollection implements StyledXYDataset {
private static final long serialVersionUID = 5274940965666948237L;
+ private static final Logger log = Logger.getLogger(StyledAreaSeriesCollection.class);
+
/** Mode, how to draw/which areas to fill. */
- public enum FILL_MODE {UNDER, ABOVE, BETWEEN}
+ public enum FILL_MODE {
+ UNDER, ABOVE, BETWEEN
+ }
/** MODE in use. */
private FILL_MODE mode;
@@ -41,35 +55,83 @@
private final ThemeDocument theme;
/**
- * @param theme the theme-document.
+ * @param theme
+ * the theme-document.
*/
public StyledAreaSeriesCollection(final ThemeDocument theme) {
this.theme = theme;
this.mode = FILL_MODE.BETWEEN;
}
-
/** Gets the Fill mode. */
- public FILL_MODE getMode() {
+ private FILL_MODE getMode() {
return this.mode;
}
-
/** Sets the Fill mode. */
public void setMode(final FILL_MODE fMode) {
this.mode = fMode;
}
+ @Override
+ public void applyTheme(final CallMeta callMeta, final XYPlot plot, final int datasetIndex, final Font legendFont) {
+
+ final LegendItemCollection lic = new LegendItemCollection();
+ final LegendItemCollection anno = plot.getFixedLegendItems();
+
+ log.debug("Registering an 'area'renderer at idx: " + datasetIndex);
+
+ final StableXYDifferenceRenderer dRenderer = new StableXYDifferenceRenderer();
+
+ if (getMode() == StyledAreaSeriesCollection.FILL_MODE.UNDER) {
+ dRenderer.setPositivePaint(createTransparentPaint());
+ }
+
+ plot.setRenderer(datasetIndex, dRenderer);
+
+ applyTheme(dRenderer);
+
+ // i18n
+ dRenderer.setAreaLabelNumberFormat(Formatter.getFormatter(callMeta, 2, 4));
+
+ dRenderer.setAreaLabelTemplate(Resources.getMsg(callMeta, "area.label.template", "Area=%sm2"));
+
+ final LegendItem legendItem = dRenderer.getLegendItem(datasetIndex, 0);
+ if (legendItem != null) {
+ legendItem.setLabelFont(legendFont);
+ lic.add(legendItem);
+ } else {
+ log.warn("Could not get LegentItem for renderer: " + datasetIndex + ", series-idx " + 0);
+ }
+
+ if (anno != null) {
+ lic.addAll(anno);
+ }
+
+ plot.setFixedLegendItems(lic);
+ }
+
+ /**
+ * Returns a transparently textured paint.
+ *
+ * @return a transparently textured paint.
+ */
+ private static Paint createTransparentPaint() {
+ // TODO why not use a transparent color?
+ final BufferedImage texture = new BufferedImage(1, 1, BufferedImage.TYPE_4BYTE_ABGR);
+
+ return new TexturePaint(texture, new Rectangle2D.Double(0d, 0d, 0d, 0d));
+ }
/**
* Applies line color, size and type attributes to renderer, also
* whether to draw lines and/or points.
- * @param renderer Renderer to apply theme to.
+ *
+ * @param renderer
+ * Renderer to apply theme to.
* @return \param renderer
*/
- public StableXYDifferenceRenderer applyTheme(
- final StableXYDifferenceRenderer renderer
- ) {
+ private StableXYDifferenceRenderer applyTheme(final StableXYDifferenceRenderer renderer) {
applyFillColor(renderer);
applyShowBorder(renderer);
applyShowArea(renderer);
@@ -81,16 +143,11 @@
applyPointStyle(renderer);
applyShowMinimumMaximum(renderer);
if (this.mode == FILL_MODE.UNDER) {
- renderer.setAreaCalculationMode(
- StableXYDifferenceRenderer.CALCULATE_NEGATIVE_AREA);
- }
- else if (this.mode == FILL_MODE.ABOVE) {
- renderer.setAreaCalculationMode(
- StableXYDifferenceRenderer.CALCULATE_POSITIVE_AREA);
- }
- else {
- renderer.setAreaCalculationMode(
- StableXYDifferenceRenderer.CALCULATE_ALL_AREA);
+ renderer.setAreaCalculationMode(StableXYDifferenceRenderer.CALCULATE_NEGATIVE_AREA);
+ } else if (this.mode == FILL_MODE.ABOVE) {
+ renderer.setAreaCalculationMode(StableXYDifferenceRenderer.CALCULATE_POSITIVE_AREA);
+ } else {
+ renderer.setAreaCalculationMode(StableXYDifferenceRenderer.CALCULATE_ALL_AREA);
}
// Apply text style.
@@ -115,13 +172,11 @@
if (paint != null && this.getMode() == FILL_MODE.ABOVE) {
renderer.setPositivePaint(paint);
- renderer.setNegativePaint(new Color(0,0,0,0));
- }
- else if (paint != null && this.getMode() == FILL_MODE.UNDER) {
+ renderer.setNegativePaint(new Color(0, 0, 0, 0));
+ } else if (paint != null && this.getMode() == FILL_MODE.UNDER) {
renderer.setNegativePaint(paint);
- renderer.setPositivePaint(new Color(0,0,0,0));
- }
- else {
+ renderer.setPositivePaint(new Color(0, 0, 0, 0));
+ } else {
if (paint == null)
paint = new Color(177, 117, 102);
@@ -134,31 +189,19 @@
final Color paint = this.theme.parseAreaBackgroundColor();
final int transparency = this.theme.parseAreaTransparency();
- final Color alphaPaint = withAlpha(paint, transparency);
+ final Color alphaPaint = ShapeUtils.withAlpha(paint, transparency);
final AreaFillPattern pattern = this.theme.parseAreaBackgroundPattern();
- if( pattern == null || pattern == AreaFillPattern.patternFill )
+ if (pattern == null || pattern == AreaFillPattern.patternFill)
return alphaPaint;
final BufferedImage image = pattern.getImage(alphaPaint);
- final Rectangle2D anchor = new Rectangle2D.Double(0,0, image.getWidth(), image.getHeight());
+ final Rectangle2D anchor = new Rectangle2D.Double(0, 0, image.getWidth(), image.getHeight());
return new TexturePaint(image, anchor);
}
- private Color withAlpha(final Color color, final int transparency) {
-
- if (transparency <= 0 || color == null)
- return color;
-
- return new Color(
- color.getRed(),
- color.getGreen(),
- color.getBlue(),
- (int)((100 - transparency) * 2.55f));
- }
-
private void applyShowBorder(final StableXYDifferenceRenderer renderer) {
final boolean show = this.theme.parseAreaShowBorder();
renderer.setDrawOutline(show);
@@ -195,20 +238,14 @@
private void applyOutlineStyle(final StableXYDifferenceRenderer renderer) {
final float[] dashes = this.theme.parseLineStyle();
- final int size = this.theme.parseLineWidth();
+ final int size = this.theme.parseLineWidth();
Stroke stroke = null;
if (dashes.length <= 1) {
stroke = new BasicStroke(Integer.valueOf(size));
- }
- else {
- stroke = new BasicStroke(Integer.valueOf(size),
- BasicStroke.CAP_BUTT,
- BasicStroke.JOIN_ROUND,
- 1.0f,
- dashes,
- 0.0f);
+ } else {
+ stroke = new BasicStroke(Integer.valueOf(size), BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 1.0f, dashes, 0.0f);
}
renderer.setOutlineStroke(stroke);
@@ -219,10 +256,9 @@
final boolean showPoints = this.theme.parseShowPoints();
renderer.setShapesVisible(showPoints);
- if( showPoints )
- {
+ if (showPoints) {
final int size = this.theme.parsePointWidth();
- final int dim = 2 * size;
+ final int dim = 2 * size;
final Ellipse2D pointShape = new Ellipse2D.Double(-size, -size, dim, dim);
final Color pointColor = this.theme.parsePointColor();
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/java/org/dive4elements/river/jfree/StyledXYDataset.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/artifacts/src/main/java/org/dive4elements/river/jfree/StyledXYDataset.java Thu Sep 27 17:41:44 2018 +0200
@@ -0,0 +1,24 @@
+/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
+ * Software engineering by
+ * Björnsen Beratende Ingenieure GmbH
+ * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
+ *
+ * This file is Free Software under the GNU AGPL (>=v3)
+ * and comes with ABSOLUTELY NO WARRANTY! Check out the
+ * documentation coming with Dive4Elements River for details.
+ */
+package org.dive4elements.river.jfree;
+
+import java.awt.Font;
+
+import org.dive4elements.artifacts.CallMeta;
+import org.jfree.chart.plot.XYPlot;
+import org.jfree.data.xy.XYDataset;
+
+/**
+ * @author Domenico Nardi Tironi
+ *
+ */
+public interface StyledXYDataset extends XYDataset {
+ void applyTheme(CallMeta callMeta, XYPlot plot, int datasetIndex, Font legendFont);
+}
\ No newline at end of file
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/resources/messages.properties
--- a/artifacts/src/main/resources/messages.properties Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/resources/messages.properties Thu Sep 27 17:41:44 2018 +0200
@@ -1198,6 +1198,11 @@
uinfo_salix_scenario_historical = historical
uinfo_facet_salix_rank = Assessment Scheme
uinfo_facet_salix_rank.description = Assessment Scheme
+uinfo_salix_rank.excellent = Excellent
+uinfo_salix_rank.good = Good
+uinfo_salix_rank.moderate = Moderate
+uinfo_salix_rank.bad = Bad
+uinfo_salix_rank.very_bad = Very bad
uinfo_salix_calc.warning.missing_mq = MQ (MW) missing at reference gauge, no calculation possible
uinfo_salix_calc.warning.missing_mhq = MHQ (MHW) missing at reference gauge, no salix calculation possible
uinfo_salix_calc.warning.missing_mnq = MNQ (MNW) missing at reference gauge, no (MW-MNW) calculation possible
@@ -1324,13 +1329,13 @@
bundu.wst.gauge_no_ud_calc_available = No calculation of DNE available.
bundu.chart.wspl.section.title = REFWL-Longitudinal Section
-bundu_facet_bedheight.description = Mean Bed Height ({0})
+bundu_facet_bedheight.description = Mean Bed Height ({0})
bundu_facet_channelmin.description = Bed (Target)
-bundu_facet_field_bedheight.description = Bed Height Field {0}
+bundu_facet_field_bedheight.description = Bed Height Field {0}
bundu.chart.depth.section.title = \u0394h-L\u00e4ngsschnitt
bundu_facet_flowdepth.filtered.description = \u0394h (BZWS, {0})
bundu_facet_channeldepth.description = \u0394h (Target depth)
-bundu_facet_field_depth.description = \u0394h Field {0}
+bundu_facet_field_depth.description = \u0394h Field {0}
bundu.channelfinder.empty = The database does not contain any values for the river and the reference year
bundu.channelfinder.missing = no channel data available
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 artifacts/src/main/resources/messages_de.properties
--- a/artifacts/src/main/resources/messages_de.properties Thu Sep 27 17:40:39 2018 +0200
+++ b/artifacts/src/main/resources/messages_de.properties Thu Sep 27 17:41:44 2018 +0200
@@ -1198,6 +1198,11 @@
uinfo_salix_scenario_historical = historisch
uinfo_facet_salix_rank = Bewertungsschema
uinfo_facet_salix_rank.description = Bewertungsschema
+uinfo_salix_rank.excellent = Sehr gut
+uinfo_salix_rank.good = Gut
+uinfo_salix_rank.moderate = M\u00e4\u00dfig
+uinfo_salix_rank.bad = Schlecht
+uinfo_salix_rank.very_bad = Sehr schlecht
uinfo_salix_calc.warning.missing_mq = MQ (MW) fehlt am Bezugspegel, Berechnung nicht m\u00f6glich
uinfo_salix_calc.warning.missing_mhq = MHQ (MHW) fehlt am Bezugspegel, Berechnung des Iota nicht m\u00f6glich
uinfo_salix_calc.warning.missing_mnq = MNQ (MNW) fehlt am Bezugspegel, Berechnung von (MW-MNW) nicht m\u00f6glich
@@ -1324,13 +1329,13 @@
bundu.wst.gauge_no_ud_calc_available = Eine Berechnung der UD ist nicht m\u00f6glich.
bundu.chart.wspl.section.title = BZWS-L\u00e4ngsschnitt
-bundu_facet_bedheight.description = Mittlere Sohlh\u00f6he ({0})
+bundu_facet_bedheight.description = Mittlere Sohlh\u00f6he ({0})
bundu_facet_channelmin.description = Sohle (Sollzustand)
-bundu_facet_field_bedheight.description = Sohlh\u00f6he Feld {0}
+bundu_facet_field_bedheight.description = Sohlh\u00f6he Feld {0}
bundu.chart.depth.section.title = \u0394h-L\u00e4ngsschnitt
bundu_facet_flowdepth.filtered.description = \u0394h (BZWS, {0})
bundu_facet_channeldepth.description = \u0394h (Solltiefe)
-bundu_facet_field_depth.description = \u0394h Feld {0}
+bundu_facet_field_depth.description = \u0394h Feld {0}
bundu.channelfinder.empty = Die Datenbank enth\u00e4lt keine Fahrrinnedaten f\u00fcr das Gew\u00e4sser und das Bezugsjahr
bundu.channelfinder.missing = keine Fahrrinnedaten vorhanden
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 backend/src/main/java/org/dive4elements/river/importer/ImportAttribute.java
--- a/backend/src/main/java/org/dive4elements/river/importer/ImportAttribute.java Thu Sep 27 17:40:39 2018 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/ImportAttribute.java Thu Sep 27 17:41:44 2018 +0200
@@ -59,6 +59,26 @@
if (this.peer != null)
return this.peer;
final Session session = ImporterSession.getInstance().getDatabaseSession();
+ final Query query = session.createQuery("FROM Attribute WHERE value=:value");
+ query.setString("value", this.value.trim());
+ final List<Attribute> attributes = query.list();
+ if (attributes.isEmpty()) {
+ this.peer = getPeerCaseInsensitive();
+ if (this.peer == null) {
+ this.peer = new Attribute(this.value);
+ session.save(this.peer);
+ }
+ }
+ else {
+ this.peer = attributes.get(0);
+ }
+ return this.peer;
+ }
+
+ private Attribute getPeerCaseInsensitive() {
+ if (this.peer != null)
+ return this.peer;
+ final Session session = ImporterSession.getInstance().getDatabaseSession();
final Query query = session.createQuery("FROM Attribute WHERE lower(value)=:value");
query.setString("value", this.value.trim().toLowerCase());
final List<Attribute> attributes = query.list();
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.java
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.java Thu Sep 27 17:40:39 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.java Thu Sep 27 17:41:44 2018 +0200
@@ -1616,4 +1616,6 @@
String gauge_list_grid_end();
String no_data_for_input();
+
+ String bundu_bezugswsts();
}
\ No newline at end of file
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.properties
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.properties Thu Sep 27 17:40:39 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.properties Thu Sep 27 17:41:44 2018 +0200
@@ -858,6 +858,7 @@
bundu_ws_wq_info = The discharge values MNQ, MQ and MHQ are being calculated based on the daily discharge values.
bundu_wspl_longitudinal_section = REFWL - Longitudinal Section
bundu_depth_longitudinal_section = REFWL \u0394h -
+bundu_bezugswsts = Reference Waterlevels
chart_settings_export_metadata = Show Metadata
export_csv_title = Title:
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_de.properties
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_de.properties Thu Sep 27 17:40:39 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_de.properties Thu Sep 27 17:41:44 2018 +0200
@@ -858,6 +858,7 @@
bundu_ws_wq_info = Die Abfl\u00fcsse MNQ, MQ und MHQ sind anhand der Tagesmittelwerte des Abflusses berechnet.
bundu_wspl_longitudinal_section = BZWS - L\u00e4ngsschnitt
bundu_depth_longitudinal_section = BZWS \u0394h - L\u00e4ngsschnitt
+bundu_bezugswsts = Bezugswasserst\u00e4nde
chart_settings_export_metadata = Metadaten anzeigen
export_csv_title = Titel:
diff -r d6d5ca6d4af0 -r 7b4b66c7b303 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/AbstractEpochPanel.java
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/AbstractEpochPanel.java Thu Sep 27 17:40:39 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/AbstractEpochPanel.java Thu Sep 27 17:41:44 2018 +0200
@@ -210,7 +210,7 @@
switch (this.type) {
case single:
- data.add(buildResult(this.start.getValueAsString(), this.end.getValueAsString()));
+ data.add(resultToData(buildResult(this.start.getValueAsString(), this.end.getValueAsString())));
break;
case multi:
@@ -218,9 +218,13 @@
if (lgr.length == 0) {
return new Data[0];
}
+ final StringBuilder resultBuilder = new StringBuilder();
for (final ListGridRecord element : lgr) {
- data.add(buildResult(element.getAttribute("from"), element.getAttribute("to")));
+ resultBuilder.append(buildResult(element.getAttribute("from"), element.getAttribute("to")));
+
}
+ data.add(resultToData(resultBuilder.toString()));
+
break;
default:
throw new IllegalStateException();
@@ -228,14 +232,17 @@
return data.toArray(new Data[data.size()]);
}
- private final Data buildResult(final String startStr, final String endStr) {
+ private final String buildResult(final String startStr, final String endStr) {
final StringBuilder builder = new StringBuilder();
builder.append(startStr);
builder.append(",");
builder.append(endStr);
builder.append(";");
- final DataItem item = new DefaultDataItem(getDatakey(), null, builder.toString());
+ return builder.toString();
+ }
+
+ final Data resultToData(final String resultStr) {
+ final DataItem item = new DefaultDataItem(getDatakey(), null, resultStr);
return new DefaultData(getDatakey(), null, null, new DataItem[] { item });
}
-
}
More information about the Dive4Elements-commits
mailing list