# HG changeset patch # User Tom Gottfried # Date 1397727732 -7200 # Node ID 35094b6bacf4d280534b11dfcac93b71068a2133 # Parent 3f58de350fb4a3bb866ee4cdbc33fdd5abca1c04# Parent b2a8a94a92f9caf0cbcb0cc026b750e72022dc1f Merged minfo-opt branch into default. diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/doc/conf/artifacts/minfo.xml --- a/artifacts/doc/conf/artifacts/minfo.xml Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/doc/conf/artifacts/minfo.xml Thu Apr 17 11:42:12 2014 +0200 @@ -97,7 +97,7 @@ - + - + + + @@ -246,6 +248,7 @@ + @@ -273,6 +276,7 @@ + @@ -530,6 +534,7 @@ + diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/doc/conf/artifacts/winfo.xml --- a/artifacts/doc/conf/artifacts/winfo.xml Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/doc/conf/artifacts/winfo.xml Thu Apr 17 11:42:12 2014 +0200 @@ -264,6 +264,7 @@ + @@ -371,6 +372,7 @@ + @@ -693,6 +695,7 @@ + diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/doc/conf/meta-data.xml --- a/artifacts/doc/conf/meta-data.xml Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/doc/conf/meta-data.xml Thu Apr 17 11:42:12 2014 +0200 @@ -469,19 +469,20 @@ - + - + + + + + + + + diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/doc/conf/themes.xml --- a/artifacts/doc/conf/themes.xml Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/doc/conf/themes.xml Thu Apr 17 11:42:12 2014 +0200 @@ -157,6 +157,7 @@ + diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/doc/conf/zoom-scales.xml --- a/artifacts/doc/conf/zoom-scales.xml Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/doc/conf/zoom-scales.xml Thu Apr 17 11:42:12 2014 +0200 @@ -1,5 +1,8 @@ + + + diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/src/main/java/org/dive4elements/river/artifacts/model/DifferenceCurveFilterFacet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/DifferenceCurveFilterFacet.java Thu Apr 17 11:42:12 2014 +0200 @@ -0,0 +1,82 @@ +package org.dive4elements.river.artifacts.model; + +import org.apache.log4j.Logger; +import org.dive4elements.artifactdatabase.state.Facet; +import org.dive4elements.artifacts.Artifact; +import org.dive4elements.artifacts.CallContext; +import org.dive4elements.river.artifacts.D4EArtifact; +import org.dive4elements.river.artifacts.WINFOArtifact; +import org.dive4elements.river.artifacts.access.RiverAccess; +import org.dive4elements.river.artifacts.context.RiverContext; +import org.dive4elements.river.artifacts.math.MovingAverage; +import org.dive4elements.river.artifacts.states.DefaultState.ComputeType; + + +public class DifferenceCurveFilterFacet +extends DifferenceCurveFacet +{ + private static Logger logger = Logger.getLogger(DifferenceCurveFacet.class); + + + public DifferenceCurveFilterFacet() { + } + + public DifferenceCurveFilterFacet( + int index, + String name, + String description, + ComputeType type, + String stateID, + String hash + + ) { + super(index, name, description, type, stateID, hash); + } + + /** + * Get difference curve data. + * @return a WKms at given index. + */ + @Override + public Object getData(Artifact artifact, CallContext context) { + WKms result = (WKms)super.getData(artifact, context); + + Double start = (Double)context.getContextValue("startkm"); + Double end = (Double)context.getContextValue("endkm"); + if(start != null && end != null) { + RiverContext fc = (RiverContext)context.globalContext(); + // Adaptive smoothing, based on zoom factor/diagram extents. + ZoomScale scales = (ZoomScale)fc.get("zoomscale"); + RiverAccess access = new RiverAccess((D4EArtifact)artifact); + String river = access.getRiverName(); + + double radius = scales.getRadius(river, start, end); + + double[][] oldData = new double[2][result.size()]; + for (int i = 0; i < result.size(); i++) { + oldData[0][i] = result.getKm(i); + oldData[1][i] = result.getW(i); + } + + double[][] diffs = MovingAverage.weighted(oldData, radius); + WKmsImpl newData = new WKmsImpl(); + for(int j = 0; j < diffs[0].length; j++) { + newData.add(diffs[0][j], diffs[1][j]); + } + return newData; + } + return result; + } + + + /** Copy deeply. */ + @Override + public Facet deepCopy() { + WaterlevelFacet copy = new DifferenceCurveFilterFacet(); + copy.set(this); + copy.type = type; + copy.stateId = stateId; + copy.hash = hash; + return copy; + } +} diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/src/main/java/org/dive4elements/river/artifacts/model/FacetTypes.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/FacetTypes.java Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/FacetTypes.java Thu Apr 17 11:42:12 2014 +0200 @@ -245,6 +245,7 @@ String LONGITUDINAL_MANUALPOINTS = "longitudinal_section.manualpoints"; String W_DIFFERENCES = "w_differences"; + String W_DIFFERENCES_FILTERED = "w_differences.filtered"; String COMPUTED_DISCHARGE_Q = "computed_discharge_curve.q"; String COMPUTED_DISCHARGE_MAINVALUES_Q = "computed_discharge_curve.mainvalues.q"; @@ -338,7 +339,9 @@ String BED_DIFFERENCE_HEIGHT_YEAR_FILTERED = "bedheight_difference.height_year.filtered"; String BED_DIFFERENCE_EPOCH = "bedheight_difference.epoch"; String BED_DIFFERENCE_EPOCH_FILTERED = "bedheight_difference.epoch.filtered"; - String BED_DIFFERENCE_MORPH_WIDTH = "bedheight_difference.morph_width"; + String BED_DIFFERENCE_MORPH_WIDTH1 = "bedheight_difference.morph_width1"; + String BED_DIFFERENCE_MORPH_WIDTH2 = "bedheight_difference.morph_width2"; + String BED_DIFFERENCE_SOUNDING_WIDTH = "bedheight_difference.sounding_width"; String BED_DIFFERENCE_YEAR_HEIGHT1 = "bedheight_difference.year.height1"; String BED_DIFFERENCE_YEAR_HEIGHT2 = "bedheight_difference.year.height2"; String BED_DIFFERENCE_YEAR_HEIGHT1_FILTERED = "bedheight_difference.year.height1.filtered"; diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/src/main/java/org/dive4elements/river/artifacts/model/ZoomScale.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/ZoomScale.java Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/ZoomScale.java Thu Apr 17 11:42:12 2014 +0200 @@ -38,7 +38,11 @@ double range = Math.abs(upper) - Math.abs(lower); TreeMap ranges = rivers.get(river); if (ranges == null) { - return 0.001; + TreeMap defaultRanges = rivers.get("default"); + if (defaultRanges == null) { + return 0.001; + } + ranges = defaultRanges; } Map.Entry next = ranges.higherEntry(range); Map.Entry prev = ranges.lowerEntry(range); diff -r 3f58de350fb4 -r 35094b6bacf4 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 Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedDiffCalculation.java Thu Apr 17 11:42:12 2014 +0200 @@ -133,13 +133,15 @@ TDoubleArrayList stations = s1.getStations(); int size = stations.size(); - TDoubleArrayList diffRes = new TDoubleArrayList(size); - TDoubleArrayList kms = new TDoubleArrayList(size); - TDoubleArrayList morphs = new TDoubleArrayList(size); - TDoubleArrayList absolute = new TDoubleArrayList(size); - TDoubleArrayList gap = new TDoubleArrayList(size); - TDoubleArrayList heights1 = new TDoubleArrayList(size); - TDoubleArrayList heights2 = new TDoubleArrayList(size); + TDoubleArrayList diffRes = new TDoubleArrayList(size); + TDoubleArrayList kms = new TDoubleArrayList(size); + TDoubleArrayList soundings = new TDoubleArrayList(size); + TDoubleArrayList absolute = new TDoubleArrayList(size); + TDoubleArrayList gap = new TDoubleArrayList(size); + TDoubleArrayList heights1 = new TDoubleArrayList(size); + TDoubleArrayList heights2 = new TDoubleArrayList(size); + TDoubleArrayList morphs1 = new TDoubleArrayList(size); + TDoubleArrayList morphs2 = new TDoubleArrayList(size); int range = Math.abs(s1.getYear() - s2.getYear()); @@ -147,15 +149,17 @@ double station = stations.getQuick(i); double h1 = s1.getHeight(station); double h2 = s2.getHeight(station); + double m1 = s1.getWidth(station); + double m2 = s2.getWidth(station); double hDiff = h1 - h2; if (!Double.isNaN(hDiff)) { diffRes.add(hDiff); kms.add(station); - morphs.add(Math.max( - s1.getMorphWidth(station), - s2.getMorphWidth(station))); + soundings.add(Math.max( + s1.getSoundingWidth(station), + s2.getSoundingWidth(station))); gap.add(Math.max( s1.getDataGap(station), @@ -164,6 +168,8 @@ absolute.add((hDiff / range) * 100d); heights1.add(h1); heights2.add(h2); + morphs1.add(m1); + morphs2.add(m2); } } return new BedDiffYearResult( @@ -171,7 +177,9 @@ diffRes, heights1, heights2, - morphs, + morphs1, + morphs2, + soundings, absolute, gap, s1.getYear(), diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedDiffYearFilterFacet.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedDiffYearFilterFacet.java Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedDiffYearFilterFacet.java Thu Apr 17 11:42:12 2014 +0200 @@ -63,12 +63,16 @@ double[][] diffs = MovingAverage.weighted(oldData.getDifferencesData(), radius); double[][] heights1 = MovingAverage.weighted(oldData.getHeights1Data(), radius); double[][] heights2 = MovingAverage.weighted(oldData.getHeights2Data(), radius); - double[][] morph = oldData.getMorphWidthData(); + double[][] morph1 = oldData.getMorphWidth1Data(); + double[][] morph2 = oldData.getMorphWidth2Data(); + double[][] sounding = oldData.getSoundingWidthData(); double[][] year = MovingAverage.weighted(oldData.getHeightPerYearData(), radius); for(int j = 0; j < diffs[0].length; j++) { newData.addKm(diffs[0][j]); newData.addBedHeights(year[1][j]); - newData.addMorphWidth(morph[1][j]); + newData.addMorphWidth1(morph1[1][j]); + newData.addMorphWidth2(morph2[1][j]); + newData.addSoundingWidth(sounding[1][j]); newData.addDifference(diffs[1][j]); newData.addHeight1(heights1[1][j]); newData.addHeight2(heights2[1][j]); diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedDiffYearResult.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedDiffYearResult.java Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedDiffYearResult.java Thu Apr 17 11:42:12 2014 +0200 @@ -17,7 +17,9 @@ { protected TDoubleArrayList bedHeights; protected TDoubleArrayList dataGap; - protected TDoubleArrayList morphWidth; + protected TDoubleArrayList soundingWidth; + protected TDoubleArrayList morphWidth1; + protected TDoubleArrayList morphWidth2; protected int start; protected int end; protected String nameFirst; @@ -27,7 +29,9 @@ super(); this.bedHeights = new TDoubleArrayList(); this.dataGap = new TDoubleArrayList(); - this.morphWidth = new TDoubleArrayList(); + this.soundingWidth = new TDoubleArrayList(); + this.morphWidth1 = new TDoubleArrayList(); + this.morphWidth2 = new TDoubleArrayList(); this.start = -1; this.end = -1; } @@ -44,7 +48,9 @@ TDoubleArrayList differences, TDoubleArrayList heights1, TDoubleArrayList heights2, - TDoubleArrayList morphWidth, + TDoubleArrayList morphWidth1, + TDoubleArrayList morphWidth2, + TDoubleArrayList soundingWidth, TDoubleArrayList bedHeights, TDoubleArrayList dataGap, int start, @@ -55,7 +61,9 @@ super(kms, differences, heights1, heights2); this.bedHeights = bedHeights; this.dataGap = dataGap; - this.morphWidth = morphWidth; + this.soundingWidth = soundingWidth; + this.morphWidth1 = morphWidth1; + this.morphWidth2 = morphWidth2; this.start = start; this.end = end; this.nameFirst = nameFirst; @@ -70,8 +78,16 @@ return this.dataGap; } - public TDoubleArrayList getMorphWidth() { - return this.morphWidth; + public TDoubleArrayList getMorphWidth1() { + return this.morphWidth1; + } + + public TDoubleArrayList getMorphWidth2() { + return this.morphWidth2; + } + + public TDoubleArrayList getSoundingWidth() { + return this.soundingWidth; } public int getStart() { @@ -100,18 +116,40 @@ return this.nameSecond; } - public void addMorphWidth(double value) { - this.morphWidth.add(value); + public void addMorphWidth1(double value) { + this.morphWidth1.add(value); + } + + public void addMorphWidth2(double value) { + this.morphWidth2.add(value); + } + + public void addSoundingWidth(double value) { + this.soundingWidth.add(value); } public void addBedHeights(double value) { this.bedHeights.add(value); } - public double[][] getMorphWidthData() { + public double[][] getMorphWidth1Data() { return new double[][] { kms.toNativeArray(), - morphWidth.toNativeArray() + morphWidth1.toNativeArray() + }; + } + + public double[][] getMorphWidth2Data() { + return new double[][] { + kms.toNativeArray(), + morphWidth2.toNativeArray() + }; + } + + public double[][] getSoundingWidthData() { + return new double[][] { + kms.toNativeArray(), + soundingWidth.toNativeArray() }; } diff -r 3f58de350fb4 -r 35094b6bacf4 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 Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedHeightFactory.java Thu Apr 17 11:42:12 2014 +0200 @@ -32,7 +32,8 @@ /** Query to get km and ws for wst_id and column_pos. */ public static final String SQL_SELECT_SINGLE = - "SELECT bhsv.height, bhsv.station, bhsv.data_gap, bhsv.sounding_width, bhs.year " + + "SELECT bhsv.height, bhsv.station, bhsv.data_gap, bhsv.sounding_width," + + " bhs.year, bhsv.width" + " FROM bed_height_single bhs" + " JOIN bed_height_single_values bhsv on bhsv.bed_height_single_id = bhs.id" + " WHERE bhs.id = :height_id" + @@ -148,6 +149,7 @@ .addScalar("station", StandardBasicTypes.DOUBLE) .addScalar("data_gap", StandardBasicTypes.DOUBLE) .addScalar("sounding_width", StandardBasicTypes.DOUBLE) + .addScalar("width", StandardBasicTypes.DOUBLE) .addScalar("year", StandardBasicTypes.INTEGER); sqlQuery.setInteger("height_id", height_id); List results = sqlQuery.list(); @@ -158,7 +160,8 @@ Double row1 = row[1] != null ? (Double)row[1] : Double.NaN; Double row2 = row[2] != null ? (Double)row[2] : Double.NaN; Double row3 = row[3] != null ? (Double)row[3] : Double.NaN; - height.add(row0, row1, row2, row3, (Integer) row[4]); + Double row4 = row[4] != null ? (Double)row[4] : Double.NaN; + height.add(row0, row1, row2, row3, row4, (Integer) row[5]); } return height; } diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedHeightSingleData.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedHeightSingleData.java Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedHeightSingleData.java Thu Apr 17 11:42:12 2014 +0200 @@ -16,50 +16,55 @@ { protected int year; protected TDoubleArrayList data_gap; - protected TDoubleArrayList morphWidth; + protected TDoubleArrayList soundingWidth; + protected TDoubleArrayList width; public BedHeightSingleData() { super(); this.year = -1; data_gap = new TDoubleArrayList(); - morphWidth = new TDoubleArrayList(); + soundingWidth = new TDoubleArrayList(); + width = new TDoubleArrayList(); } public BedHeightSingleData(String name) { super(name); this.year = -1; data_gap = new TDoubleArrayList(); - morphWidth = new TDoubleArrayList(); + soundingWidth = new TDoubleArrayList(); + width = new TDoubleArrayList(); } public void add( double value, double station, double gap, + double sounding, double width, int year ) { super.add(value, station); this.year = year; this.data_gap.add(gap); - this.morphWidth.add(width); + this.soundingWidth.add(sounding); + this.width.add(width); } public int getYear() { return this.year; } - public double getMorphWidth(int idx) { - return this.morphWidth.getQuick(idx); + public double getSoundingWidth(int idx) { + return this.soundingWidth.getQuick(idx); } public double getDataGap(int idx) { return this.data_gap.getQuick(idx); } - public double getMorphWidth(double station) { + public double getSoundingWidth(double station) { int index = this.station.indexOf(station); - return index >= 0 ? morphWidth.getQuick(index): Double.NaN; + return index >= 0 ? soundingWidth.getQuick(index): Double.NaN; } public double getDataGap(double station) { @@ -67,7 +72,16 @@ return index >= 0 ? data_gap.getQuick(index) : Double.NaN; } - public double[] getMorphWidths() { - return this.morphWidth.toNativeArray(); + public double[] getSoundingWidths() { + return this.soundingWidth.toNativeArray(); + } + + public double getWidth(int ndx) { + return width.getQuick(ndx); + } + + public double getWidth(double station) { + int ndx = this.station.indexOf(station); + return width.get(ndx); } } diff -r 3f58de350fb4 -r 35094b6bacf4 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 Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadFactory.java Thu Apr 17 11:42:12 2014 +0200 @@ -116,6 +116,7 @@ " JOIN units u ON u.id = sy.unit_id " + " WHERE r.name = :name " + " AND ti.stop_time IS NOT NULL " + + " AND sy.kind = 0" + " AND syv.station BETWEEN :startKm AND :endKm"; public static final String SQL_SELECT_SINGLES_DATA_BY_ID = @@ -169,6 +170,7 @@ " WHERE r.name = :name " + " AND sy.description = :descr " + " AND gf.name = 'unknown' " + + " AND sy.kind = :type" + " ORDER BY syv.station"; public static final String SQL_SELECT_UNKNOWN = @@ -817,14 +819,15 @@ public static SedimentLoad getLoadUnknown( String river, - String description + String description, + String type ) { log.debug("SedimentLoadFactory.getLoadWithData"); Cache cache = CacheFactory.getCache(LOAD_DATA_CACHE_NAME); if (cache == null) { log.debug("Cache not configured."); - return getSedimentLoadUnknownUncached(river, description); + return getSedimentLoadUnknownUncached(river, description, type); } StaticSedimentLoadCacheKey key = @@ -837,7 +840,8 @@ return (SedimentLoad)element.getValue(); } - SedimentLoad values = getSedimentLoadUnknownUncached(river, description); + SedimentLoad values = + getSedimentLoadUnknownUncached(river, description, type); if (values != null && key != null) { log.debug("Store static bed height values in cache."); @@ -855,7 +859,8 @@ */ public static SedimentLoad getSedimentLoadUnknownUncached( String river, - String description + String description, + String type ) { log.debug("SedimentLoadFactory.getSedimentLoadWithDataUncached"); Session session = SessionHolder.HOLDER.get(); @@ -870,6 +875,12 @@ .addScalar("unit", StandardBasicTypes.STRING); sqlQuery.setString("name", river); sqlQuery.setString("descr", description); + if (type.equals("off_epoch")) { + sqlQuery.setInteger("type", 1); + } + else { + sqlQuery.setInteger("type", 0); + } List results = sqlQuery.list(); SedimentLoad load = new SedimentLoad(); if (results.isEmpty()) { diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadUnknownFacet.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadUnknownFacet.java Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadUnknownFacet.java Thu Apr 17 11:42:12 2014 +0200 @@ -41,7 +41,7 @@ access.getYearEpoch()); SedimentLoad load = SedimentLoadFactory.getLoadUnknown( - river, unknown[index].getDescription()); + river, unknown[index].getDescription(), access.getYearEpoch()); return load; } diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/src/main/java/org/dive4elements/river/artifacts/states/SoundingsSelect.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/states/SoundingsSelect.java Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/states/SoundingsSelect.java Thu Apr 17 11:42:12 2014 +0200 @@ -8,6 +8,7 @@ package org.dive4elements.river.artifacts.states; +import java.text.NumberFormat; import java.util.ArrayList; import java.util.List; @@ -17,16 +18,21 @@ import org.dive4elements.artifacts.CallContext; import org.dive4elements.artifacts.common.model.KVP; +import org.dive4elements.artifacts.common.utils.XMLUtils; +import org.dive4elements.artifacts.common.utils.XMLUtils.ElementCreator; import org.dive4elements.river.model.BedHeightEpoch; import org.dive4elements.river.model.BedHeightSingle; import org.dive4elements.river.model.River; import org.dive4elements.river.artifacts.D4EArtifact; +import org.dive4elements.river.artifacts.resources.Resources; +import org.dive4elements.river.utils.Formatter; import org.dive4elements.river.utils.RiverUtils; +import org.w3c.dom.Element; -public class SoundingsSelect extends MultiStringArrayState { +public class SoundingsSelect extends DefaultState { public static final String SOUNDINGS = "soundings"; @@ -43,12 +49,30 @@ return "parameter-matrix"; } + @Override + protected void appendItems( + Artifact artifact, + ElementCreator creator, + String name, + CallContext context, + Element select + ) { + try { + creator.addAttr(select, "type", "multiattribute", true); - @Override + getOptions(artifact, name, context, creator, select); + } + catch (IllegalArgumentException iae) { + logger.warn("Illegal argument", iae); + } + } + protected KVP[] getOptions( Artifact artifact, String parameterName, - CallContext context + CallContext context, + ElementCreator creator, + Element select ) throws IllegalArgumentException { @@ -68,8 +92,8 @@ List> kvp = new ArrayList>(); - appendSingles(river, kmLo, kmHi, kvp); - appendEpochs(river, kmLo, kmHi, kvp); + appendSingles(river, kmLo, kmHi, creator, select, context); + appendEpochs(river, kmLo, kmHi, creator, select, context); return kvp.toArray(new KVP[kvp.size()]); } @@ -79,7 +103,9 @@ River river, double kmLo, double kmHi, - List> kvp + ElementCreator creator, + Element select, + CallContext context ) { List singles = BedHeightSingle.getBedHeightSingles(river, kmLo, kmHi); @@ -89,15 +115,29 @@ logger.debug("Found " + size + " singles."); + NumberFormat nf = Formatter.getCalculationKm(context.getMeta()); for (int i = 0; i < size; i++) { BedHeightSingle s = singles.get(i); String id = PREFIX_SINGLE + s.getId(); String value = s.getDescription(); - kvp.add(new KVP(id, value)); + Integer year = s.getYear(); + Element item = creator.create("item"); + creator.addAttr(item, "label", value, true); + creator.addAttr(item, "value", id, true); + creator.addAttr(item, "year", + year != null ? s.getYear().toString() : ""); + creator.addAttr(item, "type", s.getType().getName()); + creator.addAttr(item, "range", + nf.format(s.getRange().getA()) + + " - " + + nf.format(s.getRange().getB())); + select.appendChild(item); } } + logger.debug("appended singles"); + logger.debug(XMLUtils.toString(select)); } @@ -105,7 +145,9 @@ River river, double kmLo, double kmHi, - List> kvp + ElementCreator creator, + Element select, + CallContext context ) { List epochs = BedHeightEpoch.getBedHeightEpochs(river, kmLo, kmHi); @@ -115,19 +157,55 @@ logger.debug("Found " + size + " epochs."); + NumberFormat nf = Formatter.getCalculationKm(context.getMeta()); for (int i = 0; i < size; i++) { BedHeightEpoch e = epochs.get(i); String id = PREFIX_EPOCH + e.getId(); String value = e.getDescription(); - kvp.add(new KVP(id, value)); + Element item = creator.create("item"); + creator.addAttr(item, "label", value, true); + creator.addAttr(item, "value", id, true); + creator.addAttr(item, "year", e.getTimeInterval().getStartTime().toString()); + creator.addAttr(item, "range", + nf.format(e.getRange().getA()) + + " - " + + nf.format(e.getRange().getB())); + select.appendChild(item); } } + logger.debug("appended epochs"); } + @Override + protected Element createStaticData( + D4EArtifact flys, + ElementCreator creator, + CallContext cc, + String name, + String value, + String type + ) { + Element data = creator.create("data"); + creator.addAttr(data, "name", name, true); + creator.addAttr(data, "type", type, true); + creator.addAttr(data, "label", + Resources.getMsg(cc.getMeta(), name, name), true); - @Override + String[] values = value.split(";"); + + for (String val: values) { + Element item = creator.create("item"); + creator.addAttr(item, "value", val, true); + creator.addAttr(item, "label", getLabelFor(cc, name, val), true); + + data.appendChild(item); + } + + return data; + } + protected String getLabelFor( CallContext cc, String parameterName, diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/src/main/java/org/dive4elements/river/artifacts/states/WDifferencesState.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/states/WDifferencesState.java Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/states/WDifferencesState.java Thu Apr 17 11:42:12 2014 +0200 @@ -14,6 +14,7 @@ import org.apache.log4j.Logger; import org.dive4elements.artifactdatabase.state.Facet; +import org.dive4elements.artifactdatabase.state.FacetActivity; import org.dive4elements.artifactdatabase.data.StateData; import org.dive4elements.artifacts.CallContext; @@ -30,12 +31,14 @@ import org.dive4elements.river.artifacts.model.CalculationResult; import org.dive4elements.river.artifacts.model.DataFacet; import org.dive4elements.river.artifacts.model.DifferenceCurveFacet; +import org.dive4elements.river.artifacts.model.DifferenceCurveFilterFacet; 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.artifacts.resources.Resources; import org.dive4elements.river.utils.RiverUtils; import org.dive4elements.river.utils.StringUtil; @@ -48,6 +51,31 @@ /** The logger that is used in this state. */ private static Logger logger = Logger.getLogger(WDifferencesState.class); + private static final String I18N_DIFFERENCES_FACET_NAME = + "facet.w_differences"; + private static final String I18N_DIFFERENCES_FACET_NAME_RAW = + "facet.w_differences.raw"; + + static { + // Active/deactivate facets. + FacetActivity.Registry.getInstance().register( + "winfo", + new FacetActivity() { + @Override + public Boolean isInitialActive( + Artifact artifact, + Facet facet, + String output + ) { + String name = facet.getName(); + + if (name.equals(FacetTypes.W_DIFFERENCES)) { + return Boolean.FALSE; + } + return Boolean.TRUE; + } + }); + } /** Specify to display nothing (this is kind of a "final" state). */ @Override @@ -190,10 +218,13 @@ context); String facetName = "diff ()"; + String minName = "min"; + String subName = "sub"; if (minuendWKms != null && subtrahendWKms != null) { - facetName = StringUtil.wWrap(minuendWKms.getName()) - + " - " + StringUtil.wWrap(subtrahendWKms.getName()); + minName = StringUtil.wWrap(minuendWKms.getName()); + subName = StringUtil.wWrap(subtrahendWKms.getName()); + facetName = minName + " - " + subName; WKms wkms = WKmsOperation.SUBTRACTION.operate(minuendWKms, subtrahendWKms); wkms.setName(facetName); @@ -201,8 +232,27 @@ logger.debug("WKMSSubtraction happened"); } if (facets != null) { - facets.add(new DifferenceCurveFacet(i/2, W_DIFFERENCES, facetName, - ComputeType.ADVANCE, id, hash)); + facets.add(new DifferenceCurveFacet( + i/2, + W_DIFFERENCES, + Resources.getMsg( + context.getMeta(), + I18N_DIFFERENCES_FACET_NAME_RAW, + facetName, + new Object[] { minName, subName }), + ComputeType.ADVANCE, + id, + hash)); + facets.add(new DifferenceCurveFilterFacet(i/2, + W_DIFFERENCES_FILTERED, + Resources.getMsg( + context.getMeta(), + I18N_DIFFERENCES_FACET_NAME, + facetName, + new Object[] { minName, subName }), + ComputeType.ADVANCE, + id, + hash)); } } diff -r 3f58de350fb4 -r 35094b6bacf4 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 Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/states/minfo/DifferencesState.java Thu Apr 17 11:42:12 2014 +0200 @@ -53,7 +53,9 @@ public static final String I18N_FACET_BED_DIFF_YEAR_RAW = "facet.bedheight.diff.year.raw"; public static final String I18N_FACET_BED_DIFF_ABSOLUTE = "facet.bedheight.diff.absolute"; public static final String I18N_FACET_BED_DIFF_ABSOLUTE_RAW = "facet.bedheight.diff.absolute.raw"; - public static final String I18N_FACET_BED_DIFF_MORPH = "facet.bedheight.diff.morph"; + public static final String I18N_FACET_BED_DIFF_SOUNDING = "facet.bedheight.diff.sounding"; + public static final String I18N_FACET_BED_DIFF_MORPH1 = "facet.bedheight.diff.morph1"; + public static final String I18N_FACET_BED_DIFF_MORPH2 = "facet.bedheight.diff.morph2"; public static final String I18N_FACET_BED_DIFF_EPOCH = "facet.bedheight.diff.epoch"; public static final String I18N_FACET_BED_DIFF_EPOCH_RAW = "facet.bedheight.diff.epoch.raw"; public static final String I18N_FACET_BED_DIFF_HEIGHT1 = "facet.bedheight.diff.height1"; @@ -128,8 +130,22 @@ hash)); newFacets.add(new BedDiffYearFacet( idx, - BED_DIFFERENCE_MORPH_WIDTH, - createBedDiffMorphDescription(meta), + BED_DIFFERENCE_SOUNDING_WIDTH, + createBedDiffSoundingDescription(meta), + ComputeType.ADVANCE, + stateId, + hash)); + newFacets.add(new BedDiffYearFacet( + idx, + BED_DIFFERENCE_MORPH_WIDTH1, + createBedDiffMorph1Description(meta), + ComputeType.ADVANCE, + stateId, + hash)); + newFacets.add(new BedDiffYearFacet( + idx, + BED_DIFFERENCE_MORPH_WIDTH2, + createBedDiffMorph2Description(meta), ComputeType.ADVANCE, stateId, hash)); @@ -341,10 +357,22 @@ return Resources.getMsg(meta, i18n, i18n, new Object[] { range }); } - protected String createBedDiffMorphDescription( + protected String createBedDiffSoundingDescription( CallMeta meta) { - return Resources.getMsg(meta, I18N_FACET_BED_DIFF_MORPH, - I18N_FACET_BED_DIFF_MORPH); + return Resources.getMsg(meta, I18N_FACET_BED_DIFF_SOUNDING, + I18N_FACET_BED_DIFF_SOUNDING); + } + + protected String createBedDiffMorph1Description( + CallMeta meta) { + return Resources.getMsg(meta, I18N_FACET_BED_DIFF_MORPH1, + I18N_FACET_BED_DIFF_MORPH1); + } + + protected String createBedDiffMorph2Description( + CallMeta meta) { + return Resources.getMsg(meta, I18N_FACET_BED_DIFF_MORPH2, + I18N_FACET_BED_DIFF_MORPH2); } protected String createBedDiffAbsoluteDescription( @@ -403,7 +431,7 @@ name.equals(BED_DIFFERENCE_YEAR_HEIGHT2_FILTERED)){ return Boolean.FALSE; } - else if (name.equals(BED_DIFFERENCE_MORPH_WIDTH) || + else if (name.equals(BED_DIFFERENCE_SOUNDING_WIDTH) || name.equals(BED_DIFFERENCE_EPOCH_FILTERED) || name.equals(BED_DIFFERENCE_HEIGHT_YEAR_FILTERED) || name.equals(BED_DIFFERENCE_YEAR_FILTERED)) { diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/src/main/java/org/dive4elements/river/exports/ChartGenerator2.java --- a/artifacts/src/main/java/org/dive4elements/river/exports/ChartGenerator2.java Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/ChartGenerator2.java Thu Apr 17 11:42:12 2014 +0200 @@ -685,7 +685,16 @@ ChartSettings chartSettings = getChartSettings(); if (chartSettings != null) { - return getChartSubtitle(chartSettings); + String subTitle = getChartSubtitle(chartSettings); + String defSubTitle = getDefaultChartSubtitle(); + if (defSubTitle != null && + !defSubTitle.isEmpty() && + !subTitle.equals(defSubTitle)) { + return defSubTitle; + } + else { + return subTitle; + } } return getDefaultChartSubtitle(); diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/src/main/java/org/dive4elements/river/exports/DiagramGenerator.java --- a/artifacts/src/main/java/org/dive4elements/river/exports/DiagramGenerator.java Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/DiagramGenerator.java Thu Apr 17 11:42:12 2014 +0200 @@ -15,6 +15,7 @@ import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -119,12 +120,15 @@ protected DiagramAttributes.Instance diagramAttributes; + protected HashSet subTitleParts; + public DiagramGenerator() { super(); axesLabels = new HashMap>(); xBounds = new HashMap(); yBounds = new HashMap(); + subTitleParts = new LinkedHashSet(); } @Override @@ -1041,13 +1045,18 @@ @Override public String getDefaultChartSubtitle() { + String parts = ""; + if (subTitleParts != null && !subTitleParts.isEmpty()) { + for (String p : subTitleParts) { + parts += ", " + p; + } + } DiagramAttributes.Title dTitle = diagramAttributes.getSubtitle(); if (dTitle == null) { /* Subtitle is optional */ return null; } - - return dTitle.evaluate((D4EArtifact)getMaster(), context); + return dTitle.evaluate((D4EArtifact)getMaster(), context) + parts; } /** @@ -1223,4 +1232,18 @@ } return axis; } + + /** + * @return the subtitle parts + */ + public HashSet getSubTitleParts() { + return subTitleParts; + } + + /** + * @param part the subtitle part to set + */ + public void addSubtitle(String part) { + this.subTitleParts.add(part); + } } diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/src/main/java/org/dive4elements/river/exports/LongitudinalSectionGenerator2.java --- a/artifacts/src/main/java/org/dive4elements/river/exports/LongitudinalSectionGenerator2.java Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/LongitudinalSectionGenerator2.java Thu Apr 17 11:42:12 2014 +0200 @@ -26,16 +26,21 @@ @Override public String getDefaultChartSubtitle() { double[] dist = getRange(); - + String parts = ""; + if (subTitleParts != null && !subTitleParts.isEmpty()) { + for (String p : subTitleParts) { + parts += ", " + p; + } + } if (dist == null || dist.length != 2 || Double.isNaN(dist[0]) || Double.isNaN(dist[1])) { Object [] args = new Object[] {getRiverName()}; - return msg(I18N_CHART_SHORT_SUBTITLE, "", args); + return msg(I18N_CHART_SHORT_SUBTITLE, "", args) + parts; } if (Math.abs(dist[0] - dist[1]) < 1E-5) { Object [] args = new Object[] {getRiverName(), dist[1]}; - return msg(I18N_CHART_LOCATION_SUBTITLE, "", args); + return msg(I18N_CHART_LOCATION_SUBTITLE, "", args) + parts; } return super.getDefaultChartSubtitle(); diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/src/main/java/org/dive4elements/river/exports/minfo/BedDifferenceExporter.java --- a/artifacts/src/main/java/org/dive4elements/river/exports/minfo/BedDifferenceExporter.java Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/minfo/BedDifferenceExporter.java Thu Apr 17 11:42:12 2014 +0200 @@ -33,6 +33,7 @@ import org.dive4elements.artifacts.common.utils.Config; import org.dive4elements.river.artifacts.resources.Resources; import org.dive4elements.river.artifacts.model.CalculationResult; +import org.dive4elements.river.artifacts.model.minfo.BedDiffYearResult; import org.dive4elements.river.artifacts.model.minfo.BedDifferencesResult; import org.dive4elements.river.artifacts.model.minfo.BedDifferenceJRDataSource; import org.dive4elements.river.exports.AbstractExporter; @@ -55,6 +56,12 @@ private static final String CSV_HEADER_DIFF = "export.minfo.beddifference.diff"; + private static final String CSV_HEADER_MORPH1 = + "export.minfo.beddifference.morph1"; + + private static final String CSV_HEADER_MORPH2 = + "export.minfo.beddifference.morph2"; + public static final String JASPER_FILE = "export.minfo.beddifference.pdf.file"; @@ -77,10 +84,26 @@ NumberFormat kmf = Formatter.getCalculationKm(context.getMeta()); NumberFormat mf = Formatter.getMeterFormat(context); for (BedDifferencesResult result : results) { - double[][] kms = result.getDifferencesData(); - for (int j = 0; j < kms[0].length; j++) { - writer.writeNext(new String[] { - kmf.format(kms[0][j]), mf.format(kms[1][j])}); + if (result instanceof BedDiffYearResult) { + BedDiffYearResult yResult = (BedDiffYearResult) result; + double[][] kms = yResult.getDifferencesData(); + double[][] morph1 = yResult.getMorphWidth1Data(); + double[][] morph2 = yResult.getMorphWidth2Data(); + for (int j = 0; j < kms[0].length; j++) { + writer.writeNext(new String[] { + kmf.format(kms[0][j]), + mf.format(kms[1][j]), + mf.format(morph1[1][j]), + mf.format(morph2[1][j])}); + } + } + else { + double[][] kms = result.getDifferencesData(); + for (int j = 0; j < kms[0].length; j++) { + writer.writeNext(new String[] { + kmf.format(kms[0][j]), + mf.format(kms[1][j])}); + } } } } @@ -136,6 +159,11 @@ if (results != null) { header.add(msg(CSV_HEADER_KM, "km")); header.add(msg(CSV_HEADER_DIFF, "m")); + if (results.length > 0 && + results[0] instanceof BedDiffYearResult) { + header.add(msg(CSV_HEADER_MORPH1, "morph width minuend [m]")); + header.add(msg(CSV_HEADER_MORPH2, "morph width subtrahend [m]")); + } } writer.writeNext(header.toArray(new String[header.size()])); } diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/src/main/java/org/dive4elements/river/exports/process/BedDiffHeightYearProcessor.java --- a/artifacts/src/main/java/org/dive4elements/river/exports/process/BedDiffHeightYearProcessor.java Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/process/BedDiffHeightYearProcessor.java Thu Apr 17 11:42:12 2014 +0200 @@ -13,8 +13,13 @@ import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; import org.dive4elements.artifacts.CallContext; +import org.dive4elements.river.artifacts.D4EArtifact; +import org.dive4elements.river.artifacts.access.RiverAccess; +import org.dive4elements.river.artifacts.context.RiverContext; import org.dive4elements.river.artifacts.model.FacetTypes; +import org.dive4elements.river.artifacts.model.ZoomScale; import org.dive4elements.river.artifacts.model.minfo.BedDiffYearResult; +import org.dive4elements.river.artifacts.resources.Resources; import org.dive4elements.river.exports.StyledSeriesBuilder; import org.dive4elements.river.exports.DiagramGenerator; import org.dive4elements.river.exports.XYChartGenerator; @@ -34,6 +39,8 @@ "chart.beddifference.height.yaxis.label"; public static final String I18N_AXIS_LABEL_DEFAULT = "delta S [cm / Jahr]"; + public static final String I18N_SUBTITLE_RADIUS = + "chart.subtitle.radius"; @Override public void doOut( @@ -49,7 +56,22 @@ logger.error("Can't process " + data.getClass().getName() + " objects"); return; } + Double start = (Double)context.getContextValue("startkm"); + Double end = (Double)context.getContextValue("endkm"); + if (start != null && end != null) { + D4EArtifact artifact = (D4EArtifact)bundle.getArtifact(); + RiverContext fc = (RiverContext)context.globalContext(); + // Adaptive smoothing, based on zoom factor/diagram extents. + ZoomScale scales = (ZoomScale)fc.get("zoomscale"); + RiverAccess access = new RiverAccess((D4EArtifact)artifact); + String river = access.getRiverName(); + double radius = scales.getRadius(river, start, end); + generator.addSubtitle(Resources.getMsg( + context.getMeta(), + I18N_SUBTITLE_RADIUS, + new Object[] { radius })); + } BedDiffYearResult bData = (BedDiffYearResult) data; XYSeries series = new StyledXYSeries(bundle.getFacetDescription(), theme); StyledSeriesBuilder.addPoints(series, bData.getHeightPerYearData(), false, GAP_TOLERANCE); diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/src/main/java/org/dive4elements/river/exports/process/BedDiffYearProcessor.java --- a/artifacts/src/main/java/org/dive4elements/river/exports/process/BedDiffYearProcessor.java Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/process/BedDiffYearProcessor.java Thu Apr 17 11:42:12 2014 +0200 @@ -13,8 +13,13 @@ import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; import org.dive4elements.artifacts.CallContext; +import org.dive4elements.river.artifacts.D4EArtifact; +import org.dive4elements.river.artifacts.access.RiverAccess; +import org.dive4elements.river.artifacts.context.RiverContext; import org.dive4elements.river.artifacts.model.FacetTypes; +import org.dive4elements.river.artifacts.model.ZoomScale; import org.dive4elements.river.artifacts.model.minfo.BedDiffYearResult; +import org.dive4elements.river.artifacts.resources.Resources; import org.dive4elements.river.exports.StyledSeriesBuilder; import org.dive4elements.river.exports.DiagramGenerator; import org.dive4elements.river.jfree.StyledXYSeries; @@ -33,6 +38,8 @@ "chart.beddifference.yaxis.label.diff"; public static final String I18N_AXIS_LABEL_DEFAULT = "delta S [cm]"; + public static final String I18N_SUBTITLE_RADIUS = + "chart.subtitle.radius"; @Override public void doOut( @@ -43,6 +50,22 @@ CallContext context = generator.getCallContext(); Object data = bundle.getData(context); if (data instanceof BedDiffYearResult) { + Double start = (Double)context.getContextValue("startkm"); + Double end = (Double)context.getContextValue("endkm"); + if (start != null && end != null) { + D4EArtifact artifact = (D4EArtifact)bundle.getArtifact(); + RiverContext fc = (RiverContext)context.globalContext(); + // Adaptive smoothing, based on zoom factor/diagram extents. + ZoomScale scales = (ZoomScale)fc.get("zoomscale"); + RiverAccess access = new RiverAccess((D4EArtifact)artifact); + String river = access.getRiverName(); + + double radius = scales.getRadius(river, start, end); + generator.addSubtitle(Resources.getMsg( + context.getMeta(), + I18N_SUBTITLE_RADIUS, + new Object[] { radius })); + } String facetType = bundle.getFacetName(); BedDiffYearResult bData = (BedDiffYearResult) data; diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/src/main/java/org/dive4elements/river/exports/process/BedHeightProcessor.java --- a/artifacts/src/main/java/org/dive4elements/river/exports/process/BedHeightProcessor.java Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/process/BedHeightProcessor.java Thu Apr 17 11:42:12 2014 +0200 @@ -86,23 +86,32 @@ 1d); } else if (data instanceof BedHeightSingleData) { BedHeightSingleData bData = (BedHeightSingleData)data; - double[] heights = bData.getHeights(); - double[] stations = bData.getStations().toNativeArray(); + double[][] points = new double[][] + {bData.getStations().toNativeArray(), bData.getHeights()}; logger.debug("doBedheightSingleOut"); - - for (int i = 0; i < heights.length; i++) { - series.add(stations[i], heights[i], false); - } + StyledSeriesBuilder.addPointsFactorY(series, + points, + false, + GAP_TOLERANCE, + 1d); } else if (data instanceof List) { List bData = (List)data; + double[][] points = new double[2][]; logger.debug("doBedheightSingleValueOut"); - for(BedHeightSingleValue bvalue: bData) { - series.add(bvalue.getStation(), bvalue.getHeight()); + for(int i = 0; i < bData.size(); i++) { + BedHeightSingleValue bvalue = bData.get(i); + points[0][i] = bvalue.getStation(); + points[1][i] = bvalue.getHeight(); } + StyledSeriesBuilder.addPointsFactorY(series, + points, + false, + GAP_TOLERANCE, + 1d); } else { logger.error("Unknown data type " + data.getClass()); diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/src/main/java/org/dive4elements/river/exports/process/BedWidthProcessor.java --- a/artifacts/src/main/java/org/dive4elements/river/exports/process/BedWidthProcessor.java Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/process/BedWidthProcessor.java Thu Apr 17 11:42:12 2014 +0200 @@ -47,16 +47,30 @@ XYSeries series = new StyledXYSeries(bundle.getFacetDescription(), theme); Object data = bundle.getData(context); + String facetName = bundle.getFacetName(); - if (data instanceof BedDiffYearResult) { + if (facetName.equals(FacetTypes.BED_DIFFERENCE_SOUNDING_WIDTH) && + data instanceof BedDiffYearResult) { BedDiffYearResult bData = (BedDiffYearResult) data; - StyledSeriesBuilder.addPoints(series, bData.getMorphWidthData(), true); + StyledSeriesBuilder.addPoints( + series, + bData.getSoundingWidthData(), + false, + 0.110d); + } else if (facetName.equals(FacetTypes.BED_DIFFERENCE_MORPH_WIDTH1) && + data instanceof BedDiffYearResult) { + BedDiffYearResult bData = (BedDiffYearResult) data; + StyledSeriesBuilder.addPoints(series, bData.getMorphWidth1Data(), true); + } else if (facetName.equals(FacetTypes.BED_DIFFERENCE_MORPH_WIDTH2) && + data instanceof BedDiffYearResult) { + BedDiffYearResult bData = (BedDiffYearResult) data; + StyledSeriesBuilder.addPoints(series, bData.getMorphWidth2Data(), true); } else if (data instanceof MorphologicWidth) { MorphologicWidth bData = (MorphologicWidth) data; StyledSeriesBuilder.addPoints(series, bData.getAsArray(), true); } else if (data instanceof BedHeightSingleData) { BedHeightSingleData bData = (BedHeightSingleData)data; - double[] width = bData.getMorphWidths(); + double[] width = bData.getSoundingWidths(); double[] stations = bData.getStations().toNativeArray(); for (int i = 0; i < width.length; i++) { @@ -77,7 +91,9 @@ @Override public boolean canHandle(String facettype) { - return facettype.equals(FacetTypes.BED_DIFFERENCE_MORPH_WIDTH) || + return facettype.equals(FacetTypes.BED_DIFFERENCE_SOUNDING_WIDTH) || + facettype.equals(FacetTypes.BED_DIFFERENCE_MORPH_WIDTH1) || + facettype.equals(FacetTypes.BED_DIFFERENCE_MORPH_WIDTH2) || facettype.equals(FacetTypes.MORPHOLOGIC_WIDTH) || facettype.equals(FacetTypes.BEDHEIGHT_SOUNDING_WIDTH); } diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/src/main/java/org/dive4elements/river/exports/process/WDiffProcessor.java --- a/artifacts/src/main/java/org/dive4elements/river/exports/process/WDiffProcessor.java Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/exports/process/WDiffProcessor.java Thu Apr 17 11:42:12 2014 +0200 @@ -8,8 +8,16 @@ package org.dive4elements.river.exports.process; +import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; +import org.dive4elements.artifacts.CallContext; +import org.dive4elements.river.artifacts.D4EArtifact; +import org.dive4elements.river.artifacts.access.RiverAccess; +import org.dive4elements.river.artifacts.context.RiverContext; import org.dive4elements.river.artifacts.model.FacetTypes; +import org.dive4elements.river.artifacts.model.ZoomScale; +import org.dive4elements.river.artifacts.resources.Resources; import org.dive4elements.river.exports.DiagramGenerator; +import org.dive4elements.river.themes.ThemeDocument; public class WDiffProcessor extends WOutProcessor { @@ -18,12 +26,41 @@ public final static String I18N_WDIFF_YAXIS_LABEL_DEFAULT = "m"; + public static final String I18N_SUBTITLE_RADIUS = + "chart.subtitle.radius"; + + @Override + public void doOut( + DiagramGenerator generator, + ArtifactAndFacet bundle, + ThemeDocument theme, + boolean visible) { + CallContext context = generator.getCallContext(); + Double start = (Double)context.getContextValue("startkm"); + Double end = (Double)context.getContextValue("endkm"); + if (start != null && end != null) { + D4EArtifact artifact = (D4EArtifact)bundle.getArtifact(); + RiverContext fc = (RiverContext)context.globalContext(); + // Adaptive smoothing, based on zoom factor/diagram extents. + ZoomScale scales = (ZoomScale)fc.get("zoomscale"); + RiverAccess access = new RiverAccess((D4EArtifact)artifact); + String river = access.getRiverName(); + + double radius = scales.getRadius(river, start, end); + generator.addSubtitle(Resources.getMsg( + context.getMeta(), + I18N_SUBTITLE_RADIUS, + new Object[] { radius })); + } + super.doOut(generator, bundle, theme, visible); + } @Override public boolean canHandle(String facetType) { if (facetType == null) { return false; } - return facetType.equals(FacetTypes.W_DIFFERENCES); + return facetType.equals(FacetTypes.W_DIFFERENCES) || + facetType.equals(FacetTypes.W_DIFFERENCES_FILTERED); } diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/src/main/resources/messages.properties --- a/artifacts/src/main/resources/messages.properties Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/src/main/resources/messages.properties Thu Apr 17 11:42:12 2014 +0200 @@ -280,6 +280,8 @@ facet.longitudinal_section.annotations = POIs facet.discharge_curves.mainvalues.q = Q (main values) facet.discharge_curves.mainvalues.w = W (main values) +facet.w_differences = {0} - {1} +facet.w_differences.raw = {0} - {1} (raw) historical_discharge.mainvalues.q = Q Main Values historical_discharge.mainvalues.w = W Main Values facet.flow_velocity.model.mainchannel = Mainchannel {0} @@ -311,9 +313,11 @@ bedquality.sublayer = 0.1m - 0.5m facet.bedheight.diff.year = Bedheight Difference {0} facet.bedheight.sounding_width = Sounding Width ({0}) -facet.bedheight.diff.morph = sounding Width +facet.bedheight.diff.sounding = sounding Width facet.bedheight.diff.height1 = Original Height Minuend {0} facet.bedheight.diff.height2 = Original Height Subtrahend {0} +facet.bedheight.diff.morph1 = Morph. active width minuend +facet.bedheight.diff.morph2 = Morph. active width subtrahend facet.bedheight.diff.absolute = Bedheight Difference/Year {0} facet.bedheight.diff.epoch = Bedheight Difference {0} facet.bedheight.diff.year.raw = Bedheight Difference {0} (raw) @@ -339,7 +343,8 @@ chart.beddifference.year.title = Bedheight Difference chart.beddifference.yaxis.label.morph = Width [m] chart.beddifference.yaxis.label.heights = Absolute Height [{0}] - +chart.beddifference.subtitle.radius = Fensterbreite für gewichtete Mittel: {0}km +chart.subtitle.radius = Radius for weighted Average: {0}km export.waterlevel.csv.header.km = River-Km export.waterlevel.csv.header.w = W [{0}] @@ -448,6 +453,8 @@ export.minfo.beddifference.pdf.file = /jasper/beddifference_en.jasper export.minfo.beddifference.pdf.title = Bedheight Difference export.minfo.beddifference.pdf.mode = Bedheight Difference +export.minfo.beddifference.morph1 = Morph. active width minuend [m] +export.minfo.beddifference.morph2 = Morph. active width subtrahend [m] floodmap.wmsbackground = Background Map floodmap.riveraxis = River Axis diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/src/main/resources/messages_de.properties --- a/artifacts/src/main/resources/messages_de.properties Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/src/main/resources/messages_de.properties Thu Apr 17 11:42:12 2014 +0200 @@ -280,6 +280,8 @@ facet.longitudinal_section.annotations = Streckenfavoriten facet.discharge_curves.mainvalues.q = Q (Haupt- und Extremwerte) facet.discharge_curves.mainvalues.w = W (Haupt- und Extremwerte) +facet.w_differences = {0} - {1} +facet.w_differences.raw = {0} - {1} (Rohdaten) historical_discharge.mainvalues.q = Q (Haupt- und Extremwerte) historical_discharge.mainvalues.w = W (Haupt- und Extremwerte) facet.flow_velocity.model.mainchannel = Hauptgerinne {0} @@ -311,7 +313,10 @@ bedquality.sublayer = 0,1m - 0,5m facet.bedheight.diff.year = Sohlh\u00f6hendifferenz {0} facet.bedheight.sounding_width = gepeilte Breite ({0}) -facet.bedheight.diff.morph = gepeilte Breite +facet.bedheight.diff.morph1 = Morph. aktive Breite Minuend +facet.bedheight.diff.morph2 = Morph. aktive Breite Subtrahend +facet.bedheight.sounding_width = gepeilte Breite ({0}) +facet.bedheight.diff.sounding = gepeilte Breite facet.bedheight.diff.height1 = H\u00f6he Minuend {0} facet.bedheight.diff.height2 = H\u00f6he Subtrahend {0} facet.bedheight.diff.absolute = Sohlh\u00f6hendifferenz/Jahr {0} @@ -339,6 +344,7 @@ chart.beddifference.year.title = Sohlh\u00f6hendifferenz chart.beddifference.yaxis.label.morph = Breite [m] chart.beddifference.yaxis.label.heights = Absolute H\u00f6he [m] +chart.subtitle.radius = Fensterbreite f\u00fcr gewichtete Mittel: {0}km export.waterlevel.csv.header.km = Fluss-Km export.waterlevel.csv.header.w = W [{0}] @@ -448,6 +454,9 @@ export.minfo.beddifference.pdf.file = /jasper/beddifference.jasper export.minfo.beddifference.pdf.title = Sohlh\u00f6hendifferenz export.minfo.beddifference.pdf.mode = Sohlh\u00f6hendifferenz +export.minfo.beddifference.morph1 = Morph. aktive Breite Minuend [m] +export.minfo.beddifference.morph2 = Morph. aktive Breite Subtrahend [m] + floodmap.wmsbackground = Hintergrundkarte floodmap.riveraxis = Flussachse diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/src/main/resources/messages_de_DE.properties --- a/artifacts/src/main/resources/messages_de_DE.properties Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/src/main/resources/messages_de_DE.properties Thu Apr 17 11:42:12 2014 +0200 @@ -278,6 +278,8 @@ facet.longitudinal_section.annotations = Streckenfavoriten facet.discharge_curves.mainvalues.q = Q (Haupt- und Extremwerte) facet.discharge_curves.mainvalues.w = W (Haupt- und Extremwerte) +facet.w_differences = {0} - {1} +facet.w_differences.raw = {0} - {1} (Rohdaten) historical_discharge.mainvalues.q = Q (Haupt- und Extremwerte) historical_discharge.mainvalues.w = W (Haupt- und Extremwerte) facet.flow_velocity.model.mainchannel = Hauptgerinne {0} @@ -310,9 +312,11 @@ facet.bedheight.diff.year = Sohlh\u00f6hendifferenz {0} facet.bedheight.diff.year.raw = Sohlh\u00f6hendifferenz {0} (Rohdaten) facet.bedheight.sounding_width = gepeilte Breite ({0}) -facet.bedheight.diff.morph = gepeilte Breite +facet.bedheight.diff.sounding = gepeilte Breite facet.bedheight.diff.height1 = H\u00f6he Minuend {0} facet.bedheight.diff.height2 = H\u00f6he Subtrahend {0} +facet.bedheight.diff.morph1 = Morph. aktive Breite Minuend +facet.bedheight.diff.morph2 = Morph. aktive Breite Subtrahend facet.bedheight.diff.absolute = Sohlh\u00f6hendifferenz/Jahr {0} facet.bedheight.diff.height.raw = {0} (Rohdaten) facet.bedheight.diff.height1.raw = H\u00f6he Minuend {0} (Rohdaten) @@ -337,6 +341,7 @@ chart.beddifference.year.title = Sohlh\u00f6hendifferenz chart.beddifference.yaxis.label.morph = Breite [m] chart.beddifference.yaxis.label.heights = Absolute H\u00f6he [{0}] +chart.subtitle.radius = Fensterbreite f\u00fcr gewichtete Mittel: {0}km export.waterlevel.csv.header.km = Fluss-Km export.waterlevel.csv.header.w = W [{0}] @@ -445,6 +450,8 @@ export.minfo.beddifference.pdf.file = /jasper/beddifference.jasper export.minfo.beddifference.pdf.title = Sohlh\u00f6hendifferenz export.minfo.beddifference.pdf.mode = Sohlh\u00f6hendifferenz +export.minfo.beddifference.morph1 = Morph. aktive Breite Minuend [m] +export.minfo.beddifference.morph2 = Morph. aktive Breite Subtrahend [m] floodmap.wmsbackground = Hintergrundkarte floodmap.riveraxis = Flussachse diff -r 3f58de350fb4 -r 35094b6bacf4 artifacts/src/main/resources/messages_en.properties --- a/artifacts/src/main/resources/messages_en.properties Thu Mar 27 11:21:31 2014 +0100 +++ b/artifacts/src/main/resources/messages_en.properties Thu Apr 17 11:42:12 2014 +0200 @@ -284,6 +284,8 @@ facet.longitudinal_section.annotations = POIs facet.discharge_curves.mainvalues.q = Q (main values) facet.discharge_curves.mainvalues.w = W (main values) +facet.w_differences = {0} - {1} +facet.w_differences.raw = {0} - {1} (raw) historical_discharge.mainvalues.q = Q Main Values historical_discharge.mainvalues.w = W Main Values facet.flow_velocity.model.mainchannel = Mainchannel {0} @@ -315,9 +317,11 @@ bedquality.sublayer = 0.1m - 0.5m facet.bedheight.diff.year = Bedheight Difference {0} facet.bedheight.sounding_width = Sounding Width ({0}) -facet.bedheight.diff.morph = sounding Width +facet.bedheight.diff.sounding = sounding Width facet.bedheight.diff.height1 = Original Height Minuend {0} facet.bedheight.diff.height2 = Original Height Subtrahend {0} +facet.bedheight.diff.morph1 = Morph. active width minuend +facet.bedheight.diff.morph2 = Morph. active width subtrahend facet.bedheight.diff.absolute = Bedheight Difference/Year {0} facet.bedheight.diff.epoch = Bedheight Difference {0} facet.bedheight.diff.year.raw = Bedheight Difference {0} (raw) @@ -343,6 +347,7 @@ chart.beddifference.year.title = Bedheight Difference chart.beddifference.yaxis.label.morph = Width [m] chart.beddifference.yaxis.label.heights = Absolute Height [m] +chart.subtitle.radius = Radius for weighted Average: {0}km export.waterlevel.csv.header.km = River-Km export.waterlevel.csv.header.w = W [{0}] @@ -451,6 +456,8 @@ export.minfo.beddifference.pdf.file = /jasper/beddifference_en.jasper export.minfo.beddifference.pdf.title = Bedheight Difference export.minfo.beddifference.pdf.mode = Bedheight Difference +export.minfo.beddifference.morph1 = Morph. active width minuend [m] +export.minfo.beddifference.morph2 = Morph. active width subtrahend [m] floodmap.wmsbackground = Background Map floodmap.riveraxis = River Axis diff -r 3f58de350fb4 -r 35094b6bacf4 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ParameterMatrix.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ParameterMatrix.java Thu Mar 27 11:21:31 2014 +0100 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ParameterMatrix.java Thu Apr 17 11:42:12 2014 +0200 @@ -25,6 +25,8 @@ import org.dive4elements.river.client.client.FLYSConstants; import org.dive4elements.river.client.shared.model.DataItem; import org.dive4elements.river.client.shared.model.IntegerOptionsData; +import org.dive4elements.river.client.shared.model.MultiAttributeData; +import org.dive4elements.river.client.shared.model.MultiDataItem; import org.dive4elements.river.client.shared.model.StringOptionsData; import java.io.Serializable; @@ -79,6 +81,7 @@ private Map columns; private List columnNames; private List valueNames; + private Map> attributes; /** Maps column names to list of rows' first fields. */ private Map> selected; @@ -89,6 +92,7 @@ this.columnNames = new ArrayList(); this.valueNames = new ArrayList(); this.selected = new HashMap>(); + this.attributes = new HashMap>(); } @@ -148,6 +152,49 @@ columns.put(groupTitle, col); } + public void addColumn(MultiAttributeData options) { + GWT.log("Add Columns for MultiAttribute data"); + String groupTitle = options.getLabel(); + + Column col = new Column(groupTitle); + DataItem[] items = options.getItems(); + + if (items == null) { + GWT.log("No items found in StringOptionsData '" + groupTitle + "'"); + return; + } + + MultiDataItem mItem = (MultiDataItem)items[0]; + for (Map.Entry entry: mItem.getValue().entrySet()) { + if (entry.getKey().equals("art:value") || + entry.getKey().equals("art:label")) { + continue; + } + attributes.put(entry.getKey(), new ArrayList()); + } + for (DataItem item: items) { + GWT.log("multidataitem: " + item.getLabel()); + String title = item.getLabel(); + + if (valueNames.indexOf(title) < 0) { + valueNames.add(title); + } + MultiDataItem mi = (MultiDataItem)item; + Map vs = mi.getValue(); + for (Map.Entrye: vs.entrySet()) { + if (e.getKey().equals("art:value") || + e.getKey().equals("art:label")) { + continue; + } + List data = attributes.get(e.getKey()); + data.add(e.getValue()); + } + col.addValue(item.getLabel(), mi.getValue().get("art:value")); + } + + columnNames.add(groupTitle); + columns.put(groupTitle, col); + } public Widget createParameterGrid() { listGrid = new ListGrid(); @@ -155,7 +202,7 @@ listGrid.setWrapCells(true); listGrid.setShowHeaderContextMenu(false); listGrid.setCanReorderFields(false); - listGrid.setCanSort(false); +// listGrid.setCanSort(false); //listGrid.setAutoFitData(Autofit.VERTICAL); listGrid.setFixedRecordHeights(false); // TODO: Then also need "autofit" (when wrapping) @@ -164,6 +211,12 @@ ArrayList fields = new ArrayList(); fields.add(itemNameField); + for (Map.Entry> entry: attributes.entrySet()) { + ListGridField attrField = new ListGridField( + entry.getKey(), MESSAGE.getString(entry.getKey())); + fields.add(attrField); + } + for (int i = 0, n = columnNames.size(); i < n; i++) { ListGridField field = new ListGridField(columnNames.get(i), MESSAGE.getString(columnNames.get(i))); field.setType(ListGridFieldType.BOOLEAN); @@ -189,6 +242,9 @@ record.setAttribute(columnName, false); record.setAttribute(columnName+"-value", value); } + for (Map.Entry> entry: attributes.entrySet()) { + record.setAttribute(entry.getKey(), entry.getValue().get(j)); + } records.add(record); } diff -r 3f58de350fb4 -r 35094b6bacf4 gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ParameterMatrixPanel.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ParameterMatrixPanel.java Thu Mar 27 11:21:31 2014 +0100 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ParameterMatrixPanel.java Thu Apr 17 11:42:12 2014 +0200 @@ -23,6 +23,7 @@ import org.dive4elements.river.client.shared.model.DefaultData; import org.dive4elements.river.client.shared.model.DefaultDataItem; import org.dive4elements.river.client.shared.model.IntegerOptionsData; +import org.dive4elements.river.client.shared.model.MultiAttributeData; import org.dive4elements.river.client.shared.model.StringOptionsData; import java.util.ArrayList; @@ -169,6 +170,9 @@ else if (data instanceof StringOptionsData) { matrix.addColumn((StringOptionsData) data); } + else if (data instanceof MultiAttributeData) { + matrix.addColumn((MultiAttributeData)data); + } } // If too many items are shown, show it in the helper Panel. diff -r 3f58de350fb4 -r 35094b6bacf4 gwt-client/src/main/java/org/dive4elements/river/client/server/ArtifactDescriptionFactory.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/server/ArtifactDescriptionFactory.java Thu Mar 27 11:21:31 2014 +0100 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/ArtifactDescriptionFactory.java Thu Apr 17 11:42:12 2014 +0200 @@ -227,6 +227,9 @@ else if (type.equals("doublearray")) { list.add(new DoubleArrayData(name, label, null)); } + else if (type.equals("multiattribute")) { + list.add(DataFactory.createMultiAttributeData(d, name, label)); + } else { logger.warn("Unrecognized Dynamic data type."); NodeList choices = ClientProtocolUtils.getItemNodes(d); diff -r 3f58de350fb4 -r 35094b6bacf4 gwt-client/src/main/java/org/dive4elements/river/client/server/DataFactory.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/server/DataFactory.java Thu Mar 27 11:21:31 2014 +0100 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/server/DataFactory.java Thu Apr 17 11:42:12 2014 +0200 @@ -8,9 +8,13 @@ package org.dive4elements.river.client.server; +import java.util.HashMap; + import javax.xml.xpath.XPathConstants; import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.apache.log4j.Logger; @@ -27,6 +31,8 @@ import org.dive4elements.river.client.shared.model.IntegerData; import org.dive4elements.river.client.shared.model.IntegerOptionsData; import org.dive4elements.river.client.shared.model.IntegerRangeData; +import org.dive4elements.river.client.shared.model.MultiAttributeData; +import org.dive4elements.river.client.shared.model.MultiDataItem; import org.dive4elements.river.client.shared.model.StringData; import org.dive4elements.river.client.shared.model.StringOptionsData; import org.dive4elements.river.client.shared.model.LongRangeData; @@ -91,6 +97,9 @@ else if (type.equals(LongRangeData.TYPE)) { return createLongRangeData(element, name, label); } + else if (type.equals(MultiAttributeData.TYPE)) { + return createMultiAttributeData(element, name, label); + } else { return createDefaultData(element, name, label); } @@ -103,6 +112,52 @@ } + public static Data createMultiAttributeData( + Element element, + String name, + String label) { + return new MultiAttributeData( + name, + label, + extractMultiDataItems(element)); + } + + + protected static DataItem[] extractMultiDataItems(Element element) { + NodeList itemList = (NodeList) XMLUtils.xpath( + element, + "art:item", + XPathConstants.NODESET, + ArtifactNamespaceContext.INSTANCE); + + if (itemList == null || itemList.getLength() == 0) { + logger.debug("No old data items found."); + return null; + } + + int count = itemList.getLength(); + + MultiDataItem[] items = new MultiDataItem[count]; + + for (int i = 0; i < count; i++) { + Element tmp = (Element) itemList.item(i); + + HashMap data = new HashMap(); + String label = tmp.getAttributeNS(NS_URI, "label"); + NamedNodeMap attributes = tmp.getAttributes(); + for (int j = 0; j < attributes.getLength(); j++) { + Node n = attributes.item(j); + if (n.getNodeName().equals("label")) { + continue; + } + data.put(n.getNodeName(), n.getNodeValue()); + } + items[i] = new MultiDataItem(label, label, data); + } + return items; + } + + /** * This method creates a new instance of DefaultData which has no real type * set. diff -r 3f58de350fb4 -r 35094b6bacf4 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/MultiAttributeData.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/MultiAttributeData.java Thu Apr 17 11:42:12 2014 +0200 @@ -0,0 +1,92 @@ +package org.dive4elements.river.client.shared.model; + + +public class MultiAttributeData +implements Data +{ + + public static final String TYPE = "multiattribute"; + + protected String label; + protected String description; + + public DataItem[] opts; + + + public MultiAttributeData() { + } + + + public MultiAttributeData(String label, String desc, DataItem[] opts) { + this.label = label; + this.description = desc; + this.opts = opts; + } + + + /** + * Returns the label of the item. + * + * @return the label. + */ + public String getLabel() { + return label; + } + + + /** + * Returns the description of the item. + * + * @return the description. + */ + public String getDescription() { + return description; + } + + + /** + * Returns the type of the item. + * + * @return the type. + */ + public String getType() { + return TYPE; + } + + + /** + * Returns the data items which represent the allowed options for this Data. + * + * @return the allowed options as DataItem array. + */ + public DataItem[] getItems() { + return opts; + } + + + /** + * @return always null. + */ + public DataItem getDefault() { + return null; + } + + + /** + * Returns the values as colon separated string. + * + * @return colon separated string. + */ + public String getStringValue() { + String data = ""; + boolean first = true; + for (int i = 0; i < opts.length; i++) { + if (!first) { + data += ";"; + } + data += opts[i].getStringValue(); + first = false; + } + return data; + } +} diff -r 3f58de350fb4 -r 35094b6bacf4 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/MultiDataItem.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/MultiDataItem.java Thu Apr 17 11:42:12 2014 +0200 @@ -0,0 +1,61 @@ +package org.dive4elements.river.client.shared.model; + +import java.util.Map; + + +public class MultiDataItem +implements DataItem +{ + /** The label. */ + protected String label; + + /** The description. */ + protected String description; + + /** The value. */ + protected Map value; + + + public MultiDataItem() { + } + + /** + * The default constructor to create new instances. + * + * @param label The label. + * @param description The description. + * @param value The value. + */ + public MultiDataItem( + String label, + String description, + Map value + ) { + this.label = label; + this.description = description; + this.value = value; + } + + + public String getLabel() { + return label; + } + + + public String getDescription() { + return description; + } + + + public String getStringValue() { + String v = ""; + for (Map.Entry e: value.entrySet()) { + v += e.getKey() + ":" + e.getValue() + ";"; + } + return v; + } + + public Map getValue() { + return value; + } +}