1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * https://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.commons.configuration2.builder.fluent;
18
19 import java.io.File;
20 import java.net.URL;
21
22 import org.apache.commons.configuration2.CombinedConfiguration;
23 import org.apache.commons.configuration2.FileBasedConfiguration;
24 import org.apache.commons.configuration2.INIConfiguration;
25 import org.apache.commons.configuration2.PropertiesConfiguration;
26 import org.apache.commons.configuration2.XMLConfiguration;
27 import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder;
28 import org.apache.commons.configuration2.builder.combined.CombinedConfigurationBuilder;
29 import org.apache.commons.configuration2.ex.ConfigurationException;
30
31 //@formatter:off
32 /**
33 * A convenience class which simplifies the creation of standard configurations and their builders.
34 * <p>
35 * Complex initializations of configuration builders can be done in a pretty straight-forward way by making use of the
36 * provided fluent API. However, if only default settings are used (and maybe a configuration file to be loaded has to
37 * be specified), this approach tends to become a bit verbose. This class was introduced to simplify the creation of
38 * configuration objects in such cases. It offers a bunch of methods which allow the creation of some standard
39 * configuration classes with default settings passing in only a minimum required parameters.
40 * </p>
41 * <p>
42 * An an example consider the creation of a {@code PropertiesConfiguration} object from a file. Using a builder, code
43 * like the following one would have to be written:
44 * </p>
45 * <pre>
46 * Parameters params = new Parameters();
47 * FileBasedConfigurationBuilder<PropertiesConfiguration> builder =
48 * new FileBasedConfigurationBuilder<PropertiesConfiguration>(PropertiesConfiguration.class)
49 * .configure(params.fileBased().setFile(new File("config.properties")));
50 * PropertiesConfiguration config = builder.getConfiguration();
51 * </pre>
52 * <p>
53 * With a convenience method of {@code Configurations} the same can be achieved with the following:
54 * </p>
55 * <pre>
56 * Configurations configurations = new Configurations();
57 * PropertiesConfiguration config = configurations.properties(new File("config.properties"));
58 * </pre>
59 * <p>
60 * There are similar methods for constructing builder objects from which configurations can then be obtained.
61 * </p>
62 * <p>
63 * This class is thread-safe. A single instance can be created by an application and used in a central way to create
64 * configuration objects. When an instance is created a {@link Parameters} instance can be passed in. Otherwise, a
65 * default instance is created. In any case, the {@code Parameters} instance associated with a {@code Configurations}
66 * object can be used to define default settings for the configurations to be created.
67 * </p>
68 *
69 * @since 2.0
70 * @see org.apache.commons.configuration2.builder.DefaultParametersManager
71 */
72 //@formatter:off
73 public class Configurations {
74
75 /** The parameters object associated with this instance. */
76 private final Parameters parameters;
77
78 /**
79 * Creates a new {@code Configurations} instance with default settings.
80 */
81 public Configurations() {
82 this(null);
83 }
84
85 /**
86 * Creates a new instance of {@code Configurations} and initializes it with the specified {@code Parameters} object.
87 *
88 * @param params the {@code Parameters} (may be <strong>null</strong>, then a default instance is created)
89 */
90 public Configurations(final Parameters params) {
91 parameters = params != null ? params : new Parameters();
92 }
93
94 /**
95 * Creates a {@code CombinedConfiguration} instance from the content of the given file. This is a convenience method
96 * which can be used if no builder is needed for managing the configuration object. (Although, behind the scenes a
97 * builder is created).
98 *
99 * @param file the file to be loaded
100 * @return a {@code CombinedConfiguration} object initialized from this file
101 * @throws ConfigurationException if an error occurred when loading the configuration
102 */
103 public CombinedConfiguration combined(final File file) throws ConfigurationException {
104 return combinedBuilder(file).getConfiguration();
105 }
106
107 /**
108 * Creates a {@code CombinedConfiguration} instance from the content of the file identified by the given path. This is a
109 * convenience method which can be used if no builder is needed for managing the configuration object. (Although, behind
110 * the scenes a builder is created).
111 *
112 * @param path the path to the file to be loaded
113 * @return a {@code CombinedConfiguration} object initialized from this URL
114 * @throws ConfigurationException if an error occurred when loading the configuration
115 */
116 public CombinedConfiguration combined(final String path) throws ConfigurationException {
117 return combinedBuilder(path).getConfiguration();
118 }
119
120 /**
121 * Creates a {@code CombinedConfiguration} instance from the content of the given URL. This is a convenience method
122 * which can be used if no builder is needed for managing the configuration object. (Although, behind the scenes a
123 * builder is created).
124 *
125 * @param url the URL to be loaded
126 * @return a {@code CombinedConfiguration} object initialized from this URL
127 * @throws ConfigurationException if an error occurred when loading the configuration
128 */
129 public CombinedConfiguration combined(final URL url) throws ConfigurationException {
130 return combinedBuilder(url).getConfiguration();
131 }
132
133 /**
134 * Creates a builder for a {@code CombinedConfiguration} and initializes it with the given file to be loaded.
135 *
136 * @param file the file to be loaded
137 * @return the newly created {@code CombinedConfigurationBuilder}
138 */
139 public CombinedConfigurationBuilder combinedBuilder(final File file) {
140 return new CombinedConfigurationBuilder().configure(fileParams(file));
141 }
142
143 /**
144 * Creates a builder for a {@code CombinedConfiguration} and initializes it with the given path to the file to be
145 * loaded.
146 *
147 * @param path the path to the file to be loaded
148 * @return the newly created {@code CombinedConfigurationBuilder}
149 */
150 public CombinedConfigurationBuilder combinedBuilder(final String path) {
151 return new CombinedConfigurationBuilder().configure(fileParams(path));
152 }
153
154 /**
155 * Creates a builder for a {@code CombinedConfiguration} and initializes it with the given URL to be loaded.
156 *
157 * @param url the URL to be loaded
158 * @return the newly created {@code CombinedConfigurationBuilder}
159 */
160 public CombinedConfigurationBuilder combinedBuilder(final URL url) {
161 return new CombinedConfigurationBuilder().configure(fileParams(url));
162 }
163
164 /**
165 * Creates a configured builder for a file-based configuration of the specified type.
166 *
167 * @param configClass the configuration class
168 * @param <T> the type of the configuration to be constructed
169 * @return the newly created builder
170 * @since 2.6
171 */
172 private <T extends FileBasedConfiguration> FileBasedConfigurationBuilder<T> createFileBasedBuilder(final Class<T> configClass) {
173 return new FileBasedConfigurationBuilder<>(configClass);
174 }
175
176 /**
177 * Creates a configured builder for a file-based configuration of the specified type.
178 *
179 * @param configClass the configuration class
180 * @param params the parameters object for configuring the builder
181 * @param <T> the type of the configuration to be constructed
182 * @return the newly created builder
183 */
184 private <T extends FileBasedConfiguration> FileBasedConfigurationBuilder<T> createFileBasedBuilder(final Class<T> configClass,
185 final FileBasedBuilderParameters params) {
186 return createFileBasedBuilder(configClass).configure(params);
187 }
188
189 /**
190 * Creates an instance of the specified file-based configuration class from the content of the given file. This is a
191 * convenience method which can be used if no builder is needed for managing the configuration object. (Although, behind
192 * the scenes a builder is created).
193 *
194 * @param configClass the configuration class
195 * @param file the file to be loaded
196 * @param <T> the type of the configuration to be constructed
197 * @return a {@code FileBasedConfiguration} object initialized from this file
198 * @throws ConfigurationException if an error occurred when loading the configuration
199 */
200 public <T extends FileBasedConfiguration> T fileBased(final Class<T> configClass, final File file) throws ConfigurationException {
201 return fileBasedBuilder(configClass, file).getConfiguration();
202 }
203
204 /**
205 * Creates an instance of the specified file-based configuration class from the content of the file identified by the
206 * given path. This is a convenience method which can be used if no builder is needed for managing the configuration
207 * object. (Although, behind the scenes a builder is created).
208 *
209 * @param configClass the configuration class
210 * @param path the path to the file to be loaded
211 * @param <T> the type of the configuration to be constructed
212 * @return a {@code FileBasedConfiguration} object initialized from this file
213 * @throws ConfigurationException if an error occurred when loading the configuration
214 */
215 public <T extends FileBasedConfiguration> T fileBased(final Class<T> configClass, final String path) throws ConfigurationException {
216 return fileBasedBuilder(configClass, path).getConfiguration();
217 }
218
219 /**
220 * Creates an instance of the specified file-based configuration class from the content of the given URL. This is a
221 * convenience method which can be used if no builder is needed for managing the configuration object. (Although, behind
222 * the scenes a builder is created).
223 *
224 * @param configClass the configuration class
225 * @param url the URL to be loaded
226 * @param <T> the type of the configuration to be constructed
227 * @return a {@code FileBasedConfiguration} object initialized from this file
228 * @throws ConfigurationException if an error occurred when loading the configuration
229 */
230 public <T extends FileBasedConfiguration> T fileBased(final Class<T> configClass, final URL url) throws ConfigurationException {
231 return fileBasedBuilder(configClass, url).getConfiguration();
232 }
233
234 /**
235 * Creates a {@code FileBasedConfigurationBuilder} for the specified configuration class and initializes it with the
236 * file to be loaded.
237 *
238 * @param configClass the configuration class
239 * @param file the file to be loaded
240 * @param <T> the type of the configuration to be constructed
241 * @return the new {@code FileBasedConfigurationBuilder}
242 */
243 public <T extends FileBasedConfiguration> FileBasedConfigurationBuilder<T> fileBasedBuilder(final Class<T> configClass, final File file) {
244 return createFileBasedBuilder(configClass, fileParams(file));
245 }
246
247 /**
248 * Creates a {@code FileBasedConfigurationBuilder} for the specified configuration class and initializes it with the
249 * path to the file to be loaded.
250 *
251 * @param configClass the configuration class
252 * @param path the path to the file to be loaded
253 * @param <T> the type of the configuration to be constructed
254 * @return the new {@code FileBasedConfigurationBuilder}
255 */
256 public <T extends FileBasedConfiguration> FileBasedConfigurationBuilder<T> fileBasedBuilder(final Class<T> configClass, final String path) {
257 return createFileBasedBuilder(configClass, fileParams(path));
258 }
259
260 /**
261 * Creates a {@code FileBasedConfigurationBuilder} for the specified configuration class and initializes it with the URL
262 * to the file to be loaded.
263 *
264 * @param configClass the configuration class
265 * @param url the URL to be loaded
266 * @param <T> the type of the configuration to be constructed
267 * @return the new {@code FileBasedConfigurationBuilder}
268 */
269 public <T extends FileBasedConfiguration> FileBasedConfigurationBuilder<T> fileBasedBuilder(final Class<T> configClass, final URL url) {
270 return createFileBasedBuilder(configClass, fileParams(url));
271 }
272
273 /**
274 * Convenience method for creating a parameters object for a file-based configuration.
275 *
276 * @return the newly created parameters object
277 */
278 private FileBasedBuilderParameters fileParams() {
279 return getParameters().fileBased();
280 }
281
282 /**
283 * Convenience method for creating a file-based parameters object initialized with the given file.
284 *
285 * @param file the file to be loaded
286 * @return the initialized parameters object
287 */
288 private FileBasedBuilderParameters fileParams(final File file) {
289 return fileParams().setFile(file);
290 }
291
292 /**
293 * Convenience method for creating a file-based parameters object initialized with the given file path.
294 *
295 * @param path the path to the file to be loaded
296 * @return the initialized parameters object
297 */
298 private FileBasedBuilderParameters fileParams(final String path) {
299 return fileParams().setFileName(path);
300 }
301
302 /**
303 * Convenience method for creating a file-based parameters object initialized with the given file.
304 *
305 * @param url the URL to be loaded
306 * @return the initialized parameters object
307 */
308 private FileBasedBuilderParameters fileParams(final URL url) {
309 return fileParams().setURL(url);
310 }
311
312 /**
313 * Gets the {@code Parameters} instance associated with this object.
314 *
315 * @return the associated {@code Parameters} object
316 */
317 public Parameters getParameters() {
318 return parameters;
319 }
320
321 /**
322 * Creates a {@code INIConfiguration} instance from the content of the given file. This is a convenience method which
323 * can be used if no builder is needed for managing the configuration object. (Although, behind the scenes a builder is
324 * created).
325 *
326 * @param file the file to be loaded
327 * @return a {@code INIConfiguration} object initialized from this file
328 * @throws ConfigurationException if an error occurred when loading the configuration
329 */
330 public INIConfiguration ini(final File file) throws ConfigurationException {
331 return iniBuilder(file).getConfiguration();
332 }
333
334 /**
335 * Creates a {@code INIConfiguration} instance from the content of the file identified by the given path. This is a
336 * convenience method which can be used if no builder is needed for managing the configuration object. (Although, behind
337 * the scenes a builder is created).
338 *
339 * @param path the path to the file to be loaded
340 * @return a {@code INIConfiguration} object initialized from this file
341 * @throws ConfigurationException if an error occurred when loading the configuration
342 */
343 public INIConfiguration ini(final String path) throws ConfigurationException {
344 return iniBuilder(path).getConfiguration();
345 }
346
347 /**
348 * Creates a {@code INIConfiguration} instance from the content of the given URL. This is a convenience method which can
349 * be used if no builder is needed for managing the configuration object. (Although, behind the scenes a builder is
350 * created).
351 *
352 * @param url the URL to be loaded
353 * @return a {@code INIConfiguration} object initialized from this file
354 * @throws ConfigurationException if an error occurred when loading the configuration
355 */
356 public INIConfiguration ini(final URL url) throws ConfigurationException {
357 return iniBuilder(url).getConfiguration();
358 }
359
360 /**
361 * Creates a builder for a {@code INIConfiguration} and initializes it with the given file to be loaded.
362 *
363 * @param file the file to be loaded
364 * @return the newly created {@code FileBasedConfigurationBuilder}
365 */
366 public FileBasedConfigurationBuilder<INIConfiguration> iniBuilder(final File file) {
367 return fileBasedBuilder(INIConfiguration.class, file);
368 }
369
370 /**
371 * Creates a builder for a {@code INIConfiguration} and initializes it with the file file identified by the given path.
372 *
373 * @param path the path to the file to be loaded
374 * @return the newly created {@code FileBasedConfigurationBuilder}
375 */
376 public FileBasedConfigurationBuilder<INIConfiguration> iniBuilder(final String path) {
377 return fileBasedBuilder(INIConfiguration.class, path);
378 }
379
380 /**
381 * Creates a builder for a {@code INIConfiguration} and initializes it with the given URL to be loaded.
382 *
383 * @param url the URL to be loaded
384 * @return the newly created {@code FileBasedConfigurationBuilder}
385 */
386 public FileBasedConfigurationBuilder<INIConfiguration> iniBuilder(final URL url) {
387 return fileBasedBuilder(INIConfiguration.class, url);
388 }
389
390 /**
391 * Creates a {@code PropertiesConfiguration} instance from the content of the given file. This is a convenience method
392 * which can be used if no builder is needed for managing the configuration object. (Although, behind the scenes a
393 * builder is created).
394 *
395 * @param file the file to be loaded
396 * @return a {@code PropertiesConfiguration} object initialized from this file
397 * @throws ConfigurationException if an error occurred when loading the configuration
398 */
399 public PropertiesConfiguration properties(final File file) throws ConfigurationException {
400 return propertiesBuilder(file).getConfiguration();
401 }
402
403 /**
404 * Creates a {@code PropertiesConfiguration} instance from the content of the file identified by the given path. This is
405 * a convenience method which can be used if no builder is needed for managing the configuration object. (Although,
406 * behind the scenes a builder is created).
407 *
408 * @param path the path to the file to be loaded
409 * @return a {@code PropertiesConfiguration} object initialized from this path
410 * @throws ConfigurationException if an error occurred when loading the configuration
411 */
412 public PropertiesConfiguration properties(final String path) throws ConfigurationException {
413 return propertiesBuilder(path).getConfiguration();
414 }
415
416 /**
417 * Creates a {@code PropertiesConfiguration} instance from the content of the given URL. This is a convenience method
418 * which can be used if no builder is needed for managing the configuration object. (Although, behind the scenes a
419 * builder is created).
420 *
421 * @param url the URL to be loaded
422 * @return a {@code PropertiesConfiguration} object initialized from this URL
423 * @throws ConfigurationException if an error occurred when loading the configuration
424 */
425 public PropertiesConfiguration properties(final URL url) throws ConfigurationException {
426 return propertiesBuilder(url).getConfiguration();
427 }
428
429 /**
430 * Creates a builder for a {@code PropertiesConfiguration}.
431 *
432 * @return the newly created {@code FileBasedConfigurationBuilder}
433 * @since 2.6
434 */
435 public FileBasedConfigurationBuilder<PropertiesConfiguration> propertiesBuilder() {
436 return createFileBasedBuilder(PropertiesConfiguration.class);
437 }
438
439 /**
440 * Creates a builder for a {@code PropertiesConfiguration} and initializes it with the given file to be loaded.
441 *
442 * @param file the file to be loaded
443 * @return the newly created {@code FileBasedConfigurationBuilder}
444 */
445 public FileBasedConfigurationBuilder<PropertiesConfiguration> propertiesBuilder(final File file) {
446 return fileBasedBuilder(PropertiesConfiguration.class, file);
447 }
448
449 /**
450 * Creates a builder for a {@code PropertiesConfiguration} and initializes it with the given parameters to be loaded.
451 *
452 * @param parameters the parameters to be loaded
453 * @return the newly created {@code FileBasedConfigurationBuilder}
454 * @since 2.6
455 */
456 public FileBasedConfigurationBuilder<PropertiesConfiguration> propertiesBuilder(final PropertiesBuilderParameters parameters) {
457 return propertiesBuilder().configure(parameters);
458 }
459
460 /**
461 * Creates a builder for a {@code PropertiesConfiguration} and initializes it with the given path to the file to be
462 * loaded.
463 *
464 * @param path the path to the file to be loaded
465 * @return the newly created {@code FileBasedConfigurationBuilder}
466 */
467 public FileBasedConfigurationBuilder<PropertiesConfiguration> propertiesBuilder(final String path) {
468 return fileBasedBuilder(PropertiesConfiguration.class, path);
469 }
470
471 /**
472 * Creates a builder for a {@code PropertiesConfiguration} and initializes it with the given URL to be loaded.
473 *
474 * @param url the URL to be loaded
475 * @return the newly created {@code FileBasedConfigurationBuilder}
476 */
477 public FileBasedConfigurationBuilder<PropertiesConfiguration> propertiesBuilder(final URL url) {
478 return fileBasedBuilder(PropertiesConfiguration.class, url);
479 }
480
481 /**
482 * Creates a {@code XMLConfiguration} instance from the content of the given file. This is a convenience method which
483 * can be used if no builder is needed for managing the configuration object. (Although, behind the scenes a builder is
484 * created).
485 *
486 * @param file the file to be loaded
487 * @return a {@code XMLConfiguration} object initialized from this file
488 * @throws ConfigurationException if an error occurred when loading the configuration
489 */
490 public XMLConfiguration xml(final File file) throws ConfigurationException {
491 return xmlBuilder(file).getConfiguration();
492 }
493
494 /**
495 * Creates a {@code XMLConfiguration} instance from the content of the file identified by the given path. This is a
496 * convenience method which can be used if no builder is needed for managing the configuration object. (Although, behind
497 * the scenes a builder is created).
498 *
499 * @param path the path to the file to be loaded
500 * @return a {@code XMLConfiguration} object initialized from this file
501 * @throws ConfigurationException if an error occurred when loading the configuration
502 */
503 public XMLConfiguration xml(final String path) throws ConfigurationException {
504 return xmlBuilder(path).getConfiguration();
505 }
506
507 /**
508 * Creates a {@code XMLConfiguration} instance from the content of the given URL. This is a convenience method which can
509 * be used if no builder is needed for managing the configuration object. (Although, behind the scenes a builder is
510 * created).
511 *
512 * @param url the URL to be loaded
513 * @return a {@code XMLConfiguration} object initialized from this file
514 * @throws ConfigurationException if an error occurred when loading the configuration
515 */
516 public XMLConfiguration xml(final URL url) throws ConfigurationException {
517 return xmlBuilder(url).getConfiguration();
518 }
519
520 /**
521 * Creates a builder for a {@code XMLConfiguration} and initializes it with the given file to be loaded.
522 *
523 * @param file the file to be loaded
524 * @return the newly created {@code FileBasedConfigurationBuilder}
525 */
526 public FileBasedConfigurationBuilder<XMLConfiguration> xmlBuilder(final File file) {
527 return fileBasedBuilder(XMLConfiguration.class, file);
528 }
529
530 /**
531 * Creates a builder for a {@code XMLConfiguration} and initializes it with the given path to the file to be loaded.
532 *
533 * @param path the path to the file to be loaded
534 * @return the newly created {@code FileBasedConfigurationBuilder}
535 */
536 public FileBasedConfigurationBuilder<XMLConfiguration> xmlBuilder(final String path) {
537 return fileBasedBuilder(XMLConfiguration.class, path);
538 }
539
540 /**
541 * Creates a builder for a {@code XMLConfiguration} and initializes it with the given URL to be loaded.
542 *
543 * @param url the URL to be loaded
544 * @return the newly created {@code FileBasedConfigurationBuilder}
545 */
546 public FileBasedConfigurationBuilder<XMLConfiguration> xmlBuilder(final URL url) {
547 return fileBasedBuilder(XMLConfiguration.class, url);
548 }
549
550 }