001/*
002 * Stallion Core: A Modern Web Framework
003 *
004 * Copyright (C) 2015 - 2016 Stallion Software LLC.
005 *
006 * This program is free software: you can redistribute it and/or modify it under the terms of the
007 * GNU General Public License as published by the Free Software Foundation, either version 2 of
008 * the License, or (at your option) any later version. This program is distributed in the hope that
009 * it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
010 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
011 * License for more details. You should have received a copy of the GNU General Public License
012 * along with this program.  If not, see <http://www.gnu.org/licenses/gpl-2.0.html>.
013 *
014 *
015 *
016 */
017
018package io.stallion.services;
019
020import org.apache.commons.lang3.ArrayUtils;
021
022import java.util.HashMap;
023import java.util.Map;
024import java.util.logging.Filter;
025import java.util.logging.Level;
026import java.util.logging.LogRecord;
027
028import static io.stallion.utils.Literals.*;
029
030
031public class LogFilter implements Filter {
032    private Map<String, Level> packageLogLevelMap = new HashMap<>();
033    private Level defaultLevel = Level.INFO;
034
035    public LogFilter(Level defaultLevel, Map<String, String> packageLogLevelMap) {
036        for(Map.Entry<String, String> entry: packageLogLevelMap.entrySet()) {
037            String packageName = entry.getKey().replace("io.stallion", ".");
038            this.packageLogLevelMap.put(packageName, Level.parse(entry.getValue().toUpperCase()));
039        }
040        this.defaultLevel = defaultLevel;
041    }
042
043    @Override
044    public boolean isLoggable(LogRecord record) {
045        Level overrideLevel = packageLogLevelMap.getOrDefault(toPackageName(record), null);
046        if (overrideLevel != null) {
047            if (record.getLevel().intValue() >= overrideLevel.intValue()) {
048                return true;
049            } else {
050                return false;
051            }
052        }
053        return record.getLevel().intValue() >= defaultLevel.intValue();
054    }
055
056    private String toPackageName(LogRecord record) {
057        int i = record.getSourceClassName().lastIndexOf(".");
058        if (i == -1) {
059            return "";
060        }
061        return record.getSourceClassName().substring(0, i);
062    }
063}