2727import oracle .nosql .driver .values .StringValue ;
2828
2929import java .lang .reflect .Array ;
30- import java .util .Enumeration ;
30+ import java .util .List ;
3131import java .util .Map ;
3232
33- enum FieldValueConverter {
33+ class FieldValueConverter {
34+ private static final List <FieldValueMapper > MAPPERS = List .of (
35+ new FieldValuePassthroughMapper (),
36+ new StringValueMapper (),
37+ new IntegerValueMapper (),
38+ new LongValueMapper (),
39+ new DoubleValueMapper (),
40+ new BooleanValueMapper (),
41+ new NumberValueMapper (),
42+ new ByteArrayValueMapper (),
43+ new EnumValueMapper (),
44+ new IterableValueMapper (),
45+ new ArrayValueMapper (),
46+ new MapValueMapper ()
47+ );
3448
35- INSTANCE ;
49+ private FieldValueConverter () {
50+ throw new AssertionError ("Utility class" );
51+ }
3652
37- FieldValue of (Object value ){
38- if (value == null ){
53+ static FieldValue of (Object value ) {
54+ if (value == null ) {
3955 return NullValue .getInstance ();
4056 }
41- if (value instanceof String string ) {
42- return new StringValue (string );
43- } else if (value instanceof Integer integer ) {
44- return new IntegerValue (integer );
45- } else if (value instanceof Long longValue ) {
46- return new LongValue (longValue );
47- } else if (value instanceof Double doubleValue ) {
48- return new DoubleValue (doubleValue );
49- } else if (value instanceof Boolean booleanValue ) {
50- return Boolean .TRUE .equals (booleanValue ) ? BooleanValue .trueInstance () : BooleanValue .falseInstance ();
51- } else if (value instanceof Number ) {
52- return new NumberValue (value .toString ());
53- } else if (value instanceof byte []) {
54- return new BinaryValue ((byte []) value );
55- } else if (value instanceof Iterable <?> values ) {
56- return createList (values );
57- } else if (value .getClass ().isArray ()) {
58- return createArray (value );
59- } else if (value instanceof Map <?,?>) {
60- return entries ((Map <String , ?>) value );
61- }else if (value instanceof FieldValue ) {
62- return (FieldValue ) value ;
63- } else if (value instanceof Enum <?> enumeration ) {
64- return new StringValue (enumeration .name ());
57+
58+ for (FieldValueMapper mapper : MAPPERS ) {
59+ if (mapper .supports (value )) {
60+ return mapper .toFieldValue (value );
61+ }
6562 }
66- throw new UnsupportedOperationException ("There is not support to: " + value .getClass ());
63+
64+ throw new UnsupportedOperationException ("Unsupported value type: " + value .getClass ());
6765 }
6866
69- Object toObject (FieldValue value ) {
70- if (value .isNull ()) {
67+ public static Object toJavaObject (FieldValue value ) {
68+ if (value == null || value .isNull ()) {
7169 return null ;
7270 }
71+
7372 return switch (value .getType ()) {
7473 case STRING -> value .asString ();
7574 case INTEGER -> value .asInteger ();
@@ -80,31 +79,153 @@ Object toObject(FieldValue value) {
8079 case BINARY -> value .asBinary ();
8180 case ARRAY -> value .asArray ();
8281 case MAP -> value .asMap ();
83- default -> throw new UnsupportedOperationException ("There is not support to : " + value .getType ());
82+ default -> throw new UnsupportedOperationException ("Unsupported FieldValue type : " + value .getType ());
8483 };
8584 }
86- private MapValue entries (Map <String , ?> value ) {
87- MapValue mapValue = new MapValue ();
88- for (Map .Entry <String , ?> entry : value .entrySet ()) {
89- mapValue .put (entry .getKey (), of (entry .getValue ()));
85+
86+ private interface FieldValueMapper {
87+ boolean supports (Object value );
88+ FieldValue toFieldValue (Object value );
89+ }
90+
91+ private static final class FieldValuePassthroughMapper implements FieldValueMapper {
92+ public boolean supports (Object value ) {
93+ return value instanceof FieldValue ;
94+ }
95+
96+ public FieldValue toFieldValue (Object value ) {
97+ return (FieldValue ) value ;
98+ }
99+ }
100+
101+ private static final class StringValueMapper implements FieldValueMapper {
102+ public boolean supports (Object value ) {
103+ return value instanceof String ;
104+ }
105+
106+ public FieldValue toFieldValue (Object value ) {
107+ return new StringValue ((String ) value );
108+ }
109+ }
110+
111+ private static final class IntegerValueMapper implements FieldValueMapper {
112+ public boolean supports (Object value ) {
113+ return value instanceof Integer ;
114+ }
115+
116+ public FieldValue toFieldValue (Object value ) {
117+ return new IntegerValue ((Integer ) value );
118+ }
119+ }
120+
121+ private static final class LongValueMapper implements FieldValueMapper {
122+ public boolean supports (Object value ) {
123+ return value instanceof Long ;
124+ }
125+
126+ public FieldValue toFieldValue (Object value ) {
127+ return new LongValue ((Long ) value );
128+ }
129+ }
130+
131+ private static final class DoubleValueMapper implements FieldValueMapper {
132+ public boolean supports (Object value ) {
133+ return value instanceof Double ;
134+ }
135+
136+ public FieldValue toFieldValue (Object value ) {
137+ return new DoubleValue ((Double ) value );
138+ }
139+ }
140+
141+ private static final class BooleanValueMapper implements FieldValueMapper {
142+ public boolean supports (Object value ) {
143+ return value instanceof Boolean ;
144+ }
145+
146+ public FieldValue toFieldValue (Object value ) {
147+ return Boolean .TRUE .equals (value )
148+ ? BooleanValue .trueInstance ()
149+ : BooleanValue .falseInstance ();
150+ }
151+ }
152+
153+ private static final class NumberValueMapper implements FieldValueMapper {
154+ public boolean supports (Object value ) {
155+ return value instanceof Number &&
156+ !(value instanceof Integer || value instanceof Long || value instanceof Double );
157+ }
158+
159+ public FieldValue toFieldValue (Object value ) {
160+ return new NumberValue (value .toString ());
161+ }
162+ }
163+
164+ private static final class ByteArrayValueMapper implements FieldValueMapper {
165+ public boolean supports (Object value ) {
166+ return value instanceof byte [];
167+ }
168+
169+ public FieldValue toFieldValue (Object value ) {
170+ return new BinaryValue ((byte []) value );
171+ }
172+ }
173+
174+ private static final class EnumValueMapper implements FieldValueMapper {
175+ public boolean supports (Object value ) {
176+ return value instanceof Enum <?>;
177+ }
178+
179+ public FieldValue toFieldValue (Object value ) {
180+ return new StringValue (((Enum <?>) value ).name ());
181+ }
182+ }
183+
184+ private static final class IterableValueMapper implements FieldValueMapper {
185+ public boolean supports (Object value ) {
186+ return value instanceof Iterable <?>;
187+ }
188+
189+ public FieldValue toFieldValue (Object value ) {
190+ ArrayValue array = new ArrayValue ();
191+ for (Object item : (Iterable <?>) value ) {
192+ array .add (FieldValueConverter .toFieldValue (item ));
193+ }
194+ return array ;
90195 }
91- return mapValue ;
92196 }
93197
94- private ArrayValue createArray (Object value ) {
95- var arrayValue = new ArrayValue ();
96- int length = Array .getLength (value );
97- for (int i = 0 ; i < length ; i ++) {
98- arrayValue .add (of (Array .get (value , i )));
198+ private static final class ArrayValueMapper implements FieldValueMapper {
199+ public boolean supports (Object value ) {
200+ return value != null && value .getClass ().isArray ();
201+ }
202+
203+ public FieldValue toFieldValue (Object value ) {
204+ int length = Array .getLength (value );
205+ ArrayValue array = new ArrayValue ();
206+ for (int i = 0 ; i < length ; i ++) {
207+ array .add (FieldValueConverter .toFieldValue (Array .get (value , i )));
208+ }
209+ return array ;
99210 }
100- return arrayValue ;
101211 }
102212
103- private ArrayValue createList (Iterable <?> values ) {
104- var arrayValue = new ArrayValue ();
105- for (Object value : values ) {
106- arrayValue .add (of (value ));
213+ private static final class MapValueMapper implements FieldValueMapper {
214+ public boolean supports (Object value ) {
215+ return value instanceof Map <?, ?>;
216+ }
217+
218+ public FieldValue toFieldValue (Object value ) {
219+ Map <?, ?> map = (Map <?, ?>) value ;
220+ MapValue mapValue = new MapValue ();
221+ for (Map .Entry <?, ?> entry : map .entrySet ()) {
222+ Object key = entry .getKey ();
223+ if (!(key instanceof String keyStr )) {
224+ throw new IllegalArgumentException ("Map keys must be strings. Found: " + key );
225+ }
226+ mapValue .put (keyStr , FieldValueConverter .toFieldValue (entry .getValue ()));
227+ }
228+ return mapValue ;
107229 }
108- return arrayValue ;
109230 }
110231}
0 commit comments