1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.configuration2.builder.combined;
18
19 import java.util.ArrayList;
20 import java.util.Collection;
21 import java.util.HashMap;
22 import java.util.Map;
23
24 import org.apache.commons.beanutils.DynaBean;
25 import org.apache.commons.beanutils.DynaClass;
26 import org.apache.commons.beanutils.DynaProperty;
27 import org.apache.commons.configuration2.beanutils.BeanHelper;
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 final class MultiWrapDynaBean implements DynaBean {
44
45 private final DynaClass dynaClass;
46
47
48 private final Map<String, DynaBean> propsToBeans;
49
50
51
52
53
54
55
56 public MultiWrapDynaBean(final Collection<?> beans) {
57 propsToBeans = new HashMap<>();
58 final Collection<DynaClass> beanClasses = new ArrayList<>(beans.size());
59
60 beans.forEach(bean -> {
61 final DynaBean dynaBean = createDynaBean(bean);
62 final DynaClass beanClass = dynaBean.getDynaClass();
63 for (final DynaProperty prop : beanClass.getDynaProperties()) {
64
65 propsToBeans.putIfAbsent(prop.getName(), dynaBean);
66 }
67 beanClasses.add(beanClass);
68 });
69
70 dynaClass = new MultiWrapDynaClass(beanClasses);
71 }
72
73
74
75
76
77 @Override
78 public boolean contains(final String name, final String key) {
79 throw new UnsupportedOperationException("contains() operation not supported!");
80 }
81
82 @Override
83 public Object get(final String name) {
84 return fetchBean(name).get(name);
85 }
86
87 @Override
88 public Object get(final String name, final int index) {
89 return fetchBean(name).get(name, index);
90 }
91
92 @Override
93 public Object get(final String name, final String key) {
94 return fetchBean(name).get(name, key);
95 }
96
97
98
99
100 @Override
101 public DynaClass getDynaClass() {
102 return dynaClass;
103 }
104
105
106
107
108
109 @Override
110 public void remove(final String name, final String key) {
111 throw new UnsupportedOperationException("remove() operation not supported!");
112 }
113
114 @Override
115 public void set(final String name, final Object value) {
116 fetchBean(name).set(name, value);
117 }
118
119 @Override
120 public void set(final String name, final int index, final Object value) {
121 fetchBean(name).set(name, index, value);
122 }
123
124 @Override
125 public void set(final String name, final String key, final Object value) {
126 fetchBean(name).set(name, key, value);
127 }
128
129
130
131
132
133
134
135
136 private DynaBean fetchBean(final String property) {
137 DynaBean dynaBean = propsToBeans.get(property);
138 if (dynaBean == null) {
139 dynaBean = propsToBeans.values().iterator().next();
140 }
141 return dynaBean;
142 }
143
144
145
146
147
148
149
150 private static DynaBean createDynaBean(final Object bean) {
151 if (bean instanceof DynaBean) {
152 return (DynaBean) bean;
153 }
154 return BeanHelper.createWrapDynaBean(bean);
155 }
156 }