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.core.JsonGenerator;
30 import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatTypes;
31
32 import gov.nist.secauto.metaschema.core.datatype.AbstractDataTypeAdapter;
33 import gov.nist.secauto.metaschema.core.metapath.item.atomic.IAnyAtomicItem;
34 import gov.nist.secauto.metaschema.core.metapath.item.atomic.IBooleanItem;
35 import gov.nist.secauto.metaschema.core.metapath.item.atomic.IDecimalItem;
36 import gov.nist.secauto.metaschema.core.metapath.item.atomic.IIntegerItem;
37 import gov.nist.secauto.metaschema.core.metapath.item.atomic.INumericItem;
38 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
39
40 import java.io.IOException;
41 import java.math.BigDecimal;
42 import java.math.MathContext;
43 import java.util.List;
44
45 import edu.umd.cs.findbugs.annotations.NonNull;
46
47 public class DecimalAdapter
48 extends AbstractDataTypeAdapter<BigDecimal, IDecimalItem> {
49 public static final MathContext MATH_CONTEXT = MathContext.DECIMAL64;
50 @NonNull
51 private static final BigDecimal DECIMAL_BOOLEAN_TRUE = new BigDecimal("1.0");
52 @NonNull
53 private static final BigDecimal DECIMAL_BOOLEAN_FALSE = new BigDecimal("0.0");
54 @NonNull
55 private static final List<String> NAMES = ObjectUtils.notNull(
56 List.of("decimal"));
57
58 DecimalAdapter() {
59 super(BigDecimal.class);
60 }
61
62 @Override
63 public List<String> getNames() {
64 return NAMES;
65 }
66
67 @Override
68 public JsonFormatTypes getJsonRawType() {
69 return JsonFormatTypes.NUMBER;
70 }
71
72 @Override
73 public BigDecimal parse(String value) {
74 return new BigDecimal(value, MATH_CONTEXT);
75 }
76
77 @Override
78 public void writeJsonValue(Object value, JsonGenerator generator) throws IOException {
79 try {
80 generator.writeNumber((BigDecimal) value);
81 } catch (ClassCastException ex) {
82 throw new IOException(ex);
83 }
84 }
85
86 @Override
87 public BigDecimal copy(Object obj) {
88
89 return (BigDecimal) obj;
90 }
91
92 @Override
93 public Class<IDecimalItem> getItemClass() {
94 return IDecimalItem.class;
95 }
96
97 @Override
98 public IDecimalItem newItem(Object value) {
99 BigDecimal item = toValue(value);
100 return IDecimalItem.valueOf(item);
101 }
102
103 @Override
104 protected IDecimalItem castInternal(@NonNull IAnyAtomicItem item) {
105 IDecimalItem retval;
106 if (item instanceof INumericItem) {
107 if (item instanceof IDecimalItem) {
108 retval = (IDecimalItem) item;
109 } else {
110
111 retval = newItem(((IIntegerItem) item).asDecimal());
112 }
113 } else if (item instanceof IBooleanItem) {
114 boolean value = ((IBooleanItem) item).toBoolean();
115 retval = newItem(value ? DECIMAL_BOOLEAN_TRUE : DECIMAL_BOOLEAN_FALSE);
116 } else {
117 retval = super.castInternal(item);
118 }
119 return retval;
120 }
121 }