Skip to content

Method: getFieldForProperty(String)

1: package cz.cvut.kbss.jsonld.deserialization;
2:
3: import cz.cvut.kbss.jsonld.common.BeanAnnotationProcessor;
4: import cz.cvut.kbss.jsonld.common.BeanClassProcessor;
5: import cz.cvut.kbss.jsonld.deserialization.util.DataTypeTransformer;
6: import cz.cvut.kbss.jsonld.exception.JsonLdDeserializationException;
7:
8: import java.lang.reflect.Field;
9: import java.util.Collection;
10: import java.util.Map;
11:
12: class SingularObjectContext<T> extends InstanceContext<T> {
13:
14: private final Map<String, Field> fieldMap;
15:
16: SingularObjectContext(T instance, Map<String, Field> fieldMap, Map<String, Object> knownInstances) {
17: super(instance, knownInstances);
18: this.fieldMap = fieldMap;
19: }
20:
21: @Override
22: Field getFieldForProperty(String property) {
23: // TODO Add handling of @Properties
24: return fieldMap.get(property);
25: }
26:
27: @Override
28: void setFieldValue(Field field, Object value) {
29: assert !(instance instanceof Collection);
30: if (!field.getType().isAssignableFrom(value.getClass())) {
31: boolean success = trySettingReferenceToKnownInstance(field, value);
32: if (success) {
33: return;
34: }
35: success = tryTypeTransformation(field, value);
36: if (success) {
37: return;
38: }
39: throw valueTypeMismatch(value, field);
40: }
41: BeanClassProcessor.setFieldValue(field, instance, value);
42: }
43:
44: private JsonLdDeserializationException valueTypeMismatch(Object value, Field field) {
45: return new JsonLdDeserializationException(
46: "Type mismatch. Cannot set value " + value + " of type " + value.getClass() + " on field " + field);
47: }
48:
49: private boolean trySettingReferenceToKnownInstance(Field field, Object value) {
50: if (!BeanAnnotationProcessor.isObjectProperty(field) || !knownInstances.containsKey(value.toString())) {
51: return false;
52: }
53: final Object knownInstance = knownInstances.get(value.toString());
54: if (!field.getType().isAssignableFrom(knownInstance.getClass())) {
55: // Throw the exception right here so that it contains info about the known instance's type
56: throw valueTypeMismatch(knownInstance, field);
57: }
58: BeanClassProcessor.setFieldValue(field, instance, knownInstance);
59: return true;
60: }
61:
62: private boolean tryTypeTransformation(Field field, Object value) {
63: final Class<?> targetType = field.getType();
64: final Object transformedValue = DataTypeTransformer.transformValue(value, targetType);
65: if (transformedValue != null) {
66: BeanClassProcessor.setFieldValue(field, instance, transformedValue);
67: return true;
68: }
69: return false;
70: }
71: }