1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package fr.inrae.agroclim.indicators.model.data.soil;
18
19 import java.io.File;
20 import java.util.ArrayList;
21 import java.util.Collection;
22 import java.util.Collections;
23 import java.util.Date;
24 import java.util.List;
25 import java.util.Map;
26 import java.util.Set;
27
28 import fr.inrae.agroclim.indicators.model.TimeScale;
29 import fr.inrae.agroclim.indicators.model.data.DataLoadingListenerHandler;
30 import fr.inrae.agroclim.indicators.model.data.Resource;
31 import fr.inrae.agroclim.indicators.model.data.Variable;
32 import fr.inrae.agroclim.indicators.model.data.climate.ClimaticDailyData;
33 import jakarta.xml.bind.annotation.XmlAccessType;
34 import jakarta.xml.bind.annotation.XmlAccessorType;
35 import jakarta.xml.bind.annotation.XmlElement;
36 import jakarta.xml.bind.annotation.XmlTransient;
37 import lombok.Getter;
38 import lombok.Setter;
39 import lombok.extern.log4j.Log4j2;
40
41
42
43
44
45
46
47
48
49
50
51
52
53 @Log4j2
54 @XmlAccessorType(XmlAccessType.FIELD)
55 public final class SoilLoaderProxy extends DataLoadingListenerHandler implements HasSoilCalculatorParams, SoilLoader {
56
57
58
59 private static final long serialVersionUID = 4796900688021151186L;
60
61
62
63
64 @XmlTransient
65 private List<ClimaticDailyData> climaticDailyData;
66
67
68
69
70 @XmlElement(name = "file")
71 @Getter
72 @Setter
73 private File file;
74
75
76
77
78 @XmlElement(name = "header")
79 @Getter
80 @Setter
81 private String[] headers;
82
83
84
85
86
87 private Double kcIni;
88
89
90
91
92
93 private Double kcLate;
94
95
96
97
98
99 private Double kcMid;
100
101
102
103
104 @XmlTransient
105 private SoilLoader loader;
106
107
108
109
110
111
112 private Double p;
113
114
115
116
117
118
119 private Double ru;
120
121
122
123
124 @XmlElement(name = "separator")
125 @Getter
126 @Setter
127 private String separator = Resource.DEFAULT_SEP;
128
129
130
131
132 private Double soilDepth;
133
134
135
136
137 @XmlTransient
138 @Getter
139 private List<Date> stages;
140
141
142
143
144 private Double swcFc;
145
146
147
148
149 private double swcMax;
150
151
152
153
154 private Double swcWp;
155
156
157
158
159 public SoilLoaderProxy() {
160 super();
161 }
162
163 @Override
164 public SoilLoaderProxy clone() throws CloneNotSupportedException {
165 final SoilLoaderProxy clone = (SoilLoaderProxy) super.clone();
166 if (climaticDailyData != null) {
167 clone.climaticDailyData = new ArrayList<>();
168 Collections.copy(clone.climaticDailyData, climaticDailyData);
169 }
170 clone.file = file;
171 clone.headers = headers;
172 clone.kcIni = kcIni;
173 clone.kcLate = kcLate;
174 clone.kcMid = kcMid;
175 clone.loader = loader.clone();
176 clone.p = p;
177 clone.ru = ru;
178 clone.separator = separator;
179 clone.soilDepth = soilDepth;
180 if (stages != null) {
181 clone.stages = new ArrayList<>();
182 Collections.copy(clone.stages, stages);
183 }
184 clone.swcFc = swcFc;
185 clone.swcMax = swcMax;
186 clone.swcWp = swcWp;
187 return clone;
188 }
189
190 @Override
191 public Map<String, String> getConfigurationErrors() {
192 return getLoader().getConfigurationErrors();
193 }
194
195
196
197
198 public SoilLoader getLoader() {
199 if (loader == null) {
200 if (file != null) {
201 final SoilFileLoader soilFileLoader = new SoilFileLoader(getFile(),
202 getHeaders(), getSeparator());
203 soilFileLoader
204 .addDataLoadingListeners(getDataLoadingListeners());
205 loader = soilFileLoader;
206 } else {
207 final SoilCalculator calc = new SoilCalculator();
208 calc.setClimaticDailyData(climaticDailyData);
209 calc.setStages(stages);
210 calc.setKcIni(kcIni);
211 calc.setKcLate(kcLate);
212 calc.setKcMid(kcMid);
213 calc.setP(p);
214 calc.setRu(ru);
215 calc.setSoilDepth(soilDepth);
216 calc.setSwcFc(swcFc);
217 calc.setSwcMax(swcMax);
218 calc.setSwcWp(swcWp);
219 calc.addDataLoadingListeners(getDataLoadingListeners());
220 loader = calc;
221 }
222 }
223 return loader;
224 }
225
226 @Override
227 public Collection<String> getMissingVariables() {
228 throw new RuntimeException("Not implemented for soil!");
229 }
230
231 @Override
232 public Set<Variable> getProvidedVariables() {
233 return getLoader().getProvidedVariables();
234 }
235
236 @Override
237 public Set<Variable> getVariables() {
238 return getLoader().getVariables();
239 }
240
241 @Override
242 public List<SoilDailyData> load() {
243 return getLoader().load();
244 }
245
246
247
248
249 public void setCalculator(final SoilCalculator calc) {
250 loader = calc;
251 }
252
253
254
255
256 public void setClimaticDailyData(final List<ClimaticDailyData> values) {
257 this.climaticDailyData = values;
258 if (loader instanceof final SoilCalculator calc) {
259 calc.setClimaticDailyData(values);
260 } else {
261 LOGGER.warn("No soil loader!");
262 }
263 }
264
265 @Override
266 public void setKcIni(final Double value) {
267 this.kcIni = value;
268 }
269
270 @Override
271 public void setKcLate(final Double value) {
272 this.kcLate = value;
273 }
274
275 @Override
276 public void setKcMid(final Double value) {
277 this.kcMid = value;
278 }
279
280 @Override
281 public void setP(final Double value) {
282 p = value;
283 }
284
285 @Override
286 public void setSoilDepth(final Double value) {
287 this.soilDepth = value;
288 }
289
290
291
292
293
294 public void setStages(final List<Date> values) {
295 this.stages = values;
296 if (loader instanceof final SoilCalculator calc) {
297 calc.setStages(stages);
298 }
299 }
300
301 @Override
302 public void setSwcFc(final Double value) {
303 this.swcFc = value;
304 }
305
306 @Override
307 public void setSwcMax(final Double value) {
308 this.swcMax = value;
309 }
310
311 @Override
312 public void setSwcWp(final Double value) {
313 this.swcWp = value;
314 }
315
316 @Override
317 public void setTimeScale(final TimeScale timeScale) {
318
319 }
320 }