1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.mycore.datamodel.metadata;
20
21 import java.math.BigDecimal;
22 import java.text.NumberFormat;
23 import java.util.Locale;
24 import java.util.Objects;
25
26 import org.apache.logging.log4j.LogManager;
27 import org.apache.logging.log4j.Logger;
28 import org.jdom2.Element;
29 import org.mycore.common.MCRException;
30 import org.mycore.common.config.MCRConfiguration2;
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 public final class MCRMetaNumber extends MCRMetaDefault {
68
69 public static final int MAX_DIMENSION_LENGTH = 128;
70
71 public static final int MAX_MEASUREMENT_LENGTH = 64;
72
73 public static final int DEFAULT_FRACTION_DIGITS = 3;
74
75 private BigDecimal number;
76
77 private String dimension;
78
79 private String measurement;
80
81 private static final Logger LOGGER = LogManager.getLogger();
82
83 private int fractionDigits;
84
85 private int dimensionLength;
86
87 private int measurementLength;
88
89 private void loadProperties() {
90 fractionDigits = MCRConfiguration2.getInt("MCR.Metadata.MetaNumber.FractionDigits")
91 .orElse(DEFAULT_FRACTION_DIGITS);
92 dimensionLength = MCRConfiguration2.getInt("MCR.Metadata.MetaNumber.DimensionLength")
93 .orElse(MAX_DIMENSION_LENGTH);
94 measurementLength = MCRConfiguration2.getInt("MCR.Metadata.MetaNumber.MeasurementLength")
95 .orElse(MAX_MEASUREMENT_LENGTH);
96 }
97
98
99
100
101
102 public MCRMetaNumber() {
103 super();
104 loadProperties();
105 number = new BigDecimal("0");
106 dimension = "";
107 measurement = "";
108 }
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128 public MCRMetaNumber(String subtag, int inherted, String dimension, String measurement, String number)
129 throws MCRException {
130 super(subtag, null, null, inherted);
131 loadProperties();
132 setDimension(dimension);
133 setMeasurement(measurement);
134 setNumber(number);
135 }
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154 public MCRMetaNumber(String subtag, int inherted, String dimension, String measurement, BigDecimal number)
155 throws MCRException {
156 super(subtag, null, null, inherted);
157 loadProperties();
158 setDimension(dimension);
159 setMeasurement(measurement);
160 setNumber(number);
161 }
162
163
164
165
166
167
168
169
170 public void setDimension(String dimension) {
171 if (dimension == null) {
172 this.dimension = "";
173 } else {
174 if (dimension.length() > dimensionLength) {
175 this.dimension = dimension.substring(dimensionLength);
176 LOGGER.warn("{}: dimension is too long: {}", getSubTag(), dimension.length());
177 } else {
178 this.dimension = dimension;
179 }
180 }
181 }
182
183
184
185
186
187
188
189
190 public void setMeasurement(String measurement) {
191 if (measurement == null) {
192 this.measurement = "";
193 } else {
194 if (measurement.length() > measurementLength) {
195 this.measurement = measurement.substring(measurementLength);
196 LOGGER.warn("{}: measurement is too long: {}", getSubTag(), measurement.length());
197 } else {
198 this.measurement = measurement;
199 }
200 }
201 }
202
203
204
205
206
207
208
209
210
211
212 public void setNumber(String number) throws MCRException {
213 try {
214 if (number == null) {
215 throw new MCRException("Number cannot be null");
216 }
217 String tmpNumber = number.replace(',', '.');
218 this.number = new BigDecimal(tmpNumber);
219 } catch (NumberFormatException e) {
220 throw new MCRException("The format of a number is invalid.");
221 }
222 }
223
224
225
226
227
228
229
230
231
232 public void setNumber(BigDecimal number) throws MCRException {
233 if (number == null) {
234 throw new MCRException("Number cannot be null");
235 }
236 this.number = number;
237 }
238
239
240
241
242
243
244 public String getDimension() {
245 return dimension;
246 }
247
248
249
250
251
252
253 public String getMeasurement() {
254 return measurement;
255 }
256
257
258
259
260
261
262 public BigDecimal getNumberAsBigDecimal() {
263 return number;
264 }
265
266
267
268
269
270
271
272
273 public String getNumberAsString() {
274 final NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.ENGLISH);
275 numberFormat.setGroupingUsed(false);
276 numberFormat.setMaximumFractionDigits(fractionDigits);
277 numberFormat.setMinimumFractionDigits(fractionDigits);
278 return numberFormat.format(number);
279 }
280
281
282
283
284
285
286
287
288 @Override
289 public void setFromDOM(Element element) {
290 super.setFromDOM(element);
291 setMeasurement(element.getAttributeValue("measurement"));
292 setDimension(element.getAttributeValue("dimension"));
293 setNumber(element.getTextTrim());
294 }
295
296
297
298
299
300
301
302
303
304 @Override
305 public Element createXML() throws MCRException {
306 Element elm = super.createXML();
307 if (dimension != null && dimension.length() != 0) {
308 elm.setAttribute("dimension", dimension);
309 }
310
311 if (measurement != null && measurement.length() != 0) {
312 elm.setAttribute("measurement", measurement);
313 }
314 elm.addContent(getNumberAsString());
315 return elm;
316 }
317
318
319
320
321
322
323
324
325 @Override
326 public MCRMetaNumber clone() {
327 MCRMetaNumber clone = (MCRMetaNumber) super.clone();
328
329 clone.dimension = this.dimension;
330 clone.measurement = this.measurement;
331 clone.number = this.number;
332
333 return clone;
334 }
335
336
337
338
339 @Override
340 public void debug() {
341 if (LOGGER.isDebugEnabled()) {
342 super.debugDefault();
343 LOGGER.debug("Measurement = {}", measurement);
344 LOGGER.debug("Dimension = {}", dimension);
345 LOGGER.debug("Value = {}", number.toPlainString());
346 LOGGER.debug("");
347 }
348 }
349
350 @Override
351 public boolean equals(Object obj) {
352 if (!super.equals(obj)) {
353 return false;
354 }
355 final MCRMetaNumber other = (MCRMetaNumber) obj;
356 return Objects.equals(measurement, other.measurement) && Objects.equals(dimension, other.dimension)
357 && Objects.equals(number, other.number);
358 }
359
360 }