001package com.ganteater.ae;
002
003import java.lang.reflect.Constructor;
004import java.util.ArrayList;
005import java.util.List;
006import java.util.Map;
007
008import org.apache.commons.lang.ObjectUtils;
009
010import com.ganteater.ae.logfilter.LogFilter;
011import com.ganteater.ae.util.AEUtils;
012import com.ganteater.ae.util.xml.easyparser.Node;
013
014public class Logger implements ILogger {
015
016        private static final String FILTER_DEFAULT_PACKAGE = "com.ganteater.ae.logfilter";
017        
018        private org.apache.log4j.Logger logger;
019        private List<LogFilter> logFilters = new ArrayList<>();
020
021        public Logger(String name) {
022                logger = org.apache.log4j.Logger.getLogger(name);
023
024                AEWorkspace instance = AEWorkspace.getInstance();
025                if (instance != null) {
026                        Node configNode = instance.getConfigNode();
027                        if (configNode != null) {
028                                Node[] loggers = configNode.getNodes("Logger");
029                                for (Node loggerNode : loggers) {
030                                        for (Node filterNode : loggerNode.getNodes("filter")) {
031                                                try {
032                                                        String className = filterNode.getAttribute("class");
033                                                        className = AEUtils.getFullClassName(className, FILTER_DEFAULT_PACKAGE);
034                                                        Class<?> filterClass = Class.forName(className);
035                                                        Constructor<?> constructor = filterClass.getConstructor(Map.class);
036                                                        LogFilter filter = (LogFilter) constructor.newInstance(filterNode.getAttributes());
037
038                                                        logFilters.add(filter);
039                                                } catch (Exception e) {
040                                                        e.printStackTrace();
041                                                }
042                                        }
043                                }
044                        }
045                }
046        }
047
048        @Override
049        public Object info(Object message) {
050                message = filter(message);
051                logger.info(message);
052                return message;
053        }
054
055        @Override
056        public Object debug(Object message) {
057                message = filter(message);
058                logger.debug(message);
059                return message;
060        }
061
062        @Override
063        public Object debug(Object message, Throwable t) {
064                message = filter(message);
065                debug(message, t);
066                return message;
067        }
068
069        @Override
070        public Object warn(Object message) {
071                message = filter(message);
072                logger.warn(message);
073                return message;
074        }
075
076        @Override
077        public Object error(Object message) {
078                logger.error(message);
079                return message;
080        }
081
082        @Override
083        public Object error(Object message, Throwable t) {
084                message = filter(message);
085                logger.error(message, t);
086                return message;
087        }
088
089        @Override
090        public String getName() {
091                return logger.getName();
092        }
093
094        public boolean isFilterEnabled() {
095                return logFilters.size() > 0;
096        }
097
098        public String filter(Object message) {
099                if (ObjectUtils.toString(message) != null) {
100                        for (LogFilter logFilter : logFilters) {
101                                message = logFilter.filter(ObjectUtils.toString(message));
102                        }
103                }
104                return ObjectUtils.toString(message);
105        }
106
107}