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 static org.junit.jupiter.api.Assertions.assertEquals;
20 import static org.junit.jupiter.api.Assertions.assertThrows;
21 import static org.junit.jupiter.api.Assertions.assertTrue;
22
23 import java.util.ArrayList;
24 import java.util.Arrays;
25 import java.util.Collection;
26 import java.util.Collections;
27
28 import org.apache.commons.configuration2.BaseHierarchicalConfiguration;
29 import org.apache.commons.configuration2.Configuration;
30 import org.apache.commons.configuration2.ConfigurationAssert;
31 import org.apache.commons.configuration2.HierarchicalConfiguration;
32 import org.apache.commons.configuration2.PropertiesConfiguration;
33 import org.apache.commons.configuration2.builder.BasicBuilderParameters;
34 import org.apache.commons.configuration2.builder.BasicConfigurationBuilder;
35 import org.apache.commons.configuration2.builder.BuilderParameters;
36 import org.apache.commons.configuration2.builder.ConfigurationBuilder;
37 import org.apache.commons.configuration2.builder.FileBasedBuilderParametersImpl;
38 import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder;
39 import org.apache.commons.configuration2.builder.ReloadingFileBasedConfigurationBuilder;
40 import org.apache.commons.configuration2.convert.DefaultListDelimiterHandler;
41 import org.apache.commons.configuration2.convert.DisabledListDelimiterHandler;
42 import org.apache.commons.configuration2.ex.ConfigurationException;
43 import org.junit.jupiter.api.Test;
44
45
46
47
48 public class TestBaseConfigurationBuilderProvider {
49
50
51
52
53
54
55
56
57 private void checkAllowFailOnInit(final boolean expFlag, final String... props) throws ConfigurationException {
58 final HierarchicalConfiguration<?> declConfig = setUpConfig(false);
59 for (final String key : props) {
60 declConfig.addProperty(key, Boolean.TRUE);
61 }
62 final ConfigurationDeclaration decl = createDeclaration(declConfig);
63 final BasicConfigurationBuilder<? extends Configuration> builder = (BasicConfigurationBuilder<? extends Configuration>) createProvider()
64 .getConfigurationBuilder(decl);
65 assertEquals(expFlag, builder.isAllowFailOnInit());
66 }
67
68
69
70
71
72
73
74
75 private ConfigurationBuilder<? extends Configuration> checkBuilder(final boolean reload) throws ConfigurationException {
76 final HierarchicalConfiguration<?> declConfig = setUpConfig(reload);
77 final ConfigurationDeclaration decl = createDeclaration(declConfig);
78 final ConfigurationBuilder<? extends Configuration> builder = createProvider().getConfigurationBuilder(decl);
79 final Configuration config = builder.getConfiguration();
80 assertEquals(PropertiesConfiguration.class, config.getClass());
81 final PropertiesConfiguration pconfig = (PropertiesConfiguration) config;
82 assertTrue(pconfig.isThrowExceptionOnMissing());
83 final DefaultListDelimiterHandler listHandler = (DefaultListDelimiterHandler) pconfig.getListDelimiterHandler();
84 assertEquals(';', listHandler.getDelimiter());
85 assertTrue(pconfig.getBoolean("configuration.loaded"));
86 return builder;
87 }
88
89
90
91
92
93
94
95 private ConfigurationDeclaration createDeclaration(final HierarchicalConfiguration<?> declConfig) {
96 final CombinedConfigurationBuilder parentBuilder = new CombinedConfigurationBuilder() {
97 @Override
98 protected void initChildBuilderParameters(final BuilderParameters params) {
99
100
101 if (params instanceof BasicBuilderParameters) {
102 ((BasicBuilderParameters) params).setListDelimiterHandler(DisabledListDelimiterHandler.INSTANCE);
103 }
104 }
105 };
106 return new ConfigurationDeclaration(parentBuilder, declConfig) {
107 @Override
108 protected Object interpolate(final Object value) {
109 return value;
110 }
111 };
112 }
113
114
115
116
117
118
119 private BaseConfigurationBuilderProvider createProvider() {
120 return new BaseConfigurationBuilderProvider(FileBasedConfigurationBuilder.class.getName(), ReloadingFileBasedConfigurationBuilder.class.getName(),
121 PropertiesConfiguration.class.getName(), Arrays.asList(FileBasedBuilderParametersImpl.class.getName()));
122 }
123
124
125
126
127
128
129
130 private HierarchicalConfiguration<?> setUpConfig(final boolean reload) {
131 final HierarchicalConfiguration<?> config = new BaseHierarchicalConfiguration();
132 config.addProperty(CombinedConfigurationBuilder.ATTR_RELOAD, Boolean.valueOf(reload));
133 config.addProperty("[@throwExceptionOnMissing]", Boolean.TRUE);
134 config.addProperty("[@path]", ConfigurationAssert.getTestFile("test.properties").getAbsolutePath());
135 config.addProperty("listDelimiterHandler[@config-class]", DefaultListDelimiterHandler.class.getName());
136 config.addProperty("listDelimiterHandler.config-constrarg[@config-value]", ";");
137 return config;
138 }
139
140
141
142
143 @Test
144 void testGetBuilderAllowFailOnInit() throws ConfigurationException {
145 checkAllowFailOnInit(true, CombinedConfigurationBuilder.ATTR_OPTIONAL_RES, CombinedConfigurationBuilder.ATTR_FORCECREATE);
146 }
147
148
149
150
151 void testGetBuilderAllowFailOnInitNotOptional() throws ConfigurationException {
152 checkAllowFailOnInit(false, CombinedConfigurationBuilder.ATTR_FORCECREATE);
153 }
154
155
156
157
158 @Test
159 void testGetBuilderNoFailOnInit() throws ConfigurationException {
160 checkAllowFailOnInit(false);
161 }
162
163
164
165
166 @Test
167 void testGetBuilderNotReloading() throws ConfigurationException {
168 final ConfigurationBuilder<? extends Configuration> builder = checkBuilder(false);
169 assertEquals(FileBasedConfigurationBuilder.class, builder.getClass());
170 }
171
172
173
174
175 @Test
176 void testGetBuilderReloading() throws ConfigurationException {
177 final ConfigurationBuilder<? extends Configuration> builder = checkBuilder(true);
178 assertEquals(ReloadingFileBasedConfigurationBuilder.class, builder.getClass());
179 }
180
181
182
183
184 @Test
185 void testGetParameterClassesModify() {
186 final BaseConfigurationBuilderProvider provider = new BaseConfigurationBuilderProvider(BasicConfigurationBuilder.class.getName(), null,
187 PropertiesConfiguration.class.getName(), Arrays.asList(BasicBuilderParameters.class.getName()));
188 final Collection<String> parameterClasses = provider.getParameterClasses();
189 assertThrows(UnsupportedOperationException.class, parameterClasses::clear);
190 }
191
192
193
194
195 @Test
196 void testGetReloadingBuilderNotSupported() {
197 final BaseConfigurationBuilderProvider provider = new BaseConfigurationBuilderProvider(FileBasedConfigurationBuilder.class.getName(), null,
198 PropertiesConfiguration.class.getName(), Arrays.asList(FileBasedBuilderParametersImpl.class.getName()));
199 final HierarchicalConfiguration<?> declConfig = setUpConfig(true);
200 final ConfigurationDeclaration decl = createDeclaration(declConfig);
201 assertThrows(ConfigurationException.class, () -> provider.getConfigurationBuilder(decl));
202 }
203
204
205
206
207 @Test
208 void testInitNoBuilderClass() {
209 final String configClass = PropertiesConfiguration.class.getName();
210 assertThrows(IllegalArgumentException.class, () -> new BaseConfigurationBuilderProvider(null, null, configClass, null));
211 }
212
213
214
215
216 @Test
217 void testInitNoConfigurationClass() {
218 final String builderClass = BasicConfigurationBuilder.class.getName();
219 assertThrows(IllegalArgumentException.class, () -> new BaseConfigurationBuilderProvider(builderClass, null, null, null));
220 }
221
222
223
224
225 @Test
226 void testInitNoParameterClasses() {
227 final BaseConfigurationBuilderProvider provider = new BaseConfigurationBuilderProvider(BasicConfigurationBuilder.class.getName(), null,
228 PropertiesConfiguration.class.getName(), null);
229 assertEquals(Collections.emptyList(), new ArrayList<>(provider.getParameterClasses()));
230 }
231 }