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.factory;
16
17 import java.util.ArrayList;
18 import java.util.HashMap;
19 import java.util.List;
20 import java.util.Map;
21
22 import net.sourceforge.acelogger.constants.FormatterConstants;
23 import net.sourceforge.acelogger.execution.LogController;
24 import net.sourceforge.acelogger.formatter.Formatter;
25
26 /**
27 * Factory for managing instances of configured formatters.
28 *
29 * @author Zardi (https://sourceforge.net/users/daniel_zardi)
30 * @version 1.0.0
31 * @since 1.0.0
32 */
33 public final class FormatterFactory {
34
35 /**
36 * A instance of this class (the only one).
37 */
38 private static final FormatterFactory INSTANCE = new FormatterFactory();
39
40 /**
41 * Used when no configured formatter is found for a given identifier.
42 */
43 private Formatter defaultFormatter;
44
45 /**
46 * Maps each configured formatter to a unique identifier.
47 */
48 private final Map<String, Formatter> registeredFormatters;
49
50 /**
51 * Creates a new FormatterFactory (This class is a singleton).
52 *
53 * @since 1.0.0
54 */
55 private FormatterFactory() {
56 registeredFormatters = new HashMap<String, Formatter>();
57 defaultFormatter = FormatterConstants.EMPTY;
58 }
59
60 /**
61 * Obtains a properly configured formatter for the given identifier.
62 *
63 * @param identifier
64 * The identifier of the intended formatter.
65 * @return A properly configured formatter for the given identifier. If the identifier is not
66 * found, then the default formatter is returned.
67 * @see FormatterFactory#getDefaultFormatter()
68 * @since 1.0.0
69 */
70 public static Formatter getFormatter(String identifier) {
71 LogController.ensureInitialization();
72 Formatter intendedFormatter = INSTANCE.registeredFormatters.get(identifier);
73 if (intendedFormatter == null) {
74 int lastDotIndex = identifier.lastIndexOf('.');
75 if (lastDotIndex > 0) {
76 intendedFormatter = getFormatter(identifier.substring(0, lastDotIndex));
77 } else {
78 intendedFormatter = INSTANCE.defaultFormatter;
79 }
80 }
81 return intendedFormatter;
82 }
83
84 /**
85 * Sets the default formatter of this factory, the one used when no formatter is found for a
86 * given identifier.
87 *
88 * @param defaultFormatter
89 * The formatter that will be used as the default one from now.
90 * @return The previous default formatter.
91 * @since 1.0.0
92 */
93 public static Formatter setDefaultFormatter(Formatter defaultFormatter) {
94 LogController.ensureInitialization();
95 Formatter previous = INSTANCE.defaultFormatter;
96 if (defaultFormatter != null) {
97 INSTANCE.defaultFormatter = defaultFormatter;
98 }
99 return previous;
100 }
101
102 /**
103 * Returns the default formatter of this factory, the one used when no formatter is found for a
104 * given identifier.
105 *
106 * @return The default formatter.
107 * @since 1.0.0
108 */
109 public static Formatter getDefaultFormatter() {
110 LogController.ensureInitialization();
111 return INSTANCE.defaultFormatter;
112 }
113
114 /**
115 * Returns a list of all formatters registered in this factory.
116 *
117 * @return A list of formatters.
118 * @since 1.0.0
119 */
120 public static List<Formatter> getRegisteredFormatters() {
121 LogController.ensureInitialization();
122 List<Formatter> allFormatters = new ArrayList<Formatter>(INSTANCE.registeredFormatters
123 .values());
124 return allFormatters;
125 }
126
127 /**
128 * Registers an appender within this factory. The mapped identifier will be the formatters
129 * identifier.
130 *
131 * @param formatter
132 * The formatter to be registered.
133 * @return The default formatter if there was no previous mapping for the identifier or the
134 * previous configured formatter otherwise.
135 * @see FormatterFactory#getDefaultFormatter()
136 * @since 1.0.0
137 */
138 public static Formatter registerFormatter(Formatter formatter) {
139 LogController.ensureInitialization();
140 Formatter intendedFormatter = null;
141 if (formatter != null) {
142 intendedFormatter = INSTANCE.registeredFormatters.put(formatter.getIdentifier(),
143 formatter);
144 }
145 if (intendedFormatter == null) {
146 intendedFormatter = INSTANCE.defaultFormatter;
147 }
148 return intendedFormatter;
149 }
150
151 }