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