View Javadoc

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;
16  
17  import net.sourceforge.acelogger.appender.Appender;
18  import net.sourceforge.acelogger.constants.AppenderConstants;
19  import net.sourceforge.acelogger.constants.LevelFilterConstants;
20  import net.sourceforge.acelogger.constants.LocationGathererConstants;
21  import net.sourceforge.acelogger.execution.LogController;
22  import net.sourceforge.acelogger.level.LogLevel;
23  import net.sourceforge.acelogger.level.filter.LevelFilter;
24  import net.sourceforge.acelogger.location.gatherer.LocationGatherer;
25  
26  /**
27   * Abstracts all common tasks for {@link Logger}.
28   * 
29   * @author Zardi (https://sourceforge.net/users/daniel_zardi)
30   * @version 1.0.0
31   * @since 1.0.0
32   */
33  public abstract class BaseLogger implements Logger {
34  
35  	/**
36  	 * The level filter used within this logger.
37  	 */
38  	private LevelFilter threshold;
39  
40  	/**
41  	 * The appender used within this logger.
42  	 */
43  	private Appender appender;
44  
45  	/**
46  	 * The location gatherer used within this logger.
47  	 */
48  	private LocationGatherer gatherer;
49  
50  	/**
51  	 * The identifier of this logger.
52  	 */
53  	private String identifier;
54  
55  	/**
56  	 * Constructs a new BaseLogger using the supplied identifier, an empty appender, a "deny all"
57  	 * level filter and an empty location gatherer.
58  	 * 
59  	 * @param identifier
60  	 *            A string that identifies this logger.
61  	 * @since 1.0.0
62  	 */
63  	protected BaseLogger(String identifier) {
64  		this(identifier, AppenderConstants.EMPTY, LevelFilterConstants.ACCEPT_NONE,
65  				LocationGathererConstants.EMPTY);
66  	}
67  
68  	/**
69  	 * Constructs a new BaseLogger using the supplied identifier, appender, level filter and
70  	 * location gatherer.
71  	 * 
72  	 * @param identifier
73  	 *            A string that identifies this logger.
74  	 * @param appender
75  	 *            The {@link Appender} that will be used within this logger.
76  	 * @param filter
77  	 *            The {@link LevelFilter} that will be used within this logger.
78  	 * @param gatherer
79  	 *            The {@link LocationGatherer} that will be used within this logger.
80  	 * @since 1.0.0
81  	 */
82  	protected BaseLogger(String identifier, Appender appender, LevelFilter filter,
83  			LocationGatherer gatherer) {
84  		setIdentifier(identifier);
85  		setAppender(appender);
86  		setThreshold(filter);
87  		setGatherer(gatherer);
88  	}
89  
90  	/**
91  	 * Returns the level filter used within this logger.
92  	 * 
93  	 * @return The {@link LevelFilter} used within this logger.
94  	 * @since 1.0.0
95  	 */
96  	public final LevelFilter getThreshold() {
97  		return threshold;
98  	}
99  
100 	/**
101 	 * Sets the level filter used within this logger.
102 	 * 
103 	 * @param filter
104 	 *            The {@link LevelFilter} that will be used within this logger.
105 	 * @since 1.0.0
106 	 */
107 	public final void setThreshold(LevelFilter filter) {
108 		if (filter == null) {
109 			LogController.getInternalLogger().error(
110 					"Received an <null> value for filter in logger \"{0}\". As a"
111 					+ " result this logger will accept no messages", getIdentifier()
112 				);
113 			threshold = LevelFilterConstants.ACCEPT_NONE;
114 		} else {
115 			threshold = filter;
116 		}
117 	}
118 
119 	/**
120 	 * Returns the location gatherer used within this logger.
121 	 * 
122 	 * @return The {@link LocationGatherer} used within this logger.
123 	 * @since 1.0.0
124 	 */
125 	public final LocationGatherer getGatherer() {
126 		return gatherer;
127 	}
128 
129 	/**
130 	 * Sets the location gatherer used within this logger.
131 	 * 
132 	 * @param gatherer
133 	 *            The {@link LocationGatherer} that will be used within this logger.
134 	 * @since 1.0.0
135 	 */
136 	public final void setGatherer(LocationGatherer gatherer) {
137 		if (gatherer == null) {
138 			LogController.getInternalLogger().error(
139 					"Received an <null> value for gatherer in logger \"{0}\". As a"
140 					+ " result this logger will not generate call location information",
141 					getIdentifier()
142 				);
143 			this.gatherer = LocationGathererConstants.EMPTY;
144 		} else {
145 			this.gatherer = gatherer;
146 		}
147 	}
148 
149 	/** {@inheritDoc} */
150 	public final String getIdentifier() {
151 		return identifier;
152 	}
153 
154 	/**
155 	 * Sets the string that identifies this object.
156 	 * 
157 	 * @param identifier
158 	 *            The identifier of this object.
159 	 * @since 1.0.0
160 	 */
161 	private final void setIdentifier(String identifier) {
162 		this.identifier = identifier;
163 	}
164 
165 	/**
166 	 * Returns the log appender used within this logger.
167 	 * 
168 	 * @return The {@link Appender} used within this logger.
169 	 * @since 1.0.0
170 	 */
171 	public final Appender getAppender() {
172 		return appender;
173 	}
174 
175 	/**
176 	 * Sets the log appender used within this logger.
177 	 * 
178 	 * @param appender
179 	 *            The {@link Appender} that will be used within this logger.
180 	 * @since 1.0.0
181 	 */
182 	private final void setAppender(Appender appender) {
183 		if (appender == null) {
184 			LogController.getInternalLogger().error(
185 					"Received an <null> value for appender in logger \"{0}\". As a"
186 					+ " result this logger won't output any message", getIdentifier()
187 				);
188 			this.appender = AppenderConstants.EMPTY;
189 		} else {
190 			this.appender = appender;
191 		}
192 	}
193 
194 	/**
195 	 * Generates a log call based on the supplied information.
196 	 * 
197 	 * @param message
198 	 *            The message to be logged.
199 	 * @param params
200 	 *            The parameters that should be available for formatting.
201 	 * @param level
202 	 *            The level of the log call.
203 	 * @return A {@link LogEvent} generated with the supplied information.
204 	 * @since 1.0.0
205 	 */
206 	protected final LogEvent generateLogCall(String message, Object[] params, LogLevel level) {
207 		return generateLogCall(message, params, level, null);
208 	}
209 
210 	/**
211 	 * Generates a log call based on the supplied information.
212 	 * 
213 	 * @param message
214 	 *            The message to be logged.
215 	 * @param params
216 	 *            The parameters that should be available for formatting.
217 	 * @param level
218 	 *            The level of the log call.
219 	 * @param cause
220 	 *            The origin of the reported problem.
221 	 * @return A {@link LogEvent} generated with the supplied information.
222 	 * @since 1.0.0
223 	 */
224 	protected final LogEvent generateLogCall(String message, Object[] params, LogLevel level,
225 			Throwable cause) {
226 		return generateLogCall(message, params, level, cause, Thread.currentThread());
227 	}
228 
229 	/**
230 	 * Generates a log call based on the supplied information.
231 	 * 
232 	 * @param message
233 	 *            The message to be logged.
234 	 * @param params
235 	 *            The parameters that should be available for formatting.
236 	 * @param level
237 	 *            The level of the log call.
238 	 * @param cause
239 	 *            The origin of the reported problem.
240 	 * @param currenThread
241 	 *            The Thread where the log call was originated.
242 	 * @return A {@link LogEvent} generated with the supplied information.
243 	 * @since 1.0.0
244 	 */
245 	protected final LogEvent generateLogCall(String message, Object[] params, LogLevel level,
246 			Throwable cause, Thread currenThread) {
247 		LogEvent call = new LogEvent(message, level, gatherer.getCallLocation(currenThread), cause,
248 				params);
249 		return call;
250 	}
251 
252 	/**
253 	 * Checks if a level is suitable for logging within this logger.
254 	 * 
255 	 * @param level
256 	 *            The level to be checked for.
257 	 * @return True if the level is suitable for logging; False otherwise.
258 	 * @since 1.0.0
259 	 */
260 	private final boolean isSuitableForLogging(LogLevel level) {
261 		return threshold.isSuitable(level);
262 	}
263 
264 	/** {@inheritDoc} */
265 	public final boolean isDebugEnabled() {
266 		return isSuitableForLogging(LogLevel.DEBUG);
267 	}
268 
269 	/** {@inheritDoc} */
270 	public final boolean isErrorEnabled() {
271 		return isSuitableForLogging(LogLevel.ERROR);
272 	}
273 
274 	/** {@inheritDoc} */
275 	public final boolean isFatalEnabled() {
276 		return isSuitableForLogging(LogLevel.FATAL);
277 	}
278 
279 	/** {@inheritDoc} */
280 	public final boolean isInfoEnabled() {
281 		return isSuitableForLogging(LogLevel.INFO);
282 	}
283 
284 	/** {@inheritDoc} */
285 	public final boolean isTraceEnabled() {
286 		return isSuitableForLogging(LogLevel.TRACE);
287 	}
288 
289 	/** {@inheritDoc} */
290 	public final boolean isWarnEnabled() {
291 		return isSuitableForLogging(LogLevel.WARN);
292 	}
293 
294 	/** {@inheritDoc} */
295 	public final void debug(String message, Object... params) {
296 		debug(message, null, params);
297 	}
298 
299 	/** {@inheritDoc} */
300 	public final void debug(String message, Throwable cause, Object... params) {
301 		if (isDebugEnabled()) {
302 			LogEvent call = generateLogCall(message, params, LogLevel.DEBUG, cause);
303 			appender.appendLog(call);
304 		}
305 	}
306 
307 	/** {@inheritDoc} */
308 	public final void error(String message, Object... params) {
309 		error(message, null, params);
310 	}
311 
312 	/** {@inheritDoc} */
313 	public final void error(String message, Throwable cause, Object... params) {
314 		if (isErrorEnabled()) {
315 			LogEvent call = generateLogCall(message, params, LogLevel.ERROR, cause);
316 			appender.appendLog(call);
317 		}
318 	}
319 
320 	/** {@inheritDoc} */
321 	public final void fatal(String message, Object... params) {
322 		fatal(message, null, params);
323 	}
324 
325 	/** {@inheritDoc} */
326 	public final void fatal(String message, Throwable cause, Object... params) {
327 		if (isFatalEnabled()) {
328 			LogEvent call = generateLogCall(message, params, LogLevel.FATAL, cause);
329 			appender.appendLog(call);
330 		}
331 	}
332 
333 	/** {@inheritDoc} */
334 	public final void info(String message, Object... params) {
335 		info(message, null, params);
336 	}
337 
338 	/** {@inheritDoc} */
339 	public final void info(String message, Throwable cause, Object... params) {
340 		if (isInfoEnabled()) {
341 			LogEvent call = generateLogCall(message, params, LogLevel.INFO, cause);
342 			appender.appendLog(call);
343 		}
344 	}
345 
346 	/** {@inheritDoc} */
347 	public final void trace(String message, Object... params) {
348 		trace(message, null, params);
349 	}
350 
351 	/** {@inheritDoc} */
352 	public final void trace(String message, Throwable cause, Object... params) {
353 		if (isTraceEnabled()) {
354 			LogEvent call = generateLogCall(message, params, LogLevel.TRACE, cause);
355 			appender.appendLog(call);
356 		}
357 	}
358 
359 	/** {@inheritDoc} */
360 	public final void warn(String message, Object... params) {
361 		warn(message, null, params);
362 	}
363 
364 	/** {@inheritDoc} */
365 	public final void warn(String message, Throwable cause, Object... params) {
366 		if (isWarnEnabled()) {
367 			LogEvent call = generateLogCall(message, params, LogLevel.WARN, cause);
368 			appender.appendLog(call);
369 		}
370 	}
371 
372 }