8000 vpack: keyMap Adapter implemented · anderick/arangodb-java-driver@fa0bfb3 · GitHub
[go: up one dir, main page]

Skip to content

Commit fa0bfb3

Browse files
author
Mark
committed
vpack: keyMap Adapter implemented
1 parent 409f3de commit fa0bfb3

File tree

3 files changed

+196
-59
lines changed

3 files changed

+196
-59
lines changed

src/main/java/com/arangodb/velocypack/VPack.java

Lines changed: 28 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import java.lang.reflect.InvocationTargetException;
55
import java.math.BigDecimal;
66
import java.math.BigInteger;
7-
import java.util.ArrayList;
87
import java.util.Collection;
98
import java.util.HashMap;
109
import java.util.Iterator;
@@ -15,12 +14,12 @@
1514

1615
import com.arangodb.velocypack.VPackBuilder.BuilderOptions;
1716
import com.arangodb.velocypack.exception.VPackException;
18-
import com.arangodb.velocypack.exception.VPackKeyTypeException;
1917
import com.arangodb.velocypack.exception.VPackParserException;
2018
import com.arangodb.velocypack.internal.VPackCache;
2119
import com.arangodb.velocypack.internal.VPackCache.FieldInfo;
2220
import com.arangodb.velocypack.internal.VPackDeserializers;
2321
import com.arangodb.velocypack.internal.VPackInstanceCreators;
22+
import com.arangodb.velocypack.internal.VPackKeyMapAdapters;
2423
import com.arangodb.velocypack.internal.VPackOptionsImpl;
2524
import com.arangodb.velocypack.internal.VPackSerializers;
2625

@@ -37,26 +36,11 @@ public static interface VPackOptions extends BuilderOptions {
3736

3837
private static final String ATTR_KEY = "key";
3938
private static final String ATTR_VALUE = "value";
40-
private static final Collection<Class<?>> KEY_TYPES;
41-
static {
42-
KEY_TYPES = new ArrayList<Class<?>>();
43-
KEY_TYPES.add(Boolean.class);
44-
KEY_TYPES.add(Integer.class);
45-
KEY_TYPES.add(Long.class);
46-
KEY_TYPES.add(Float.class);
47-
KEY_TYPES.add(Short.class);
48-
KEY_TYPES.add(Double.class);
49-
KEY_TYPES.add(Number.class);
50-
KEY_TYPES.add(BigInteger.class);
51-
KEY_TYPES.add(BigDecimal.class);
52-
KEY_TYPES.add(String.class);
53-
KEY_TYPES.add(Character.class);
54-
KEY_TYPES.add(Enum.class);
55-
}
5639

5740
private final Map<Class<?>, VPackSerializer<?>> serializers;
5841
private final Map<Class<?>, VPackDeserializer<?>> deserializers;
5942
private final Map<Class<?>, VPackInstanceCreator<?>> instanceCreators;
43+
private final Map<Class<?>, VPackKeyMapAdapter<?>> keyMapAdapters;
6044
private final VPackOptions options;
6145

6246
private final VPackCache cache;
@@ -73,6 +57,7 @@ public VPack(final VPackOptions options) {
7357
serializers = new HashMap<Class<?>, VPackSerializer<?>>();
7458
deserializers = new HashMap<Class<?>, VPackDeserializer<?>>();
7559
instanceCreators = new HashMap<Class<?>, VPackInstanceCreator<?>>();
60+
keyMapAdapters = new HashMap<Class<?>, VPackKeyMapAdapter<?>>();
7661
cache = new VPackCache();
7762
serializationContext = new VPackSerializationContext() {
7863
@Override
@@ -142,6 +127,18 @@ public <T> T deserialize(final VPackSlice vpack, final Class<T> type) throws VPa
142127
deserializers.put(Number.class, VPackDeserializers.NUMBER);
143128
deserializers.put(Character.class, VPackDeserializers.CHARACTER);
144129
deserializers.put(char.class, VPackDeserializers.CHARACTER);
130+
131+
keyMapAdapters.put(String.class, VPackKeyMapAdapters.STRING);
132+
keyMapAdapters.put(Boolean.class, VPackKeyMapAdapters.BOOLEAN);
133+
keyMapAdapters.put(Integer.class, VPackKeyMapAdapters.INTEGER);
134+
keyMapAdapters.put(Long.class, VPackKeyMapAdapters.LONG);
135+
keyMapAdapters.put(Short.class, VPackKeyMapAdapters.SHORT);
136+
keyMapAdapters.put(Double.class, VPackKeyMapAdapters.DOUBLE);
137+
keyMapAdapters.put(Float.class, VPackKeyMapAdapters.FLOAT);
138+
keyMapAdapters.put(BigInteger.class, VPackKeyMapAdapters.BIG_INTEGER);
139+
keyMapAdapters.put(BigDecimal.class, VPackKeyMapAdapters.BIG_DECIMAL);
140+
keyMapAdapters.put(Number.class, VPackKeyMapAdapters.NUMBER);
141+
keyMapAdapters.put(Character.class, VPackKeyMapAdapters.CHARACTER);
145142
}
146143

147144
public VPackOptions getOptions() {
@@ -277,11 +274,12 @@ private <T> Object deserializeMap(final VPackSlice vpack, final Class<T> type, f
277274
final Class<?>[] parameterizedTypes = fieldInfo.getParameterizedTypes();
278275
final Class<?> keyType = parameterizedTypes[0];
279276
final Class<?> valueType = parameterizedTypes[1];
280-
if (isStringableKeyType(keyType)) {
277+
final VPackKeyMapAdapter<Object> keyMapAdapter = getKeyMapAdapter(keyType);
278+
if (keyMapAdapter != null) {
281279
for (final Iterator<VPackSlice> iterator = vpack.iterator(); iterator.hasNext();) {
282280
final VPackSlice key = iterator.next();
283281
final VPackSlice valueAt = new VPackSlice(key.getVpack(), key.getStart() + key.getByteSize());
284-
value.put(getKeyfromString(key.makeKey().getAsString(), keyType),
282+
value.put(keyMapAdapter.deserialize(key.makeKey().getAsString()),
285283
getValue(valueAt, valueType, null));
286284
}
287285
} else {
@@ -296,37 +294,6 @@ private <T> Object deserializeMap(final VPackSlice vpack, final Class<T> type, f
296294
return value;
297295
}
298296

299-
private Object getKeyfromString(final String key, final Class<?> type) throws VPackKeyTypeException {
300-
final Object result;
301-
if (type == String.class) {
302-
result = key;
303-
} else if (type == Integer.class) {
304-
result = Integer.valueOf(key);
305-
} else if (type == Long.class) {
306-
result = Long.valueOf(key);
307-
} else if (type == Float.class) {
308-
result = Float.valueOf(key);
309-
} else if (type == Short.class) {
310-
result = Short.valueOf(key);
311-
} else if (type == Double.class || type == Number.class) {
312-
result = Double.valueOf(key);
313-
} else if (type == BigInteger.class) {
314-
result = new BigInteger(key);
315-
} else if (type == BigDecimal.class) {
316-
result = new BigDecimal(key);
317-
} else if (type == Character.class && key.length() == 1) {
318-
result = key.charAt(0);
319-
} else if (Enum.class.isAssignableFrom(type)) {
320-
final Class<? extends Enum> enumType = (Class<? extends Enum>) type;
321-
result = Enum.valueOf(enumType, key);
322-
} else if (type == Boolean.class) {
323-
result = Boolean.valueOf(key);
324-
} else {
325-
throw new VPackKeyTypeException(String.format("can not convert key: %s in type: %s", key, type.getName()));
326-
}
327-
return result;
328-
}
329-
330297
public VPackSlice serialize(final Object entity) throws VPackParserException {
331298
final VPackBuilder builder = new VPackBuilder(options);
332299
try {
@@ -427,11 +394,13 @@ private void serializeMap(
427394
final Map map = Map.class.cast(value);
428395
if (map.size() > 0) {
429396
final Class<?> keyType = fieldInfo.getParameterizedTypes()[0];
430-
if (isStringableKeyType(keyType)) {
397+
final VPackKeyMapAdapter<Object> keyMapAdapter = getKeyMapAdapter(keyType);
398+
if (keyMapAdapter != null) {
431399
builder.add(name, new Value(ValueType.OBJECT));
432400
final Set<Entry<?, ?>> entrySet = map.entrySet();
433401
for (final Entry<?, ?> entry : entrySet) {
434-
addValue(keyToString(entry.getKey()), entry.getValue().getClass(), entry.getValue(), builder, null);
402+
addValue(keyMapAdapter.serialize(entry.getKey()), entry.getValue().getClass(), entry.getValue(),
403+
builder, null);
435404
}
436405
builder.close();
437406
} else {
@@ -451,12 +420,12 @@ private void serializeMap(
451420
}
452421
}
453422

454-
private boolean isStringableKeyType(final Class<?> type) {
455-
return KEY_TYPES.contains(type) || Enum.class.isAssignableFrom(type);
456-
}
457-
458-
private String keyToString(final Object key) {
459-
return Enum.class.isAssignableFrom(key.getClass()) ? Enum.class.cast(key).name() : key.toString();
423+
private VPackKeyMapAdapter<Object> getKeyMapAdapter(final Class<?> type) {
424+
VPackKeyMapAdapter<?> adapter = keyMapAdapters.get(type);
425+
if (adapter == null && Enum.class.isAssignableFrom(type)) {
426+
adapter = VPackKeyMapAdapters.createEnumAdapter(type);
427+
}
428+
return (VPackKeyMapAdapter<Object>) adapter;
460429
}
461430

462431
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.arangodb.velocypack;
2+
3+
/**
4+
* @author Mark - mark@arangodb.com
5+
*
6+
*/
7+
public interface VPackKeyMapAdapter<T> {
8+
9+
String serialize(T key);
10+
11+
T deserialize(String key);
12+
13+
}
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
package com.arangodb.velocypack.internal;
2+
3+
import java.math.BigDecimal;
4+
import java.math.BigInteger;
5+
6+
import com.arangodb.velocypack.VPackKeyMapAdapter;
7+
8+
/**
9+
* @author Mark - mark@arangodb.com
10+
*
11+
*/
12+
public class VPackKeyMapAdapters {
13+
14+
private VPackKeyMapAdapters() {
15+
super();
16+
}
17+
18+
public static final VPackKeyMapAdapter<Enum<?>> createEnumAdapter(final Class<?> type) {
19+
return new VPackKeyMapAdapter<Enum<?>>() {
20+
@Override
21+
public String serialize(final Enum<?> key) {
22+
return key.name();
23+
}
24+
25+
@SuppressWarnings({ "unchecked", "rawtypes" })
26+
@Override
27+
public Enum<?> deserialize(final String key) {
28+
final Class<? extends Enum> enumType = (Class<? extends Enum>) type;
29+
return Enum.valueOf(enumType, key);
30+
}
31+
};
32+
}
33+
34+
public static final VPackKeyMapAdapter<String> STRING = new VPackKeyMapAdapter<String>() {
35+
@Override
36+
public String serialize(final String key) {
37+
return key;
38+
}
39+
40+
@Override
41+
public String deserialize(final String key) {
42+
return key;
43+
}
44+
};
45+
public static final VPackKeyMapAdapter<Boolean> BOOLEAN = new VPackKeyMapAdapter<Boolean>() {
46+
@Override
47+
public String serialize(final Boolean key) {
48+
return key.toString();
49+
}
50+
51+
@Override
52+
public Boolean deserialize(final String key) {
53+
return Boolean.valueOf(key);
54+
}
55+
};
56+
public static final VPackKeyMapAdapter<Integer> INTEGER = new VPackKeyMapAdapter<Integer>() {
57+
@Override
58+
public String serialize(final Integer key) {
59+
return key.toString();
60+
}
61+
62+
@Override
63+
public Integer deserialize(final String key) {
64+
return Integer.valueOf(key);
65+
}
66+
};
67+
public static final VPackKeyMapAdapter<Long> LONG = new VPackKeyMapAdapter<Long>() {
68+
@Override
69+
public String serialize(final Long key) {
70+
return key.toString();
71+
}
72+
73+
@Override
74+
public Long deserialize(final String key) {
75+
return Long.valueOf(key);
76+
}
77+
};
78+
public static final VPackKeyMapAdapter<Short> SHORT = new VPackKeyMapAdapter<Short>() {
79+
@Override
80+
public String serialize(final Short key) {
81+
return key.toString();
82+
}
83+
84+
@Override
85+
public Short deserialize(final String key) {
86+
return Short.valueOf(key);
87+
}
88+
};
89+
public static final VPackKeyMapAdapter<Double> DOUBLE = new VPackKeyMapAdapter<Double>() {
90+
@Override
91+
public String serialize(final Double key) {
92+
return key.toString();
93+
}
94+
95+
@Override
96+
public Double deserialize(final String key) {
97+
return Double.valueOf(key);
98+
}
99+
};
100+
public static final VPackKeyMapAdapter<Float> FLOAT = new VPackKeyMapAdapter<Float>() {
101+
@Override
102+
public String serialize(final Float key) {
103+
return key.toString();
104+
}
105+
106+
@Override
107+
public Float deserialize(final String key) {
108+
return Float.valueOf(key);
109+
}
110+
};
111+
public static final VPackKeyMapAdapter<BigInteger> BIG_INTEGER = new VPackKeyMapAdapter<BigInteger>() {
112+
@Override
113+
public String serialize(final BigInteger key) {
114+
return key.toString();
115+
}
116+
117+
@Override
118+
public BigInteger deserialize(final String key) {
119+
return new BigInteger(key);
120+
}
121+
};
122+
public static final VPackKeyMapAdapter<BigDecimal> BIG_DECIMAL = new VPackKeyMapAdapter<BigDecimal>() {
123+
@Override
124+
public String serialize(final BigDecimal key) {
125+
return key.toString();
126+
}
127+
128+
@Override
129+
public BigDecimal deserialize(final String key) {
130+
return new BigDecimal(key);
131+
}
132+
};
133+
public static final VPackKeyMapAdapter<Number> NUMBER = new VPackKeyMapAdapter<Number>() {
134+
@Override
135+
public String serialize(final Number key) {
136+
return key.toString();
137+
}
138+
139+
@Override
140+
public Number deserialize(final String key) {
141+
return Double.valueOf(key);
142+
}
143+
};
144+
public static final VPackKeyMapAdapter<Character> CHARACTER = new VPackKeyMapAdapter<Character>() {
145+
@Override
146+
public String serialize(final Character key) {
147+
return key.toString();
148+
}
149+
150+
@Override
151+
public Character deserialize(final String key) {
152+
return key.charAt(0);
153+
}
154+
};
155+
}

0 commit comments

Comments
 (0)
0