# HG changeset patch # User Tom Gottfried # Date 1374491022 -7200 # Node ID 62d6e1d5da478aae9329a3f1c7420325f514b7c2 # Parent 49dd3e478ccd709f5b6c83860105a5052ea3a65b# Parent 0e1f142af3972ae04dfb63661219b40c04242d15 merged changes from default into double-precision branch diff -r 49dd3e478ccd -r 62d6e1d5da47 .hgtags --- a/.hgtags Fri Jun 28 19:32:43 2013 +0200 +++ b/.hgtags Mon Jul 22 13:03:42 2013 +0200 @@ -54,3 +54,14 @@ 5733d7f27196c5a8cf18231fbf187738f8fea560 3.0.7 eec895f6ec801a7faaed96e9f01721e1143e7bb8 3.0.8 41152c3a532d63a25e9fa348ca4286bdd76069ef 3.0.9 +5f4893db41e4fed644ddbd91bf4cdf0ac7952161 3.0.10 +5f4893db41e4fed644ddbd91bf4cdf0ac7952161 3.0.10 +0000000000000000000000000000000000000000 3.0.10 +0000000000000000000000000000000000000000 3.0.10 +bfcb513c1fdace07ce39616bc9fda3899e8ee914 3.0.10 +63baa1873b1f86a78ab10d19ae4221ec01cc75a2 3.0.11 +3999162f474fb5a6bced33521f81c9ccf274c4e7 3.0.12 +3999162f474fb5a6bced33521f81c9ccf274c4e7 3.0.12 +0000000000000000000000000000000000000000 3.0.12 +0000000000000000000000000000000000000000 3.0.12 +da197a9236fde564d45379c0826510c69a5709ce 3.0.12 diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/doc/conf/artifacts/chart.xml --- a/artifacts/doc/conf/artifacts/chart.xml Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/doc/conf/artifacts/chart.xml Mon Jul 22 13:03:42 2013 +0200 @@ -58,8 +58,18 @@ + + + + + + + + + + diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/doc/conf/artifacts/winfo.xml --- a/artifacts/doc/conf/artifacts/winfo.xml Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/doc/conf/artifacts/winfo.xml Mon Jul 22 13:03:42 2013 +0200 @@ -271,6 +271,14 @@ + + + + + + + + @@ -444,10 +452,12 @@ + diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/doc/conf/datacage.sql --- a/artifacts/doc/conf/datacage.sql Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/doc/conf/datacage.sql Mon Jul 22 13:03:42 2013 +0200 @@ -41,7 +41,7 @@ artifact_id INT NOT NULL REFERENCES artifacts(id) ON DELETE CASCADE, kind VARCHAR(256) NOT NULL, k VARCHAR(256) NOT NULL, - v VARCHAR(256), -- Maybe too short + v TEXT, UNIQUE (artifact_id, k) ); diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/doc/conf/meta-data.xml --- a/artifacts/doc/conf/meta-data.xml Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/doc/conf/meta-data.xml Mon Jul 22 13:03:42 2013 +0200 @@ -87,12 +87,15 @@ + + + @@ -135,6 +138,7 @@ + @@ -268,6 +272,16 @@ + + + + + + + + + + @@ -319,6 +333,7 @@ + @@ -344,6 +359,10 @@ + + + + @@ -375,20 +394,20 @@ - + - + - + @@ -411,9 +430,10 @@ @@ -710,6 +730,78 @@ + + + + No diffs between beddiffs and others, for now. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No grouping in this? @@ -877,11 +969,11 @@ - + - + @@ -889,14 +981,14 @@ - - - + + + - + @@ -2332,8 +2424,8 @@ + ids="official-wstv-{$wstcolpos}-{$wstid}" + factory="staticwqkms" target_out="{$out}"/> diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/doc/conf/themes/default.xml --- a/artifacts/doc/conf/themes/default.xml Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/doc/conf/themes/default.xml Mon Jul 22 13:03:42 2013 +0200 @@ -1399,12 +1399,14 @@ - + + diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/doc/conf/themes/second.xml --- a/artifacts/doc/conf/themes/second.xml Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/doc/conf/themes/second.xml Mon Jul 22 13:03:42 2013 +0200 @@ -1399,12 +1399,14 @@ - + + diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/doc/conf/themes/virtual.xml --- a/artifacts/doc/conf/themes/virtual.xml Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/doc/conf/themes/virtual.xml Mon Jul 22 13:03:42 2013 +0200 @@ -30,6 +30,17 @@ + + + + + + + + 0) { - min = range[0]; + this.addStringData(DATA_KM, Double.toString(range[0])); + this.addStringData(PARENT_KM, Double.toString(range[0])); } - this.addStringData(DATA_KM, Double.toString(min)); } @@ -242,6 +244,20 @@ /** + * Return position (km) from parent (initial km), 0 if not found. + */ + private double getParentKm() { + String val = getDataAsString(PARENT_KM); + try { + return Double.valueOf(val); + } + catch (NumberFormatException e) { + logger.warn("Could not get data " + PARENT_KM + " as double", e); + return 0; + } + } + + /** * Return position (km) from data, 0 if not found. */ protected double getKm() { diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/artifacts/MainValuesArtifact.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/MainValuesArtifact.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/MainValuesArtifact.java Mon Jul 22 13:03:42 2013 +0200 @@ -316,6 +316,21 @@ return spawnState(); } + /** + * Access the Gauge that the mainvalues are taken from. + * @return Gauge that main values are taken from or null in case of + * invalid parameterization. + */ + protected Gauge getGauge(double km) { + River river = RiverUtils.getRiver(this); + + if (river == null) { + logger.error("River is null"); + return null; + } + + return river.determineGaugeByPosition(km); + } /** * Access the Gauge that the mainvalues are taken from. @@ -358,6 +373,41 @@ * Get a list of "Q" main values. * @return list of Q main values. */ + public List getMainValuesQ(double[] kms) { + List filteredList = new ArrayList(); + boolean atGauge = false; + Gauge gauge = getGauge(kms[0]); + WstValueTable interpolator = WstValueTableFactory.getTable(RiverUtils.getRiver(this)); + Calculation c = new Calculation(); + double w_out[] = {0.0f}; + double q_out[] = {0.0f}; + if (gauge != null) { + double gaugeStation = gauge.getStation().doubleValue(); + atGauge = Math.abs(kms[0] - gaugeStation) < 1e-4; + List orig = gauge.getMainValues(); + for (MainValue mv : orig) { + if (mv.getMainValue().getType().getName().equals("Q")) { + if (atGauge) { + q_out[0] = mv.getValue().doubleValue(); + } + else { + interpolator.interpolate(mv.getValue().doubleValue(), + gaugeStation, kms, w_out, q_out, c); + } + filteredList.add(new NamedDouble( + mv.getMainValue().getName(), + q_out[0] + )); + } + } + } + return filteredList; + } + + /** + * Get a list of "Q" main values. + * @return list of Q main values. + */ public List getMainValuesQ(boolean atGauge) { List filteredList = new ArrayList(); Gauge gauge = getGauge(); @@ -366,8 +416,8 @@ double w_out[] = {0.0f}; double q_out[] = {0.0f}; double kms[] = {getLocation()}; - double gaugeStation = gauge.getStation().doubleValue(); if (gauge != null) { + double gaugeStation = gauge.getStation().doubleValue(); List orig = gauge.getMainValues(); for (MainValue mv : orig) { if (mv.getMainValue().getType().getName().equals("Q")) { @@ -389,21 +439,26 @@ } - /** - * Get a list of "W" main values. - * @param atGauge if true, do not interpolate - * @return list of W main values. - */ - public List getMainValuesW(boolean atGauge) { + /** Get main values of km. */ + public List getMainValuesW(double[] kms) { List filteredList = new ArrayList(); - Gauge gauge = getGauge(); + boolean atGauge = false; + double gaugeDatum = 0d; + Gauge gauge = getGauge(kms[0]); + if (gauge == null) { + return filteredList; + } + else if (Math.abs(kms[0] - gauge.getStation().doubleValue()) < 1e-4) { + atGauge = true; + gaugeDatum = gauge.getDatum().doubleValue(); + } + WstValueTable interpolator = WstValueTableFactory.getTable(RiverUtils.getRiver(this)); Calculation c = new Calculation(); double gaugeStation = gauge.getStation().doubleValue(); double w_out[] = {0.0f}; double q_out[] = {0.0f}; - double kms[] = {getLocation()}; if (gauge != null) { List orig = gauge.getMainValues(); for (MainValue mv : orig) { @@ -411,6 +466,41 @@ if (mv.getMainValue().getType().getName().equals("W")) { filteredList.add(new NamedDouble(mv.getMainValue().getName(), mv.getValue().doubleValue())); + } + } else + // We cannot interpolate the W values, so derive them + // from given Q values. + if (mv.getMainValue().getType().getName().equals("Q")) { + interpolator.interpolate(mv.getValue().doubleValue(), + gaugeStation, kms, w_out, q_out, c); + + filteredList.add(new NamedDouble( + "W(" + mv.getMainValue().getName() +")", + w_out[0] + )); + } + } + } + return filteredList; + } + + + public List getMainValuesW(boolean atGauge, double[] kms) { + List filteredList = new ArrayList(); + Gauge gauge = getGauge(); + WstValueTable interpolator = WstValueTableFactory.getTable(RiverUtils.getRiver(this)); + Calculation c = new Calculation(); + + double w_out[] = {0.0f}; + double q_out[] = {0.0f}; + if (gauge != null) { + double gaugeStation = gauge.getStation().doubleValue(); + List orig = gauge.getMainValues(); + for (MainValue mv : orig) { + if (atGauge) { + if (mv.getMainValue().getType().getName().equals("W")) { + filteredList.add(new NamedDouble(mv.getMainValue().getName(), + mv.getValue().doubleValue())); } } else @@ -431,6 +521,16 @@ /** + * Get a list of "W" main values. + * @param atGauge if true, do not interpolate + * @return list of W main values. + */ + public List getMainValuesW(boolean atGauge) { + return getMainValuesW(atGauge, new double[] {getLocation()}); + } + + + /** * Returns the name of this artifact ('mainvalue'). * * @return 'mainvalue' diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/artifacts/StaticWKmsArtifact.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/StaticWKmsArtifact.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/StaticWKmsArtifact.java Mon Jul 22 13:03:42 2013 +0200 @@ -310,7 +310,7 @@ return -1; } - // Do linear interpolation + // Do linear interpolation. int mod = kmIncreasing ? -1 : +1; return Linear.linear(km, wkms.getKm(idx+mod), wkms.getKm(idx), wkms.getW(idx+mod), wkms.getW(idx)); } diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/artifacts/StaticWQKmsArtifact.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/StaticWQKmsArtifact.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/StaticWQKmsArtifact.java Mon Jul 22 13:03:42 2013 +0200 @@ -59,6 +59,8 @@ private static final String NAME = "staticwqkms"; + private boolean official = false; + static { // TODO: Move to configuration. FacetActivity.Registry.getInstance().register( @@ -85,6 +87,10 @@ /** * Gets called from factory, to set things up. + * + * If the id's string starts with official- it will be treated as + * an Artifact containing official data for the according special + * case handling. */ @Override public void setup( @@ -106,6 +112,10 @@ if (code != null) { String [] parts = code.split("-"); + if (parts.length >= 1) { + official = parts[0].toLowerCase().equals("official"); + } + if (parts.length >= 4) { int col = Integer.parseInt(parts[2]); int wst = Integer.parseInt(parts[3]); @@ -222,5 +232,10 @@ return Lines.createWaterLines(points, wAtKm); } // TODO implement deepCopy. + + public boolean isOfficial() + { + return official; + } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/artifacts/WINFOArtifact.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/WINFOArtifact.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/WINFOArtifact.java Mon Jul 22 13:03:42 2013 +0200 @@ -197,15 +197,26 @@ String calculationMode = getDataAsString("calculation_mode"); - if (calculationMode.equals("calc.discharge.longitudinal.section") - ) { - return getDischargeLongitudinalSectionData(); - } - else if (calculationMode.equals("calc.extreme.curve")) { - return (CalculationResult) - this.compute(context, ComputeType.ADVANCE, false); + // If this WINFO-Artifact has a calculation trait. + if (calculationMode != null) { + if (calculationMode.equals("calc.discharge.longitudinal.section") + ) { + return getDischargeLongitudinalSectionData(); + } + else if (calculationMode.equals("calc.extreme.curve")) { + return (CalculationResult) + this.compute(context, ComputeType.ADVANCE, false); + } + else if (calculationMode.equals("calc.w.differences")) { + return (CalculationResult) + this.compute(context, ComputeType.ADVANCE, true); + } + else { + logger.warn("Unhandled calculation_mode " + calculationMode); + } } + // Otherwise get it from parameterization. River river = RiverUtils.getRiver(this); if (river == null) { return error(new WQKms[0], "no.river.selected"); diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/artifacts/access/FixAnalysisAccess.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/access/FixAnalysisAccess.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/access/FixAnalysisAccess.java Mon Jul 22 13:03:42 2013 +0200 @@ -33,6 +33,7 @@ super(artifact); } + /** Access the reference date period, return null in case of 'errors'. */ public DateRange getReferencePeriod() { if (referencePeriod == null) { StateData refStart = artifact.getData("ref_start"); diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/artifacts/datacage/Recommendations.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/datacage/Recommendations.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/datacage/Recommendations.java Mon Jul 22 13:03:42 2013 +0200 @@ -173,7 +173,7 @@ /** * Append recommendations to \param result. - * @param extraParameters parameters (typicall example: 'recommended') + * @param extraParameters parameters (typical example: 'recommended') */ public void recommend( D4EArtifact artifact, diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/artifacts/model/CrossSectionFactory.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/CrossSectionFactory.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/CrossSectionFactory.java Mon Jul 22 13:03:42 2013 +0200 @@ -59,30 +59,6 @@ } - /** - * True if the given section is the "newest" for that river. - * @param section Given section - * @return true if the section has the most advanced end of its validity interval - * or the most advanced start of its validity interval. - */ - public static boolean isNewest(CrossSection section) { - Session session = SessionHolder.HOLDER.get(); - Query query = session.createQuery( - "from CrossSection where river.id = :riverid " - + " order by timeInterval.stopTime desc, timeInterval.startTime desc"); - query.setParameter("riverid", section.getRiver().getId()); - - List result = query.list(); - - if (result == null || result.isEmpty()) { - return true; - } - else { - CrossSection cs = (CrossSection) result.get(0); - return section.getId().equals(cs.getId()); - } - } - /** * Get a specific CrossSection from db. diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/artifacts/model/FastCrossSectionChunk.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/FastCrossSectionChunk.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/FastCrossSectionChunk.java Mon Jul 22 13:03:42 2013 +0200 @@ -19,6 +19,10 @@ import org.apache.log4j.Logger; +/** + * Number of FastCrossSectionLines, e.g. to store in cache and retrieve + * a single contain CrossSectionLine by its km. + */ public class FastCrossSectionChunk implements Serializable { diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/artifacts/model/MainValuesQFacet.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/MainValuesQFacet.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/MainValuesQFacet.java Mon Jul 22 13:03:42 2013 +0200 @@ -25,6 +25,7 @@ import org.dive4elements.river.jfree.StickyAxisAnnotation; import org.dive4elements.river.exports.DurationCurveGenerator; +import org.dive4elements.river.exports.fixings.FixChartGenerator; /** @@ -89,7 +90,8 @@ * Returns the data this facet requires. * * @param artifact the owner artifact. - * @param context the CallContext (ignored). + * @param context the CallContext (can be used to find out if in + * navigable fixation-setting, or durationcurve). * * @return the data. */ @@ -105,6 +107,15 @@ getDataProvider(DurationCurveFacet.BB_DURATIONCURVE); if (providers.size() < 1) { logger.warn("Could not find durationcurve data provider."); + // Do we have a current km in context? + // If so, we are likely fetching data for a navigable + // diagram (i.e. in fixation branch). + if (context.getContextValue(FixChartGenerator.CURRENT_KM) != null) { + Double ckm = (Double) context.getContextValue(FixChartGenerator.CURRENT_KM); + // Return linearly interpolated values, in m if not at gauge, + // in cm if at gauge. + qs = mvArtifact.getMainValuesQ(new double[] {ckm}); + } } else { wqdays = (WQDay) providers.get(0).provideData( diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/artifacts/model/MainValuesWFacet.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/MainValuesWFacet.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/MainValuesWFacet.java Mon Jul 22 13:03:42 2013 +0200 @@ -23,6 +23,7 @@ import org.dive4elements.river.artifacts.math.Linear; import org.dive4elements.river.jfree.RiverAnnotation; import org.dive4elements.river.jfree.StickyAxisAnnotation; +import org.dive4elements.river.exports.fixings.FixChartGenerator; /** @@ -85,7 +86,8 @@ * Returns the data this facet provides. * * @param artifact the owner artifact. - * @param context the CallContext (ignored). + * @param context the CallContext (can be used to find out if in + * navigable fixation-setting, or durationcurve). * * @return the data. */ @@ -102,6 +104,15 @@ getDataProvider(DurationCurveFacet.BB_DURATIONCURVE); if (providers.size() < 1) { logger.warn("Could not find durationcurve data provider."); + // Do we have a current km in context? + // If so, we are likely fetching data for a navigable + // diagram (i.e. in fixation branch). + if (context.getContextValue(FixChartGenerator.CURRENT_KM) != null) { + Double ckm = (Double) context.getContextValue(FixChartGenerator.CURRENT_KM); + // Return linearly interpolated values, in m if not at gauge, + // in cm if at gauge. + ws = mvArtifact.getMainValuesW(new double[] {ckm}); + } } else { wqdays = (WQDay) providers.get(0).provideData( diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/artifacts/model/OfficialLineFinder.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/OfficialLineFinder.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/OfficialLineFinder.java Mon Jul 22 13:03:42 2013 +0200 @@ -10,6 +10,7 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -25,6 +26,7 @@ import org.dive4elements.river.model.NamedMainValue; import org.dive4elements.river.model.OfficialLine; import org.dive4elements.river.model.River; +import org.dive4elements.river.model.TimeInterval; import org.dive4elements.river.model.Wst; import org.dive4elements.river.model.WstColumn; @@ -46,6 +48,8 @@ private int wstId; private int columnPos; private String name; + private String source; + private Date date; public ValueRange( double start, @@ -53,13 +57,17 @@ double value, int wstId, int columnPos, - String name + String name, + String source, + Date date ) { super(start, end); this.value = value; this.wstId = wstId; this.columnPos = columnPos; this.name = name; + this.source = source; + this.date = date; } public boolean sameValue(double value) { @@ -82,6 +90,14 @@ return name; } + public String getSource() { + return source; + } + + public Date getDate() { + return date; + } + @Override public boolean equals(Object o) { if (!(o instanceof ValueRange)) { @@ -96,7 +112,11 @@ return "[" + name + " value: " + value + " wstId: " + wstId + - " pos: " + columnPos + "]"; + " pos: " + columnPos + + " source: " + source + + " date: " + date + + " from: " + start + + " to: " + end + "]"; } } @@ -132,10 +152,13 @@ new HashMap>(); for (OfficialLine line: OfficialLine.fetchAllOfficalLines()) { - NamedMainValue nmv = line.getNamedMainValue(); - Integer mnvId = nmv.getId(); - WstColumn wc = line.getWstColumn(); - Wst wst = wc.getWst(); + NamedMainValue nmv = line.getNamedMainValue(); + Integer mnvId = nmv.getId(); + WstColumn wc = line.getWstColumn(); + Wst wst = wc.getWst(); + TimeInterval ti = wc.getTimeInterval(); + Date date = ti != null ? ti.getStartTime() : null; + String source = wc.getSource(); List ranges = new ArrayList(); @@ -147,14 +170,14 @@ NamedMainValue tnmv = mainValue.getMainValue(); if (tnmv.getId().equals(mnvId)) { // found gauge with this main value - double from = gauge.getRange().getA().doubleValue(); - double to = gauge.getRange().getA().doubleValue(); + double to = gauge.getRange().getB().doubleValue(); double value = mainValue.getValue().doubleValue(); int wstId = wst.getId(); int pos = wc.getPosition(); ValueRange range = new ValueRange( - from, to, value, wstId, pos, nmv.getName()); + from, to, value, wstId, pos, + nmv.getName(), source, date); if (debug) { log.debug( diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/artifacts/model/WQKms.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/WQKms.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/WQKms.java Mon Jul 22 13:03:42 2013 +0200 @@ -143,5 +143,15 @@ double to = getKm(size()-1); return from + " - " + to; } + + /** + * Returns an array of two double values the first and last kilometer. + * + * @return a double array with the first and last km + */ + public double[] getFirstLastKM() { + /* Behold the first km might be larger then the last! */ + return new double[] {getKm(0), getKm(size()-1)}; + } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/artifacts/model/WQKmsResult.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/WQKmsResult.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/WQKmsResult.java Mon Jul 22 13:03:42 2013 +0200 @@ -12,4 +12,4 @@ public interface WQKmsResult { public WQKms[] getWQKms(); } - +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixAnalysisCalculation.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixAnalysisCalculation.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixAnalysisCalculation.java Mon Jul 22 13:03:42 2013 +0200 @@ -172,7 +172,7 @@ ArrayList allQWDs = new ArrayList(); // for all Q sectors. - for (int qSector = qSectorStart; qSector < qSectorEnd; ++qSector) { + for (int qSector = qSectorStart; qSector <= qSectorEnd; ++qSector) { Filter filter = new AndFilter() .add(kmFilter) @@ -289,6 +289,7 @@ return results; } + /** Returns the mapped value of colIdx or the size of the hashmap. */ private static final int getIndex(TIntIntHashMap map, int colIdx) { if (map.containsKey(colIdx)) { return map.get(colIdx); diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedDiffCalculation.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedDiffCalculation.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedDiffCalculation.java Mon Jul 22 13:03:42 2013 +0200 @@ -18,7 +18,10 @@ import org.dive4elements.river.artifacts.model.Calculation; import org.dive4elements.river.artifacts.model.CalculationResult; - +/** + * Perform calculation of differences of bed height (german Sohlhoehe). + * The input are either single year data or epochs. + */ public class BedDiffCalculation extends Calculation { @@ -84,6 +87,7 @@ */ } + /** Get two BedHeights from factory. */ private static BedHeight [] getHeightPair(int [] ids, String type) { return new BedHeight [] { BedHeightFactory.getHeight(type, ids[0], 0), diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedHeightFactory.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedHeightFactory.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedHeightFactory.java Mon Jul 22 13:03:42 2013 +0200 @@ -62,7 +62,7 @@ /** - * Get WKms for given column and wst_id, caring about the cache. + * Get BedHeight for given type and height_id, caring about the cache. */ public static BedHeight getHeight(String type, int height_id, int time) { log.debug("BedHeightFactory.getHeight"); @@ -92,7 +92,7 @@ return values; } - /** Get name for a WKms. */ + /** Get name for a BedHeight. */ public static String getHeightName(String type, int height_id) { log.debug("BedHeightFactory.getHeightName height_id/" + height_id); @@ -123,10 +123,9 @@ /** - * Get WKms from db. - * @param column the position columns value - * @param wst_id database id of the wst - * @return according WKms. + * Get BedHeight from db. + * @param height_id database id of the bed_height + * @return according BedHeight. */ public static BedHeight getBedHeightUncached( String type, diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadCalculation.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadCalculation.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadCalculation.java Mon Jul 22 13:03:42 2013 +0200 @@ -187,12 +187,28 @@ } } SedimentLoadFraction fr = resLoad.getFraction(km); - resLoad.setCoarse(km, fr.getCoarse()/cSum, fr.getCoarseRange()); - resLoad.setFineMiddle(km, fr.getFineMiddle()/fmSum, fr.getFineMiddleRange()); - resLoad.setSand(km, fr.getSand()/sSum, fr.getSandRange()); - resLoad.setSuspSand(km, fr.getSuspSand()/ssSum, fr.getSuspSandRange()); - resLoad.setSuspSandBed(km, fr.getSuspSandBed()/ssbSum, fr.getSuspSandBedRange()); - resLoad.setSuspSediment(km, fr.getSuspSediment()/sseSum, fr.getSuspSedimentRange()); + // Prevent divisions by zero, the fraction defaults to 0d. + if (cSum != 0) { + resLoad.setCoarse(km, fr.getCoarse()/cSum, fr.getCoarseRange()); + } + if (fmSum != 0) { + resLoad.setFineMiddle(km, fr.getFineMiddle()/fmSum, + fr.getFineMiddleRange()); + } + if (sSum != 0) { + resLoad.setSand(km, fr.getSand()/sSum, fr.getSandRange()); + } + if (ssSum != 0) { + resLoad.setSuspSand(km, fr.getSuspSand()/ssSum, + fr.getSuspSandRange()); + } + if (ssbSum != 0) { + resLoad.setSuspSandBed(km, fr.getSuspSandBed()/ssbSum, + fr.getSuspSandBedRange()); + } + if (sseSum != 0) { + resLoad.setSuspSediment(km, fr.getSuspSediment()/sseSum, fr.getSuspSedimentRange()); + } } resLoad.setDescription(""); resLoad.setEpoch(true); diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadFactory.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadFactory.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadFactory.java Mon Jul 22 13:03:42 2013 +0200 @@ -364,7 +364,7 @@ Calendar toStart = Calendar.getInstance(); toStart.set(eyear - 1, 11, 31); Calendar toEnd = Calendar.getInstance(); - toEnd.set(eyear, 11, 30); + toEnd.set(eyear+1, 11, 31); sqlQuery = session.createSQLQuery(SQL_SELECT_EPOCHS_DATA) .addScalar("description", StandardBasicTypes.STRING) .addScalar("startYear", StandardBasicTypes.DATE) @@ -436,6 +436,7 @@ Range range = null; if (station == null) { log.warn("No measurement station for " + fraction + " km " + km); + continue; } else { if (nextStation != null) diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/artifacts/states/CalculationSelect.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/states/CalculationSelect.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/states/CalculationSelect.java Mon Jul 22 13:03:42 2013 +0200 @@ -77,10 +77,11 @@ CALCULATION_DISCHARGE_CURVE, CALCULATION_HISTORICAL_DISCHARGE_CURVE, CALCULATION_DURATION_CURVE, - CALCULATION_DISCHARGE_LONGITUDINAL_CURVE, +// CALCULATION_DISCHARGE_LONGITUDINAL_CURVE, CALCULATION_W_DIFFERENCES, - CALCULATION_REFERENCE_CURVE, - CALCULATION_EXTREME}; + CALCULATION_REFERENCE_CURVE //, +// CALCULATION_EXTREME + }; /** Error message that is thrown if no mode has been chosen. */ diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/artifacts/states/WDifferencesState.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/states/WDifferencesState.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/states/WDifferencesState.java Mon Jul 22 13:03:42 2013 +0200 @@ -18,10 +18,12 @@ import org.dive4elements.artifacts.CallContext; import org.dive4elements.artifacts.Artifact; +import org.dive4elements.river.artifacts.ChartArtifact; import org.dive4elements.river.artifacts.D4EArtifact; +import org.dive4elements.river.artifacts.FixationArtifact; +import org.dive4elements.river.artifacts.MINFOArtifact; import org.dive4elements.river.artifacts.StaticWKmsArtifact; import org.dive4elements.river.artifacts.WINFOArtifact; -import org.dive4elements.river.artifacts.ChartArtifact; import org.dive4elements.river.artifacts.math.WKmsOperation; @@ -29,15 +31,16 @@ import org.dive4elements.river.artifacts.model.DataFacet; import org.dive4elements.river.artifacts.model.DifferenceCurveFacet; import org.dive4elements.river.artifacts.model.EmptyFacet; - import org.dive4elements.river.artifacts.model.FacetTypes; import org.dive4elements.river.artifacts.model.WKms; import org.dive4elements.river.artifacts.model.WQKms; +import org.dive4elements.river.artifacts.model.fixings.FixRealizingResult; + import org.dive4elements.river.utils.RiverUtils; import org.dive4elements.river.utils.StringUtil; - +/** State of a WINFOArtifact to get differences of data of other artifacts. */ public class WDifferencesState extends DefaultState implements FacetTypes @@ -76,9 +79,10 @@ /** - * Access the data (wkms). + * Access the data (wkms) of an artifact, coded in mingle. */ protected WKms getWKms(String mingle, CallContext context) { + logger.debug("WDifferencesState.getWKms " + mingle); String[] def = mingle.split(";"); String uuid = def[0]; String name = def[1]; @@ -96,23 +100,45 @@ return wkms; } - WINFOArtifact flys = (WINFOArtifact) RiverUtils.getArtifact( + D4EArtifact d4eArtifact = RiverUtils.getArtifact( uuid, context); - if (flys == null) { + if (d4eArtifact == null) { logger.warn("One of the artifacts (1) for diff calculation could not be loaded"); return null; } - else{ - WQKms[] wqkms = (WQKms[]) flys.getWaterlevelData(). + + if (d4eArtifact instanceof WINFOArtifact) { + logger.debug("Get WKms from WINFOArtifact"); + WINFOArtifact flys = (WINFOArtifact) d4eArtifact; + + WKms[] wkms = (WKms[]) flys.getWaterlevelData(context). getData(); - if (wqkms == null) - logger.warn("not waterlevels in artifact"); - else if (wqkms.length < idx) - logger.warn("not enough waterlevels in artifact"); - return wqkms[idx]; + if (wkms == null || wkms.length == 0) { + logger.warn("no waterlevels in artifact"); + } + else if (wkms.length < idx+1) { + logger.warn("Not enough waterlevels in artifact."); + return new WQKms(); + } + return wkms[idx]; } + else if (d4eArtifact instanceof MINFOArtifact) { + logger.debug("Get WKms from MINFOArtifact"); + CalculationResult r = (CalculationResult) + d4eArtifact.compute(context, ComputeType.ADVANCE, false); + } + else if (d4eArtifact instanceof FixationArtifact) { + logger.debug ("Get WKms from FixationArtifact."); + CalculationResult r = (CalculationResult) + d4eArtifact.compute(context, ComputeType.ADVANCE, false); + FixRealizingResult frR = (FixRealizingResult) r.getData(); + return frR.getWQKms()[idx]; + } + + logger.error("Do not know how to handle (getWKms) minuend/subtrahend"); + return null; } diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/artifacts/states/WaterlevelState.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/states/WaterlevelState.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/states/WaterlevelState.java Mon Jul 22 13:03:42 2013 +0200 @@ -8,6 +8,7 @@ package org.dive4elements.river.artifacts.states; +import java.util.Date; import java.util.List; import org.apache.log4j.Logger; @@ -125,8 +126,8 @@ report.addProblem(Resources.format( cc.getMeta(), "official.line.found", - "Found official line for {0}.", - ol.getName())); + "Found official line for {0} from year {1,date,yyyy} from {2}.", + ol.getName(), nn(ol.getDate()), nn(ol.getSource()))); } } @@ -137,6 +138,14 @@ return res; } + /** Returns empty String if argument is null, argument itself otherwise. */ + private static final String nn(String s) { + return s != null ? s : ""; + } + + private static final Date nn(Date d) { + return d != null ? d : new Date(); + } /** * @param context Ignored. diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/artifacts/states/fixation/FixRealizingCompute.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/states/fixation/FixRealizingCompute.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/states/fixation/FixRealizingCompute.java Mon Jul 22 13:03:42 2013 +0200 @@ -29,7 +29,6 @@ import org.dive4elements.river.artifacts.model.fixings.FixRealizingCalculation; import org.dive4elements.river.artifacts.model.fixings.FixRealizingResult; import org.dive4elements.river.artifacts.model.fixings.FixEventFacet; -import org.dive4elements.river.artifacts.model.fixings.FixReferenceEventsFacet; import org.dive4elements.river.artifacts.model.fixings.FixWQCurveFacet; import org.dive4elements.river.artifacts.model.fixings.FixWaterlevelFacet; import org.dive4elements.river.artifacts.resources.Resources; diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/artifacts/states/minfo/DifferencesState.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/states/minfo/DifferencesState.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/states/minfo/DifferencesState.java Mon Jul 22 13:03:42 2013 +0200 @@ -37,6 +37,7 @@ import org.dive4elements.river.utils.Formatter; /** + * State for BedDifferences. * @author Raimund Renkert */ public class DifferencesState diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/collections/D4EArtifactCollection.java --- a/artifacts/src/main/java/org/dive4elements/river/collections/D4EArtifactCollection.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/collections/D4EArtifactCollection.java Mon Jul 22 13:03:42 2013 +0200 @@ -628,6 +628,30 @@ return persistent != null ? persistent.getArtifact() : null; } - + /** + * Returns artifacts that name facetName. + * + * @param name The Artifact name to search + * @param context The CallContext + * + * @return a list of artifacts matching this name. + */ + public List getArtifactsByName(String name, CallContext context) + { + log.debug("Searching for Artifacts: " + name); + List ret = new ArrayList(); + try { + for (String uuid: getArtifactUUIDs(context)) { + D4EArtifact subArt = (D4EArtifact)getArtifact(uuid, context); + if (subArt.getName() != null && subArt.getName().equals(name)) { + ret.add(subArt); + } + } + } catch (ArtifactDatabaseException e) { + log.error("Unexpected Error!", e); + } finally { + return ret; + } + } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/exports/ComputedDischargeCurveGenerator.java --- a/artifacts/src/main/java/org/dive4elements/river/exports/ComputedDischargeCurveGenerator.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/ComputedDischargeCurveGenerator.java Mon Jul 22 13:03:42 2013 +0200 @@ -20,17 +20,15 @@ import org.dive4elements.river.jfree.StickyAxisAnnotation; import org.dive4elements.river.jfree.StyledXYSeries; -import org.dive4elements.river.model.Gauge; import org.dive4elements.river.utils.RiverUtils; -import org.dive4elements.artifacts.Artifact; - import java.awt.Font; import java.util.ArrayList; import java.util.List; import org.jfree.chart.axis.NumberAxis; +import org.jfree.chart.plot.XYPlot; import org.jfree.data.xy.XYSeries; import org.apache.log4j.Logger; diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/exports/DischargeCurveGenerator.java --- a/artifacts/src/main/java/org/dive4elements/river/exports/DischargeCurveGenerator.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/DischargeCurveGenerator.java Mon Jul 22 13:03:42 2013 +0200 @@ -88,6 +88,17 @@ } + /** Overriden to show second axis also if no visible data present. */ + @Override + protected void adjustAxes(XYPlot plot) { + super.adjustAxes(plot); + if (getCurrentGaugeDatum() != 0d) { + // Show the W[*m] axis even if there is no data. + plot.setRangeAxis(1, createYAxis(YAXIS.W.idx)); + } + } + + public DischargeCurveGenerator() { super(); } @@ -142,6 +153,7 @@ return zoomin; } + /** Translate River annotations if a gauge. */ public void translateRiverAnnotation(RiverAnnotation riverAnnotation) { if (getCurrentGaugeDatum() == 0d) { return; diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/exports/OutputHelper.java --- a/artifacts/src/main/java/org/dive4elements/river/exports/OutputHelper.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/OutputHelper.java Mon Jul 22 13:03:42 2013 +0200 @@ -71,7 +71,7 @@ boolean debug = log.isDebugEnabled(); if (debug) { - log.debug("D4EArtifactCollection.doOut: " + outName); + log.debug("OutputHelper.doOut: " + outName); } ThemeList themeList = new ThemeList(attributes); @@ -154,7 +154,7 @@ if (debug) { log.debug( - "D4EArtifactCollection.getFacetThemeFromAttribute(facet=" + "OutputHelper.getFacetThemeFromAttribute(facet=" + facet + ", index=" + index + ")"); } @@ -235,7 +235,7 @@ Theme t, CallContext context) { - log.debug("D4EArtifactCollection.addThemeToAttribute: " + uuid); + log.debug("OutputHelper.addThemeToAttribute: " + uuid); if (t == null) { log.warn("Theme is empty - cancel adding it to attribute!"); @@ -380,7 +380,7 @@ protected Artifact getArtifact(String uuid, CallContext context) throws ArtifactDatabaseException { - log.debug("D4EArtifactCollection.getArtifact"); + log.debug("OutputHelper.getArtifact"); Backend backend = Backend.getInstance(); PersistentArtifact persistent = backend.getArtifact(uuid); @@ -409,7 +409,7 @@ boolean debug = log.isDebugEnabled(); if (debug) { - log.debug("D4EArtifactCollection.initItemAttribute"); + log.debug("OutputHelper.initItemAttribute"); } Theme t = getThemeForFacet(uuid, facet, pattern, index, outName, context); @@ -447,7 +447,7 @@ String outName, CallContext context) { - log.info("D4EArtifactCollection.getThemeForFacet: " + facet); + log.info("OutputHelper.getThemeForFacet: " + facet); RiverContext flysContext = context instanceof RiverContext ? (RiverContext) context diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/exports/WDifferencesCurveGenerator.java --- a/artifacts/src/main/java/org/dive4elements/river/exports/WDifferencesCurveGenerator.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/WDifferencesCurveGenerator.java Mon Jul 22 13:03:42 2013 +0200 @@ -8,11 +8,28 @@ package org.dive4elements.river.exports; +import org.apache.log4j.Logger; + +import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; +import org.dive4elements.artifactdatabase.state.Facet; + import org.dive4elements.river.artifacts.model.FacetTypes; import org.dive4elements.river.artifacts.model.WKms; +import org.dive4elements.river.exports.StyledSeriesBuilder; +import org.dive4elements.river.jfree.StyledXYSeries; +import org.dive4elements.river.artifacts.model.minfo.MorphologicWidth; + + +import org.dive4elements.river.exports.process.BedDiffYearProcessor; +import org.dive4elements.river.exports.process.BedDiffHeightYearProcessor; +import org.dive4elements.river.exports.process.BedheightProcessor; +import org.dive4elements.river.exports.process.Processor; + import org.jfree.chart.JFreeChart; import org.jfree.chart.plot.XYPlot; +import org.jfree.data.xy.XYSeries; +import org.w3c.dom.Document; /** @@ -22,6 +39,9 @@ extends LongitudinalSectionGenerator implements FacetTypes { + /** The logger that is used in this generator. */ + private static Logger logger = Logger.getLogger(WDifferencesCurveGenerator.class); + public enum YAXIS { W(0), D(1), @@ -85,8 +105,46 @@ } + /** Handle additional facets (beddifferences). */ + @Override + public void doOut(ArtifactAndFacet bundle, Document attr, boolean visible) { + super.doOut(bundle, attr, visible); + + String name = bundle.getFacetName(); + logger.debug("doOut: " + name); + + if (name == null) { + logger.error("No facet name for doOut(). No output generated!"); + return; + } + + Facet facet = bundle.getFacet(); + + if (facet == null) { + return; + } + + Processor bedp = new BedheightProcessor(); + Processor bdyProcessor = new BedDiffYearProcessor(); + Processor bdhyProcessor = new BedDiffHeightYearProcessor(); + + if (bedp.canHandle(name)) { + bedp.doOut(this, bundle, attr, visible, YAXIS.W.idx); + } + else if (bdyProcessor.canHandle(name)) { + bdyProcessor.doOut(this, bundle, attr, visible, YAXIS.W.idx); + } + else if (bdhyProcessor.canHandle(name)) { + bdhyProcessor.doOut(this, bundle, attr, visible, YAXIS.W.idx); + } + else { + logger.warn("WDifferencesCurveGenerator.doOut: unknown facet type " + name); + } + } + + /** - * + * Sets the zero base line visible. */ @Override public JFreeChart generateChart() { diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/exports/WaterlevelExporter.java --- a/artifacts/src/main/java/org/dive4elements/river/exports/WaterlevelExporter.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/WaterlevelExporter.java Mon Jul 22 13:03:42 2013 +0200 @@ -34,6 +34,7 @@ import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JRException; +import org.dive4elements.artifacts.Artifact; import org.dive4elements.artifacts.CallContext; import org.dive4elements.artifacts.CallMeta; import org.dive4elements.artifacts.common.utils.Config; @@ -45,6 +46,7 @@ import org.dive4elements.river.artifacts.FixationArtifact; import org.dive4elements.river.artifacts.D4EArtifact; import org.dive4elements.river.artifacts.WINFOArtifact; +import org.dive4elements.river.artifacts.StaticWQKmsArtifact; import org.dive4elements.river.artifacts.model.CalculationResult; import org.dive4elements.river.artifacts.model.Segment; import org.dive4elements.river.artifacts.model.WQCKms; @@ -70,6 +72,9 @@ public static final String FACET_WST = "wst"; + /* This should be the same as in the StaticWQKmsArtifact */ + public static final String STATICWQKMSNAME = "staticwqkms"; + public static final String CSV_KM_HEADER = "export.waterlevel.csv.header.km"; @@ -134,9 +139,11 @@ public static final String PDF_HEADER_MODE = "export.waterlevel.pdf.mode"; public static final String JASPER_FILE = "export.waterlevel.pdf.file"; - /** The storage that contains all WQKms objects for the different facets.*/ + /** The storage that contains all WQKms objects that are calculated.*/ protected List data; + /** The storage that contains official fixings if available.*/ + protected List officalFixings; public void init(Document request, OutputStream out, CallContext context) { logger.debug("WaterlevelExporter.init"); @@ -153,6 +160,37 @@ { logger.debug("WaterlevelExporter.generate"); + /* Check for official fixings. They should also be included in the + * export but only the calculation result is added with addData */ + + officalFixings = new ArrayList(); + + for (Artifact art: collection.getArtifactsByName(STATICWQKMSNAME, context)) { + if (art instanceof StaticWQKmsArtifact) { + StaticWQKmsArtifact sart = (StaticWQKmsArtifact) art; + if (!sart.isOfficial()) { + continue; + } + + /* Check that we add the data only once */ + WQKms toAdd = sart.getWQKms(); + String newName = toAdd.getName(); + + boolean exists = false; + for (WQKms wqkm: officalFixings) { + /* The same official fixing could be in two + artifacts/outs so let's deduplicate */ + if (wqkm.getName().equals(newName)) { + exists = true; + } + } + if (!exists) { + officalFixings.add(toAdd); + logger.debug("Adding additional offical fixing: " + newName); + } + } + } + if (facet != null && facet.equals(AbstractExporter.FACET_CSV)) { generateCSV(); } @@ -183,7 +221,7 @@ /** - * This method is used to prepare the column titles of waterlevel exports. + * Prepare the column titles of waterlevel exports. * Titles in this export include the Q value. If a Q value matches a named * main value (as HQ100 or MNQ) this named main value should be used as * title. This method resets the name of the wqkms object if such @@ -294,11 +332,80 @@ writeCSVMeta(writer); writeCSVHeader(writer, atGauge, isQ); + Double first = Double.NaN; + Double last = Double.NaN; + for (WQKms[] tmp: data) { for (WQKms wqkms: tmp) { wQKms2CSV(writer, wqkms, atGauge, isQ); + double[] firstLast = wqkms.getFirstLastKM(); + if (first.isNaN()) { + /* Initialize */ + first = firstLast[0]; + last = firstLast[1]; + } + if (firstLast[0] > firstLast[1]) { + /* Calculating upstream we assert that it is + * impossible that the direction changes during this + * loop */ + first = Math.max(first, firstLast[0]); + last = Math.min(last, firstLast[1]); + } else if (firstLast[0] < firstLast[1]) { + first = Math.min(first, firstLast[0]); + last = Math.max(last, firstLast[1]); + } else { + first = last = firstLast[0]; + } } } + /* Append the official fixing at the bottom */ + for (WQKms wqkms: officalFixings) { + wQKms2CSV(writer, filterWQKms(wqkms, first, last), atGauge, isQ); + } + } + + + /** Filter a wqkms object to a distance. + * + * To handle upstream / downstream and to limit + * the officialFixings to the calculation distance + * we create a new wqkms object here and fill it only + * with the relevant data. + * + * @param wqkms: The WQKms Object to filter + * @param first: The fist kilometer of the range + * @param last: The last kilometer of the range + * + * @return A new WQKms with the relevant data sorted by direction + */ + private WQKms filterWQKms(WQKms wqkms, Double first, Double last) { + if (first.isNaN() || last.isNaN()) { + logger.warn("Filtering official fixing without valid first/last."); + return wqkms; + } + int firstIdx = first > last ? wqkms.size() - 1 : 0; + int lastIdx = first > last ? 0 : wqkms.size() -1; + WQKms filtered = new WQKms (wqkms.size()); + filtered.setReferenceSystem(wqkms.getReferenceSystem()); + filtered.setName(wqkms.getName()); + double [] dp = new double [3]; + + if (first > last) { + for (int i = wqkms.size() - 1; i >= 0; i--) { + dp = wqkms.get(i, dp); + if (dp[2] <= first + 1E-5 && dp[2] > last - 1E-5) { + filtered.add(dp[0], dp[1], dp[2]); + } + } + } else { + for (int i = 0; i < wqkms.size(); i++) { + dp = wqkms.get(i, dp); + if (dp[2] < last + 1E-5 && dp[2] > first - 1E-5) { + filtered.add(dp[0], dp[1], dp[2]); + } + } + } + return filtered; } @@ -484,13 +591,12 @@ NumberFormat kmf = getKmFormatter(); NumberFormat wf = getWFormatter(); NumberFormat qf = getQFormatter(); - - writer.writeNext(new String[] { - kmf.format(wqkm[2]), - wf.format(wqkm[0]), - qf.format(wqkm[1]), - RiverUtils.getLocationDescription(flys, wqkm[2]) - }); + writer.writeNext(new String[] { + kmf.format(wqkm[2]), + wf.format(wqkm[0]), + qf.format(wqkm[1]), + RiverUtils.getLocationDescription(flys, wqkm[2]) + }); } @@ -511,6 +617,38 @@ }); } + private String getDesc(WQKms wqkms, boolean isQ) + { + D4EArtifact flys = (D4EArtifact) master; + String colDesc = ""; + + if (flys instanceof WINFOArtifact && isQ) { + colDesc = getCSVRowTitle((WINFOArtifact)flys, wqkms); + } + else if (!isQ) { + Double value = RiverUtils.getValueFromWQ(wqkms); + colDesc = (value != null) ? + Formatter.getWaterlevelW(context).format(value) : null; + } + + if (flys instanceof WINFOArtifact) { + if (wqkms != null && wqkms.getRawValue() != null) { + WINFOArtifact winfo = (WINFOArtifact) flys; + colDesc = RiverUtils.getNamedMainValue(winfo, wqkms.getRawValue()); + // For 'W am Pegel' s + if (colDesc == null) { + colDesc = ((D4EArtifact)master).getDataAsString("wq_single"); + } + } + } + if (colDesc != null) { + /* Quick hack. Can be removed when database strings are + * adapted or left in here as it should never be harmful. */ + colDesc = colDesc.replace("Amtl.Festlegung_", "Amtl. "); + } + + return colDesc == null ? "" : colDesc; + } /** * Write "rows" of csv data from wqkms with writer. @@ -543,35 +681,16 @@ String notinrange = msg( CSV_NOT_IN_GAUGE_RANGE, DEFAULT_CSV_NOT_IN_GAUGE_RANGE); + List segments = null; + boolean isFixRealize = false; double a = gauge.getRange().getA().doubleValue(); double b = gauge.getRange().getB().doubleValue(); - - if (flys instanceof WINFOArtifact && isQ) { - desc = getCSVRowTitle((WINFOArtifact)flys, wqkms); - } - else if (!isQ) { - Double value = RiverUtils.getValueFromWQ(wqkms); - desc = value != null - ? Formatter.getWaterlevelW(context).format(value) : null; - } - long startTime = System.currentTimeMillis(); - String colDesc = desc; - List segments = null; - boolean isFixRealize = false; - if (flys instanceof WINFOArtifact) { - if (wqkms != null && wqkms.getRawValue() != null) { - WINFOArtifact winfo = (WINFOArtifact) flys; - colDesc = RiverUtils.getNamedMainValue(winfo, wqkms.getRawValue()); - // For 'W am Pegel' s - if (colDesc == null) { - colDesc = ((D4EArtifact)master).getDataAsString("wq_single"); - } - } - } - else if (flys instanceof FixationArtifact) { + desc = getDesc(wqkms, isQ); + + if (flys instanceof FixationArtifact) { // Get W/Q input per gauge for this case. FixRealizingAccess fixAccess = new FixRealizingAccess(flys); segments = fixAccess.getSegments(); @@ -601,7 +720,7 @@ : findSegment(km, segments); if (found != null) { - colDesc = nf.format(found.getValues()[0]); + desc = nf.format(found.getValues()[0]); } lastSegment = found; } @@ -622,7 +741,7 @@ ? gaugeName : notinrange; } - writeRow6(writer, result, colDesc, flys, gaugeN); + writeRow6(writer, result, desc, flys, gaugeN); } } else { // Not at gauge. @@ -693,7 +812,7 @@ /** - * This method is used to register a new column at writer. The name / + * Register a new column at writer. The name / * title of the column depends on the Q or W value of wqkms. If a Q * was selected and the Q fits to a named main value, the title is set to * the named main value. Otherwise, the name returned by @@ -715,9 +834,6 @@ } - /** - * - */ @Override protected void writePDF(OutputStream out) { logger.debug("write PDF"); @@ -751,12 +867,38 @@ boolean atGauge = mode == WQ_MODE.QGAUGE || mode == WQ_MODE.WGAUGE; boolean isQ = mode == WQ_MODE.QGAUGE || mode == WQ_MODE.QFREE; + Double first = Double.NaN; + Double last = Double.NaN; + addMetaData(source); for (WQKms[] tmp: data) { for (WQKms wqkms: tmp) { addWKmsData(wqkms, atGauge, isQ, source); + double[] firstLast = wqkms.getFirstLastKM(); + if (first.isNaN()) { + /* Initialize */ + first = firstLast[0]; + last = firstLast[1]; + } + if (firstLast[0] > firstLast[1]) { + /* Calculating upstream we assert that it is + * impossible that the direction changes during this + * loop */ + first = Math.max(first, firstLast[0]); + last = Math.min(last, firstLast[1]); + } else if (firstLast[0] < firstLast[1]) { + first = Math.min(first, firstLast[0]); + last = Math.max(last, firstLast[1]); + } else { + first = last = firstLast[0]; + } } } + + /* Append the official fixing at the bottom */ + for (WQKms wqkms: officalFixings) { + addWKmsData(filterWQKms(wqkms, first, last), atGauge, isQ, source); + } return source; } @@ -815,15 +957,7 @@ double a = gauge.getRange().getA().doubleValue(); double b = gauge.getRange().getB().doubleValue(); - if (flys instanceof WINFOArtifact && isQ) { - desc = getCSVRowTitle((WINFOArtifact)flys, wqkms); - } - else if (!isQ) { - Double value = RiverUtils.getValueFromWQ(wqkms); - desc = value != null - ? Formatter.getWaterlevelW(context).format(value) : null; - } - + desc = getDesc(wqkms, isQ); long startTime = System.currentTimeMillis(); for (int i = 0; i < size; i ++) { diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/exports/extreme/ExtremeWQCurveGenerator.java --- a/artifacts/src/main/java/org/dive4elements/river/exports/extreme/ExtremeWQCurveGenerator.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/extreme/ExtremeWQCurveGenerator.java Mon Jul 22 13:03:42 2013 +0200 @@ -14,6 +14,7 @@ import org.jfree.chart.JFreeChart; import org.jfree.chart.plot.Marker; import org.jfree.chart.plot.ValueMarker; +import org.jfree.chart.plot.XYPlot; import org.jfree.chart.title.TextTitle; import org.jfree.data.xy.XYSeries; import org.w3c.dom.Document; @@ -92,6 +93,16 @@ return false; } + /** Overriden to show second axis also if no visible data present. */ + @Override + protected void adjustAxes(XYPlot plot) { + super.adjustAxes(plot); + if (getCurrentGaugeDatum() != 0d) { + // Show the W[*m] axis even if there is no data. + plot.setRangeAxis(1, createYAxis(YAXIS.W.idx)); + } + } + /** Do Extreme Curve nonextrapolated points out. */ protected void doExtremeCurveBaseOut(ArtifactAndFacet aaf, Document theme, boolean visible) { logger.debug("doExtremeCurveBaseOut"); diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/exports/fixings/FixWQCurveGenerator.java --- a/artifacts/src/main/java/org/dive4elements/river/exports/fixings/FixWQCurveGenerator.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/fixings/FixWQCurveGenerator.java Mon Jul 22 13:03:42 2013 +0200 @@ -21,6 +21,7 @@ import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.plot.Marker; import org.jfree.chart.plot.ValueMarker; +import org.jfree.chart.plot.XYPlot; import org.jfree.chart.title.TextTitle; import org.jfree.data.xy.XYSeries; import org.jfree.ui.RectangleAnchor; @@ -153,15 +154,43 @@ return axis; } + /** Returns value != 0 if the current km is not at a gauge. */ public double getCurrentGaugeDatum() { if (context.getContextValue(CURRENT_KM) != null) { return DischargeCurveGenerator.getCurrentGaugeDatum( (Double) context.getContextValue(CURRENT_KM), - (D4EArtifact) getMaster(), 0.1d); + (D4EArtifact) getMaster(), 1e-4); } else return 0d; } + /** Overriden to show second axis also if no visible data present. */ + @Override + protected void adjustAxes(XYPlot plot) { + super.adjustAxes(plot); + if (getCurrentGaugeDatum() != 0d) { + // Show the W[*m] axis even if there is no data. + plot.setRangeAxis(1, createYAxis(YAXIS.W.idx)); + } + } + + /** Translate River annotations if not at gauge. */ + public void translateRiverAnnotation(RiverAnnotation riverAnnotation) { + if (getCurrentGaugeDatum() == 0d) { + return; + } + logger.debug("Translate some river annotation."); + double translate = getCurrentGaugeDatum(); + double factor = 100d; + for (StickyAxisAnnotation annotation: riverAnnotation.getAxisTextAnnotations()){ + if (!annotation.atX()) { + annotation.setPos((annotation.getPos() - translate)*factor); + } + } + for (XYTextAnnotation annotation: riverAnnotation.getTextAnnotations()) { + annotation.setY((annotation.getY() - translate)*factor); + } + } @Override public void doOut(ArtifactAndFacet aaf, Document doc, boolean visible) { @@ -226,8 +255,10 @@ visible); } else if (name.equals(MAINVALUES_W) || name.equals(MAINVALUES_Q)) { + RiverAnnotation mainValues = (RiverAnnotation) aaf.getData(context); + translateRiverAnnotation(mainValues); doAnnotations( - ((RiverAnnotation) aaf.getData(context)), + mainValues, aaf, doc, visible); @@ -341,6 +372,17 @@ if (Math.abs(kms[i] - ckm) <= EPSILON) { series.add(wqkms.getQ(i), wqkms.getW(i)); addAxisSeries(series, YAXIS.W.idx, visible); + if(visible && ThemeUtil.parseShowPointLabel(theme)) { + List textAnnos = new ArrayList(); + XYTextAnnotation anno = new CollisionFreeXYTextAnnotation( + title, + wqkms.getQ(i), + wqkms.getW(i)); + textAnnos.add(anno); + RiverAnnotation flysAnno = new RiverAnnotation(null, null, null, theme); + flysAnno.setTextAnnotations(textAnnos); + addAnnotations(flysAnno); + } return; } } @@ -385,6 +427,14 @@ addAxisSeries(series, YAXIS.W.idx, visible); } else { + StyledXYSeries series2 = JFreeUtil.sampleFunction2D( + func.getFunction(), + doc, + aaf.getFacetDescription(), + 500, // number of samples + 0.0 , // start + maxQ); // end + addAxisSeries(series2, YAXIS.W.idx, false); // Use second axis at cm if at gauge. for (int i = 0; i < series.getItemCount(); i++) { series.updateByIndex(i, new Double(factor*(series.getY(i).doubleValue()-gaugeDatum))); diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/exports/minfo/BedDiffBaseGenerator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/minfo/BedDiffBaseGenerator.java Mon Jul 22 13:03:42 2013 +0200 @@ -0,0 +1,59 @@ +/* Copyright (C) 2013 by Bundesanstalt für Gewässerkunde + * Software engineering by Intevation GmbH + * + * 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.exports.minfo; + +import org.apache.log4j.Logger; + +import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; +import org.dive4elements.river.artifacts.model.minfo.BedDifferencesResult; +import org.dive4elements.river.jfree.Bounds; +import org.dive4elements.river.jfree.DoubleBounds; +import org.dive4elements.river.exports.fixings.FixChartGenerator; + +/** Base for BedDiff*Year*Generators, to avoid duplicate code of setContextBounds. */ +public abstract class BedDiffBaseGenerator +extends FixChartGenerator +{ + /** The logger that is used in this generator. */ + private static Logger logger = Logger.getLogger(BedDiffBaseGenerator.class); + + /** Set context values for something. */ + public void setContextBounds(ArtifactAndFacet bundle) { + Bounds xBounds = getXBounds(0); + if (xBounds != null && getDomainAxisRange() != null) { + Bounds bounds = + calculateZoom(xBounds, getDomainAxisRange()); + context.putContextValue("startkm", bounds.getLower()); + context.putContextValue("endkm", bounds.getUpper()); + } + else if (xBounds != null && getDomainAxisRange() == null) { + context.putContextValue("startkm", xBounds.getLower()); + context.putContextValue("endkm", xBounds.getUpper()); + } + else if (xBounds == null && getDomainAxisRange() == null) { + BedDifferencesResult data = (BedDifferencesResult)bundle.getData(context); + if (data.getKms().size() > 0) { + context.putContextValue("startkm", data.getKms().min()); + context.putContextValue("endkm", data.getKms().max()); + } + else { + logger.warn("No data to define start and end km"); + } + } + else if (xBounds == null && getDomainAxisRange() != null){ + BedDifferencesResult data = (BedDifferencesResult)bundle.getData(context); + Bounds b = new DoubleBounds(data.getKms().min(), data.getKms().max()); + Bounds bounds = + calculateZoom(b, getDomainAxisRange()); + context.putContextValue("startkm", bounds.getLower()); + context.putContextValue("endkm", bounds.getUpper()); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/exports/minfo/BedDiffHeightYearGenerator.java --- a/artifacts/src/main/java/org/dive4elements/river/exports/minfo/BedDiffHeightYearGenerator.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/minfo/BedDiffHeightYearGenerator.java Mon Jul 22 13:03:42 2013 +0200 @@ -15,20 +15,16 @@ import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; import org.dive4elements.artifactdatabase.state.Facet; import org.dive4elements.river.artifacts.model.FacetTypes; -import org.dive4elements.river.artifacts.model.minfo.BedDiffYearResult; import org.dive4elements.river.artifacts.model.minfo.BedDifferencesResult; import org.dive4elements.river.exports.StyledSeriesBuilder; -import org.dive4elements.river.exports.fixings.FixChartGenerator; +import org.dive4elements.river.exports.process.BedDiffHeightYearProcessor; import org.dive4elements.river.exports.process.KMIndexProcessor; import org.dive4elements.river.exports.process.Processor; -import org.dive4elements.river.jfree.Bounds; -import org.dive4elements.river.jfree.DoubleBounds; import org.dive4elements.river.jfree.RiverAnnotation; -import org.dive4elements.river.jfree.StyledXYSeries; public class BedDiffHeightYearGenerator -extends FixChartGenerator +extends BedDiffBaseGenerator implements FacetTypes { public enum YAXIS { @@ -91,42 +87,12 @@ } if (bundle.getData(context) instanceof BedDifferencesResult) { - if (getXBounds(0) != null && getDomainAxisRange() != null) { - Bounds bounds = - calculateZoom(getXBounds(0), getDomainAxisRange()); - context.putContextValue("startkm", bounds.getLower()); - context.putContextValue("endkm", bounds.getUpper()); - } - else if (getXBounds(0) != null && getDomainAxisRange() == null) { - context.putContextValue("startkm", getXBounds(0).getLower()); - context.putContextValue("endkm", getXBounds(0).getUpper()); - } - else if (getXBounds(0) == null && getDomainAxisRange() == null) { - BedDifferencesResult data = (BedDifferencesResult)bundle.getData(context); - context.putContextValue("startkm", data.getKms().min()); - context.putContextValue("endkm", data.getKms().max()); - } - else if (getXBounds(0) == null && getDomainAxisRange() != null){ - BedDifferencesResult data = (BedDifferencesResult)bundle.getData(context); - Bounds b = new DoubleBounds(data.getKms().min(), data.getKms().max()); - Bounds bounds = - calculateZoom(b, getDomainAxisRange()); - context.putContextValue("startkm", bounds.getLower()); - context.putContextValue("endkm", bounds.getUpper()); - } + setContextBounds(bundle); } + Processor processor = new KMIndexProcessor(); - if (name.equals(BED_DIFFERENCE_HEIGHT_YEAR)) { - doBedDifferenceYearOut( - (BedDiffYearResult) bundle.getData(context), - bundle, attr, visible); - } - else if (name.equals(BED_DIFFERENCE_HEIGHT_YEAR_FILTERED)) { - doBedDifferenceYearOut( - (BedDiffYearResult) bundle.getData(context), - bundle, attr, visible); - } - else if (name.equals(LONGITUDINAL_ANNOTATION)) { + Processor bdyProcessor = new BedDiffHeightYearProcessor(); + if (name.equals(LONGITUDINAL_ANNOTATION)) { doAnnotations( (RiverAnnotation) bundle.getData(context), bundle, @@ -136,11 +102,15 @@ else if (processor.canHandle(name)) { processor.doOut(this, bundle, attr, visible, YAXIS.dW.idx); } + else if (bdyProcessor.canHandle(name)) { + bdyProcessor.doOut(this, bundle, attr, visible, YAXIS.D.idx); + } else { logger.warn("Unknown facet name " + name); } } + @Override protected String getDefaultChartTitle() { return msg(I18N_CHART_TITLE, I18N_CHART_TITLE_DEFAULT); @@ -163,13 +133,4 @@ } return "default"; } - - protected void doBedDifferenceYearOut(BedDiffYearResult data, - ArtifactAndFacet aandf, Document theme, boolean visible) { - - XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme); - StyledSeriesBuilder.addPoints(series, data.getHeightPerYearData(), true); - - addAxisSeries(series, YAXIS.D.idx, visible); - } } diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/exports/minfo/BedDifferenceYearGenerator.java --- a/artifacts/src/main/java/org/dive4elements/river/exports/minfo/BedDifferenceYearGenerator.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/minfo/BedDifferenceYearGenerator.java Mon Jul 22 13:03:42 2013 +0200 @@ -22,11 +22,11 @@ import org.dive4elements.river.artifacts.model.minfo.MorphologicWidth; import org.dive4elements.river.exports.StyledSeriesBuilder; import org.dive4elements.river.exports.fixings.FixChartGenerator; +import org.dive4elements.river.exports.process.BedDiffYearProcessor; +import org.dive4elements.river.exports.process.BedDiffHeightYearProcessor; import org.dive4elements.river.exports.process.KMIndexProcessor; import org.dive4elements.river.exports.process.Processor; import org.dive4elements.river.exports.process.WOutProcessor; -import org.dive4elements.river.jfree.Bounds; -import org.dive4elements.river.jfree.DoubleBounds; import org.dive4elements.river.jfree.RiverAnnotation; import org.dive4elements.river.jfree.StyledXYSeries; import org.dive4elements.river.utils.DataUtil; @@ -34,11 +34,11 @@ public class BedDifferenceYearGenerator -extends FixChartGenerator +extends BedDiffBaseGenerator implements FacetTypes { public enum YAXIS { - D(0), M(1), H(2), dW(3), W(4); + D(0), M(1), H(2), dW(3), W(4); protected int idx; @@ -86,6 +86,7 @@ }; } + @Override public void doOut(ArtifactAndFacet bundle, Document attr, boolean visible) { String name = bundle.getFacetName(); @@ -103,66 +104,19 @@ return; } - if (getXBounds(0) != null && getDomainAxisRange() != null) { - Bounds bounds = - calculateZoom(getXBounds(0), getDomainAxisRange()); - context.putContextValue("startkm", bounds.getLower()); - context.putContextValue("endkm", bounds.getUpper()); - } - else if (getXBounds(0) != null && getDomainAxisRange() == null) { - context.putContextValue("startkm", getXBounds(0).getLower()); - context.putContextValue("endkm", getXBounds(0).getUpper()); + if (bundle.getData(context) instanceof BedDifferencesResult) { + setContextBounds(bundle); } - else if (getXBounds(0) == null && getDomainAxisRange() == null) { - BedDifferencesResult data = (BedDifferencesResult)bundle.getData(context); - context.putContextValue("startkm", data.getKms().min()); - context.putContextValue("endkm", data.getKms().max()); - } - else if (getXBounds(0) == null && getDomainAxisRange() != null){ - BedDifferencesResult data = (BedDifferencesResult)bundle.getData(context); - Bounds b = new DoubleBounds(data.getKms().min(), data.getKms().max()); - Bounds bounds = - calculateZoom(b, getDomainAxisRange()); - context.putContextValue("startkm", bounds.getLower()); - context.putContextValue("endkm", bounds.getUpper()); - } + Processor processor = new KMIndexProcessor(); Processor woutp = new WOutProcessor(); - if (name.equals(BED_DIFFERENCE_YEAR)) { - doBedDifferenceYearOut( - (BedDiffYearResult) bundle.getData(context), - bundle, attr, visible); - } - else if (name.equals(BED_DIFFERENCE_MORPH_WIDTH)) { + Processor bdhyProcessor = new BedDiffHeightYearProcessor(); + Processor bdyProcessor = new BedDiffYearProcessor(); + if (name.equals(BED_DIFFERENCE_MORPH_WIDTH)) { doBedDifferenceMorphWidthOut( (BedDiffYearResult) bundle.getData(context), bundle, attr, visible); } - else if (name.equals(BED_DIFFERENCE_YEAR_HEIGHT1)) { - doBedDifferenceHeightsOut( - (BedDiffYearResult)bundle.getData(context), - bundle, attr, visible, 0); - } - else if (name.equals(BED_DIFFERENCE_YEAR_HEIGHT2)) { - doBedDifferenceHeightsOut( - (BedDiffYearResult)bundle.getData(context), - bundle, attr, visible, 1); - } - else if (name.equals(BED_DIFFERENCE_YEAR_FILTERED)) { - doBedDifferenceYearOut( - (BedDiffYearResult) bundle.getData(context), - bundle, attr, visible); - } - else if (name.equals(BED_DIFFERENCE_YEAR_HEIGHT1_FILTERED)) { - doBedDifferenceHeightsOut( - (BedDiffYearResult)bundle.getData(context), - bundle, attr, visible, 0); - } - else if (name.equals(BED_DIFFERENCE_YEAR_HEIGHT2_FILTERED)) { - doBedDifferenceHeightsOut( - (BedDiffYearResult)bundle.getData(context), - bundle, attr, visible, 1); - } else if (name.equals(MORPHOLOGIC_WIDTH)) { doMorphologicWidthOut( (MorphologicWidth)bundle.getData(context), @@ -181,6 +135,12 @@ attr, visible); } + else if (bdyProcessor.canHandle(name)) { + bdyProcessor.doOut(this, bundle, attr, visible, YAXIS.H.idx); + } + else if (bdhyProcessor.canHandle(name)) { + bdhyProcessor.doOut(this, bundle, attr, visible, YAXIS.D.idx); + } else if (woutp.canHandle(name)) { woutp.doOut(this, bundle, attr, visible, YAXIS.W.idx); } @@ -208,24 +168,6 @@ addAxisSeries(series, YAXIS.M.idx, visible); } - private void doBedDifferenceHeightsOut( - BedDiffYearResult data, - ArtifactAndFacet bundle, - Document attr, - boolean visible, - int idx) { - logger.debug("doBedDifferenceYearOut()"); - - XYSeries series = new StyledXYSeries(bundle.getFacetDescription(), attr); - if (idx == 0) { - StyledSeriesBuilder.addPoints(series, data.getHeights1Data(), true); - } - else { - StyledSeriesBuilder.addPoints(series, data.getHeights2Data(), true); - } - - addAxisSeries(series, YAXIS.H.idx, visible); - } @Override protected String getDefaultChartTitle() { @@ -267,15 +209,6 @@ return label; } - protected void doBedDifferenceYearOut(BedDiffYearResult data, - ArtifactAndFacet aandf, Document theme, boolean visible) { - logger.debug("doBedDifferenceYearOut()"); - - XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme); - StyledSeriesBuilder.addPoints(series, data.getDifferencesData(), true); - - addAxisSeries(series, YAXIS.D.idx, visible); - } protected void doBedDifferenceMorphWidthOut(BedDiffYearResult data, ArtifactAndFacet aandf, Document theme, boolean visible) { @@ -307,3 +240,4 @@ } } } +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/exports/minfo/SedimentLoadLSGenerator.java --- a/artifacts/src/main/java/org/dive4elements/river/exports/minfo/SedimentLoadLSGenerator.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/minfo/SedimentLoadLSGenerator.java Mon Jul 22 13:03:42 2013 +0200 @@ -73,8 +73,6 @@ public static final String I18N_YAXIS_D_LABEL_DEFAULT = "delta S [m]"; public static final String I18N_YAXIS_V_LABEL_DEFAULT = "Geschwindigkeit v [m/s]"; - private String yLabel = ""; - @Override protected YAxisWalker getYAxisWalker() { return new YAxisWalker() { @@ -106,14 +104,6 @@ Facet facet = bundle.getFacet(); D4EArtifact artifact = (D4EArtifact)bundle.getArtifact(); - SedimentLoadAccess slaccess = new SedimentLoadAccess(artifact); - String unit = slaccess.getUnit(); - if (unit != null && unit.equals("m3_per_a")) { - yLabel = msg(I18N_YAXIS_LABEL_2, I18N_YAXIS_LABEL_DEFAULT_2); - } - else { - yLabel = msg(I18N_YAXIS_LABEL_1, I18N_YAXIS_LABEL_DEFAULT_1); - } if (facet == null) { return; } @@ -242,7 +232,15 @@ protected String getDefaultYAxisLabel(int pos) { String label = "default"; if (pos == YAXIS.L.idx) { - label = yLabel; + SedimentLoadAccess slaccess = + new SedimentLoadAccess((D4EArtifact) getMaster()); + String unit = slaccess.getUnit(); + if (unit != null && unit.equals("m3_per_a")) { + label = msg(I18N_YAXIS_LABEL_2, I18N_YAXIS_LABEL_DEFAULT_2); + } + else { + label = msg(I18N_YAXIS_LABEL_1, I18N_YAXIS_LABEL_DEFAULT_1); + } } else if (pos == YAXIS.V.idx) { label = msg(I18N_YAXIS_V_LABEL, I18N_YAXIS_V_LABEL_DEFAULT); diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/exports/process/BedDiffHeightYearProcessor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/process/BedDiffHeightYearProcessor.java Mon Jul 22 13:03:42 2013 +0200 @@ -0,0 +1,70 @@ +/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde + * Software engineering by Intevation GmbH + * + * 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.exports.process; + +import org.apache.log4j.Logger; +import org.jfree.data.xy.XYSeries; +import org.w3c.dom.Document; + +import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; +import org.dive4elements.artifacts.CallContext; +import org.dive4elements.river.artifacts.model.FacetTypes; +import org.dive4elements.river.artifacts.model.minfo.BedDiffYearResult; +import org.dive4elements.river.exports.StyledSeriesBuilder; +import org.dive4elements.river.exports.XYChartGenerator; +import org.dive4elements.river.jfree.StyledXYSeries; + + +public class BedDiffHeightYearProcessor implements Processor, FacetTypes { + + private final static Logger logger = + Logger.getLogger(BedDiffHeightYearProcessor.class); + + @Override + public void doOut( + XYChartGenerator generator, + ArtifactAndFacet aandf, + Document theme, + boolean visible, + int index + ) { + CallContext context = generator.getCallContext(); + Object data = aandf.getData(context); + if (data instanceof BedDiffYearResult) { + doBedDifferenceYearOut( + generator, + (BedDiffYearResult) data, + aandf, theme, visible, index); + return; + } + logger.error("Can't process " + data.getClass().getName() + " objects"); + } + + @Override + public boolean canHandle(String facetType) { + return BED_DIFFERENCE_HEIGHT_YEAR.equals(facetType) // from BedDiffYearHeight + || BED_DIFFERENCE_HEIGHT_YEAR_FILTERED.equals(facetType) // from BedDiffYearHeight + || BED_DIFFERENCE_YEAR.equals(facetType) // from BedDifferencesYear + || BED_DIFFERENCE_YEAR_FILTERED.equals(facetType); // from BedDifferencesYear + } + + protected void doBedDifferenceYearOut(XYChartGenerator generator, + BedDiffYearResult data, + ArtifactAndFacet aandf, + Document theme, + boolean visible, + int axidx) { + + XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme); + StyledSeriesBuilder.addPoints(series, data.getHeightPerYearData(), true); + + generator.addAxisSeries(series, axidx, visible); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/exports/process/BedDiffYearProcessor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/process/BedDiffYearProcessor.java Mon Jul 22 13:03:42 2013 +0200 @@ -0,0 +1,83 @@ +/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde + * Software engineering by Intevation GmbH + * + * 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.exports.process; + +import org.apache.log4j.Logger; +import org.jfree.data.xy.XYSeries; +import org.w3c.dom.Document; + +import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; +import org.dive4elements.artifacts.CallContext; +import org.dive4elements.river.artifacts.model.FacetTypes; +import org.dive4elements.river.artifacts.model.minfo.BedDiffYearResult; +import org.dive4elements.river.exports.StyledSeriesBuilder; +import org.dive4elements.river.exports.XYChartGenerator; +import org.dive4elements.river.jfree.StyledXYSeries; + + +public class BedDiffYearProcessor implements Processor, FacetTypes { + + private final static Logger logger = + Logger.getLogger(BedDiffYearProcessor.class); + + @Override + public void doOut( + XYChartGenerator generator, + ArtifactAndFacet aandf, + Document theme, + boolean visible, + int axidx + ) { + CallContext context = generator.getCallContext(); + Object data = aandf.getData(context); + if (data instanceof BedDiffYearResult) { + String facetType = aandf.getFacetName(); + int index = + (BED_DIFFERENCE_YEAR_HEIGHT1.equals(facetType) + || BED_DIFFERENCE_YEAR_HEIGHT1_FILTERED.equals(facetType))?0:1; + doBedDifferenceHeightsOut( + generator, + (BedDiffYearResult) data, + aandf, theme, visible, index, axidx); + return; + } + logger.error("Can't process " + data.getClass().getName() + " objects"); + } + + @Override + public boolean canHandle(String facetType) { + return + BED_DIFFERENCE_YEAR_HEIGHT1.equals(facetType) + || BED_DIFFERENCE_YEAR_HEIGHT2.equals(facetType) + || BED_DIFFERENCE_YEAR_HEIGHT1_FILTERED.equals(facetType) + || BED_DIFFERENCE_YEAR_HEIGHT2_FILTERED.equals(facetType); + } + + private void doBedDifferenceHeightsOut( + XYChartGenerator generator, + BedDiffYearResult data, + ArtifactAndFacet bundle, + Document attr, + boolean visible, + int idx, + int axidx) { + logger.debug("doBedDifferenceHeightsOut()"); + + XYSeries series = new StyledXYSeries(bundle.getFacetDescription(), attr); + if (idx == 0) { + StyledSeriesBuilder.addPoints(series, data.getHeights1Data(), true); + } + else { + StyledSeriesBuilder.addPoints(series, data.getHeights2Data(), true); + } + + generator.addAxisSeries(series, axidx, visible); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/exports/process/KMIndexProcessor.java --- a/artifacts/src/main/java/org/dive4elements/river/exports/process/KMIndexProcessor.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/process/KMIndexProcessor.java Mon Jul 22 13:03:42 2013 +0200 @@ -148,3 +148,4 @@ generator.addAxisDataset(col, idx, visible); } } +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/java/org/dive4elements/river/utils/RiverUtils.java --- a/artifacts/src/main/java/org/dive4elements/river/utils/RiverUtils.java Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/utils/RiverUtils.java Mon Jul 22 13:03:42 2013 +0200 @@ -178,7 +178,7 @@ /** - * This method returns an WQ_MODE enum which is based on the parameters + * Returns an WQ_MODE enum which is based on the parameters * stored in flys Artifact. If there is no wq_isq parameter * existing, WQ_MODE.NONE is returned. * @@ -340,7 +340,7 @@ return ((WINFOArtifact) flys).getQs(); } - logger.warn("This method currently supports WINFOArtifact only!"); + logger.warn("This method (getQs) currently supports WINFOArtifact only!"); return null; } @@ -360,7 +360,7 @@ return ((WINFOArtifact) flys).getWs(); } - logger.warn("This method currently supports WINFOArtifact only!"); + logger.warn("This method (getWs) currently supports WINFOArtifact only!"); return null; } @@ -697,7 +697,7 @@ /** - * This method returns the description for a given km for a specific + * Returns the description for a given km for a specific * river. The river is provided by the D4EArtifact flys. * * @param flys The D4EArtifact that provides a river. @@ -718,7 +718,7 @@ /** - * This method returns the differences for a w-differences calculation. + * Returns the differences for a w-differences calculation. * * @param winfo The WINFOArtifact. * @param context The context. @@ -806,7 +806,7 @@ /** - * This method transform a string into an int array. Therefore, the string + * Transform a string into an int array. Therefore, the string * raw must consist of int values separated by a ';'. * * @param raw The raw integer array as string separated by a ';'. @@ -837,7 +837,7 @@ /** - * This method transform a string into a long array. Therefore, the string + * Transform a string into a long array. Therefore, the string * raw must consist of int values separated by a ';'. * * @param raw The raw long array as string separated by a ';'. @@ -868,7 +868,7 @@ /** - * This method transform a string into an double array. Therefore, the + * Transform a string into an double array. Therefore, the * string raw must consist of double values separated by a * ';'. * diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/resources/messages.properties --- a/artifacts/src/main/resources/messages.properties Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/resources/messages.properties Mon Jul 22 13:03:42 2013 +0200 @@ -436,7 +436,7 @@ wsplgen.job.queued = WSPLGEN job in queue. wsplgen.job.error = An unexpected error while starting WSPLGEN occured. -official.line.found = Found official line for {0}. +official.line.found = Found official line for {0} from year {1,date,yyyy} from {2}. wsp.selected.string = {0} diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/resources/messages_de.properties --- a/artifacts/src/main/resources/messages_de.properties Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/resources/messages_de.properties Mon Jul 22 13:03:42 2013 +0200 @@ -330,7 +330,7 @@ export.waterlevel.csv.meta.gauge = # Bezugspegel: {0} export.waterlevel.csv.meta.q = # Q (m\u00b3/s): {0} export.waterlevel.csv.meta.w = # W (NN + m): {0} - {1} -export.waterlevel.csv.not.in.gauge.range = au\u00dferhalb gew\u00e4hlter Bezugspegels +export.waterlevel.csv.not.in.gauge.range = au\u00dferh. d. Bez.pegels export.computed.discharge.curve.csv.header.w = W [{0}] export.computed.discharge.curve.csv.header.q = Q [m\u00b3/s] export.duration.curve.csv.header.duration = D [Tagen] @@ -436,7 +436,7 @@ wsplgen.job.queued = WSPLGEN Berechnung befindet sich in Warteschlange. wsplgen.job.error = Ein unerwarteter Fehler beim Starten von WSPLGEN ist aufgetreten. -official.line.found = Es existiert eine amtliche Festlegung f\u00fcr {0}. +official.line.found = F\u00fcr {0} existiert eine amtlich festgelegte Wasserspiegellage aus dem Jahr {1,date,yyyy} von {2}. wsp.selected.string = {0} diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/resources/messages_de_DE.properties --- a/artifacts/src/main/resources/messages_de_DE.properties Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/resources/messages_de_DE.properties Mon Jul 22 13:03:42 2013 +0200 @@ -328,7 +328,7 @@ export.waterlevel.csv.meta.gauge = # Bezugspegel: {0} export.waterlevel.csv.meta.q = # Q (m\u00b3/s): {0} export.waterlevel.csv.meta.w = # W (NN + m): {0} - {1} -export.waterlevel.csv.not.in.gauge.range = au\u00dferhalb gew\u00e4hlter Bezugspegels +export.waterlevel.csv.not.in.gauge.range = au\u00dferh. d. Bez.pegels export.computed.discharge.curve.csv.header.w = W [{0}] export.computed.discharge.curve.csv.header.q = Q [m\u00b3/s] export.duration.curve.csv.header.duration = D [Tagen] @@ -433,7 +433,7 @@ wsplgen.job.queued = WSPLGEN Berechnung befindet sich in Warteschlange. wsplgen.job.error = Ein unerwarteter Fehler beim Starten von WSPLGEN ist aufgetreten. -official.line.found = Es existiert eine amtliche Festlegung f\u00fcr {0}. +official.line.found = F\u00fcr {0} existiert eine amtlich festgelegte Wasserspiegellage aus dem Jahr {1,date,yyyy} von {2}. wsp.selected.string = {0} diff -r 49dd3e478ccd -r 62d6e1d5da47 artifacts/src/main/resources/messages_en.properties --- a/artifacts/src/main/resources/messages_en.properties Fri Jun 28 19:32:43 2013 +0200 +++ b/artifacts/src/main/resources/messages_en.properties Mon Jul 22 13:03:42 2013 +0200 @@ -438,7 +438,7 @@ wsplgen.job.queued = WSPLGEN job in queue. wsplgen.job.error = An unexpected error while starting WSPLGEN occured. -official.line.found = Found official line for {0}. +official.line.found = Found official line for {0} from year {1,date,yyyy} from {2}. wsp.selected.string = {0} diff -r 49dd3e478ccd -r 62d6e1d5da47 backend/src/main/java/org/dive4elements/river/importer/parsers/W80CSVParser.java --- a/backend/src/main/java/org/dive4elements/river/importer/parsers/W80CSVParser.java Fri Jun 28 19:32:43 2013 +0200 +++ b/backend/src/main/java/org/dive4elements/river/importer/parsers/W80CSVParser.java Mon Jul 22 13:03:42 2013 +0200 @@ -192,8 +192,9 @@ /** * Add a Point (YZ,Index) to the current cross section line. - * @param y The y coordinate of new point. - * @param z The z coordinate of new point. + * @param y The y coordinate of new point in GK. + * @param z The z coordinate of new point in GK. + * @param height The hight (3rd coord) of point, in meter. * @param idx Ignored, the parameter of new point. * @return true if point could been added, false otherwise (e.g. not * parsable y or z values. diff -r 49dd3e478ccd -r 62d6e1d5da47 backend/src/main/java/org/dive4elements/river/model/CrossSection.java --- a/backend/src/main/java/org/dive4elements/river/model/CrossSection.java Fri Jun 28 19:32:43 2013 +0200 +++ b/backend/src/main/java/org/dive4elements/river/model/CrossSection.java Mon Jul 22 13:03:42 2013 +0200 @@ -38,11 +38,16 @@ import org.dive4elements.river.backend.SessionHolder; +import org.apache.log4j.Logger; + @Entity @Table(name = "cross_sections") public class CrossSection implements Serializable { + private static Logger logger = + Logger.getLogger(CrossSection.class); + public static final MathContext PRECISION = new MathContext(6); public static final String SQL_FAST_CROSS_SECTION_LINES = @@ -53,6 +58,20 @@ "km between :from_km AND :to_km " + "ORDER BY csl.km, csl.id, csp.col_pos"; + public static final String SQL_MIN_MAX = + "SELECT * FROM ( "+ + "SELECT cross_section_id, MIN(km) AS minkm, MAX(km) AS maxkm " + + "FROM cross_section_lines " + + "WHERE cross_section_id IN " + + " (SELECT id FROM cross_sections WHERE river_id = :river_id) " + + " GROUP BY cross_section_id" + + ") cs_ranges " + + "JOIN cross_sections cs ON cs_ranges.cross_section_id = cs.id " + + "LEFT OUTER JOIN time_intervals ON cs.time_interval_id = time_intervals.id " + + "WHERE :km BETWEEN minkm AND maxkm " + + "ORDER BY stop_time desc, start_time asc, :km - minkm"; + // Order by time interval missing. + private Integer id; private River river; private TimeInterval timeInterval; @@ -203,5 +222,31 @@ return lines; } + + /** + * True if the given section is the "newest" for that river and has values at km. + * @param km Given station. + * @return true if the section has the most advanced end of its validity interval + * or the most advanced start of its validity interval. + */ + public boolean shouldBeMaster(double km) { + Session session = SessionHolder.HOLDER.get(); + + SQLQuery sqlQuery = session.createSQLQuery(SQL_MIN_MAX) + .addScalar("cross_section_id", StandardBasicTypes.INTEGER); + + sqlQuery + .setInteger("river_id", getRiver().getId()) + .setDouble("km", km); + + List results = sqlQuery.list(); + + for (Integer result: results) { + if (result == getId()) { + return true; + } + } + return false; + } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r 49dd3e478ccd -r 62d6e1d5da47 backend/src/main/java/org/dive4elements/river/model/Wst.java --- a/backend/src/main/java/org/dive4elements/river/model/Wst.java Fri Jun 28 19:32:43 2013 +0200 +++ b/backend/src/main/java/org/dive4elements/river/model/Wst.java Mon Jul 22 13:03:42 2013 +0200 @@ -33,6 +33,7 @@ import org.dive4elements.river.backend.SessionHolder; +/** DB-mapped WST. */ @Entity @Table(name = "wsts") public class Wst diff -r 49dd3e478ccd -r 62d6e1d5da47 contrib/make_flys_release/make_release.sh --- a/contrib/make_flys_release/make_release.sh Fri Jun 28 19:32:43 2013 +0200 +++ b/contrib/make_flys_release/make_release.sh Mon Jul 22 13:03:42 2013 +0200 @@ -367,6 +367,11 @@ mv $WORK_DIR/datacagedb $WORK_DIR/server/ echo "INFO: create tarball" +if [ -d "$WORK_DIR/flys-$VERSION" ]; then + echo "INFO: removing old directory" + rm -rf "$WORK_DIR/flys-$VERSION" +fi + mkdir $WORK_DIR/flys-$VERSION mv $WORK_DIR/server $WORK_DIR/client $WORK_DIR/flys-$VERSION cd $WORK_DIR diff -r 49dd3e478ccd -r 62d6e1d5da47 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 Fri Jun 28 19:32:43 2013 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.java Mon Jul 22 13:03:42 2013 +0200 @@ -822,6 +822,12 @@ String waterlevels(); + String beddifferences(); + + String bedheight_differences(); + + String vollmer_waterlevels(); + String old_calculations(); String officiallines(); diff -r 49dd3e478ccd -r 62d6e1d5da47 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 Fri Jun 28 19:32:43 2013 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.properties Mon Jul 22 13:03:42 2013 +0200 @@ -422,6 +422,9 @@ # data cage waterlevels = Waterlevels +beddifferences = Bedheight Differences +bedheight_differences = Bedheight Differences +vollmer_waterlevels = Vollmer Waterlevels old_calculations = Former Calculations officiallines = Official lines datacageAdd = Add data diff -r 49dd3e478ccd -r 62d6e1d5da47 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 Fri Jun 28 19:32:43 2013 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_de.properties Mon Jul 22 13:03:42 2013 +0200 @@ -426,6 +426,9 @@ # data cage waterlevels = Wasserst\u00e4nde +beddifferences = Sohlh\u00f6hendifferenzen +bedheight_differences = Sohlh\u00f6hendifferenzen +vollmer_waterlevels = Ausgelagerte WSPL. old_calculations = Fr\u00fchere Berechnungen officiallines = Amtliche Linien datacageAdd = Daten laden diff -r 49dd3e478ccd -r 62d6e1d5da47 gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_en.properties --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_en.properties Fri Jun 28 19:32:43 2013 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_en.properties Mon Jul 22 13:03:42 2013 +0200 @@ -424,6 +424,9 @@ # data cage waterlevels = Waterlevels +beddifferences = Bedheight Differences +bedheight_differences = Bedheight Differences +vollmer_waterlevels = Vollmer Waterlevels old_calculations = Former Calculations officiallines = Official lines datacageAdd = Add data diff -r 49dd3e478ccd -r 62d6e1d5da47 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/CollectionView.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/CollectionView.java Fri Jun 28 19:32:43 2013 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/CollectionView.java Mon Jul 22 13:03:42 2013 +0200 @@ -393,7 +393,8 @@ } /** - * Loads all information of a collection + * Loads all information of a collection. + * If 'recommendations' present, load these. * @param c the Collection */ private void loadCollection(Collection c) { @@ -641,7 +642,7 @@ ); } else { - // Create new collection and add artifact + // Create new collection and add artifact. final Artifact art = artifact; createCollectionService.create( locale, diff -r 49dd3e478ccd -r 62d6e1d5da47 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DatacageTwinPanel.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DatacageTwinPanel.java Fri Jun 28 19:32:43 2013 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DatacageTwinPanel.java Mon Jul 22 13:03:42 2013 +0200 @@ -175,7 +175,7 @@ VLayout layout = new VLayout(); HLayout helperLayout = new HLayout(); helperLayout.addMember(new DatacagePairWidget(this.artifact, - user, "waterlevels", differencesList)); + user, "differenceable", differencesList)); layout.addMember(widget); layout.addMember(submit); @@ -277,6 +277,29 @@ this.removedPairs.add(pr); } + /** + * Set factory of recommendation such that the correct artifacts will + * be cloned for difference calculations. + */ + public void adjustRecommendation(Recommendation recommendation) { + if (recommendation.getIDs() != null) { + GWT.log("Setting staticwkms factory for rec with ID " + + recommendation.getIDs()); + recommendation.setFactory("staticwkms"); + } + /* + // So far, we do not need to rewrite the factory anymore, + // except for staticwkms; probably other cases will pop up later. + else if (recommendation.getFactory().equals("winfo")) { + GWT.log("Setting waterlevel factory for a winfo rec."); + recommendation.setFactory("waterlevel"); + } + */ + else { + GWT.log("Leave rec. id " + recommendation.getIDs() + ", factory " + + recommendation.getFactory() + " untouched."); + } + } /** * Validates data, does nothing if invalid, otherwise clones new selected @@ -308,29 +331,10 @@ // Check whether one of those is a dike or similar. // TODO differentiate and merge: new clones, new, old. Recommendation firstR = r.getFirst(); - if(firstR.getIDs() != null) { - GWT.log("First IDs: " + firstR.getIDs() + " factory: " - + firstR.getFactory()); - } - if(firstR.getIDs() != null) { - // These do not get cloned but loaded ("spawned"). - firstR.setFactory("staticwkms"); - } - else { - firstR.setFactory("waterlevel"); - } + adjustRecommendation(firstR); + Recommendation secondR = r.getSecond(); - if(secondR.getIDs() != null) { - GWT.log("Second IDs: " + secondR.getIDs() + " factory: " - + secondR.getFactory()); - } - if (secondR.getIDs() != null) { - // These do not get cloned but loaded ("spawned"). - secondR.setFactory("staticwkms"); - } - else { - secondR.setFactory("waterlevel"); - } + adjustRecommendation(secondR); ar.add(firstR); ar.add(secondR); @@ -389,6 +393,7 @@ } // Clone new ones (and spawn statics), go forward. + parameterList.lockUI(); loadArtifactService.loadMany( this.collection, toClone, @@ -399,6 +404,7 @@ @Override public void onFailure(Throwable caught) { GWT.log("Failure of cloning with factories!"); + parameterList.unlockUI(); } @Override public void onSuccess(Artifact[] artifacts) { @@ -407,6 +413,7 @@ fireStepForwardEvent(new StepForwardEvent( getData(toClone, artifacts, toUse))); + parameterList.unlockUI(); } }); } diff -r 49dd3e478ccd -r 62d6e1d5da47 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/FLYSHeader.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/FLYSHeader.java Fri Jun 28 19:32:43 2013 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/FLYSHeader.java Mon Jul 22 13:03:42 2013 +0200 @@ -12,6 +12,7 @@ import com.google.gwt.i18n.client.LocaleInfo; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.HTML; import com.smartgwt.client.types.Alignment; import com.smartgwt.client.types.VerticalAlignment; import com.smartgwt.client.util.BooleanCallback; @@ -135,14 +136,30 @@ info.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { - GWT.log("Clicked 'info' button."); String wikiLink = Config.getInstance().getWikiUrl() + "/Info"; - Window.open(wikiLink, "_blank", null); + + // Create a form which contains the SAML session + // for the user which is currently logged in + String html = WikiLinks.imageLinkForm( + getFlys(), wikiLink, "", "wikiLinkForm"); + HTML htmlObj = new HTML(html); + info.addChild(htmlObj); + fireWikiLinkSubmit(); + htmlObj.removeFromParent(); } }); init(); } + /** + * Calls the JS submit() function on the dynamically added + * wikiLinkForm. This is a workaround for a SmartGWT issue(?) that + * clears all form fields when using DynamicForm.submit() or .submitForm(). + */ + protected native void fireWikiLinkSubmit() /*-{ + $doc.wikiLinkForm.submit(); + }-*/; + public void init() { setStyleName("header"); setWidth100(); diff -r 49dd3e478ccd -r 62d6e1d5da47 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ImgLink.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ImgLink.java Fri Jun 28 19:32:43 2013 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ImgLink.java Mon Jul 22 13:03:42 2013 +0200 @@ -12,6 +12,7 @@ import com.smartgwt.client.widgets.HTMLPane; +/** An image wrapped in a clickable link. */ public class ImgLink extends HTMLPane { protected int width; @@ -59,3 +60,4 @@ update(); } } +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r 49dd3e478ccd -r 62d6e1d5da47 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/MultiPeriodPanel.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/MultiPeriodPanel.java Fri Jun 28 19:32:43 2013 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/MultiPeriodPanel.java Mon Jul 22 13:03:42 2013 +0200 @@ -36,7 +36,7 @@ import java.util.List; /** - * This UIProvider creates a panel for location or distance input. + * This UIProvider creates a panel for input of multiple time periods. * * @author Raimund Renkert */ diff -r 49dd3e478ccd -r 62d6e1d5da47 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ParameterList.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ParameterList.java Fri Jun 28 19:32:43 2013 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ParameterList.java Mon Jul 22 13:03:42 2013 +0200 @@ -83,7 +83,7 @@ public static final String STYLENAME_OLD_PARAMETERS = "oldParameters"; - /** The message class that provides i18n strings.*/ + /** The message class that provides i18n strings. */ protected FLYSConstants MSG = GWT.create(FLYSConstants.class); /** The ArtifactService used to communicate with the Artifact server. */ @@ -103,7 +103,7 @@ GWT.create(ReportService.class); - /** The list of ParameterizationChangeHandler.*/ + /** The list of ParameterizationChangeHandler. */ protected List parameterHandlers; protected FLYS flys; @@ -568,7 +568,7 @@ /** - * This method refreshes the part displaying the data of the current state. + * Refreshes the part displaying the data of the current state. * The UI is created using the UIProvider stored in the Data object. */ public void refreshCurrent() { diff -r 49dd3e478ccd -r 62d6e1d5da47 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/QSegmentedInputPanel.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/QSegmentedInputPanel.java Fri Jun 28 19:32:43 2013 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/QSegmentedInputPanel.java Mon Jul 22 13:03:42 2013 +0200 @@ -428,14 +428,14 @@ new AsyncCallback() { @Override public void onFailure(Throwable caught) { - GWT.log("Could not recieve wq informations."); + GWT.log("Could not receive wq informations."); SC.warn(caught.getMessage()); } @Override public void onSuccess(WQInfoObject[] wqi) { int num = wqi != null ? wqi.length :0; - GWT.log("Recieved " + num + " wq informations."); + GWT.log("Received " + num + " wq informations."); if (num == 0) { return; diff -r 49dd3e478ccd -r 62d6e1d5da47 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/RiverInfoPanel.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/RiverInfoPanel.java Fri Jun 28 19:32:43 2013 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/RiverInfoPanel.java Mon Jul 22 13:03:42 2013 +0200 @@ -99,7 +99,7 @@ MSG.gauge_river_url() + number : MSG.gauge_river_url(); String wikiBaseUrl = Config.getInstance().getWikiUrl(); - DynamicForm infoLink = WikiLinks.linkHTML(this.flys, wikiBaseUrl + url, + DynamicForm infoLink = WikiLinks.linkDynamicForm(this.flys, wikiBaseUrl + url, MSG.gauge_river_info_link()); infoLink.setTop(5); LinkItem item = (LinkItem)infoLink.getField("saml"); diff -r 49dd3e478ccd -r 62d6e1d5da47 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WQInputPanel.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WQInputPanel.java Fri Jun 28 19:32:43 2013 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WQInputPanel.java Mon Jul 22 13:03:42 2013 +0200 @@ -1811,14 +1811,14 @@ new AsyncCallback() { @Override public void onFailure(Throwable caught) { - GWT.log("Could not recieve wq informations."); + GWT.log("Could not receive wq informations."); SC.warn(caught.getMessage()); } @Override public void onSuccess(WQInfoObject[] wqi) { int num = wqi != null ? wqi.length :0; - GWT.log("Recieved " + num + " wq informations."); + GWT.log("Received " + num + " wq informations."); if (num == 0) { return; diff -r 49dd3e478ccd -r 62d6e1d5da47 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WQSimpleArrayPanel.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WQSimpleArrayPanel.java Fri Jun 28 19:32:43 2013 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WQSimpleArrayPanel.java Mon Jul 22 13:03:42 2013 +0200 @@ -265,13 +265,13 @@ new AsyncCallback() { @Override public void onFailure(Throwable caught) { - GWT.log("Could not recieve wq informations."); + GWT.log("Could not receive wq informations."); } @Override public void onSuccess(WQInfoObject[] wqi) { int num = wqi != null ? wqi.length :0; - GWT.log("Recieved " + num + " wq informations."); + GWT.log("Received " + num + " wq informations."); if (num == 0) { return; diff -r 49dd3e478ccd -r 62d6e1d5da47 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WikiImgLink.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WikiImgLink.java Fri Jun 28 19:32:43 2013 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WikiImgLink.java Mon Jul 22 13:03:42 2013 +0200 @@ -24,7 +24,7 @@ @Override protected void update() { - setContents(WikiLinks.imageLinkHTML(instance, href, imgUrl)); + setContents(WikiLinks.imageLinkForm(instance, href, imgUrl, "wikiImgLink" + toString())); setWidth(width); setHeight(height); setOverflow(Overflow.VISIBLE); diff -r 49dd3e478ccd -r 62d6e1d5da47 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WikiLinks.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WikiLinks.java Fri Jun 28 19:32:43 2013 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WikiLinks.java Mon Jul 22 13:03:42 2013 +0200 @@ -8,20 +8,21 @@ package org.dive4elements.river.client.client.ui; +import com.google.gwt.core.client.GWT; +import com.google.gwt.safehtml.shared.SafeHtmlUtils; import com.smartgwt.client.types.FormMethod; import com.smartgwt.client.widgets.form.DynamicForm; +import com.smartgwt.client.widgets.form.fields.HiddenItem; import com.smartgwt.client.widgets.form.fields.LinkItem; import com.smartgwt.client.widgets.form.fields.events.ClickEvent; import com.smartgwt.client.widgets.form.fields.events.ClickHandler; -import com.smartgwt.client.widgets.grid.CellFormatter; -import com.smartgwt.client.widgets.grid.ListGridRecord; -import com.google.gwt.safehtml.shared.SafeHtmlUtils; import org.dive4elements.river.client.client.FLYS; +import org.dive4elements.river.client.shared.model.User; public class WikiLinks { - public static String imageLinkHTML(FLYS instance, String url, String imageUrl) { + public static String imageLinkForm(FLYS instance, String url, String imageUrl, String formName) { String saml = null; if (instance != null && instance.getCurrentUser() != null) { saml = instance.getCurrentUser().getSamlXMLBase64(); @@ -31,7 +32,7 @@ if (saml != null) { return "
" + + quotedUrl + "\" " + "name=\"" + formName + "\">" + "" + "" @@ -42,11 +43,13 @@ } } - public static DynamicForm linkHTML(FLYS flys, String url, String text) { - String saml = flys.getCurrentUser().getSamlXMLBase64(); + public static DynamicForm linkDynamicForm(FLYS flys, String url, String text) { + User currentUser = flys.getCurrentUser(); String quotedUrl = SafeHtmlUtils.htmlEscape(url); String quotedText = SafeHtmlUtils.htmlEscape(text); - if (saml != null) { + + if (currentUser != null) { + String saml = currentUser.getSamlXMLBase64(); final DynamicForm form = new DynamicForm(); form.setMethod(FormMethod.POST); form.setTarget("_blank"); @@ -73,4 +76,33 @@ return form; } } + + public static DynamicForm dynamicForm(FLYS flys, String url) { + User currentUser = flys.getCurrentUser(); + String quotedUrl = SafeHtmlUtils.htmlEscape(url); + + if (currentUser != null) { + String saml = currentUser.getSamlXMLBase64(); + saml = SafeHtmlUtils.htmlEscape(saml); + GWT.log("saml=" + saml); + DynamicForm form = new DynamicForm(); + form.setID("wikiDynamicForm"); + form.setMethod(FormMethod.POST); + form.setTarget("_blank"); + form.setAction(quotedUrl); + form.setCanSubmit(true); + HiddenItem item = new HiddenItem("saml"); + item.setDefaultValue(saml); + item.setValue(saml); + form.setFields(item); + //form.setValue("saml", saml); + return form; + } + else { + DynamicForm form = new DynamicForm(); + form.setTarget("_blank"); + form.setAction(quotedUrl); + return form; + } + } } diff -r 49dd3e478ccd -r 62d6e1d5da47 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WspDatacagePanel.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WspDatacagePanel.java Fri Jun 28 19:32:43 2013 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WspDatacagePanel.java Mon Jul 22 13:03:42 2013 +0200 @@ -78,7 +78,7 @@ /** * We need to override this method (defined in AbstractUIProvider) because - * we have to create a new Artifact specified by the Datacage selection via + * we have to create a new Artifact specified by the Datacage selection via * Async request. * * @param e The ClickEvent. @@ -144,6 +144,7 @@ } + /** Returns a Data Array with one default item. */ protected Data[] getData(Recommendation r, Artifact newArtifact) { String uuid = newArtifact.getUuid(); r.setMasterArtifact(uuid); diff -r 49dd3e478ccd -r 62d6e1d5da47 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ChartPropertiesEditor.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ChartPropertiesEditor.java Fri Jun 28 19:32:43 2013 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ChartPropertiesEditor.java Mon Jul 22 13:03:42 2013 +0200 @@ -188,6 +188,17 @@ PropertyGroup origPg = (PropertyGroup)orig; if (pg.getName().equals("axis")) { + // Certain axis shall be skipped (W/Q-Diagrams cm-axis especially). + String outputName = tab.getOutputName(); + if (outputName.equals("fix_wq_curve") || outputName.equals("computed_discharge_curve") + || outputName.equals("extreme_wq_curve")) { + String labelString = ((StringProperty)origPg.getPropertyByName("label")).getValue(); + if(labelString.equals("W [cm]")) { + VLayout layout = new VLayout(); + layout.setHeight(0); + return layout; + } + } Label scale = new Label(MSG.scale() + " :"); scale.setHeight(25); scale.setMargin(2); diff -r 49dd3e478ccd -r 62d6e1d5da47 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/CrossSectionChartThemePanel.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/CrossSectionChartThemePanel.java Fri Jun 28 19:32:43 2013 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/CrossSectionChartThemePanel.java Mon Jul 22 13:03:42 2013 +0200 @@ -312,7 +312,7 @@ /** - * Feed a single artifact with the km of the crosssection to display. + * Feed artifacts with the km of the crosssection to display. * If its the selected master, also feed the collectionmaster. * * @param artifacts List of artifacts to feed. diff -r 49dd3e478ccd -r 62d6e1d5da47 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/FixGaugeSelectPanel.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/FixGaugeSelectPanel.java Fri Jun 28 19:32:43 2013 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/FixGaugeSelectPanel.java Mon Jul 22 13:03:42 2013 +0200 @@ -30,7 +30,8 @@ import java.util.List; /** - * This UIProvider creates a panel for location or distance input. + * This UIProvider creates a panel to select discharge classes / sectors + * (german Abflussklassen). * * @author Raimund Renkert */ diff -r 49dd3e478ccd -r 62d6e1d5da47 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/InfoListGrid.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/InfoListGrid.java Fri Jun 28 19:32:43 2013 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/InfoListGrid.java Mon Jul 22 13:03:42 2013 +0200 @@ -46,7 +46,7 @@ ) { String name = this.getFieldName(colNum); if (name.equals("infolink")) { - return WikiLinks.linkHTML( + return WikiLinks.linkDynamicForm( flys, record.getAttribute("link"), record.getLinkText()); diff -r 49dd3e478ccd -r 62d6e1d5da47 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/DefaultCollection.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/DefaultCollection.java Fri Jun 28 19:32:43 2013 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/DefaultCollection.java Mon Jul 22 13:03:42 2013 +0200 @@ -284,6 +284,10 @@ } + /** + * Returns true if a recommendation with given factory and id + * is already member of this collection. + */ public boolean loadedRecommendation(Recommendation recommendation) { String factory = recommendation.getFactory(); String dbids = recommendation.getIDs(); @@ -307,7 +311,7 @@ } /** - * Returns the name of the collection or uuid if no name is set + * Returns the name of the collection or uuid if no name is set. */ @Override public String getDisplayName() { diff -r 49dd3e478ccd -r 62d6e1d5da47 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/ToLoad.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/ToLoad.java Fri Jun 28 19:32:43 2013 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/ToLoad.java Mon Jul 22 13:03:42 2013 +0200 @@ -20,6 +20,7 @@ public class ToLoad implements Serializable { + /** Two strings. */ public class StringPair { public String first; public String second; @@ -51,16 +52,17 @@ } return key; } - public void add( - String artifactName, - String factory, - String out, - String name, - String ids, - String displayName - ) { - add(artifactName, factory, out, name, ids, displayName, null); - } + + public void add( + String artifactName, + String factory, + String out, + String name, + String ids, + String displayName + ) { + add(artifactName, factory, out, name, ids, displayName, null); + } public void add( String artifactName, @@ -114,7 +116,7 @@ for (Map.Entry entry: all.getValue().entrySet() ) { - StringPair pair = entry.getKey(); + StringPair pair = entry.getKey(); String factory = pair.first; ArtifactFilter artifactFilter = entry.getValue();