1
2
3
4
5
6 package dev.metaschema.core.metapath.item.atomic;
7
8 import java.nio.ByteBuffer;
9
10 import dev.metaschema.core.datatype.adapter.MetaschemaDataTypeProvider;
11 import dev.metaschema.core.metapath.function.InvalidValueForCastFunctionException;
12 import dev.metaschema.core.metapath.item.atomic.impl.Base64BinaryItemImpl;
13 import dev.metaschema.core.metapath.item.atomic.impl.IBinaryItem;
14 import dev.metaschema.core.metapath.type.IAtomicOrUnionType;
15 import dev.metaschema.core.metapath.type.InvalidTypeMetapathException;
16 import edu.umd.cs.findbugs.annotations.NonNull;
17
18
19
20
21 public interface IBase64BinaryItem extends IBinaryItem {
22
23
24
25
26
27 @NonNull
28 static IAtomicOrUnionType<IBase64BinaryItem> type() {
29 return MetaschemaDataTypeProvider.BASE64.getItemType();
30 }
31
32 @Override
33 default IAtomicOrUnionType<IBase64BinaryItem> getType() {
34 return type();
35 }
36
37
38
39
40
41
42
43
44
45
46 static IBase64BinaryItem encode(@NonNull IStringItem text) {
47 return encode(text.asString());
48 }
49
50
51
52
53
54
55
56
57
58
59 static IBase64BinaryItem encode(@NonNull String text) {
60 return valueOf(MetaschemaDataTypeProvider.BASE64.encodeToByteBuffer(text));
61 }
62
63
64
65
66
67
68
69
70 @NonNull
71 static IBase64BinaryItem encode(@NonNull byte[] bytes) {
72 return valueOf(MetaschemaDataTypeProvider.BASE64.encodeToByteBuffer(bytes));
73 }
74
75
76
77
78
79
80
81
82 @NonNull
83 static IBase64BinaryItem encode(@NonNull ByteBuffer buffer) {
84 return valueOf(MetaschemaDataTypeProvider.BASE64.encodeToByteBuffer(buffer));
85 }
86
87
88
89
90
91
92 default IHexBinaryItem decode() {
93 return IHexBinaryItem.valueOf(MetaschemaDataTypeProvider.BASE64.decode(asByteBuffer()));
94 }
95
96
97
98
99
100
101 default IStringItem decodeAsString() {
102 return IStringItem.valueOf(MetaschemaDataTypeProvider.BASE64.decodeToString(asBytes()));
103 }
104
105
106
107
108
109
110
111
112
113
114
115 @NonNull
116 static IBase64BinaryItem valueOf(@NonNull String value) {
117 try {
118 return valueOf(MetaschemaDataTypeProvider.BASE64.parse(value));
119 } catch (IllegalArgumentException ex) {
120 throw new InvalidTypeMetapathException(
121 null,
122 String.format("The value starting with '%s' is not a valid Base64 character sequence. %s",
123 value.substring(0, Math.min(value.length(), 200)),
124 ex.getLocalizedMessage()),
125 ex);
126 }
127 }
128
129
130
131
132
133
134
135
136
137
138
139
140
141 @NonNull
142 static IBase64BinaryItem valueOf(@NonNull ByteBuffer buffer) {
143 return new Base64BinaryItemImpl(buffer);
144 }
145
146
147
148
149
150
151
152
153
154
155
156 @NonNull
157 static IBase64BinaryItem cast(@NonNull IAnyAtomicItem item) {
158 try {
159 return item instanceof IBase64BinaryItem
160 ? (IBase64BinaryItem) item
161 : valueOf(item.asString());
162 } catch (IllegalStateException | InvalidTypeMetapathException ex) {
163
164 throw new InvalidValueForCastFunctionException(ex);
165 }
166 }
167
168 @Override
169 default IBase64BinaryItem castAsType(IAnyAtomicItem item) {
170 return cast(item);
171 }
172
173
174
175
176
177
178
179
180
181 default int compareTo(@NonNull IBase64BinaryItem item) {
182 return asByteBuffer().compareTo(item.asByteBuffer());
183 }
184 }