1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package gov.nist.secauto.metaschema.core.datatype.adapter;
28
29 import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatTypes;
30
31 import gov.nist.secauto.metaschema.core.datatype.AbstractDataTypeAdapter;
32 import gov.nist.secauto.metaschema.core.metapath.item.atomic.IBase64BinaryItem;
33 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
34
35 import java.nio.ByteBuffer;
36 import java.util.Base64;
37 import java.util.List;
38
39 import edu.umd.cs.findbugs.annotations.NonNull;
40
41 public class Base64Adapter
42 extends AbstractDataTypeAdapter<ByteBuffer, IBase64BinaryItem> {
43 @NonNull
44 private static final List<String> NAMES = ObjectUtils.notNull(
45 List.of(
46 "base64",
47
48 "base64Binary"));
49
50 Base64Adapter() {
51 super(ByteBuffer.class);
52 }
53
54 @Override
55 public List<String> getNames() {
56 return NAMES;
57 }
58
59 @Override
60 public JsonFormatTypes getJsonRawType() {
61 return JsonFormatTypes.STRING;
62 }
63
64 @SuppressWarnings("null")
65 @Override
66 public ByteBuffer parse(String value) {
67 Base64.Decoder decoder = Base64.getDecoder();
68 byte[] result = decoder.decode(value);
69 return ByteBuffer.wrap(result);
70 }
71
72 @Override
73 public ByteBuffer copy(Object obj) {
74 ByteBuffer buffer = (ByteBuffer) obj;
75 final ByteBuffer clone
76 = buffer.isDirect() ? ByteBuffer.allocateDirect(buffer.capacity()) : ByteBuffer.allocate(buffer.capacity());
77 final ByteBuffer readOnlyCopy = buffer.asReadOnlyBuffer();
78 readOnlyCopy.flip();
79 clone.put(readOnlyCopy);
80 return clone;
81 }
82
83 @SuppressWarnings("null")
84 @Override
85 public String asString(Object value) {
86 Base64.Encoder encoder = Base64.getEncoder();
87 return encoder.encodeToString(((ByteBuffer) value).array());
88 }
89
90 @Override
91 public Class<IBase64BinaryItem> getItemClass() {
92 return IBase64BinaryItem.class;
93 }
94
95 @Override
96 public IBase64BinaryItem newItem(Object value) {
97 ByteBuffer item = toValue(value);
98 return IBase64BinaryItem.valueOf(item);
99 }
100
101 }