comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/WDifferencesState.java @ 3812:f788d2d901d6

merged flys-artifacts/pre2.6-2011-12-05
author Thomas Arendsen Hein <thomas@intevation.de>
date Fri, 28 Sep 2012 12:14:53 +0200
parents 6f047a407f84
children 3a5ef4ac8e0f
comparison
equal deleted inserted replaced
3808:5fab0fe3c445 3812:f788d2d901d6
1 package de.intevation.flys.artifacts.states;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import org.apache.log4j.Logger;
7
8 import de.intevation.artifactdatabase.state.Facet;
9 import de.intevation.artifactdatabase.data.StateData;
10
11 import de.intevation.artifacts.CallContext;
12 import de.intevation.artifacts.Artifact;
13 import de.intevation.flys.artifacts.FLYSArtifact;
14 import de.intevation.flys.artifacts.StaticWKmsArtifact;
15 import de.intevation.flys.artifacts.WINFOArtifact;
16
17 import de.intevation.flys.artifacts.math.WKmsOperation;
18
19 import de.intevation.flys.artifacts.model.CalculationResult;
20 import de.intevation.flys.artifacts.model.DataFacet;
21 import de.intevation.flys.artifacts.model.DifferenceCurveFacet;
22 import de.intevation.flys.artifacts.model.FacetTypes;
23 import de.intevation.flys.artifacts.model.WKms;
24 import de.intevation.flys.artifacts.model.WQKms;
25
26 import de.intevation.flys.utils.FLYSUtils;
27 import de.intevation.flys.utils.StringUtil;
28
29
30 public class WDifferencesState
31 extends DefaultState
32 implements FacetTypes
33 {
34 /** The logger that is used in this state. */
35 private static Logger logger = Logger.getLogger(WDifferencesState.class);
36
37
38 public WDifferencesState() {
39 }
40
41
42 /** Specify to display nothing (this is kind of a "final" state). */
43 @Override
44 protected String getUIProvider() {
45 return "noinput";
46 }
47
48
49 @Override
50 public boolean validate(Artifact artifact)
51 throws IllegalArgumentException
52 {
53 FLYSArtifact flys = (FLYSArtifact) artifact;
54
55 StateData data = flys.getData("diffids");
56
57 if (data == null) {
58 throw new IllegalArgumentException("diffids is empty");
59 }
60
61 // TODO: Also validate format.
62
63 return true;
64 }
65
66
67 protected WKms getWKms(String mingle, CallContext context) {
68 String[] def = mingle.split(";");
69 String uuid = def[0];
70 String name = def[1];
71 int idx = Integer.parseInt(def[2]);
72
73 if (name.startsWith("staticwkms")) {
74 StaticWKmsArtifact staticWKms =
75 (StaticWKmsArtifact) FLYSUtils.getArtifact(
76 uuid,
77 context);
78 logger.debug("WDifferencesState obtain data from StaticWKms");
79 WKms wkms = staticWKms.getWKms(idx);
80 if (wkms == null)
81 logger.error("No WKms from artifact.");
82 return wkms;
83 }
84
85 WINFOArtifact flys = (WINFOArtifact) FLYSUtils.getArtifact(
86 uuid,
87 context);
88
89 if (flys == null) {
90 logger.warn("One of the artifacts (1) for diff calculation could not be loaded");
91 return null;
92 }
93 else{
94 WQKms[] wqkms = (WQKms[]) flys.getWaterlevelData().
95 getData();
96 if (wqkms == null)
97 logger.warn("not waterlevels in artifact");
98 else if (wqkms.length < idx)
99 logger.warn("not enough waterlevels in artifact");
100 return wqkms[idx];
101 }
102 }
103
104
105 /**
106 * Return CalculationResult with Array of WKms that are difference of
107 * Waterlevels. Add respective facets (DifferencesCurveFacet, DataFacet).
108 */
109 @Override
110 public Object computeAdvance(
111 FLYSArtifact artifact,
112 String hash,
113 CallContext context,
114 List<Facet> facets,
115 Object old
116 ) {
117 WINFOArtifact winfo = (WINFOArtifact) artifact;
118 String id = getID();
119
120 // Load the Artifacts/facets that we want to subtract and display.
121 // Expected format is:
122 // [42537f1e-3522-42ef-8968-635b03d8e9c6;longitudinal_section.w;0]#[1231f2-....]
123 String diffids = winfo.getDataAsString("diffids");
124 logger.debug("WDifferencesState has: " + diffids);
125 String datas[] = diffids.split("#");
126
127 // Validate the Data-Strings.
128 for (String s: datas) {
129 if (!WaterlevelSelectState.isValueValid(winfo.getDataAsString("diffids"))) {
130 // TODO: escalate.
131 }
132 }
133
134 if (datas.length < 2) {
135 // TODO crash with style
136 }
137
138 List<WKms> wkmss = new ArrayList<WKms>();
139
140 for(int i = 0; i < datas.length; i+=2) {
141 // e.g.:
142 // 42537f1e-3522-42ef-8968-635b03d8e9c6;longitudinal_section.w;1
143 WKms minuendWKms = getWKms(StringUtil.unbracket(datas[i+0]),
144 context);
145 WKms subtrahendWKms = getWKms(StringUtil.unbracket(datas[i+1]),
146 context);
147
148 String facetName = "diff ()";
149
150 if (minuendWKms != null && subtrahendWKms != null) {
151 facetName = StringUtil.wWrap(minuendWKms.getName())
152 + " - " + StringUtil.wWrap(subtrahendWKms.getName());
153 WKms wkms = WKmsOperation.SUBTRACTION.operate(minuendWKms,
154 subtrahendWKms);
155 wkms.setName(facetName);
156 wkmss.add(wkms);
157 logger.debug("WKMSSubtraction happened");
158 }
159
160 if (facets != null) {
161 facets.add(new DifferenceCurveFacet(i/2, W_DIFFERENCES, facetName,
162 ComputeType.ADVANCE, id, hash));
163 facets.add(new DataFacet(CSV, "CSV data"));
164 logger.debug("Adding facets in WDifferencesState.");
165 }
166 else {
167 logger.debug("Not adding facets in WDifferencesState.");
168 }
169 }
170
171 // TODO Evaluate whether null is okay as reports.
172 WKms[] diffs = wkmss.toArray(new WKms[wkmss.size()]);
173 CalculationResult result = new CalculationResult(diffs, null);
174 return result;
175 }
176 }
177 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org