annotate artifacts/src/main/java/org/dive4elements/river/artifacts/states/minfo/BedQualityDistanceSelect.java @ 8682:5102733c4567

issue1755 Prevent out of bounds access when there is no data If there is no data it will default to the complete river. In the following overview you can then see that there is no data. Better then a "Error changing state".
author Andre Heinecke <andre.heinecke@intevation.de>
date Mon, 13 Apr 2015 11:03:00 +0200
parents 39ce099a6551
children 1116079e6624
rev   line source
8613
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
1 /* Copyright (C) 2011, 2012, 2013, 2015 by Bundesanstalt für Gewässerkunde
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
2 * Software engineering by Intevation GmbH
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
3 *
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
4 * This file is Free Software under the GNU AGPL (>=v3)
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
5 * and comes with ABSOLUTELY NO WARRANTY! Check out the
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
6 * documentation coming with Dive4Elements River for details.
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
7 */
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
8
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
9 package org.dive4elements.river.artifacts.states.minfo;
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
10
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
11 import java.util.Date;
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
12 import java.util.List;
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
13
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
14 import org.w3c.dom.Element;
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
15
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
16 import org.apache.log4j.Logger;
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
17
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
18 import org.dive4elements.river.artifacts.D4EArtifact;
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
19 import org.dive4elements.river.artifacts.access.RiverAccess;
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
20 import org.dive4elements.river.artifacts.states.DistanceSelect;
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
21 import org.dive4elements.river.utils.KMIndex;
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
22
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
23 import org.dive4elements.river.artifacts.model.minfo.BedOverview;
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
24 import org.dive4elements.river.artifacts.model.minfo.BedOverviewFactory;
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
25
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
26 import org.dive4elements.artifacts.common.utils.XMLUtils;
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
27 import org.dive4elements.artifacts.Artifact;
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
28 import org.dive4elements.artifacts.CallContext;
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
29
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
30 import org.dive4elements.artifactdatabase.data.StateData;
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
31
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
32 /** Extended Distance Select with default values appropiate for BedQuality */
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
33 public class BedQualityDistanceSelect extends DistanceSelect {
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
34
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
35 private static Logger log = Logger.getLogger(BedQualityDistanceSelect.class);
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
36
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
37 /**
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
38 * The default constructor that initializes an empty State object.
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
39 */
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
40 public BedQualityDistanceSelect() {
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
41 }
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
42
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
43 @Override
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
44 protected Element createData(
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
45 XMLUtils.ElementCreator cr,
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
46 Artifact artifact,
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
47 StateData data,
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
48 CallContext context)
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
49 {
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
50 Element ele = super.createData(cr, artifact, data, context);
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
51 if (!data.getName().equals("ld_from") && !data.getName().equals("ld_to")) {
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
52 return ele;
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
53 }
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
54
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
55 D4EArtifact arti = (D4EArtifact) artifact;
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
56 RiverAccess access = new RiverAccess(arti);
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
57
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
58 /* Bit of an overkill here but it will be cached and accessed
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
59 * in the next state anyway. */
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
60 BedOverview overview = BedOverviewFactory.getOverview(access.getRiverName());
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
61
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
62 if (overview == null) {
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
63 log.warn("No overview found for river '" + access.getRiverName() + "'");
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
64 return ele;
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
65 }
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
66
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
67 KMIndex<List<Date>> entries = overview.filter(BedOverview.ACCEPT);
8682
5102733c4567 issue1755 Prevent out of bounds access when there is no data
Andre Heinecke <andre.heinecke@intevation.de>
parents: 8613
diff changeset
68 if (entries.size() == 0) {
5102733c4567 issue1755 Prevent out of bounds access when there is no data
Andre Heinecke <andre.heinecke@intevation.de>
parents: 8613
diff changeset
69 log.warn("No data found for river '" + access.getRiverName() + "'");
5102733c4567 issue1755 Prevent out of bounds access when there is no data
Andre Heinecke <andre.heinecke@intevation.de>
parents: 8613
diff changeset
70 return ele;
5102733c4567 issue1755 Prevent out of bounds access when there is no data
Andre Heinecke <andre.heinecke@intevation.de>
parents: 8613
diff changeset
71 }
8613
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
72 entries.sort();
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
73
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
74 if (data.getName().equals("ld_from")) {
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
75 cr.addAttr(ele, "defaultLabel", data.getName(), true);
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
76 cr.addAttr(ele, "defaultValue", Double.toString(entries.get(0).getKm()), true);
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
77 } else if (data.getName().equals("ld_to")) {
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
78 cr.addAttr(ele, "defaultLabel", data.getName(), true);
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
79 cr.addAttr(ele, "defaultValue", Double.toString(entries.get(entries.size()-1).getKm()), true);
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
80 }
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
81
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
82 return ele;
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
83 }
39ce099a6551 (issue1755) Add good defaults for bedquality distance selection
Andre Heinecke <andre.heinecke@intevation.de>
parents:
diff changeset
84 }

http://dive4elements.wald.intevation.org