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
28
29
30
31
32
33
34 package info.magnolia.config.source.raw;
35
36 import info.magnolia.config.registry.DefinitionRawView;
37
38 import java.util.Collection;
39 import java.util.List;
40 import java.util.Map;
41 import java.util.Set;
42
43 import com.google.common.collect.Collections2;
44 import com.google.common.collect.Lists;
45
46
47
48
49 public class DefinitionRawViewMapWrapper implements DefinitionRawView {
50
51 private final Map map;
52
53 public DefinitionRawViewMapWrapper(Map map) {
54 this.map = map;
55 }
56
57 @Override
58 public List<Property> properties() {
59 final Set<Map.Entry<?, ?>> entrySet = map.entrySet();
60 for (Map.Entry entry : entrySet) {
61 if (!(entry.getKey() instanceof String)) {
62 throw new IllegalStateException("Only support maps with String keys " + entry.getKey() + " in " + map);
63 }
64 }
65
66 return Lists.newArrayList(Collections2.<Map.Entry, Property>transform(map.entrySet(), new ToValue()));
67 }
68
69 private static Property deriveValue(String name, Object o) {
70 if (o instanceof Map) {
71 return Property.subBean(name, new DefinitionRawViewMapWrapper((Map) o));
72 } else if (o instanceof Map.Entry) {
73 final Map.Entry e = (Map.Entry) o;
74 return deriveValue((String) e.getKey(), e.getValue());
75 } else if (o instanceof Collection) {
76 return Property.collection(name, Collections2.transform((Collection) o, new ToValue()));
77 } else if (o instanceof String || o instanceof Boolean || o instanceof Number) {
78 return Property.simple(name, String.valueOf(o));
79 } else {
80 throw new IllegalStateException("Unsupported property type in map !? " + o + "(" + o.getClass() + ")");
81 }
82 }
83
84 private static class ToValue implements com.google.common.base.Function<Object, Property> {
85 @Override
86 public Property apply(Object input) {
87 return deriveValue(null, input);
88 }
89 }
90 }