/*
* Copyright © 2012, 2013 Pedro Agullo Soliveres.
*
* This file is part of Log4js-ext.
*
* Log4js-ext is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License.
*
* Commercial use is permitted to the extent that the code/component(s)
* do NOT become part of another Open Source or Commercially developed
* licensed development library or toolkit without explicit permission.
*
* Log4js-ext is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Log4js-ext. If not, see <http://www.gnu.org/licenses/>.
*
* This software uses the ExtJs library (http://extjs.com), which is
* distributed under the GPL v3 license (see http://extjs.com/license).
*/
(function() {
"use strict"; //$NON-NLS-1$
/**
* Base class for appenders.
*
* An appender outputs logging information somewhere: a window, the browser
* console, even a remote system that knows how to process it.
*
* The predefined {@link Sm.log.ExtLogAppender} outputs log information
* to the browser console, whereas {@link Sm.log.LogViewerAppender}
* outputs logs to a built-in window.
*
* @abstract
*/
Ext.define('Sm.log.AppenderBase', { //$NON-NLS-1$
uses : ['Sm.log.util.Debug',
'Sm.log.util.Assert',
'Sm.log.TemplateLayout'],
statics : {
/**
* @property
* In this state the appender ignores all logs
* it receives. Incoming logs are lost.
*
* @readonly
* @static
*/
STOPPED : 'Stopped',
/**
* @property
* In this state the appender keeps buffering logs.
*
* Logs will not be lost, they will sent to its destination
* when the appender state changes to LOGGING.
*
* @readonly
* @static
*/
BUFFERING : 'Buffering',
/**
* @property
* In this state the appender outputs logs as they arrive.
*
* @readonly
* @static
*/
LOGGING : 'Logging'
},
config : {
/**
* @cfg
* @accessor
*
* A list with the EventLogging properties for which to call
* Ext.util.Format.htmlEncode before logging them.
*
* This is important if the output will go to html, you
* are using special html characters, and you want these
* characters to be shown as-is.
*/
htmlEncodedLogEventProperties : []
},
/**
* Writes the log data
*
* @protected
* @abstract
* @param {Sm.log.LoggingEvent} logEvent
*
* @returns {void}
*/
doLog : function(logEvent) {
Sm.log.util.Debug.abort(
"You must implement this method in derived classes");
},
/**
* Performs encoding of log entry properties that should be html encoded.
*
* @private
*
* @param {Sm.log.LoggingEvent} logEvent
*
* @returns {void}
*/
htmlEncodeStringValues : function(logEvent) {
var me = this, str;
Ext.Object.each( logEvent, function( key, value ) {
if( Ext.isString(value) ) {
if( Ext.Array.indexOf(
me.getHtmlEncodedLogEventProperties(), key) >= 0 )
{
str = Ext.util.Format.htmlEncode(value);
logEvent[key] = str;
}
}
});
},
/**
* Outputs the log to its destination.
*
* @private
* @param {Sm.log.LoggingEvent} logEvent
*
* @returns {void}
*/
log : function(logEvent) {
if( !this.isStopped()) {
this.getLayout().appendFormattedData(logEvent);
if( this.getHtmlEncodedLogEventProperties().length > 0 ) {
this.htmlEncodeStringValues(logEvent);
}
this.doLog(logEvent);
}
},
/**
* Returns the layout for this logger.
*
* @returns {Sm.log.LayoutBase}
* The layout for this logger.
*/
getLayout : function() {
if( !this.layout) {
this.layout = Sm.log.TemplateLayout.getDefaultLayout();
}
return this.layout;
},
/**
* Sets the layout for this logger.
*
* @param {Sm.log.LayoutBase} layout The layout.
*
* @returns {void}
*/
setLayout : function(layout) {
this.layout = layout;
},
/**
* @protected
*
* Call this in the derived classes.
*
* @param cfg
*/
constructor : function(cfg) {
this.initConfig(cfg);
this.setInitialState();
},
/**
* Initializes the appender state to whatever is appropriate fro this
* appender.
*
* @private
*
* @returns {void}
*/
setInitialState : function() {
this.startLogging();
},
/**
* Returns the appender state.
*
* @returns {String} The appender state
*/
getState : function () {
return this.state;
},
/**
* Returns true if the appender is stopped.
*
* An stopped appender ignores all logs sent to it.
*
* @returns {Boolean}
*/
isStopped : function () {
return this.state === Sm.log.AppenderBase.STOPPED;
},
/**
* Stops the appender.
*
* The appender will ignore all logs sent to it while stopped.
*
* @returns {void}
*/
stopLogging : function () {
this.state = Sm.log.AppenderBase.STOPPED;
},
/**
* Returns true if the appender is in the logging state.
*
* In this state, all logs sent to the appender are logged.
*
* @returns {Boolean}
*/
isLogging : function() {
return this.state === Sm.log.AppenderBase.LOGGING;
},
/**
* Sets the appender in the loggins state.
*
* All logs sent to the appender from now on will be logged.
*
* @returns {void}
*/
startLogging : function() {
this.state = Sm.log.AppenderBase.LOGGING;
},
/**
* Returns true if the appender support buffering.
*
* While buffering, all logs sent to an appender are stored, but not
* sent to the output destination until the appender passes to the
* logging state.
*
* @returns {Boolean}
*/
supportsBuffering : function() {
return false;
},
/**
* Returns a formatted string representing the log information.
*
* This is used in most cases for appenders that log to line-oriented
* devices, such as the browser console.
*
* @param {Sm.log.LoggingEvent} logEvent A copy of the data to log.
*
* @returns {String} A text corresponding to the log data.
*/
formatLogAsText : function(logEvent) {
return this.getLayout().formatLogAsText(logEvent);
}
});
}());