1
2
3
4
5
6 package dev.metaschema.core.metapath.item.atomic;
7
8 import java.time.temporal.TemporalAmount;
9
10 import dev.metaschema.core.datatype.adapter.AbstractDurationAdapter;
11 import dev.metaschema.core.metapath.function.InvalidValueForCastFunctionException;
12 import dev.metaschema.core.metapath.type.IAtomicOrUnionType;
13 import dev.metaschema.core.metapath.type.InvalidTypeMetapathException;
14 import dev.metaschema.core.metapath.type.impl.TypeConstants;
15 import edu.umd.cs.findbugs.annotations.NonNull;
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 public interface IDurationItem extends IAnyAtomicItem {
31
32
33
34
35
36 @NonNull
37 static IAtomicOrUnionType<IDurationItem> type() {
38 return TypeConstants.DURATION_TYPE;
39 }
40
41
42
43
44
45
46
47
48
49
50
51 @NonNull
52 static IDurationItem valueOf(@NonNull String value) {
53 try {
54 return AbstractDurationAdapter.parseDuration(value);
55 } catch (IllegalArgumentException ex) {
56 throw new InvalidTypeMetapathException(
57 null,
58 String.format("Invalid year/month or day/time duration value '%s'.",
59 value),
60 ex);
61 }
62 }
63
64
65
66
67
68
69
70
71
72
73
74 @NonNull
75 static IDurationItem cast(@NonNull IAnyAtomicItem item) {
76 IDurationItem retval;
77 if (item instanceof IDurationItem) {
78 retval = (IDurationItem) item;
79 } else {
80 String value;
81 try {
82 value = item.asString();
83 } catch (IllegalStateException ex) {
84
85 throw new InvalidValueForCastFunctionException(ex);
86 }
87
88 try {
89 retval = valueOf(value);
90 } catch (InvalidTypeMetapathException ex) {
91 throw new InvalidValueForCastFunctionException(
92 String.format("Value '%s' cannot be parsed as either a day-time or year-month duration", value),
93 ex);
94 }
95 }
96 return retval;
97 }
98
99 @Override
100 TemporalAmount getValue();
101
102 @Override
103 default IDurationItem castAsType(IAnyAtomicItem item) {
104 return cast(item);
105 }
106
107
108
109
110
111
112
113
114
115 int compareTo(@NonNull IDurationItem item);
116 }