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.Arrays;
20
21 import org.apache.commons.configuration2.Configuration;
22 import org.apache.commons.configuration2.ConfigurationUtils;
23 import org.apache.commons.configuration2.HierarchicalConfiguration;
24 import org.apache.commons.configuration2.builder.BuilderConfigurationWrapperFactory;
25 import org.apache.commons.configuration2.builder.BuilderConfigurationWrapperFactory.EventSourceSupport;
26 import org.apache.commons.configuration2.builder.ConfigurationBuilder;
27 import org.apache.commons.configuration2.event.Event;
28 import org.apache.commons.configuration2.event.EventListener;
29 import org.apache.commons.configuration2.event.EventType;
30 import org.apache.commons.configuration2.ex.ConfigurationException;
31 import org.apache.commons.configuration2.reloading.ReloadingController;
32 import org.apache.commons.configuration2.reloading.ReloadingControllerSupport;
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 public class MultiFileConfigurationBuilderProvider extends BaseConfigurationBuilderProvider {
52
53 private static final String BUILDER_CLASS = "org.apache.commons.configuration2.builder.combined.MultiFileConfigurationBuilder";
54
55
56 private static final String RELOADING_BUILDER_CLASS = "org.apache.commons.configuration2.builder.combined.ReloadingMultiFileConfigurationBuilder";
57
58
59 private static final String PARAM_CLASS = "org.apache.commons.configuration2.builder.combined.MultiFileBuilderParametersImpl";
60
61
62
63
64
65
66
67
68 public MultiFileConfigurationBuilderProvider(final String configCls, final String paramCls) {
69 super(BUILDER_CLASS, RELOADING_BUILDER_CLASS, configCls, Arrays.asList(paramCls, PARAM_CLASS));
70 }
71
72
73
74
75
76 @Override
77 public ConfigurationBuilder<? extends Configuration> getConfigurationBuilder(final ConfigurationDeclaration decl) throws ConfigurationException {
78 final ConfigurationBuilder<? extends Configuration> multiBuilder = super.getConfigurationBuilder(decl);
79 final Configuration wrapConfig = createWrapperConfiguration(multiBuilder);
80 return createWrapperBuilder(multiBuilder, wrapConfig);
81 }
82
83
84
85
86
87
88
89
90
91 @SuppressWarnings({"unchecked", "rawtypes"})
92 private Configuration createWrapperConfiguration(final ConfigurationBuilder builder) {
93 final Class<?> configClass = ConfigurationUtils.loadClassNoEx(getConfigurationClass());
94 final Class ifcClass = HierarchicalConfiguration.class.isAssignableFrom(configClass) ? HierarchicalConfiguration.class : Configuration.class;
95 return (Configuration) BuilderConfigurationWrapperFactory.createBuilderConfigurationWrapper(ifcClass, builder, EventSourceSupport.BUILDER);
96 }
97
98
99
100
101
102
103
104
105
106
107
108 private static ConfigurationBuilder<? extends Configuration> createWrapperBuilder(final ConfigurationBuilder<? extends Configuration> multiBuilder,
109 final Configuration wrapConfig) {
110 if (multiBuilder instanceof ReloadingControllerSupport) {
111 return new ReloadableWrapperBuilder(wrapConfig, multiBuilder);
112 }
113 return new WrapperBuilder(wrapConfig, multiBuilder);
114 }
115
116
117
118
119
120 private static class WrapperBuilder implements ConfigurationBuilder<Configuration> {
121
122 private final Configuration configuration;
123
124
125 private final ConfigurationBuilder<? extends Configuration> builder;
126
127
128
129
130
131
132
133 public WrapperBuilder(final Configuration conf, final ConfigurationBuilder<? extends Configuration> bldr) {
134 configuration = conf;
135 builder = bldr;
136 }
137
138 @Override
139 public Configuration getConfiguration() throws ConfigurationException {
140 return configuration;
141 }
142
143 @Override
144 public <T extends Event> void addEventListener(final EventType<T> eventType, final EventListener<? super T> listener) {
145 builder.addEventListener(eventType, listener);
146 }
147
148 @Override
149 public <T extends Event> boolean removeEventListener(final EventType<T> eventType, final EventListener<? super T> listener) {
150 return builder.removeEventListener(eventType, listener);
151 }
152 }
153
154
155
156
157
158
159 private static final class ReloadableWrapperBuilder extends WrapperBuilder implements ReloadingControllerSupport {
160
161 private final ReloadingControllerSupport ctrlSupport;
162
163
164
165
166
167
168
169 public ReloadableWrapperBuilder(final Configuration conf, final ConfigurationBuilder<? extends Configuration> bldr) {
170 super(conf, bldr);
171 ctrlSupport = (ReloadingControllerSupport) bldr;
172 }
173
174 @Override
175 public ReloadingController getReloadingController() {
176 return ctrlSupport.getReloadingController();
177 }
178 }
179 }