1 /*
2 * This file is part of AceLogger.
3 *
4 * AceLogger is free software: you can redistribute it and/or modify it under the terms of the GNU
5 * Lesser General Public License as published by the Free Software Foundation, either version 3 of
6 * the License, or (at your option) any later version.
7 *
8 * AceLogger is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
9 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10 * Lesser General Public License for more details.
11 *
12 * You should have received a copy of the GNU Lesser General Public License along with AceLogger.
13 * If not, see <http://www.gnu.org/licenses/lgpl-3.0.html>.
14 */
15 package net.sourceforge.acelogger.interpolator;
16
17 import java.util.MissingResourceException;
18 import java.util.ResourceBundle;
19
20 import net.sourceforge.acelogger.execution.LogController;
21
22 /**
23 * An implementation of {@link TextInterpolator} that first resolves a key in a
24 * {@link ResourceBundle} to a pattern than delegates the interpolation of this pattern to a
25 * different {@link TextInterpolator}.
26 *
27 * @author Zardi (https://sourceforge.net/users/daniel_zardi)
28 * @version 1.0.0
29 * @since 1.0.0
30 */
31 public class MessageBundleInterpolator implements TextInterpolator {
32
33 /**
34 * The bundle used to resolved the keys used in log messages to patterns that will then be
35 * interpolated by a different {@link TextInterpolator}.
36 */
37 private ResourceBundle resolver;
38
39 /**
40 * The interpolator used to format the log messages using the supplied parameters and the
41 * pattern resolved using the {@link ResourceBundle}.
42 */
43 private TextInterpolator interpolator;
44
45 /**
46 * Creates a new MessageBundleInterpolator using the supplied {@link ResourceBundle} to resolve
47 * the patterns and then interpolation it with the supplied {@link TextInterpolator}.
48 *
49 * @param resolver
50 * The bundle used to resolve the patterns, using the keys in log messages.
51 * @param interpolator
52 * The interpolator used to produce the final message after resolving the pattern.
53 * @since 1.0.0
54 */
55 public MessageBundleInterpolator(ResourceBundle resolver, TextInterpolator interpolator) {
56 this.resolver = resolver;
57 this.interpolator = interpolator;
58 }
59
60 /**
61 * Resolves the supplied key to a formatting pattern using a {@link ResourceBundle}, then the
62 * resolved pattern is interpolated using another {@link TextInterpolator}.
63 *
64 * @param bundleKey
65 * The string that will be used to locate the pattern in a {@link ResourceBundle}.
66 * @param params
67 * The parameters used to interpolate the message.
68 * @return A string containing the resolved pattern interpolated with the supplied parameters.
69 * @since 1.0.0
70 * @see TextInterpolator#interpolate(String, Object...)
71 */
72 public String interpolate(String bundleKey, Object... params) {
73 String resolvedPattern = "";
74 try {
75 resolvedPattern = resolver.getString(bundleKey);
76 } catch (NullPointerException e) {
77 LogController.getInternalLogger().error(
78 "The key {0} was resolved to a <null> value using bundle {1}",
79 e, bundleKey, resolver
80 );
81 } catch (MissingResourceException e) {
82 LogController.getInternalLogger().error("The key {0} wasn't found using bundle {1}",
83 e, bundleKey, resolver
84 );
85 } catch (ClassCastException e) {
86 LogController.getInternalLogger().error(
87 "The key {0} was resolved to an object other than a String using bundle {1}",
88 e, bundleKey, resolver
89 );
90 }
91 return interpolator.interpolate(resolvedPattern, params);
92 }
93
94 }