You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by dd...@apache.org on 2017/01/20 21:32:21 UTC

[1/2] incubator-freemarker git commit: Removed freemarker.ext.log, our log abstraction layer from the old times when there was no clear winner on this field. Added org.slf4j:slf4j-api as required dependency instead.

Repository: incubator-freemarker
Updated Branches:
  refs/heads/3 1588a7f5a -> 8952cbbba


http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/log/CommonsLoggingLoggerFactory.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/log/CommonsLoggingLoggerFactory.java b/src/main/java/freemarker/log/CommonsLoggingLoggerFactory.java
deleted file mode 100644
index e157d41..0000000
--- a/src/main/java/freemarker/log/CommonsLoggingLoggerFactory.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package freemarker.log;
-
-/**
- * @deprecated Don't use it, meant to be internal.
- */
-// 2.4: Remove
-@Deprecated
-public class CommonsLoggingLoggerFactory implements LoggerFactory {
-
-    public Logger getLogger(String category) {
-            return new CommonsLoggingLogger(
-                            org.apache.commons.logging.LogFactory.getLog(category));
-    }
-    
-    static private class CommonsLoggingLogger extends Logger {
-
-            private final org.apache.commons.logging.Log logger;
-            
-            CommonsLoggingLogger(org.apache.commons.logging.Log logger) {
-                    this.logger = logger;
-            }
-            
-            @Override
-            public void debug(String message) {
-                    logger.debug(message);
-            }
-
-            @Override
-            public void debug(String message, Throwable t) {
-                    logger.debug(message, t);
-            }
-
-            @Override
-            public void info(String message) {
-                    logger.info(message);
-            }
-
-            @Override
-            public void info(String message, Throwable t) {
-                    logger.info(message, t);
-            }
-
-            @Override
-            public void warn(String message) {
-                    logger.warn(message);
-            }
-
-            @Override
-            public void warn(String message, Throwable t) {
-                    logger.warn(message, t);
-            }
-
-            @Override
-            public void error(String message) {
-                    logger.error(message);
-            }
-
-            @Override
-            public void error(String message, Throwable t) {
-                    logger.error(message, t);
-            }
-
-            @Override
-            public boolean isDebugEnabled() {
-                    return logger.isDebugEnabled();
-            }
-
-            @Override
-            public boolean isInfoEnabled() {
-                    return logger.isInfoEnabled();
-            }
-
-            @Override
-            public boolean isWarnEnabled() {
-                    return logger.isWarnEnabled();
-            }
-
-            @Override
-            public boolean isErrorEnabled() {
-                    return logger.isErrorEnabled();
-            }
-
-            @Override
-            public boolean isFatalEnabled() {
-                    return logger.isFatalEnabled();
-            }
-            
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/log/Logger.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/log/Logger.java b/src/main/java/freemarker/log/Logger.java
deleted file mode 100644
index a084fb0..0000000
--- a/src/main/java/freemarker/log/Logger.java
+++ /dev/null
@@ -1,580 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package freemarker.log;
-
-import java.security.AccessControlException;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Delegates logger creation to an actual logging library. By default it looks for logger libraries in this order (in
- * FreeMarker 2.3.x): Log4J, Avalon LogKit, JUL (i.e., <tt>java.util.logging</tt>). Prior to FreeMarker 2.4, SLF4J and
- * Apache Commons Logging aren't searched automatically due to backward compatibility constraints. But if you have
- * {@code log4j-over-slf4j} properly installed (means, you have no real Log4j in your class path, and SLF4J has a
- * backing implementation like {@code logback-classic}), then FreeMarker will use SLF4J directly instead of Log4j (since
- * FreeMarker 2.3.22).
- * 
- * <p>
- * If the auto detection sequence describet above doesn't give you the result that you want, see
- * {@link #SYSTEM_PROPERTY_NAME_LOGGER_LIBRARY}.
- */
-public abstract class Logger {
-
-    /**
-     * The {@value #SYSTEM_PROPERTY_NAME_LOGGER_LIBRARY} system property is used to select a logger library explicitly,
-     * rather than relying on automatic selection. You meant to set this system property where the JVM is started, like
-     * {@code java ... -Dorg.freemarker.loggerLibrary=SLF4j}. Setting it from Java code isn't reliable, also it can
-     * cause confusion if you override the value set by others with {@code -D}.
-     * 
-     * <p>
-     * If the requested logging library is not available, an error will be printed to the stderr, then logging will be
-     * disabled.
-     * 
-     * <p>
-     * The supported values are:
-     * <ul>
-     * <li>{@value #LIBRARY_NAME_SLF4J}: Use SLF4J (recommended)</li>
-     * <li>{@value #LIBRARY_NAME_COMMONS_LOGGING}: Use Apache Commons Logging.</li>
-     * <li>{@value #LIBRARY_NAME_LOG4J}: Use Log4j.</li>
-     * <li>{@value #LIBRARY_NAME_JUL}: Use {@code java.util.logging}.</li>
-     * <li>{@value #LIBRARY_NAME_AVALON}: Use Avalon LogKit (deprecated)</li>
-     * <li>{@value #LIBRARY_NAME_AUTO}: Use automatic selection (default behavior). See {@link Logger} class
-     * documentation for more.</li>
-     * <li>{@value #LIBRARY_NAME_NONE}: Don't log.</li>
-     * </ul>
-     * 
-     * @since 2.3.22
-     */
-    public static final String SYSTEM_PROPERTY_NAME_LOGGER_LIBRARY = "org.freemarker.loggerLibrary";
-
-    /**
-     * Enum value used for {@link #selectLoggerLibrary(int)}; indicates auto-selection as described in the class
-     * documentation of {@link #Logger()}.
-     */
-    public static final int LIBRARY_AUTO = -1;
-    private static final int MIN_LIBRARY_ENUM = LIBRARY_AUTO;
-
-    /**
-     * {@value #SYSTEM_PROPERTY_NAME_LOGGER_LIBRARY} property value; indicates auto-selection as described in the class
-     * documentation of {@link #Logger()}. @since 2.3.22
-     */
-    public static final String LIBRARY_NAME_AUTO = "auto";
-
-    /**
-     * Enum value used for {@link #selectLoggerLibrary(int)}; indicates that no logging should occur.
-     */
-    public static final int LIBRARY_NONE = 0;
-
-    /**
-     * {@value #SYSTEM_PROPERTY_NAME_LOGGER_LIBRARY} property value; indicates that no logging should occur. @since
-     * 2.3.22
-     */
-    public static final String LIBRARY_NAME_NONE = "none";
-
-    /**
-     * Enum value used for {@link #selectLoggerLibrary(int)}; indicates that {@code java.util.logging} should be used.
-     */
-    public static final int LIBRARY_JAVA = 1;
-
-    /**
-     * {@value #SYSTEM_PROPERTY_NAME_LOGGER_LIBRARY} property value; indicates that {@code java.util.logging} should be
-     * used. @since 2.3.22
-     */
-    public static final String LIBRARY_NAME_JUL = "JUL";
-
-    /**
-     * Enum value used for {@link #selectLoggerLibrary(int)}; indicates that Avalon LogKit should be used.
-     * 
-     * @deprecated Avalon LogKit support will be removed sometimes in the future.
-     */
-    @Deprecated
-    public static final int LIBRARY_AVALON = 2;
-
-    /**
-     * {@value #SYSTEM_PROPERTY_NAME_LOGGER_LIBRARY} property value; indicates that Avalon LogKit should be used. @since
-     * 2.3.22
-     * 
-     * @deprecated Avalon LogKit support will be removed sometimes in the future.
-     */
-    // This value is also used as part of the factory class name.
-    @Deprecated
-    public static final String LIBRARY_NAME_AVALON = "Avalon";
-
-    /**
-     * Enum value used for {@link #selectLoggerLibrary(int)}; indicates that Log4J should be used.
-     */
-    public static final int LIBRARY_LOG4J = 3;
-
-    /**
-     * {@value #SYSTEM_PROPERTY_NAME_LOGGER_LIBRARY} property value; indicates that Log4J should be used. @since 2.3.22
-     */
-    // This value is also used as part of the factory class name.
-    public static final String LIBRARY_NAME_LOG4J = "Log4j";
-
-    /**
-     * Enum value used for {@link #selectLoggerLibrary(int)}; indicates that Apache commons-logging should be used.
-     */
-    public static final int LIBRARY_COMMONS = 4;
-
-    /**
-     * {@value #SYSTEM_PROPERTY_NAME_LOGGER_LIBRARY} property value; indicates that Apache commons-logging should be
-     * used. @since 2.3.22
-     */
-    // This value is also used as part of the factory class name.
-    public static final String LIBRARY_NAME_COMMONS_LOGGING = "CommonsLogging";
-
-    /**
-     * Constant used with {@link #selectLoggerLibrary(int)}; indicates that SLF4J should be used.
-     */
-    public static final int LIBRARY_SLF4J = 5;
-
-    /**
-     * {@value #SYSTEM_PROPERTY_NAME_LOGGER_LIBRARY} property value; indicates that SLF4J should be used. @since 2.3.22
-     */
-    // This value is also used as part of the factory class name.
-    public static final String LIBRARY_NAME_SLF4J = "SLF4J";
-    private static final int MAX_LIBRARY_ENUM = LIBRARY_SLF4J;
-
-    private static final String REAL_LOG4J_PRESENCE_CLASS = "org.apache.log4j.FileAppender";
-    private static final String LOG4J_OVER_SLF4J_TESTER_CLASS = "freemarker.log._Log4jOverSLF4JTester";
-
-    /**
-     * Order matters! Starts with the lowest priority.
-     */
-    private static final String[] LIBRARIES_BY_PRIORITY = {
-            null, LIBRARY_NAME_JUL,
-            "org.apache.log.Logger", LIBRARY_NAME_AVALON,
-            "org.apache.log4j.Logger", LIBRARY_NAME_LOG4J,
-            /* In 2.3.x this two is skipped by LIBRARY_AUTO: */
-            "org.apache.commons.logging.Log", LIBRARY_NAME_COMMONS_LOGGING,
-            "org.slf4j.Logger", LIBRARY_NAME_SLF4J,
-    };
-
-    private static String getAvailabilityCheckClassName(int libraryEnum) {
-        if (libraryEnum == LIBRARY_AUTO || libraryEnum == LIBRARY_NONE) {
-            // Statically linked
-            return null;
-        }
-        return LIBRARIES_BY_PRIORITY[(libraryEnum - 1) * 2];
-    }
-
-    static {
-        if (LIBRARIES_BY_PRIORITY.length / 2 != MAX_LIBRARY_ENUM) {
-            throw new AssertionError();
-        }
-    }
-
-    private static String getLibraryName(int libraryEnum) {
-        if (libraryEnum == LIBRARY_AUTO) {
-            return LIBRARY_NAME_AUTO;
-        }
-        if (libraryEnum == LIBRARY_NONE) {
-            return LIBRARY_NAME_NONE;
-        }
-        return LIBRARIES_BY_PRIORITY[(libraryEnum - 1) * 2 + 1];
-    }
-
-    private static boolean isAutoDetected(int libraryEnum) {
-        // 2.4: Remove libraryEnum == LIBRARY_SLF4J || libraryEnum == LIBRARY_COMMONS
-        return !(libraryEnum == LIBRARY_AUTO || libraryEnum == LIBRARY_NONE
-                || libraryEnum == LIBRARY_SLF4J || libraryEnum == LIBRARY_COMMONS);
-    }
-
-    private static int libraryEnum;
-    private static LoggerFactory loggerFactory;
-    private static boolean initializedFromSystemProperty;
-
-    private static String categoryPrefix = "";
-
-    private static final Map loggersByCategory = new HashMap();
-
-    /**
-     * Selects the logger library to use, unless it's already specified by the
-     * {@value #SYSTEM_PROPERTY_NAME_LOGGER_LIBRARY} system property. Call this early in application initialization
-     * phase, before calling any other FreeMarker API-s, since once parts of the FreeMarker library bind to the logging
-     * subsystem, the change in this value will have no effect on them.
-     * 
-     * @param libraryEnum
-     *            One of <tt>LIBRARY_...</tt> constants. By default, {@link #LIBRARY_AUTO} is used.
-     * 
-     * @throws ClassNotFoundException
-     *             if an explicit logging library is asked for (that is, not {@value #LIBRARY_AUTO} or
-     *             {@value #LIBRARY_NONE}) and it's not found in the classpath.
-     * 
-     * @deprecated This method isn't reliable, unless you can somehow ensure that you access the FreeMarker classes
-     *             first; use the {@value #SYSTEM_PROPERTY_NAME_LOGGER_LIBRARY} Java system property instead, like
-     *             {@code java ... -Dorg.freemarker.loggerLibrary=slf4j}. See
-     *             {@link #SYSTEM_PROPERTY_NAME_LOGGER_LIBRARY} for more.
-     */
-    @Deprecated
-    public static void selectLoggerLibrary(int libraryEnum) throws ClassNotFoundException {
-        if (libraryEnum < MIN_LIBRARY_ENUM || libraryEnum > MAX_LIBRARY_ENUM) {
-            throw new IllegalArgumentException("Library enum value out of range");
-        }
-
-        synchronized (Logger.class) {
-            final boolean loggerFactoryWasAlreadySet = loggerFactory != null;
-            if (!loggerFactoryWasAlreadySet || libraryEnum != Logger.libraryEnum) {
-                // Creates the factory only if it can be done based on system property:
-                ensureLoggerFactorySet(true);
-
-                // The system property has precedence because this method was deprecated by it:
-                if (!initializedFromSystemProperty || loggerFactory == null) {
-                    int replacedLibraryEnum = Logger.libraryEnum;
-                    setLibrary(libraryEnum);
-                    loggersByCategory.clear();
-                    if (loggerFactoryWasAlreadySet) {
-                        logWarnInLogger("Logger library was already set earlier to \""
-                                + getLibraryName(replacedLibraryEnum) + "\"; "
-                                + "change to \"" + getLibraryName(libraryEnum) + "\" won't effect loggers created "
-                                + "earlier.");
-                    }
-                } else if (libraryEnum != Logger.libraryEnum) {
-                    logWarnInLogger("Ignored " + Logger.class.getName() + ".selectLoggerLibrary(\""
-                            + getLibraryName(libraryEnum)
-                            + "\") call, because the \"" + SYSTEM_PROPERTY_NAME_LOGGER_LIBRARY
-                            + "\" system property is set to \"" + getLibraryName(Logger.libraryEnum) + "\".");
-                }
-            }
-        }
-    }
-
-    /**
-     * Sets a category prefix. This prefix is prepended to any logger category name. This makes it possible to have
-     * different FreeMarker logger categories on a per-application basis (better said, per-classloader basis). By
-     * default the category prefix is the empty string. If you set a non-empty category prefix, be sure to include the
-     * trailing separator dot (i.e. "MyApp.") If you want to change the default setting, do it early in application
-     * initialization phase, before calling any other FreeMarker API since once various parts of the FreeMarker library
-     * bind to the logging subsystem, the change in this value will have no effect on them.
-     * 
-     * @deprecated This wasn't reliable, unless you can somehow ensure that you access the FreeMarker classes first. As
-     *             it's not known to be useful for users, consider it removed.
-     */
-    @Deprecated
-    public static void setCategoryPrefix(String prefix) {
-        synchronized (Logger.class) {
-            if (prefix == null) {
-                throw new IllegalArgumentException();
-            }
-            categoryPrefix = prefix;
-        }
-    }
-
-    /**
-     * Logs a debugging message.
-     */
-    public abstract void debug(String message);
-
-    /**
-     * Logs a debugging message with accompanying throwable.
-     */
-    public abstract void debug(String message, Throwable t);
-
-    /**
-     * Logs an informational message.
-     */
-    public abstract void info(String message);
-
-    /**
-     * Logs an informational message with accompanying throwable.
-     */
-    public abstract void info(String message, Throwable t);
-
-    /**
-     * Logs a warning message.
-     */
-    public abstract void warn(String message);
-
-    /**
-     * Logs a warning message with accompanying throwable.
-     */
-    public abstract void warn(String message, Throwable t);
-
-    /**
-     * Logs an error message.
-     */
-    public abstract void error(String message);
-
-    /**
-     * Logs an error message with accompanying throwable.
-     */
-    public abstract void error(String message, Throwable t);
-
-    /**
-     * Returns true if this logger will log debug messages.
-     */
-    public abstract boolean isDebugEnabled();
-
-    /**
-     * Returns true if this logger will log informational messages.
-     */
-    public abstract boolean isInfoEnabled();
-
-    /**
-     * Returns true if this logger will log warning messages.
-     */
-    public abstract boolean isWarnEnabled();
-
-    /**
-     * Returns true if this logger will log error messages.
-     */
-    public abstract boolean isErrorEnabled();
-
-    /**
-     * Returns true if this logger will log fatal error messages.
-     */
-    public abstract boolean isFatalEnabled();
-
-    /**
-     * Returns a logger for the specified category.
-     * 
-     * @param category
-     *            a dot separated hierarchical category name. If a category prefix is in effect, it's prepended to the
-     *            category name.
-     */
-    public static Logger getLogger(String category) {
-        if (categoryPrefix.length() != 0) {
-            category = categoryPrefix + category;
-        }
-        synchronized (loggersByCategory) {
-            Logger logger = (Logger) loggersByCategory.get(category);
-            if (logger == null) {
-                ensureLoggerFactorySet(false);
-                logger = loggerFactory.getLogger(category);
-                loggersByCategory.put(category, logger);
-            }
-            return logger;
-        }
-    }
-
-    private static void ensureLoggerFactorySet(boolean onlyIfCanBeSetFromSysProp) {
-        if (loggerFactory != null) return;
-        synchronized (Logger.class) {
-            if (loggerFactory != null) return;
-
-            String sysPropVal = getSystemProperty(SYSTEM_PROPERTY_NAME_LOGGER_LIBRARY);
-
-            final int libraryEnum;
-            if (sysPropVal != null) {
-                sysPropVal = sysPropVal.trim();
-
-                boolean foundMatch = false;
-                int matchedEnum = MIN_LIBRARY_ENUM;
-                do {
-                    if (sysPropVal.equalsIgnoreCase(getLibraryName(matchedEnum))) {
-                        foundMatch = true;
-                    } else {
-                        matchedEnum++;
-                    }
-                } while (matchedEnum <= MAX_LIBRARY_ENUM && !foundMatch);
-
-                if (!foundMatch) {
-                    logWarnInLogger("Ignored invalid \"" + SYSTEM_PROPERTY_NAME_LOGGER_LIBRARY
-                            + "\" system property value: \"" + sysPropVal + "\"");
-                    if (onlyIfCanBeSetFromSysProp) return;
-                }
-
-                libraryEnum = foundMatch ? matchedEnum : LIBRARY_AUTO;
-            } else {
-                if (onlyIfCanBeSetFromSysProp) return;
-                libraryEnum = LIBRARY_AUTO;
-            }
-
-            try {
-                setLibrary(libraryEnum);
-                if (sysPropVal != null) {
-                    initializedFromSystemProperty = true;
-                }
-            } catch (Throwable e) {
-                final boolean disableLogging = !(onlyIfCanBeSetFromSysProp && sysPropVal != null);
-                logErrorInLogger(
-                        "Couldn't set up logger for \"" + getLibraryName(libraryEnum) + "\""
-                                + (disableLogging ? "; logging disabled" : "."), e);
-                if (disableLogging) {
-                    try {
-                        setLibrary(LIBRARY_NONE);
-                    } catch (ClassNotFoundException e2) {
-                        throw new RuntimeException("Bug", e2);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * @throws ClassNotFoundException
-     *             If the requested logger library is not available. Never thrown for {@link #LIBRARY_AUTO}.
-     */
-    private static LoggerFactory createLoggerFactory(int libraryEnum) throws ClassNotFoundException {
-        if (libraryEnum == LIBRARY_AUTO) {
-            for (int libraryEnumToTry = MAX_LIBRARY_ENUM; libraryEnumToTry >= MIN_LIBRARY_ENUM; libraryEnumToTry--) {
-                if (!isAutoDetected(libraryEnumToTry)) continue;
-                if (libraryEnumToTry == LIBRARY_LOG4J && hasLog4LibraryThatDelegatesToWorkingSLF4J()) {
-                    libraryEnumToTry = LIBRARY_SLF4J;
-                }
-
-                try {
-                    return createLoggerFactoryForNonAuto(libraryEnumToTry);
-                } catch (ClassNotFoundException e) {
-                    // Expected, intentionally suppressed.
-                } catch (Throwable e) {
-                    logErrorInLogger(
-                            "Unexpected error when initializing logging for \""
-                                    + getLibraryName(libraryEnumToTry) + "\".",
-                            e);
-                }
-            }
-            logWarnInLogger("Auto detecton couldn't set up any logger libraries; FreeMarker logging suppressed.");
-            return new _NullLoggerFactory();
-        } else {
-            return createLoggerFactoryForNonAuto(libraryEnum);
-        }
-    }
-
-    /**
-     * @throws ClassNotFoundException
-     *             If the required logger library is not available.
-     */
-    private static LoggerFactory createLoggerFactoryForNonAuto(int libraryEnum) throws ClassNotFoundException {
-        final String availabilityCheckClassName = getAvailabilityCheckClassName(libraryEnum);
-        if (availabilityCheckClassName != null) { // Dynamically created factory
-            Class.forName(availabilityCheckClassName);
-            String libraryName = getLibraryName(libraryEnum);
-            try {
-                return (LoggerFactory) Class.forName(
-                        "freemarker.log._" + libraryName + "LoggerFactory").newInstance();
-            } catch (Exception e) {
-                throw new RuntimeException(
-                        "Unexpected error when creating logger factory for \"" + libraryName + "\".", e);
-            }
-        } else { // Non-dynamically created factory
-            if (libraryEnum == LIBRARY_JAVA) {
-                return new _JULLoggerFactory();
-            } else if (libraryEnum == LIBRARY_NONE) {
-                return new _NullLoggerFactory();
-            } else {
-                throw new RuntimeException("Bug");
-            }
-        }
-    }
-
-    private static boolean hasLog4LibraryThatDelegatesToWorkingSLF4J() {
-        try {
-            Class.forName(getAvailabilityCheckClassName(LIBRARY_LOG4J));
-            Class.forName(getAvailabilityCheckClassName(LIBRARY_SLF4J));
-        } catch (Throwable e) {
-            return false;
-        }
-        try {
-            Class.forName(REAL_LOG4J_PRESENCE_CLASS);
-            return false;
-        } catch (ClassNotFoundException e) {
-            try {
-                Object r = Class.forName(LOG4J_OVER_SLF4J_TESTER_CLASS)
-                        .getMethod("test", new Class[] {}).invoke(null);
-                return ((Boolean) r).booleanValue();
-            } catch (Throwable e2) {
-                return false;
-            }
-        }
-    }
-
-    private synchronized static void setLibrary(int libraryEnum) throws ClassNotFoundException {
-        loggerFactory = createLoggerFactory(libraryEnum);
-        Logger.libraryEnum = libraryEnum;
-    }
-
-    private static void logWarnInLogger(String message) {
-        logInLogger(false, message, null);
-    }
-
-    private static void logErrorInLogger(String message, Throwable exception) {
-        logInLogger(true, message, exception);
-    }
-
-    private static void logInLogger(boolean error, String message, Throwable exception) {
-        boolean canUseRealLogger;
-        synchronized (Logger.class) {
-            canUseRealLogger = loggerFactory != null && !(loggerFactory instanceof _NullLoggerFactory);
-        }
-
-        if (canUseRealLogger) {
-            try {
-                final Logger logger = Logger.getLogger("freemarker.logger");
-                if (error) {
-                    logger.error(message);
-                } else {
-                    logger.warn(message);
-                }
-            } catch (Throwable e) {
-                canUseRealLogger = false;
-            }
-        }
-
-        if (!canUseRealLogger) {
-            System.err.println((error ? "ERROR" : "WARN") + " "
-                    + LoggerFactory.class.getName() + ": " + message);
-            if (exception != null) {
-                System.err.println("\tException: " + tryToString(exception));
-                while (exception.getCause() != null) {
-                    exception = exception.getCause();
-                    System.err.println("\tCaused by: " + tryToString(exception));
-                }
-            }
-        }
-    }
-
-    /**
-     * Don't use {@link freemarker.template.utility.SecurityUtilities#getSystemProperty(String, String)} here, as it
-     * (might) depends on the logger, hence interfering with the initialization.
-     */
-    private static String getSystemProperty(final String key) {
-        try {
-            return (String) AccessController.doPrivileged(
-                    new PrivilegedAction() {
-                        public Object run() {
-                            return System.getProperty(key, null);
-                        }
-                    });
-        } catch (AccessControlException e) {
-            logWarnInLogger("Insufficient permissions to read system property \"" + key + "\".");
-            return null;
-        } catch (Throwable e) {
-            logErrorInLogger("Failed to read system property \"" + key + "\".", e);
-            return null;
-        }
-    }
-
-    /**
-     * Don't use {@link freemarker.template.utility.StringUtil#tryToString(Object)} here, as it might depends on the
-     * logger, hence interfering with the initialization.
-     */
-    private static String tryToString(Object object) {
-        if (object == null) return null;
-        try {
-            return object.toString();
-        } catch (Throwable e) {
-            return object.getClass().getName();
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/log/LoggerFactory.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/log/LoggerFactory.java b/src/main/java/freemarker/log/LoggerFactory.java
deleted file mode 100644
index 5c4acef..0000000
--- a/src/main/java/freemarker/log/LoggerFactory.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package freemarker.log;
-
-interface LoggerFactory {
-    public Logger getLogger(String category);
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/log/SLF4JLoggerFactory.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/log/SLF4JLoggerFactory.java b/src/main/java/freemarker/log/SLF4JLoggerFactory.java
deleted file mode 100644
index d0efbf2..0000000
--- a/src/main/java/freemarker/log/SLF4JLoggerFactory.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package freemarker.log;
-
-import org.slf4j.spi.LocationAwareLogger;
-
-/**
- * @deprecated Don't use it, meant to be internal.
- */
-// 2.4: Remove
-@Deprecated
-public class SLF4JLoggerFactory implements LoggerFactory {
-
-    public Logger getLogger(String category) {
-            org.slf4j.Logger slf4jLogger = org.slf4j.LoggerFactory.getLogger(category);
-            if (slf4jLogger instanceof LocationAwareLogger) {
-                    return new LocationAwareSLF4JLogger((LocationAwareLogger) slf4jLogger);
-            } else {
-                    return new LocationUnawareSLF4JLogger(slf4jLogger);
-            }
-    }
-
-    /**
-     * Logger where the log entry issuer (class, method) will be correctly
-     * shown to be the caller of <tt>LocationAwareSLF4JLogger</tt> methods.
-     */
-    private static final class LocationAwareSLF4JLogger extends Logger {
-            
-            private static final String ADAPTER_FQCN
-                            = LocationAwareSLF4JLogger.class.getName();
-            
-            private final LocationAwareLogger logger;
-            
-            LocationAwareSLF4JLogger(LocationAwareLogger logger) {
-                    this.logger = logger;
-            }
-
-            @Override
-            public void debug(String message) {
-                    debug(message, null);
-            }
-
-            @Override
-            public void debug(String message, Throwable t) {
-                    logger.log(null, ADAPTER_FQCN,
-                                    LocationAwareLogger.DEBUG_INT, message, null, t);
-            }
-
-            @Override
-            public void info(String message) {
-                    info(message, null);
-            }
-
-            @Override
-            public void info(String message, Throwable t) {
-                    logger.log(null, ADAPTER_FQCN,
-                                    LocationAwareLogger.INFO_INT, message, null, t);
-            }
-
-            @Override
-            public void warn(String message) {
-                    warn(message, null);
-            }
-
-            @Override
-            public void warn(String message, Throwable t) {
-                    logger.log(null, ADAPTER_FQCN,
-                                    LocationAwareLogger.WARN_INT, message, null, t);
-            }
-
-            @Override
-            public void error(String message) {
-                    error(message, null);
-            }
-
-            @Override
-            public void error(String message, Throwable t) {
-                    logger.log(null, ADAPTER_FQCN,
-                                    LocationAwareLogger.ERROR_INT, message, null, t);
-            }
-
-            @Override
-            public boolean isDebugEnabled() {
-                    return logger.isDebugEnabled();
-            }
-
-            @Override
-            public boolean isInfoEnabled() {
-                    return logger.isInfoEnabled();
-            }
-
-            @Override
-            public boolean isWarnEnabled() {
-                    return logger.isWarnEnabled();
-            }
-
-            @Override
-            public boolean isErrorEnabled() {
-                    return logger.isErrorEnabled();
-            }
-
-            @Override
-            public boolean isFatalEnabled() {
-                    return logger.isErrorEnabled();
-            }
-            
-    }
-    
-    /**
-     * Logger where the log entry issuer (class, method) will be incorrectly
-     * shown to be a method of this class.
-     */
-    private static class LocationUnawareSLF4JLogger extends Logger {
-            
-            private final org.slf4j.Logger logger;
-
-            LocationUnawareSLF4JLogger(org.slf4j.Logger logger) {
-                    this.logger = logger;
-            }
-
-            @Override
-            public void debug(String message) {
-                    logger.debug(message);
-            }
-
-            @Override
-            public void debug(String message, Throwable t) {
-                    logger.debug(message, t);
-            }
-
-            @Override
-            public void info(String message) {
-                    logger.info(message);
-            }
-
-            @Override
-            public void info(String message, Throwable t) {
-                    logger.info(message, t);
-            }
-
-            @Override
-            public void warn(String message) {
-                    logger.warn(message);
-            }
-
-            @Override
-            public void warn(String message, Throwable t) {
-                    logger.warn(message, t);
-            }
-
-            @Override
-            public void error(String message) {
-                    logger.error(message);
-            }
-
-            @Override
-            public void error(String message, Throwable t) {
-                    logger.error(message, t);
-            }
-
-            @Override
-            public boolean isDebugEnabled() {
-                    return logger.isDebugEnabled();
-            }
-
-            @Override
-            public boolean isInfoEnabled() {
-                    return logger.isInfoEnabled();
-            }
-
-            @Override
-            public boolean isWarnEnabled() {
-                    return logger.isWarnEnabled();
-            }
-
-            @Override
-            public boolean isErrorEnabled() {
-                    return logger.isErrorEnabled();
-            }
-
-            @Override
-            public boolean isFatalEnabled() {
-                    return logger.isErrorEnabled();
-            }
-            
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/log/_AvalonLoggerFactory.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/log/_AvalonLoggerFactory.java b/src/main/java/freemarker/log/_AvalonLoggerFactory.java
deleted file mode 100644
index 9e274b1..0000000
--- a/src/main/java/freemarker/log/_AvalonLoggerFactory.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package freemarker.log;
-
-import org.apache.log.Hierarchy;
-
-/**
- * Don't use this class; it's only public to work around Google App Engine Java
- * compliance issues. FreeMarker developers only: treat this class as package-visible.
- */
-public class _AvalonLoggerFactory implements LoggerFactory {
-    public Logger getLogger(String category) {
-        return new AvalonLogger(Hierarchy.getDefaultHierarchy().getLoggerFor(category));
-    }
-
-    private static class AvalonLogger
-    extends
-        Logger {
-        private final org.apache.log.Logger logger;
-        
-        AvalonLogger(org.apache.log.Logger logger) {
-            this.logger = logger;
-        }
-        
-        @Override
-        public void debug(String message) {
-            logger.debug(message);
-        }
-
-        @Override
-        public void debug(String message, Throwable t) {
-            logger.debug(message, t);
-        }
-
-        @Override
-        public void error(String message) {
-            logger.error(message);
-        }
-
-        @Override
-        public void error(String message, Throwable t) {
-            logger.error(message, t);
-        }
-
-        @Override
-        public void info(String message) {
-            logger.info(message);
-        }
-
-        @Override
-        public void info(String message, Throwable t) {
-            logger.info(message, t);
-        }
-
-        @Override
-        public void warn(String message) {
-            logger.warn(message);
-        }
-
-        @Override
-        public void warn(String message, Throwable t) {
-            logger.warn(message, t);
-        }
-
-        @Override
-        public boolean isDebugEnabled() {
-            return logger.isDebugEnabled();
-        }
-
-        @Override
-        public boolean isInfoEnabled() {
-            return logger.isInfoEnabled();
-        }
-
-        @Override
-        public boolean isWarnEnabled() {
-            return logger.isWarnEnabled();
-        }
-
-        @Override
-        public boolean isErrorEnabled() {
-            return logger.isErrorEnabled();
-        }
-
-        @Override
-        public boolean isFatalEnabled() {
-            return logger.isFatalErrorEnabled();
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/log/_CommonsLoggingLoggerFactory.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/log/_CommonsLoggingLoggerFactory.java b/src/main/java/freemarker/log/_CommonsLoggingLoggerFactory.java
deleted file mode 100644
index 551aa52..0000000
--- a/src/main/java/freemarker/log/_CommonsLoggingLoggerFactory.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package freemarker.log;
-
-/**
- * Don't use this class; it's only public to work around Google App Engine Java
- * compliance issues. FreeMarker developers only: treat this class as package-visible.
- */
-public class _CommonsLoggingLoggerFactory extends CommonsLoggingLoggerFactory {
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/log/_JULLoggerFactory.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/log/_JULLoggerFactory.java b/src/main/java/freemarker/log/_JULLoggerFactory.java
deleted file mode 100644
index 7eb11b3..0000000
--- a/src/main/java/freemarker/log/_JULLoggerFactory.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package freemarker.log;
-
-import java.util.logging.Level;
-
-/**
- * Don't use this class; it's only public to work around Google App Engine Java
- * compliance issues. FreeMarker developers only: treat this class as package-visible.
- */
-public class _JULLoggerFactory implements LoggerFactory {
-    public Logger getLogger(String category) {
-        return new JULLogger(java.util.logging.Logger.getLogger(category));
-    }
-
-    private static class JULLogger
-    extends
-        Logger {
-        private final java.util.logging.Logger logger;
-        
-        JULLogger(java.util.logging.Logger logger) {
-            this.logger = logger;
-        }
-        
-        @Override
-        public void debug(String message) {
-            logger.log(Level.FINE, message);
-        }
-
-        @Override
-        public void debug(String message, Throwable t) {
-            logger.log(Level.FINE, message, t);
-        }
-
-        @Override
-        public void error(String message) {
-            logger.log(Level.SEVERE, message);
-        }
-
-        @Override
-        public void error(String message, Throwable t) {
-            logger.log(Level.SEVERE, message, t);
-        }
-
-        @Override
-        public void info(String message) {
-            logger.log(Level.INFO, message);
-        }
-
-        @Override
-        public void info(String message, Throwable t) {
-            logger.log(Level.INFO, message, t);
-        }
-
-        @Override
-        public void warn(String message) {
-            logger.log(Level.WARNING, message);
-        }
-
-        @Override
-        public void warn(String message, Throwable t) {
-            logger.log(Level.WARNING, message, t);
-        }
-
-        @Override
-        public boolean isDebugEnabled() {
-            return logger.isLoggable(Level.FINE);
-        }
-
-        @Override
-        public boolean isInfoEnabled() {
-            return logger.isLoggable(Level.INFO);
-        }
-
-        @Override
-        public boolean isWarnEnabled() {
-            return logger.isLoggable(Level.WARNING);
-        }
-
-        @Override
-        public boolean isErrorEnabled() {
-            return logger.isLoggable(Level.SEVERE);
-        }
-
-        @Override
-        public boolean isFatalEnabled() {
-            return logger.isLoggable(Level.SEVERE);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/log/_Log4jLoggerFactory.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/log/_Log4jLoggerFactory.java b/src/main/java/freemarker/log/_Log4jLoggerFactory.java
deleted file mode 100644
index d78a164..0000000
--- a/src/main/java/freemarker/log/_Log4jLoggerFactory.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package freemarker.log;
-
-import org.apache.log4j.Level;
-
-/**
- * Don't use this class; it's only public to work around Google App Engine Java
- * compliance issues. FreeMarker developers only: treat this class as package-visible.
- */
-public class _Log4jLoggerFactory implements LoggerFactory {
-    public Logger getLogger(String category) {
-        return new Log4jLogger(org.apache.log4j.Logger.getLogger(category));
-    }
-
-    private static class Log4jLogger
-    extends
-        Logger {
-        private final org.apache.log4j.Logger logger;
-        
-        Log4jLogger(org.apache.log4j.Logger logger) {
-            this.logger = logger;
-        }
-        
-        @Override
-        public void debug(String message) {
-            logger.debug(message);
-        }
-
-        @Override
-        public void debug(String message, Throwable t) {
-            logger.debug(message, t);
-        }
-
-        @Override
-        public void error(String message) {
-            logger.error(message);
-        }
-
-        @Override
-        public void error(String message, Throwable t) {
-            logger.error(message, t);
-        }
-
-        @Override
-        public void info(String message) {
-            logger.info(message);
-        }
-
-        @Override
-        public void info(String message, Throwable t) {
-            logger.info(message, t);
-        }
-
-        @Override
-        public void warn(String message) {
-            logger.warn(message);
-        }
-
-        @Override
-        public void warn(String message, Throwable t) {
-            logger.warn(message, t);
-        }
-
-        @Override
-        public boolean isDebugEnabled() {
-            return logger.isDebugEnabled();
-        }
-
-        @Override
-        public boolean isInfoEnabled() {
-            return logger.isInfoEnabled();
-        }
-
-        @Override
-        public boolean isWarnEnabled() {
-            return logger.isEnabledFor(Level.WARN);
-        }
-
-        @Override
-        public boolean isErrorEnabled() {
-            return logger.isEnabledFor(Level.ERROR);
-        }
-
-        @Override
-        public boolean isFatalEnabled() {
-            return logger.isEnabledFor(Level.FATAL);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/log/_Log4jOverSLF4JTester.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/log/_Log4jOverSLF4JTester.java b/src/main/java/freemarker/log/_Log4jOverSLF4JTester.java
deleted file mode 100644
index 5afcadf..0000000
--- a/src/main/java/freemarker/log/_Log4jOverSLF4JTester.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package freemarker.log;
-
-/**
- * Don't use this class; it's only public to work around Google App Engine Java
- * compliance issues. FreeMarker developers only: treat this class as package-visible.
- */
-public class _Log4jOverSLF4JTester {
-
-    private static final String MDC_KEY = _Log4jOverSLF4JTester.class.getName();
-
-    /**
-     * Returns if Log4j-over-SLF4J is actually working. Sometimes the API classes are present, but there's no SLF4J
-     * implementation around.
-     */
-    public static final boolean test() {
-        org.apache.log4j.MDC.put(MDC_KEY, "");
-        try {
-            return org.slf4j.MDC.get(MDC_KEY) != null;
-        } finally {
-            org.apache.log4j.MDC.remove(MDC_KEY);
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/log/_NullLoggerFactory.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/log/_NullLoggerFactory.java b/src/main/java/freemarker/log/_NullLoggerFactory.java
deleted file mode 100644
index 7e161a5..0000000
--- a/src/main/java/freemarker/log/_NullLoggerFactory.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package freemarker.log;
-
-/**
- * Don't use this class; it's only public to work around Google App Engine Java
- * compliance issues. FreeMarker developers only: treat this class as package-visible.
- */
-public class _NullLoggerFactory implements LoggerFactory {
-    _NullLoggerFactory() {
-    }
-    
-    public Logger getLogger(String category) {
-        return INSTANCE;
-    }
-
-    private static final Logger INSTANCE = new Logger()
-    {
-        @Override
-        public void debug(String message) {
-        }
-
-        @Override
-        public void debug(String message, Throwable t) {
-        }
-
-        @Override
-        public void error(String message) {
-        }
-
-        @Override
-        public void error(String message, Throwable t) {
-        }
-
-        @Override
-        public void info(String message) {
-        }
-
-        @Override
-        public void info(String message, Throwable t) {
-        }
-
-        @Override
-        public void warn(String message) {
-        }
-
-        @Override
-        public void warn(String message, Throwable t) {
-        }
-
-        @Override
-        public boolean isDebugEnabled() {
-            return false;
-        }
-
-        @Override
-        public boolean isInfoEnabled() {
-            return false;
-        }
-
-        @Override
-        public boolean isWarnEnabled() {
-            return false;
-        }
-
-        @Override
-        public boolean isErrorEnabled() {
-            return false;
-        }
-
-        @Override
-        public boolean isFatalEnabled() {
-            return false;
-        }
-    };
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/log/_SLF4JLoggerFactory.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/log/_SLF4JLoggerFactory.java b/src/main/java/freemarker/log/_SLF4JLoggerFactory.java
deleted file mode 100644
index 6332130..0000000
--- a/src/main/java/freemarker/log/_SLF4JLoggerFactory.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package freemarker.log;
-
-
-/**
- * Don't use this class; it's only public to work around Google App Engine Java
- * compliance issues. FreeMarker developers only: treat this class as package-visible.
- */
-public class _SLF4JLoggerFactory extends SLF4JLoggerFactory {
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/log/package.html
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/log/package.html b/src/main/java/freemarker/log/package.html
deleted file mode 100644
index afc773c..0000000
--- a/src/main/java/freemarker/log/package.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-    http://www.apache.org/licenses/LICENSE-2.0
-  
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<html>
-<head>
-</head>
-<BODY>
-<p>
-Logging facility; dispatches FreeMarker log messages to the chosen logger library.
-
-</body>
-</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/template/Configuration.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/template/Configuration.java b/src/main/java/freemarker/template/Configuration.java
index 368ce23..f460eac 100644
--- a/src/main/java/freemarker/template/Configuration.java
+++ b/src/main/java/freemarker/template/Configuration.java
@@ -42,6 +42,9 @@ import java.util.TreeSet;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import freemarker.cache.CacheStorage;
 import freemarker.cache.ClassTemplateLoader;
 import freemarker.cache.FileTemplateLoader;
@@ -85,7 +88,6 @@ import freemarker.core._SortedArraySet;
 import freemarker.core._UnmodifiableCompositeSet;
 import freemarker.ext.beans.BeansWrapper;
 import freemarker.ext.beans.BeansWrapperBuilder;
-import freemarker.log.Logger;
 import freemarker.template.utility.CaptureOutput;
 import freemarker.template.utility.ClassUtil;
 import freemarker.template.utility.Constants;
@@ -146,7 +148,7 @@ import freemarker.template.utility.XmlEscape;
  */
 public class Configuration extends Configurable implements Cloneable, ParserConfiguration {
     
-    private static final Logger CACHE_LOG = Logger.getLogger("freemarker.cache");
+    private static final Logger LOG = LoggerFactory.getLogger("freemarker.cache");
     
     private static final String VERSION_PROPERTIES_PATH = "freemarker/version.properties";
     
@@ -225,16 +227,19 @@ public class Configuration extends Configurable implements Cloneable, ParserConf
      * Legacy, snake case ({@code like_this}) variation of the setting name. @since 2.3.23
      * @deprecated Use {@link Configurable#AUTO_IMPORT_KEY_SNAKE_CASE} instead.
      */
+    @Deprecated
     public static final String AUTO_IMPORT_KEY_SNAKE_CASE = "auto_import";
     /**
      * Modern, camel case ({@code likeThis}) variation of the setting name. @since 2.3.23
      * @deprecated Use {@link Configurable#AUTO_IMPORT_KEY_CAMEL_CASE} instead.
      */
+    @Deprecated
     public static final String AUTO_IMPORT_KEY_CAMEL_CASE = "autoImport";
     /**
      * Alias to the {@code ..._SNAKE_CASE} variation due to backward compatibility constraints.
      * @deprecated Use {@link Configurable#AUTO_IMPORT_KEY_SNAKE_CASE} instead.
      */
+    @Deprecated
     public static final String AUTO_IMPORT_KEY = AUTO_IMPORT_KEY_SNAKE_CASE;
     
     /** Legacy, snake case ({@code like_this}) variation of the setting name. @since 2.3.23 */
@@ -895,7 +900,7 @@ public class Configuration extends Configurable implements Cloneable, ParserConf
             try {
                 return new LegacyDefaultFileTemplateLoader();
             } catch (Exception e) {
-                CACHE_LOG.warn("Couldn't create legacy default TemplateLoader which accesses the current directory. "
+                LOG.warn("Couldn't create legacy default TemplateLoader which accesses the current directory. "
                         + "(Use new Configuration(Configuration.VERSION_2_3_21) or higher to avoid this.)", e);
                 return null;
             }
@@ -904,6 +909,7 @@ public class Configuration extends Configurable implements Cloneable, ParserConf
         }
     }
     
+    // [FM3] Remove
     private static class LegacyDefaultFileTemplateLoader extends FileTemplateLoader {
 
         public LegacyDefaultFileTemplateLoader() throws IOException {
@@ -1665,6 +1671,7 @@ public class Configuration extends Configurable implements Cloneable, ParserConf
     /**
      * The getter pair of {@link #setStrictSyntaxMode}.
      */
+    @Override
     public boolean getStrictSyntaxMode() {
         return strictSyntax;
     }
@@ -1734,6 +1741,7 @@ public class Configuration extends Configurable implements Cloneable, ParserConf
      * @return Never {@code null}. 
      * @since 2.3.20
      */
+    @Override
     public Version getIncompatibleImprovements() {
         return incompatibleImprovements;
     }
@@ -1777,6 +1785,7 @@ public class Configuration extends Configurable implements Cloneable, ParserConf
      *
      * @see #setWhitespaceStripping
      */
+    @Override
     public boolean getWhitespaceStripping() {
         return whitespaceStripping;
     }
@@ -1841,6 +1850,7 @@ public class Configuration extends Configurable implements Cloneable, ParserConf
      * 
      * @since 2.3.24
      */
+    @Override
     public int getAutoEscapingPolicy() {
         return autoEscapingPolicy;
     }
@@ -1886,6 +1896,7 @@ public class Configuration extends Configurable implements Cloneable, ParserConf
      * 
      * @since 2.3.24
      */
+    @Override
     public OutputFormat getOutputFormat() {
         return outputFormat;
     }
@@ -2138,6 +2149,7 @@ public class Configuration extends Configurable implements Cloneable, ParserConf
      * 
      * @since 2.3.24
      */
+    @Override
     public boolean getRecognizeStandardFileExtensions() {
         return recognizeStandardFileExtensions == null
                 ? incompatibleImprovements.intValue() >= _TemplateAPI.VERSION_INT_2_3_24
@@ -2175,6 +2187,7 @@ public class Configuration extends Configurable implements Cloneable, ParserConf
     /**
      * The getter pair of {@link #setTagSyntax(int)}.
      */
+    @Override
     public int getTagSyntax() {
         return tagSyntax;
     }
@@ -2240,6 +2253,7 @@ public class Configuration extends Configurable implements Cloneable, ParserConf
      * 
      * @since 2.3.23
      */
+    @Override
     public int getNamingConvention() {
         return namingConvention;
     }
@@ -2272,6 +2286,7 @@ public class Configuration extends Configurable implements Cloneable, ParserConf
      * 
      * @since 2.3.25
      */
+    @Override
     public int getTabSize() {
         return tabSize;
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/template/utility/CaptureOutput.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/template/utility/CaptureOutput.java b/src/main/java/freemarker/template/utility/CaptureOutput.java
index d505d0a..fa98871 100644
--- a/src/main/java/freemarker/template/utility/CaptureOutput.java
+++ b/src/main/java/freemarker/template/utility/CaptureOutput.java
@@ -61,6 +61,7 @@ import freemarker.template.TemplateTransformModel;
 @Deprecated
 public class CaptureOutput implements TemplateTransformModel {
 
+    @Override
     public Writer getWriter(final Writer out, final Map args) throws TemplateModelException {
         String errmsg = "Must specify the name of the variable in "
                 + "which to capture the output with the 'var' or 'local' or 'global' parameter.";

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/template/utility/SecurityUtilities.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/template/utility/SecurityUtilities.java b/src/main/java/freemarker/template/utility/SecurityUtilities.java
index e17289f..95bcf4b 100644
--- a/src/main/java/freemarker/template/utility/SecurityUtilities.java
+++ b/src/main/java/freemarker/template/utility/SecurityUtilities.java
@@ -23,12 +23,13 @@ import java.security.AccessControlException;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 
-import freemarker.log.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  */
 public class SecurityUtilities {
-    private static final Logger LOG = Logger.getLogger("freemarker.security");
+    private static final Logger LOG = LoggerFactory.getLogger("freemarker.security");
     private SecurityUtilities() {
     }
     
@@ -36,6 +37,7 @@ public class SecurityUtilities {
         return (String) AccessController.doPrivileged(
             new PrivilegedAction()
             {
+                @Override
                 public Object run() {
                     return System.getProperty(key);
                 }
@@ -47,14 +49,17 @@ public class SecurityUtilities {
             return (String) AccessController.doPrivileged(
                 new PrivilegedAction()
                 {
+                    @Override
                     public Object run() {
                         return System.getProperty(key, defValue);
                     }
                 });
         } catch (AccessControlException e) {
-            LOG.warn("Insufficient permissions to read system property " + 
-                    StringUtil.jQuoteNoXSS(key) + ", using default value " +
-                    StringUtil.jQuoteNoXSS(defValue));
+            if (LOG.isWarnEnabled()) {
+                LOG.warn("Insufficient permissions to read system property " + 
+                        StringUtil.jQuoteNoXSS(key) + ", using default value " +
+                        StringUtil.jQuoteNoXSS(defValue));
+            }
             return defValue;
         }
     }
@@ -64,13 +69,16 @@ public class SecurityUtilities {
             return (Integer) AccessController.doPrivileged(
                 new PrivilegedAction()
                 {
+                    @Override
                     public Object run() {
                         return Integer.getInteger(key, defValue);
                     }
                 });
         } catch (AccessControlException e) {
-            LOG.warn("Insufficient permissions to read system property " + 
-                    StringUtil.jQuote(key) + ", using default value " + defValue);
+            if (LOG.isWarnEnabled()) {
+                LOG.warn("Insufficient permissions to read system property " + 
+                        StringUtil.jQuote(key) + ", using default value " + defValue);
+            }
             return Integer.valueOf(defValue);
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/manual/en_US/FM3-CHANGE-LOG.txt
----------------------------------------------------------------------
diff --git a/src/manual/en_US/FM3-CHANGE-LOG.txt b/src/manual/en_US/FM3-CHANGE-LOG.txt
index e5c57dd..5c526c4 100644
--- a/src/manual/en_US/FM3-CHANGE-LOG.txt
+++ b/src/manual/en_US/FM3-CHANGE-LOG.txt
@@ -3,4 +3,6 @@ the FreeMarer 3 changelog here:
 
 - Increased version number to 3.0.0 (nightly aka. SNAPSHOT)
 - Removed legacy extensions: rhyno, jython, xml (not to be confused with dom), jdom, ant.
-- Removed JSP 2.0 support (2.1 is the minimum for now, but maybe it will be 2.2 and Servlet 3.0 later).
\ No newline at end of file
+- Removed JSP 2.0 support (2.1 is the minimum for now, but maybe it will be 2.2 and Servlet 3.0 later).
+- Removed freemarker.ext.log, our log abstraction layer from the old times when there was no clear winner on this field.
+  Added org.slf4j:slf4j-api as required dependency instead.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/test/java/freemarker/template/DefaultObjectWrapperTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/freemarker/template/DefaultObjectWrapperTest.java b/src/test/java/freemarker/template/DefaultObjectWrapperTest.java
index 5bb9152..00432ce 100644
--- a/src/test/java/freemarker/template/DefaultObjectWrapperTest.java
+++ b/src/test/java/freemarker/template/DefaultObjectWrapperTest.java
@@ -1029,6 +1029,7 @@ public class DefaultObjectWrapperTest {
     }
 
     private static final class PureIterable implements Iterable<String> {
+        @Override
         public Iterator<String> iterator() {
             return ImmutableList.of("a", "b", "c").iterator();
         }
@@ -1050,6 +1051,7 @@ public class DefaultObjectWrapperTest {
 
         final static NullModel INSTANCE = new NullModel();
 
+        @Override
         public Object getAdaptedObject(Class hint) {
             return null;
         }
@@ -1145,10 +1147,12 @@ public class DefaultObjectWrapperTest {
             this.tupple = tupple;
         }
 
+        @Override
         public int size() throws TemplateModelException {
             return 2;
         }
         
+        @Override
         public TemplateModel get(int index) throws TemplateModelException {
             switch (index) {
             case 0: return wrap(tupple.getE1());
@@ -1157,6 +1161,7 @@ public class DefaultObjectWrapperTest {
             }
         }
 
+        @Override
         public Object getAdaptedObject(Class hint) {
             return tupple;
         }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/test/java/freemarker/test/servlet/Model2TesterServlet.java
----------------------------------------------------------------------
diff --git a/src/test/java/freemarker/test/servlet/Model2TesterServlet.java b/src/test/java/freemarker/test/servlet/Model2TesterServlet.java
index 8b41be9..e6414a8 100644
--- a/src/test/java/freemarker/test/servlet/Model2TesterServlet.java
+++ b/src/test/java/freemarker/test/servlet/Model2TesterServlet.java
@@ -28,7 +28,8 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequestWrapper;
 import javax.servlet.http.HttpServletResponse;
 
-import org.apache.log4j.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import freemarker.ext.servlet.FreemarkerServlet;
 import freemarker.template.utility.StringUtil;
@@ -44,7 +45,7 @@ import freemarker.template.utility.StringUtil;
  */
 public class Model2TesterServlet extends HttpServlet {
     
-    private static final Logger LOG = Logger.getLogger(Model2TesterServlet.class);
+    private static final Logger LOG = LoggerFactory.getLogger(Model2TesterServlet.class);
     
     public static final String VIEW_PARAM_NAME = "view";
     public static final String ACTION_PARAM_NAME = "action";


[2/2] incubator-freemarker git commit: Removed freemarker.ext.log, our log abstraction layer from the old times when there was no clear winner on this field. Added org.slf4j:slf4j-api as required dependency instead.

Posted by dd...@apache.org.
Removed freemarker.ext.log, our log abstraction layer from the old times when there was no clear winner on this field. Added org.slf4j:slf4j-api as required dependency instead.


Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/8952cbbb
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/8952cbbb
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/8952cbbb

Branch: refs/heads/3
Commit: 8952cbbba8143038428441831ea22bb3ecb300e1
Parents: 1588a7f
Author: ddekany <dd...@apache.org>
Authored: Fri Jan 20 22:32:08 2017 +0100
Committer: ddekany <dd...@apache.org>
Committed: Fri Jan 20 22:32:08 2017 +0100

----------------------------------------------------------------------
 README                                          |  15 +-
 build.xml                                       |   7 +-
 ivy.xml                                         |  18 +-
 .../freemarker/cache/FileTemplateLoader.java    |  16 +-
 .../java/freemarker/cache/TemplateCache.java    |  10 +-
 .../freemarker/cache/WebappTemplateLoader.java  |  15 +-
 src/main/java/freemarker/core/Environment.java  |  24 +-
 .../core/JavaTemplateDateFormatFactory.java     |  12 +-
 .../core/JavaTemplateNumberFormatFactory.java   |  11 +-
 src/main/java/freemarker/core/RegexpHelper.java |   7 +-
 .../core/_ErrorDescriptionBuilder.java          |   6 +-
 .../java/freemarker/core/_JavaVersions.java     |   5 +-
 .../freemarker/debug/impl/DebuggerServer.java   |  11 +-
 .../debug/impl/RmiDebuggerListenerImpl.java     |   8 +-
 .../java/freemarker/ext/beans/BeanModel.java    |  27 +-
 .../java/freemarker/ext/beans/BeansWrapper.java |  20 +-
 .../freemarker/ext/beans/ClassIntrospector.java |  40 +-
 .../java/freemarker/ext/beans/StaticModel.java  |  12 +-
 .../java/freemarker/ext/dom/NodeListModel.java  |   4 +
 src/main/java/freemarker/ext/dom/NodeModel.java |  17 +-
 .../freemarker/ext/jsp/EventForwarding.java     |  21 +-
 .../jsp/FreeMarkerJspApplicationContext.java    |  21 +-
 .../freemarker/ext/jsp/TagTransformModel.java   |  12 +-
 .../java/freemarker/ext/jsp/TaglibFactory.java  |  52 +-
 .../ext/jsp/_FreeMarkerPageContext21.java       |   8 +-
 .../ext/servlet/FreemarkerServlet.java          |  19 +-
 .../freemarker/ext/servlet/InitParamParser.java |  10 +-
 .../log/CommonsLoggingLoggerFactory.java        | 109 ----
 src/main/java/freemarker/log/Logger.java        | 580 -------------------
 src/main/java/freemarker/log/LoggerFactory.java |  24 -
 .../java/freemarker/log/SLF4JLoggerFactory.java | 205 -------
 .../freemarker/log/_AvalonLoggerFactory.java    | 107 ----
 .../log/_CommonsLoggingLoggerFactory.java       |  28 -
 .../java/freemarker/log/_JULLoggerFactory.java  | 107 ----
 .../freemarker/log/_Log4jLoggerFactory.java     | 107 ----
 .../freemarker/log/_Log4jOverSLF4JTester.java   |  43 --
 .../java/freemarker/log/_NullLoggerFactory.java |  93 ---
 .../freemarker/log/_SLF4JLoggerFactory.java     |  29 -
 src/main/java/freemarker/log/package.html       |  27 -
 .../java/freemarker/template/Configuration.java |  21 +-
 .../template/utility/CaptureOutput.java         |   1 +
 .../template/utility/SecurityUtilities.java     |  22 +-
 src/manual/en_US/FM3-CHANGE-LOG.txt             |   4 +-
 .../template/DefaultObjectWrapperTest.java      |   5 +
 .../test/servlet/Model2TesterServlet.java       |   5 +-
 45 files changed, 330 insertions(+), 1615 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/README
----------------------------------------------------------------------
diff --git a/README b/README
index 2098ad3..0c1f042 100644
--- a/README
+++ b/README
@@ -72,7 +72,7 @@ in the documentation/index.html directory.
 Installing
 ----------
 
-If you are using Maven, just add this dependency:
+If you are using Maven (or Gradle, etc.), just add this dependency:
 
   <!--
   Attention: Be sure nothing pulls in an old dependency with groupId
@@ -90,10 +90,12 @@ application's ClassLoader will find it. For example, if you are using
 FreeMarker in a web application, you probably want to put
 freemarker.jar into the WEB-INF/lib directory of your web application.
 
-FreeMarker has no required dependencies. It has several optional
-dependencies, but usually you don't have to deal with them, because if
-you are using an optional feature that's certainly because your
-application already uses the related library.
+FreeMarker 3 has only one required dependency, slf4j-api. (Of course,
+it will be automatically downloaded by Maven, Gradle, and the like.)
+It has several optional dependencies, but usually you don't have
+to deal with them, because if you are using an optional feature
+that's certainly because your application already uses the related
+library.
 
 
 Change log
@@ -146,6 +148,9 @@ apply it to your development environment:
 - Window -> Preferences
   - General -> Workspace, set the text file encoding
     to "UTF-8". (Or, you can set the same later on project level instead.)
+  - General -> Editors, set:
+    - Insert space for tabs
+    - Show print margin, 120 columns
   - Java -> Code Style -> Formatter -> Import...
     Select src\ide-settings\Eclipse-Mars\Formatter-profile-FreeMarker.xml
     inside the FreeMarker project directory.

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/build.xml
----------------------------------------------------------------------
diff --git a/build.xml b/build.xml
index 096e000..e6e3b13 100644
--- a/build.xml
+++ b/build.xml
@@ -756,7 +756,6 @@
   
   <name>Apache FreeMarker</name>
   <description>
-    Google App Engine compliant variation of FreeMarker.
     FreeMarker is a "template engine"; a generic tool to generate text output based on templates.
   </description>
   <url>http://freemarker.org/</url>
@@ -807,7 +806,11 @@
   </mailingLists>
   
   <dependencies>
-    <!-- no required dependencies -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <version>1.7.22</version>
+    </dependency>
   </dependencies>
 </project>
 ]]></echo>

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/ivy.xml
----------------------------------------------------------------------
diff --git a/ivy.xml b/ivy.xml
index 9bcaf23..196b468 100644
--- a/ivy.xml
+++ b/ivy.xml
@@ -22,7 +22,7 @@
 -->
 <!DOCTYPE ivy-module [
     <!ENTITY jetty.version "7.6.16.v20140903">
-    <!ENTITY slf4j.version "1.6.1">
+    <!ENTITY slf4j.version "1.7.22">
     <!ENTITY spring.version "2.5.6.SEC03">
 ]>
 <ivy-module version="2.0">
@@ -85,19 +85,10 @@
       <exclude org="xml-apis" module="xml-apis" />
     </dependency>
 
-    <dependency org="ant" name="ant" rev="1.6.5" conf="build.base->default">
-      <!-- The lowerst supported xml-apis version depends on JDK version; prevent any collosion: -->
-      <exclude org="xml-apis" module="xml-apis" />
-    </dependency>
-    
     <dependency org="javax.servlet.jsp" name="jsp-api" rev="2.1" conf="build.jsp2.1->default" />
     <dependency org="javax.servlet" name="servlet-api" rev="2.5" conf="build.jsp2.1->default" />
     
-    <dependency org="avalon-logkit" name="avalon-logkit" rev="2.0" conf="build.base->default" />
     <dependency org="org.slf4j" name="slf4j-api" rev="&slf4j.version;" conf="build.base->default" />
-    <dependency org="org.slf4j" name="log4j-over-slf4j" rev="&slf4j.version;" conf="build.base->default" />
-    <dependency org="org.slf4j" name="jcl-over-slf4j" rev="&slf4j.version;" conf="build.base->default" />
-    <dependency org="commons-logging" name="commons-logging" rev="1.1.1" conf="build.base->default" />
     
     <dependency org="org.zeroturnaround" name="javarebel-sdk" rev="1.2.2" conf="build.base->default" />
 
@@ -109,11 +100,11 @@
     
     <!-- test -->
     
-    <!-- Note: Ant doesn't contain junit.jar any more -->
     <dependency org="junit" name="junit" rev="4.12" conf="test->default" />
     <dependency org="org.hamcrest" name="hamcrest-library" rev="1.3" conf="test->default" />
 
-    <dependency org="ch.qos.logback" name="logback-classic" rev="1.1.2" conf="test->default" />
+    <dependency org="ch.qos.logback" name="logback-classic" rev="1.1.8" conf="test->default" />
+    <dependency org="org.slf4j" name="jcl-over-slf4j" rev="&slf4j.version;" conf="test->default" />
 
     <dependency org="commons-io" name="commons-io" rev="2.2" conf="test->default" />
     <dependency org="com.google.guava" name="guava-jdk5" rev="17.0" conf="test->default" />
@@ -153,9 +144,6 @@
     
     <dependency org="org.apache.rat" name="apache-rat-tasks" rev="0.11" conf="rat->default" />
 
-    <!-- As the tests *run* on Ant, so it's a provided dependency there. -->
-    <exclude org="ant" module="ant" conf="run.test" />
-    
     <!-- Ensure that JSP versions don't accidentally hide each-other -->
     
     <conflict org="javax.servlet.jsp" module="jsp-api" manager="strict" />

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/cache/FileTemplateLoader.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/cache/FileTemplateLoader.java b/src/main/java/freemarker/cache/FileTemplateLoader.java
index d14368f..166f128 100644
--- a/src/main/java/freemarker/cache/FileTemplateLoader.java
+++ b/src/main/java/freemarker/cache/FileTemplateLoader.java
@@ -30,7 +30,9 @@ import java.security.PrivilegedAction;
 import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
 
-import freemarker.log.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import freemarker.template.Configuration;
 import freemarker.template.utility.SecurityUtilities;
 import freemarker.template.utility.StringUtil;
@@ -67,7 +69,7 @@ public class FileTemplateLoader implements TemplateLoader {
     private static final int CASE_CHECK_CACHE__SOFT_SIZE = 1000;
     private static final boolean SEP_IS_SLASH = File.separatorChar == '/';
     
-    private static final Logger LOG = Logger.getLogger("freemarker.cache");
+    private static final Logger LOG = LoggerFactory.getLogger("freemarker.cache");
     
     public final File baseDir;
     private final String canonicalBasePath;
@@ -120,6 +122,7 @@ public class FileTemplateLoader implements TemplateLoader {
     throws IOException {
         try {
             Object[] retval = (Object[]) AccessController.doPrivileged(new PrivilegedExceptionAction() {
+                @Override
                 public Object run() throws IOException {
                     if (!baseDir.exists()) {
                         throw new FileNotFoundException(baseDir + " does not exist.");
@@ -153,10 +156,12 @@ public class FileTemplateLoader implements TemplateLoader {
         }
     }
     
+    @Override
     public Object findTemplateSource(final String name)
     throws IOException {
         try {
             return AccessController.doPrivileged(new PrivilegedExceptionAction() {
+                @Override
                 public Object run() throws IOException {
                     File source = new File(baseDir, SEP_IS_SLASH ? name : 
                         name.replace('/', File.separatorChar));
@@ -187,9 +192,11 @@ public class FileTemplateLoader implements TemplateLoader {
         }
     }
     
+    @Override
     public long getLastModified(final Object templateSource) {
         return ((Long) (AccessController.doPrivileged(new PrivilegedAction()
         {
+            @Override
             public Object run() {
                 return Long.valueOf(((File) templateSource).lastModified());
             }
@@ -198,11 +205,13 @@ public class FileTemplateLoader implements TemplateLoader {
         
     }
     
+    @Override
     public Reader getReader(final Object templateSource, final String encoding)
     throws IOException {
         try {
             return (Reader) AccessController.doPrivileged(new PrivilegedExceptionAction()
             {
+                @Override
                 public Object run()
                 throws IOException {
                     if (!(templateSource instanceof File)) {
@@ -255,7 +264,7 @@ public class FileTemplateLoader implements TemplateLoader {
                         if (fileName.equalsIgnoreCase(listingEntry)) {
                             if (LOG.isDebugEnabled()) {
                                 LOG.debug("Emulating file-not-found because of letter case differences to the "
-                                        + "real file, for: " + sourcePath);
+                                        + "real file, for: {}", sourcePath);
                             }
                             return false;
                         }
@@ -270,6 +279,7 @@ public class FileTemplateLoader implements TemplateLoader {
         return true;
     }
 
+    @Override
     public void closeTemplateSource(Object templateSource) {
         // Do nothing.
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/cache/TemplateCache.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/cache/TemplateCache.java b/src/main/java/freemarker/cache/TemplateCache.java
index 4f62d05..fa8df50 100644
--- a/src/main/java/freemarker/cache/TemplateCache.java
+++ b/src/main/java/freemarker/cache/TemplateCache.java
@@ -30,11 +30,13 @@ import java.util.List;
 import java.util.Locale;
 import java.util.StringTokenizer;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import freemarker.cache.MultiTemplateLoader.MultiSource;
 import freemarker.core.BugException;
 import freemarker.core.Environment;
 import freemarker.core.TemplateConfiguration;
-import freemarker.log.Logger;
 import freemarker.template.Configuration;
 import freemarker.template.MalformedTemplateNameException;
 import freemarker.template.Template;
@@ -68,7 +70,7 @@ public class TemplateCache {
     private static final char ASTERISK = '*';
     private static final char SLASH = '/';
     private static final String LOCALE_PART_SEPARATOR = "_";
-    private static final Logger LOG = Logger.getLogger("freemarker.cache");
+    private static final Logger LOG = LoggerFactory.getLogger("freemarker.cache");
 
     /** Maybe {@code null}. */
     private final TemplateLoader templateLoader;
@@ -701,7 +703,9 @@ public class TemplateCache {
                     storage.remove(tk);
                 }
             }
-            LOG.debug(debugName + " was removed from the cache, if it was there");
+            if (debug) {
+                LOG.debug(debugName + " was removed from the cache, if it was there");
+            }
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/cache/WebappTemplateLoader.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/cache/WebappTemplateLoader.java b/src/main/java/freemarker/cache/WebappTemplateLoader.java
index 44c40df..57fb1f4 100644
--- a/src/main/java/freemarker/cache/WebappTemplateLoader.java
+++ b/src/main/java/freemarker/cache/WebappTemplateLoader.java
@@ -30,7 +30,9 @@ import java.net.URL;
 
 import javax.servlet.ServletContext;
 
-import freemarker.log.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import freemarker.template.Configuration;
 import freemarker.template.utility.CollectionUtils;
 import freemarker.template.utility.StringUtil;
@@ -41,7 +43,7 @@ import freemarker.template.utility.StringUtil;
  */
 public class WebappTemplateLoader implements TemplateLoader {
 
-    private static final Logger LOG = Logger.getLogger("freemarker.cache");
+    private static final Logger LOG = LoggerFactory.getLogger("freemarker.cache");
 
     private final ServletContext servletContext;
     private final String subdirPath;
@@ -94,6 +96,7 @@ public class WebappTemplateLoader implements TemplateLoader {
         this.servletContext = servletContext;
     }
 
+    @Override
     public Object findTemplateSource(String name) throws IOException {
         String fullPath = subdirPath + name;
 
@@ -117,13 +120,15 @@ public class WebappTemplateLoader implements TemplateLoader {
         try {
             url = servletContext.getResource(fullPath);
         } catch (MalformedURLException e) {
-            LOG.warn("Could not retrieve resource " + StringUtil.jQuoteNoXSS(fullPath),
-                    e);
+            if (LOG.isWarnEnabled()) {
+                LOG.warn("Could not retrieve resource " + StringUtil.jQuoteNoXSS(fullPath), e);
+            }
             return null;
         }
         return url == null ? null : new URLTemplateSource(url, getURLConnectionUsesCaches());
     }
 
+    @Override
     public long getLastModified(Object templateSource) {
         if (templateSource instanceof File) {
             return ((File) templateSource).lastModified();
@@ -132,6 +137,7 @@ public class WebappTemplateLoader implements TemplateLoader {
         }
     }
 
+    @Override
     public Reader getReader(Object templateSource, String encoding)
             throws IOException {
         if (templateSource instanceof File) {
@@ -145,6 +151,7 @@ public class WebappTemplateLoader implements TemplateLoader {
         }
     }
 
+    @Override
     public void closeTemplateSource(Object templateSource) throws IOException {
         if (templateSource instanceof File) {
             // Do nothing.

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/core/Environment.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/Environment.java b/src/main/java/freemarker/core/Environment.java
index e1cd94f..f8921f4 100644
--- a/src/main/java/freemarker/core/Environment.java
+++ b/src/main/java/freemarker/core/Environment.java
@@ -41,10 +41,12 @@ import java.util.Map;
 import java.util.Set;
 import java.util.TimeZone;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import freemarker.cache.TemplateNameFormat;
 import freemarker.cache._CacheAPI;
-import freemarker.log.Logger;
 import freemarker.template.Configuration;
 import freemarker.template.MalformedTemplateNameException;
 import freemarker.template.ObjectWrapper;
@@ -94,8 +96,8 @@ public final class Environment extends Configurable {
     
     private static final ThreadLocal threadEnv = new ThreadLocal();
 
-    private static final Logger LOG = Logger.getLogger("freemarker.runtime");
-    private static final Logger ATTEMPT_LOGGER = Logger.getLogger("freemarker.runtime.attempt");
+    private static final Logger LOG = LoggerFactory.getLogger("freemarker.runtime");
+    private static final Logger LOG_ATTEMPT = LoggerFactory.getLogger("freemarker.runtime.attempt");
 
     // Do not use this object directly; clone it first! DecimalFormat isn't
     // thread-safe.
@@ -411,11 +413,13 @@ public final class Environment extends Configurable {
         if (outArgs.length > 0) {
             pushLocalContext(new LocalContext() {
 
+                @Override
                 public TemplateModel getLocalVariable(String name) {
                     int index = bodyParameterNames.indexOf(name);
                     return index != -1 ? outArgs[index] : null;
                 }
 
+                @Override
                 public Collection getLocalVariableNames() {
                     return bodyParameterNames;
                 }
@@ -509,8 +513,8 @@ public final class Environment extends Configurable {
             this.out = prevOut;
         }
         if (thrownException != null) {
-            if (ATTEMPT_LOGGER.isDebugEnabled()) {
-                ATTEMPT_LOGGER.debug("Error in attempt block " +
+            if (LOG_ATTEMPT.isDebugEnabled()) {
+                LOG_ATTEMPT.debug("Error in attempt block " +
                         attemptBlock.getStartLocationQuoted(), thrownException);
             }
             try {
@@ -2207,10 +2211,12 @@ public final class Environment extends Configurable {
     public TemplateHashModel getDataModel() {
         final TemplateHashModel result = new TemplateHashModel() {
 
+            @Override
             public boolean isEmpty() {
                 return false;
             }
 
+            @Override
             public TemplateModel get(String key) throws TemplateModelException {
                 TemplateModel value = rootDataModel.get(key);
                 if (value == null) {
@@ -2223,10 +2229,12 @@ public final class Environment extends Configurable {
         if (rootDataModel instanceof TemplateHashModelEx) {
             return new TemplateHashModelEx() {
 
+                @Override
                 public boolean isEmpty() throws TemplateModelException {
                     return result.isEmpty();
                 }
 
+                @Override
                 public TemplateModel get(String key) throws TemplateModelException {
                     return result.get(key);
                 }
@@ -2234,14 +2242,17 @@ public final class Environment extends Configurable {
                 // NB: The methods below do not take into account
                 // configuration shared variables even though
                 // the hash will return them, if only for BWC reasons
+                @Override
                 public TemplateCollectionModel values() throws TemplateModelException {
                     return ((TemplateHashModelEx) rootDataModel).values();
                 }
 
+                @Override
                 public TemplateCollectionModel keys() throws TemplateModelException {
                     return ((TemplateHashModelEx) rootDataModel).keys();
                 }
 
+                @Override
                 public int size() throws TemplateModelException {
                     return ((TemplateHashModelEx) rootDataModel).size();
                 }
@@ -2258,10 +2269,12 @@ public final class Environment extends Configurable {
     public TemplateHashModel getGlobalVariables() {
         return new TemplateHashModel() {
 
+            @Override
             public boolean isEmpty() {
                 return false;
             }
 
+            @Override
             public TemplateModel get(String key) throws TemplateModelException {
                 TemplateModel result = globalNamespace.get(key);
                 if (result == null) {
@@ -2779,6 +2792,7 @@ public final class Environment extends Configurable {
             this.childBuffer = childBuffer;
         }
 
+        @Override
         public void render(Writer newOut) throws TemplateException, IOException {
             Writer prevOut = out;
             out = newOut;

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/core/JavaTemplateDateFormatFactory.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/JavaTemplateDateFormatFactory.java b/src/main/java/freemarker/core/JavaTemplateDateFormatFactory.java
index 286eeff..c8d851f 100644
--- a/src/main/java/freemarker/core/JavaTemplateDateFormatFactory.java
+++ b/src/main/java/freemarker/core/JavaTemplateDateFormatFactory.java
@@ -26,14 +26,16 @@ import java.util.StringTokenizer;
 import java.util.TimeZone;
 import java.util.concurrent.ConcurrentHashMap;
 
-import freemarker.log.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import freemarker.template.TemplateDateModel;
 
 class JavaTemplateDateFormatFactory extends TemplateDateFormatFactory {
     
     static final JavaTemplateDateFormatFactory INSTANCE = new JavaTemplateDateFormatFactory(); 
     
-    private static final Logger LOG = Logger.getLogger("freemarker.runtime");
+    private static final Logger LOG = LoggerFactory.getLogger("freemarker.runtime");
 
     private static final ConcurrentHashMap<CacheKey, DateFormat> GLOBAL_FORMAT_CACHE
             = new ConcurrentHashMap<CacheKey, DateFormat>();
@@ -110,9 +112,9 @@ class JavaTemplateDateFormatFactory extends TemplateDateFormatFactory {
                     }
                 }
                 if (triggered) {
-                    LOG.warn("Global Java DateFormat cache has exceeded " + LEAK_ALERT_NUMBER_FORMAT_CACHE_SIZE
-                            + " entries => cache flushed. "
-                            + "Typical cause: Some template generates high variety of format pattern strings.");
+                    LOG.warn("Global Java DateFormat cache has exceeded {} entries => cache flushed. "
+                            + "Typical cause: Some template generates high variety of format pattern strings.",
+                            LEAK_ALERT_NUMBER_FORMAT_CACHE_SIZE);
                 }
             }
             

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/core/JavaTemplateNumberFormatFactory.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/JavaTemplateNumberFormatFactory.java b/src/main/java/freemarker/core/JavaTemplateNumberFormatFactory.java
index 330d4f6..ec8db4b 100644
--- a/src/main/java/freemarker/core/JavaTemplateNumberFormatFactory.java
+++ b/src/main/java/freemarker/core/JavaTemplateNumberFormatFactory.java
@@ -23,7 +23,8 @@ import java.text.ParseException;
 import java.util.Locale;
 import java.util.concurrent.ConcurrentHashMap;
 
-import freemarker.log.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Deals with {@link TemplateNumberFormat}-s that just wrap a Java {@link NumberFormat}.
@@ -32,7 +33,7 @@ class JavaTemplateNumberFormatFactory extends TemplateNumberFormatFactory {
     
     static final JavaTemplateNumberFormatFactory INSTANCE = new JavaTemplateNumberFormatFactory();
     
-    private static final Logger LOG = Logger.getLogger("freemarker.runtime");
+    private static final Logger LOG = LoggerFactory.getLogger("freemarker.runtime");
 
     private static final ConcurrentHashMap<CacheKey, NumberFormat> GLOBAL_FORMAT_CACHE
             = new ConcurrentHashMap<CacheKey, NumberFormat>();
@@ -75,9 +76,9 @@ class JavaTemplateNumberFormatFactory extends TemplateNumberFormatFactory {
                     }
                 }
                 if (triggered) {
-                    LOG.warn("Global Java NumberFormat cache has exceeded " + LEAK_ALERT_NUMBER_FORMAT_CACHE_SIZE
-                            + " entries => cache flushed. "
-                            + "Typical cause: Some template generates high variety of format pattern strings.");
+                    LOG.warn("Global Java NumberFormat cache has exceeded {} entries => cache flushed. "
+                            + "Typical cause: Some template generates high variety of format pattern strings.",
+                            LEAK_ALERT_NUMBER_FORMAT_CACHE_SIZE);
                 }
             }
             

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/core/RegexpHelper.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/RegexpHelper.java b/src/main/java/freemarker/core/RegexpHelper.java
index 3743b23..30d4dcf 100644
--- a/src/main/java/freemarker/core/RegexpHelper.java
+++ b/src/main/java/freemarker/core/RegexpHelper.java
@@ -22,8 +22,10 @@ package freemarker.core;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import freemarker.cache.MruCacheStorage;
-import freemarker.log.Logger;
 import freemarker.template.TemplateModelException;
 import freemarker.template.utility.StringUtil;
 
@@ -32,7 +34,7 @@ import freemarker.template.utility.StringUtil;
  */
 final class RegexpHelper {
 
-    private static final Logger LOG = Logger.getLogger("freemarker.runtime");
+    private static final Logger LOG = LoggerFactory.getLogger("freemarker.runtime");
     
     private static volatile boolean flagWarningsEnabled = LOG.isWarnEnabled();
     private static final int MAX_FLAG_WARNINGS_LOGGED = 25;
@@ -141,6 +143,7 @@ final class RegexpHelper {
                     break;
                 default:
                     if (flagWarningsEnabled) {
+                        // [FM3] Should be an error
                         RegexpHelper.logFlagWarning(
                                 "Unrecognized regular expression flag: "
                                 + StringUtil.jQuote(String.valueOf(c)) + ".");

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/core/_ErrorDescriptionBuilder.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/_ErrorDescriptionBuilder.java b/src/main/java/freemarker/core/_ErrorDescriptionBuilder.java
index 9249f20..0900aa1 100644
--- a/src/main/java/freemarker/core/_ErrorDescriptionBuilder.java
+++ b/src/main/java/freemarker/core/_ErrorDescriptionBuilder.java
@@ -23,8 +23,10 @@ import java.lang.reflect.Constructor;
 import java.lang.reflect.Member;
 import java.lang.reflect.Method;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import freemarker.ext.beans._MethodUtil;
-import freemarker.log.Logger;
 import freemarker.template.Configuration;
 import freemarker.template.Template;
 import freemarker.template.utility.ClassUtil;
@@ -38,7 +40,7 @@ import freemarker.template.utility.StringUtil;
  */
 public class _ErrorDescriptionBuilder {
 
-    private static final Logger LOG = Logger.getLogger("freemarker.runtime");
+    private static final Logger LOG = LoggerFactory.getLogger("freemarker.runtime");
 
     private final String description;
     private final Object[] descriptionParts;

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/core/_JavaVersions.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/_JavaVersions.java b/src/main/java/freemarker/core/_JavaVersions.java
index 244862d..8d6295f 100644
--- a/src/main/java/freemarker/core/_JavaVersions.java
+++ b/src/main/java/freemarker/core/_JavaVersions.java
@@ -18,7 +18,8 @@
  */
 package freemarker.core;
 
-import freemarker.log.Logger;
+import org.slf4j.LoggerFactory;
+
 import freemarker.template.Version;
 import freemarker.template.utility.SecurityUtilities;
 
@@ -62,7 +63,7 @@ public final class _JavaVersions {
                 java6 = (_Java6) Class.forName("freemarker.core._Java6Impl").getField("INSTANCE").get(null);
             } catch (Exception e) {
                 try {
-                    Logger.getLogger("freemarker.runtime").error("Failed to access Java 6 functionality", e);
+                    LoggerFactory.getLogger("freemarker.runtime").error("Failed to access Java 6 functionality", e);
                 } catch (Exception e2) {
                     // Suppressed
                 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/debug/impl/DebuggerServer.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/debug/impl/DebuggerServer.java b/src/main/java/freemarker/debug/impl/DebuggerServer.java
index fc6f777..fa7a2ad 100644
--- a/src/main/java/freemarker/debug/impl/DebuggerServer.java
+++ b/src/main/java/freemarker/debug/impl/DebuggerServer.java
@@ -31,16 +31,19 @@ import java.security.SecureRandom;
 import java.util.Arrays;
 import java.util.Random;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import freemarker.debug.Debugger;
-import freemarker.log.Logger;
 import freemarker.template.utility.SecurityUtilities;
 import freemarker.template.utility.UndeclaredThrowableException;
 
 /**
  */
 class DebuggerServer {
-    private static final Logger LOG = Logger.getLogger("freemarker.debug.server");
+    private static final Logger LOG = LoggerFactory.getLogger("freemarker.debug.server");
     // TODO: Eventually replace with Yarrow    
+    // TODO: Can be extremely slow (on Linux, not enough entropy)
     private static final Random R = new SecureRandom();
     
     private final byte[] password;
@@ -62,6 +65,7 @@ class DebuggerServer {
     public void start() {
         new Thread(new Runnable()
         {
+            @Override
             public void run() {
                 startInternal();
             }
@@ -87,6 +91,7 @@ class DebuggerServer {
             this.s = s;
         }
         
+        @Override
         public void run() {
             try {
                 ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
@@ -105,7 +110,7 @@ class DebuggerServer {
                     out.writeObject(null);
                 }
             } catch (Exception e) {
-                LOG.warn("Connection to " + s.getInetAddress().getHostAddress() + " abruply broke", e);
+                LOG.warn("Connection to {} abruply broke", s.getInetAddress().getHostAddress(), e);
             }
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/debug/impl/RmiDebuggerListenerImpl.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/debug/impl/RmiDebuggerListenerImpl.java b/src/main/java/freemarker/debug/impl/RmiDebuggerListenerImpl.java
index dcb5cd1..da65308 100644
--- a/src/main/java/freemarker/debug/impl/RmiDebuggerListenerImpl.java
+++ b/src/main/java/freemarker/debug/impl/RmiDebuggerListenerImpl.java
@@ -24,10 +24,12 @@ import java.rmi.RemoteException;
 import java.rmi.server.UnicastRemoteObject;
 import java.rmi.server.Unreferenced;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import freemarker.debug.DebuggerClient;
 import freemarker.debug.DebuggerListener;
 import freemarker.debug.EnvironmentSuspendedEvent;
-import freemarker.log.Logger;
 
 /**
  * Used by the {@link DebuggerClient} to create local 
@@ -37,13 +39,14 @@ extends
     UnicastRemoteObject
 implements
     DebuggerListener, Unreferenced {
-    private static final Logger LOG = Logger.getLogger(
+    private static final Logger LOG = LoggerFactory.getLogger(
             "freemarker.debug.client");
     
     private static final long serialVersionUID = 1L;
 
     private final DebuggerListener listener;
 
+    @Override
     public void unreferenced() {
         try {
             UnicastRemoteObject.unexportObject(this, false);
@@ -57,6 +60,7 @@ implements
         this.listener = listener;
     }
 
+    @Override
     public void environmentSuspended(EnvironmentSuspendedEvent e) 
     throws RemoteException {
         listener.environmentSuspended(e);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/ext/beans/BeanModel.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/ext/beans/BeanModel.java b/src/main/java/freemarker/ext/beans/BeanModel.java
index 24f8590..9ccdfc0 100644
--- a/src/main/java/freemarker/ext/beans/BeanModel.java
+++ b/src/main/java/freemarker/ext/beans/BeanModel.java
@@ -32,13 +32,15 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import freemarker.core.CollectionAndSequence;
 import freemarker.core._DelayedFTLTypeDescription;
 import freemarker.core._DelayedJQuote;
 import freemarker.core._TemplateModelException;
 import freemarker.ext.util.ModelFactory;
 import freemarker.ext.util.WrapperTemplateModel;
-import freemarker.log.Logger;
 import freemarker.template.AdapterTemplateModel;
 import freemarker.template.ObjectWrapper;
 import freemarker.template.SimpleScalar;
@@ -65,7 +67,9 @@ import freemarker.template.utility.StringUtil;
 public class BeanModel
 implements
     TemplateHashModelEx, AdapterTemplateModel, WrapperTemplateModel, TemplateModelWithAPISupport {
-    private static final Logger LOG = Logger.getLogger("freemarker.beans");
+    
+    private static final Logger LOG = LoggerFactory.getLogger("freemarker.beans");
+    
     protected final Object object;
     protected final BeansWrapper wrapper;
     
@@ -75,6 +79,7 @@ implements
     static final ModelFactory FACTORY =
         new ModelFactory()
         {
+            @Override
             public TemplateModel create(Object object, ObjectWrapper wrapper) {
                 return new BeanModel(object, (BeansWrapper) wrapper);
             }
@@ -140,6 +145,7 @@ implements
      * @throws TemplateModelException if there was no property nor method nor
      * a generic <tt>get</tt> method to invoke.
      */
+    @Override
     public TemplateModel get(String key)
         throws TemplateModelException {
         Class<?> clazz = object.getClass();
@@ -174,7 +180,7 @@ implements
             if (retval == UNKNOWN) {
                 if (wrapper.isStrict()) {
                     throw new InvalidPropertyException("No such bean property: " + key);
-                } else if (LOG.isDebugEnabled()) {
+                } else {
                     logNoSuchKey(key, classInfo);
                 }
                 retval = wrapper.wrap(null);
@@ -192,9 +198,11 @@ implements
     }
 
     private void logNoSuchKey(String key, Map<?, ?> keyMap) {
-        LOG.debug("Key " + StringUtil.jQuoteNoXSS(key) + " was not found on instance of " + 
-            object.getClass().getName() + ". Introspection information for " +
-            "the class is: " + keyMap);
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Key " + StringUtil.jQuoteNoXSS(key) + " was not found on instance of " + 
+                object.getClass().getName() + ". Introspection information for " +
+                "the class is: " + keyMap);
+        }
     }
     
     /**
@@ -282,6 +290,7 @@ implements
      * Tells whether the model is empty. It is empty if either the wrapped 
      * object is null, or it's a Boolean with false value.
      */
+    @Override
     public boolean isEmpty() {
         if (object instanceof String) {
             return ((String) object).length() == 0;
@@ -302,22 +311,27 @@ implements
      * Returns the same as {@link #getWrappedObject()}; to ensure that, this method will be final starting from 2.4.
      * This behavior of {@link BeanModel} is assumed by some FreeMarker code. 
      */
+    @Override
     public Object getAdaptedObject(Class<?> hint) {
         return object;  // return getWrappedObject(); starting from 2.4
     }
 
+    @Override
     public Object getWrappedObject() {
         return object;
     }
     
+    @Override
     public int size() {
         return wrapper.getClassIntrospector().keyCount(object.getClass());
     }
 
+    @Override
     public TemplateCollectionModel keys() {
         return new CollectionAndSequence(new SimpleSequence(keySet(), wrapper));
     }
 
+    @Override
     public TemplateCollectionModel values() throws TemplateModelException {
         List<Object> values = new ArrayList<Object>(size());
         TemplateModelIterator it = keys().iterator();
@@ -359,6 +373,7 @@ implements
         return wrapper.getClassIntrospector().keySet(object.getClass());
     }
 
+    @Override
     public TemplateModel getAPI() throws TemplateModelException {
         return wrapper.wrapAsAPI(object);
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/ext/beans/BeansWrapper.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/ext/beans/BeansWrapper.java b/src/main/java/freemarker/ext/beans/BeansWrapper.java
index 28da1e4..0dd3e24 100644
--- a/src/main/java/freemarker/ext/beans/BeansWrapper.java
+++ b/src/main/java/freemarker/ext/beans/BeansWrapper.java
@@ -38,6 +38,9 @@ import java.util.Map;
 import java.util.ResourceBundle;
 import java.util.Set;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import freemarker.core.BugException;
 import freemarker.core._DelayedFTLTypeDescription;
 import freemarker.core._DelayedShortClassName;
@@ -45,7 +48,6 @@ import freemarker.core._TemplateModelException;
 import freemarker.ext.util.ModelCache;
 import freemarker.ext.util.ModelFactory;
 import freemarker.ext.util.WrapperTemplateModel;
-import freemarker.log.Logger;
 import freemarker.template.AdapterTemplateModel;
 import freemarker.template.Configuration;
 import freemarker.template.DefaultObjectWrapper;
@@ -85,7 +87,7 @@ import freemarker.template.utility.WriteProtectable;
  * published and then left unmodified. Using {@link BeansWrapperBuilder} also guarantees thread safety.
  */
 public class BeansWrapper implements RichObjectWrapper, WriteProtectable {
-    private static final Logger LOG = Logger.getLogger("freemarker.beans");
+    private static final Logger LOG = LoggerFactory.getLogger("freemarker.beans");
 
     /**
      * @deprecated Use {@link ObjectWrapperAndUnwrapper#CANT_UNWRAP_TO_TARGET_CLASS} instead. It's not a public field
@@ -302,9 +304,9 @@ public class BeansWrapper implements RichObjectWrapper, WriteProtectable {
                 }
             } catch (Throwable e) {
                 // The security manager sometimes doesn't allow this
-                LOG.info("Failed to check if finetuneMethodAppearance is overidden in " + thisClass.getName()
+                LOG.info("Failed to check if finetuneMethodAppearance is overidden in {}"
                         + "; acting like if it was, but this way it won't utilize the shared class introspection "
-                        + "cache.",
+                        + "cache.", thisClass.getName(),
                         e);
                 overridden = true;
                 testFailed = true;
@@ -318,6 +320,7 @@ public class BeansWrapper implements RichObjectWrapper, WriteProtectable {
                 bwConf = (BeansWrapperConfiguration) bwConf.clone(false);
                 bwConf.setMethodAppearanceFineTuner(new MethodAppearanceFineTuner() {
 
+                    @Override
                     public void process(
                             MethodAppearanceDecisionInput in, MethodAppearanceDecision out) {
                         BeansWrapper.this.finetuneMethodAppearance(in.getContainingClass(), in.getMethod(), out);
@@ -389,6 +392,7 @@ public class BeansWrapper implements RichObjectWrapper, WriteProtectable {
      * 
      * @since 2.3.21
      */
+    @Override
     public void writeProtect() {
         writeProtected = true;
     }
@@ -396,6 +400,7 @@ public class BeansWrapper implements RichObjectWrapper, WriteProtectable {
     /**
      * @since 2.3.21
      */
+    @Override
     public boolean isWriteProtected() {
         return writeProtected;
     }
@@ -855,6 +860,7 @@ public class BeansWrapper implements RichObjectWrapper, WriteProtectable {
      * <li>otherwise, returns a generic {@link StringModel} for it.
      * </ul>
      */
+    @Override
     public TemplateModel wrap(Object object) throws TemplateModelException {
         if (object == null) return nullModel;
         return modelCache.getInstance(object);
@@ -881,6 +887,7 @@ public class BeansWrapper implements RichObjectWrapper, WriteProtectable {
     /**
      * @since 2.3.22
      */
+    @Override
     public TemplateHashModel wrapAsAPI(Object obj) throws TemplateModelException {
         return new APIModel(obj, this);
     }
@@ -898,18 +905,21 @@ public class BeansWrapper implements RichObjectWrapper, WriteProtectable {
     }
 
     private final ModelFactory BOOLEAN_FACTORY = new ModelFactory() {
+        @Override
         public TemplateModel create(Object object, ObjectWrapper wrapper) {
             return ((Boolean) object).booleanValue() ? trueModel : falseModel; 
         }
     };
 
     private static final ModelFactory ITERATOR_FACTORY = new ModelFactory() {
+        @Override
         public TemplateModel create(Object object, ObjectWrapper wrapper) {
             return new IteratorModel((Iterator<?>) object, (BeansWrapper) wrapper); 
         }
     };
 
     private static final ModelFactory ENUMERATION_FACTORY = new ModelFactory() {
+        @Override
         public TemplateModel create(Object object, ObjectWrapper wrapper) {
             return new EnumerationModel((Enumeration<?>) object, (BeansWrapper) wrapper); 
         }
@@ -959,6 +969,7 @@ public class BeansWrapper implements RichObjectWrapper, WriteProtectable {
      * returned unchanged.
      * @throws TemplateModelException if an attempted unwrapping fails.
      */
+    @Override
     public Object unwrap(TemplateModel model) throws TemplateModelException {
         return unwrap(model, Object.class);
     }
@@ -989,6 +1000,7 @@ public class BeansWrapper implements RichObjectWrapper, WriteProtectable {
     /**
      * @since 2.3.22
      */
+    @Override
     public Object tryUnwrapTo(TemplateModel model, Class<?> targetClass) throws TemplateModelException {
         return tryUnwrapTo(model, targetClass, 0);
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/ext/beans/ClassIntrospector.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/ext/beans/ClassIntrospector.java b/src/main/java/freemarker/ext/beans/ClassIntrospector.java
index 7c08e49..fb9664f 100644
--- a/src/main/java/freemarker/ext/beans/ClassIntrospector.java
+++ b/src/main/java/freemarker/ext/beans/ClassIntrospector.java
@@ -44,11 +44,13 @@ import java.util.Map.Entry;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import freemarker.core.BugException;
 import freemarker.ext.beans.BeansWrapper.MethodAppearanceDecision;
 import freemarker.ext.beans.BeansWrapper.MethodAppearanceDecisionInput;
 import freemarker.ext.util.ModelCache;
-import freemarker.log.Logger;
 import freemarker.template.utility.NullArgumentException;
 import freemarker.template.utility.SecurityUtilities;
 
@@ -67,7 +69,7 @@ class ClassIntrospector {
     // these are shared by many object wrappers, and concurrency related glitches due to user errors must remain
     // local to the object wrappers, not corrupting the shared ClassIntrospector.
 
-    private static final Logger LOG = Logger.getLogger("freemarker.beans");
+    private static final Logger LOG = LoggerFactory.getLogger("freemarker.beans");
 
     private static final String JREBEL_SDK_CLASS_NAME = "org.zeroturnaround.javarebel.ClassEventListener";
     private static final String JREBEL_INTEGRATION_ERROR_MSG
@@ -280,7 +282,7 @@ class ClassIntrospector {
             try {
                 addBeanInfoToClassIntrospectionData(introspData, clazz, accessibleMethods);
             } catch (IntrospectionException e) {
-                LOG.warn("Couldn't properly perform introspection for class " + clazz, e);
+                LOG.warn("Couldn't properly perform introspection for class {}", clazz.getName(), e);
                 introspData.clear(); // FIXME NBC: Don't drop everything here.
             }
         }
@@ -396,10 +398,9 @@ class ClassIntrospector {
                     introspData.put(ipd.getName(), ipd);
                     getArgTypesByMethod(introspData).put(publicReadMethod, publicReadMethod.getParameterTypes());
                 } catch (IntrospectionException e) {
-                    LOG.warn("Failed creating a publicly-accessible " +
-                            "property descriptor for " + clazz.getName() +
-                            " indexed property " + pd.getName() +
-                            ", read method " + publicReadMethod,
+                    LOG.warn("Failed creating a publicly-accessible property descriptor "
+                            + "for {} indexed property {}, read method {}",
+                            clazz.getName(), pd.getName(), publicReadMethod,
                             e);
                 }
             }
@@ -414,10 +415,10 @@ class ClassIntrospector {
                     }
                     introspData.put(pd.getName(), pd);
                 } catch (IntrospectionException e) {
-                    LOG.warn("Failed creating a publicly-accessible " +
-                            "property descriptor for " + clazz.getName() +
-                            " property " + pd.getName() + ", read method " +
-                            publicReadMethod, e);
+                    LOG.warn("Failed creating a publicly-accessible property descriptor "
+                            + "for {} property {}, read method {}",
+                            clazz.getName(), pd.getName(), publicReadMethod,
+                            e);
                 }
             }
         }
@@ -451,7 +452,7 @@ class ClassIntrospector {
                 introspData.put(CONSTRUCTORS_KEY, overloadedCtors);
             }
         } catch (SecurityException e) {
-            LOG.warn("Can't discover constructors for class " + clazz.getName(), e);
+            LOG.warn("Can't discover constructors for class {}", clazz.getName(), e);
         }
     }
 
@@ -494,9 +495,8 @@ class ClassIntrospector {
                 }
                 return;
             } catch (SecurityException e) {
-                LOG.warn("Could not discover accessible methods of class " +
-                        clazz.getName() +
-                        ", attemping superclasses/interfaces.", e);
+                LOG.warn("Could not discover accessible methods of class {}, attemping superclasses/interfaces.",
+                        clazz.getName(), e);
                 // Fall through and attempt to discover superclass/interface methods
             }
         }
@@ -672,12 +672,10 @@ class ClassIntrospector {
         // some classes are often reloaded or multiple versions of the
         // same class is normal (OSGi), this will drop the cache contents
         // too often.
-        if (LOG.isInfoEnabled()) {
-            LOG.info(
-                    "Detected multiple classes with the same name, \"" + className +
-                            "\". Assuming it was a class-reloading. Clearing class introspection " +
-                            "caches to release old data.");
-        }
+        LOG.info(
+                "Detected multiple classes with the same name, \"{}\". "
+                + "Assuming it was a class-reloading. Clearing class introspection caches to release old data.",
+                className);
         forcedClearCache();
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/ext/beans/StaticModel.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/ext/beans/StaticModel.java b/src/main/java/freemarker/ext/beans/StaticModel.java
index e55f3c2..5c11719 100644
--- a/src/main/java/freemarker/ext/beans/StaticModel.java
+++ b/src/main/java/freemarker/ext/beans/StaticModel.java
@@ -26,7 +26,9 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 
-import freemarker.log.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import freemarker.template.TemplateCollectionModel;
 import freemarker.template.TemplateHashModelEx;
 import freemarker.template.TemplateModel;
@@ -41,7 +43,8 @@ import freemarker.template.TemplateModelException;
  * calls of static methods, similar to that in {@link BeanModel}.
  */
 final class StaticModel implements TemplateHashModelEx {
-    private static final Logger LOG = Logger.getLogger("freemarker.beans");
+    private static final Logger LOG = LoggerFactory.getLogger("freemarker.beans");
+    
     private final Class clazz;
     private final BeansWrapper wrapper;
     private final Map map = new HashMap();
@@ -56,6 +59,7 @@ final class StaticModel implements TemplateHashModelEx {
      * Returns the field or method named by the <tt>key</tt>
      * parameter.
      */
+    @Override
     public TemplateModel get(String key) throws TemplateModelException {
         Object model = map.get(key);
         // Simple method, overloaded method or final field -- these have cached 
@@ -80,18 +84,22 @@ final class StaticModel implements TemplateHashModelEx {
      * Returns true if there is at least one public static
      * field or method in the underlying class.
      */
+    @Override
     public boolean isEmpty() {
         return map.isEmpty();
     }
 
+    @Override
     public int size() {
         return map.size();
     }
     
+    @Override
     public TemplateCollectionModel keys() throws TemplateModelException {
         return (TemplateCollectionModel) wrapper.getOuterIdentity().wrap(map.keySet());
     }
     
+    @Override
     public TemplateCollectionModel values() throws TemplateModelException {
         return (TemplateCollectionModel) wrapper.getOuterIdentity().wrap(map.values());
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/ext/dom/NodeListModel.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/ext/dom/NodeListModel.java b/src/main/java/freemarker/ext/dom/NodeListModel.java
index 1a97e37..676e2ec 100644
--- a/src/main/java/freemarker/ext/dom/NodeListModel.java
+++ b/src/main/java/freemarker/ext/dom/NodeListModel.java
@@ -58,6 +58,7 @@ class NodeListModel extends SimpleSequence implements TemplateHashModel, _Unexpe
     XPathSupport xpathSupport;
     
     private static ObjectWrapper nodeWrapper = new ObjectWrapper() {
+        @Override
         public TemplateModel wrap(Object obj) {
             if (obj instanceof NodeModel) {
                 return (NodeModel) obj;
@@ -114,10 +115,12 @@ class NodeListModel extends SimpleSequence implements TemplateHashModel, _Unexpe
         return result;
     }
     
+    @Override
     public boolean isEmpty() {
         return size() == 0;
     }
     
+    @Override
     public TemplateModel get(String key) throws TemplateModelException {
         if (size() == 1) {
             NodeModel nm = (NodeModel) get(0);
@@ -200,6 +203,7 @@ class NodeListModel extends SimpleSequence implements TemplateHashModel, _Unexpe
         return xpathSupport;
     }
 
+    @Override
     public Object[] explainTypeError(Class[] expectedClasses) {
         for (int i = 0; i < expectedClasses.length; i++) {
             Class expectedClass = expectedClasses[i];

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/ext/dom/NodeModel.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/ext/dom/NodeModel.java b/src/main/java/freemarker/ext/dom/NodeModel.java
index b5b0ebe..1cff441 100644
--- a/src/main/java/freemarker/ext/dom/NodeModel.java
+++ b/src/main/java/freemarker/ext/dom/NodeModel.java
@@ -34,6 +34,8 @@ import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.w3c.dom.Attr;
 import org.w3c.dom.CDATASection;
 import org.w3c.dom.CharacterData;
@@ -50,7 +52,6 @@ import org.xml.sax.SAXException;
 
 import freemarker.core._UnexpectedTypeErrorExplainerTemplateModel;
 import freemarker.ext.util.WrapperTemplateModel;
-import freemarker.log.Logger;
 import freemarker.template.AdapterTemplateModel;
 import freemarker.template.Configuration;
 import freemarker.template.DefaultObjectWrapper;
@@ -86,7 +87,7 @@ abstract public class NodeModel
 implements TemplateNodeModelEx, TemplateHashModel, TemplateSequenceModel,
     AdapterTemplateModel, WrapperTemplateModel, _UnexpectedTypeErrorExplainerTemplateModel {
 
-    static private final Logger LOG = Logger.getLogger("freemarker.dom");
+    static private final Logger LOG = LoggerFactory.getLogger("freemarker.dom");
 
     private static final Object STATIC_LOCK = new Object();
     
@@ -297,6 +298,7 @@ implements TemplateNodeModelEx, TemplateHashModel, TemplateSequenceModel,
         return node;
     }
     
+    @Override
     public TemplateModel get(String key) throws TemplateModelException {
         if (key.startsWith("@@")) {
             if (key.equals(AtAtKey.TEXT.getKey())) {
@@ -344,6 +346,7 @@ implements TemplateNodeModelEx, TemplateHashModel, TemplateSequenceModel,
         }
     }
     
+    @Override
     public TemplateNodeModel getParentNode() {
         if (parent == null) {
             Node parentNode = node.getParentNode();
@@ -357,14 +360,17 @@ implements TemplateNodeModelEx, TemplateHashModel, TemplateSequenceModel,
         return parent;
     }
 
+    @Override
     public TemplateNodeModelEx getPreviousSibling() throws TemplateModelException {
         return wrap(node.getPreviousSibling());
     }
 
+    @Override
     public TemplateNodeModelEx getNextSibling() throws TemplateModelException {
         return wrap(node.getNextSibling());
     }
 
+    @Override
     public TemplateSequenceModel getChildNodes() {
         if (children == null) {
             children = new NodeListModel(node.getChildNodes(), this);
@@ -372,6 +378,7 @@ implements TemplateNodeModelEx, TemplateHashModel, TemplateSequenceModel,
         return children;
     }
     
+    @Override
     public final String getNodeType() throws TemplateModelException {
         short nodeType = node.getNodeType();
         switch (nodeType) {
@@ -407,14 +414,17 @@ implements TemplateNodeModelEx, TemplateHashModel, TemplateSequenceModel,
     /**
      * Always returns 1.
      */
+    @Override
     public final int size() {
         return 1;
     }
     
+    @Override
     public final TemplateModel get(int i) {
         return i == 0 ? this : null;
     }
     
+    @Override
     public String getNodeNamespace() {
         int nodeType = node.getNodeType();
         if (nodeType != Node.ATTRIBUTE_NODE && nodeType != Node.ELEMENT_NODE) { 
@@ -750,14 +760,17 @@ implements TemplateNodeModelEx, TemplateHashModel, TemplateSequenceModel,
         return getNodeName();
     }
     
+    @Override
     public Object getAdaptedObject(Class hint) {
         return node;
     }
     
+    @Override
     public Object getWrappedObject() {
         return node;
     }
     
+    @Override
     public Object[] explainTypeError(Class[] expectedClasses) {
         for (int i = 0; i < expectedClasses.length; i++) {
             Class expectedClass = expectedClasses[i];

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/ext/jsp/EventForwarding.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/ext/jsp/EventForwarding.java b/src/main/java/freemarker/ext/jsp/EventForwarding.java
index cb617cf..d4b124f 100644
--- a/src/main/java/freemarker/ext/jsp/EventForwarding.java
+++ b/src/main/java/freemarker/ext/jsp/EventForwarding.java
@@ -34,7 +34,8 @@ import javax.servlet.http.HttpSessionBindingEvent;
 import javax.servlet.http.HttpSessionEvent;
 import javax.servlet.http.HttpSessionListener;
 
-import freemarker.log.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * An instance of this class should be registered as a <tt>&lt;listener&gt;</tt> in
@@ -47,7 +48,7 @@ public class EventForwarding
         ServletContextListener,
         HttpSessionListener,
         HttpSessionAttributeListener {
-    private static final Logger LOG = Logger.getLogger("freemarker.jsp");
+    private static final Logger LOG = LoggerFactory.getLogger("freemarker.jsp");
     
     private static final String ATTR_NAME = EventForwarding.class.getName();
     
@@ -81,10 +82,8 @@ public class EventForwarding
             added = true;
         }
         if (!added) {
-            LOG.warn(
-                "Listener of class " + listener.getClass().getName() +
-                "wasn't registered as it doesn't implement any of the " +
-                "recognized listener interfaces.");
+            LOG.warn("Listener of class {} wasn't registered as it doesn't implement any of the recognized listener "
+                    + "interfaces.", listener.getClass().getName());
         }
     }
 
@@ -97,6 +96,7 @@ public class EventForwarding
         }
     }
     
+    @Override
     public void attributeAdded(ServletContextAttributeEvent arg0) {
         synchronized (servletContextAttributeListeners) {
             int s = servletContextAttributeListeners.size();
@@ -106,6 +106,7 @@ public class EventForwarding
         }
     }
 
+    @Override
     public void attributeRemoved(ServletContextAttributeEvent arg0) {
         synchronized (servletContextAttributeListeners) {
             int s = servletContextAttributeListeners.size();
@@ -115,6 +116,7 @@ public class EventForwarding
         }
     }
 
+    @Override
     public void attributeReplaced(ServletContextAttributeEvent arg0) {
         synchronized (servletContextAttributeListeners) {
             int s = servletContextAttributeListeners.size();
@@ -124,6 +126,7 @@ public class EventForwarding
         }
     }
 
+    @Override
     public void contextInitialized(ServletContextEvent arg0) {
         arg0.getServletContext().setAttribute(ATTR_NAME, this);
         
@@ -135,6 +138,7 @@ public class EventForwarding
         }
     }
 
+    @Override
     public void contextDestroyed(ServletContextEvent arg0) {
         synchronized (servletContextListeners) {
             int s = servletContextListeners.size();
@@ -144,6 +148,7 @@ public class EventForwarding
         }
     }
 
+    @Override
     public void sessionCreated(HttpSessionEvent arg0) {
         synchronized (httpSessionListeners) {
             int s = httpSessionListeners.size();
@@ -153,6 +158,7 @@ public class EventForwarding
         }
     }
 
+    @Override
     public void sessionDestroyed(HttpSessionEvent arg0) {
         synchronized (httpSessionListeners) {
             int s = httpSessionListeners.size();
@@ -162,6 +168,7 @@ public class EventForwarding
         }
     }
 
+    @Override
     public void attributeAdded(HttpSessionBindingEvent arg0) {
         synchronized (httpSessionAttributeListeners) {
             int s = httpSessionAttributeListeners.size();
@@ -171,6 +178,7 @@ public class EventForwarding
         }
     }
 
+    @Override
     public void attributeRemoved(HttpSessionBindingEvent arg0) {
         synchronized (httpSessionAttributeListeners) {
             int s = httpSessionAttributeListeners.size();
@@ -180,6 +188,7 @@ public class EventForwarding
         }
     }
 
+    @Override
     public void attributeReplaced(HttpSessionBindingEvent arg0) {
         synchronized (httpSessionAttributeListeners) {
             int s = httpSessionAttributeListeners.size();

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java b/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java
index 63077b3..5a24869 100644
--- a/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java
+++ b/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java
@@ -40,13 +40,15 @@ import javax.servlet.jsp.JspApplicationContext;
 import javax.servlet.jsp.el.ImplicitObjectELResolver;
 import javax.servlet.jsp.el.ScopedAttributeELResolver;
 
-import freemarker.log.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import freemarker.template.utility.ClassUtil;
 
 /**
  */
 class FreeMarkerJspApplicationContext implements JspApplicationContext {
-    private static final Logger LOG = Logger.getLogger("freemarker.jsp");
+    private static final Logger LOG = LoggerFactory.getLogger("freemarker.jsp");
     private static final ExpressionFactory expressionFactoryImpl = findExpressionFactoryImplementation();
     
     private final LinkedList listeners = new LinkedList();
@@ -63,6 +65,7 @@ class FreeMarkerJspApplicationContext implements JspApplicationContext {
         elResolver.add(new ScopedAttributeELResolver());
     }
     
+    @Override
     public void addELContextListener(ELContextListener listener) {
         synchronized (listeners) {
             listeners.addLast(listener);
@@ -74,8 +77,7 @@ class FreeMarkerJspApplicationContext implements JspApplicationContext {
         if (ef == null) {
             ef = tryExpressionFactoryImplementation("org.apache");
             if (ef == null) {
-                LOG.warn("Could not find any implementation for " + 
-                        ExpressionFactory.class.getName());
+                LOG.warn("Could not find any implementation for {}", ExpressionFactory.class.getName());
             }
         }
         return ef;
@@ -86,23 +88,24 @@ class FreeMarkerJspApplicationContext implements JspApplicationContext {
         try {
             Class cl = ClassUtil.forName(className);
             if (ExpressionFactory.class.isAssignableFrom(cl)) {
-                LOG.info("Using " + className + " as implementation of " + 
-                        ExpressionFactory.class.getName());
+                LOG.info("Using {} as implementation of {}", className, ExpressionFactory.class.getName());
                 return (ExpressionFactory) cl.newInstance();
             }
-            LOG.warn("Class " + className + " does not implement " + 
-                    ExpressionFactory.class.getName());
+            LOG.warn("Class {} does not implement {}", className, ExpressionFactory.class.getName());
         } catch (ClassNotFoundException e) {
+            // skip
         } catch (Exception e) {
-            LOG.error("Failed to instantiate " + className, e);
+            LOG.error("Failed to instantiate {}", className, e);
         }
         return null;
     }
 
+    @Override
     public void addELResolver(ELResolver resolver) {
         additionalResolvers.add(resolver);
     }
 
+    @Override
     public ExpressionFactory getExpressionFactory() {
         return expressionFactoryImpl;
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/ext/jsp/TagTransformModel.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/ext/jsp/TagTransformModel.java b/src/main/java/freemarker/ext/jsp/TagTransformModel.java
index a69d5ec..8ff7fc1 100644
--- a/src/main/java/freemarker/ext/jsp/TagTransformModel.java
+++ b/src/main/java/freemarker/ext/jsp/TagTransformModel.java
@@ -36,7 +36,9 @@ import javax.servlet.jsp.tagext.SimpleTag;
 import javax.servlet.jsp.tagext.Tag;
 import javax.servlet.jsp.tagext.TryCatchFinally;
 
-import freemarker.log.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import freemarker.template.TemplateModelException;
 import freemarker.template.TemplateTransformModel;
 import freemarker.template.TransformControl;
@@ -46,7 +48,7 @@ import freemarker.template.TransformControl;
  * For {@link SimpleTag}-based custom JSP tags {@link SimpleTagDirectiveModel} is used instead.
  */
 class TagTransformModel extends JspTagModelBase implements TemplateTransformModel {
-    private static final Logger LOG = Logger.getLogger("freemarker.jsp");
+    private static final Logger LOG = LoggerFactory.getLogger("freemarker.jsp");
     
     private final boolean isBodyTag;
     private final boolean isIterationTag;
@@ -59,6 +61,7 @@ class TagTransformModel extends JspTagModelBase implements TemplateTransformMode
         isTryCatchFinally = TryCatchFinally.class.isAssignableFrom(tagClass);
     }
     
+    @Override
     public Writer getWriter(Writer out, Map args) throws TemplateModelException {
         try {
             Tag tag = (Tag) getTagInstance();
@@ -313,6 +316,7 @@ class TagTransformModel extends JspTagModelBase implements TemplateTransformMode
             return pageContext;
         }
         
+        @Override
         public int onStart()
         throws TemplateModelException {
             try {
@@ -351,6 +355,7 @@ class TagTransformModel extends JspTagModelBase implements TemplateTransformMode
             }
         }
         
+        @Override
         public int afterBody()
         throws TemplateModelException {
             try {
@@ -379,10 +384,11 @@ class TagTransformModel extends JspTagModelBase implements TemplateTransformMode
                 needPop = false;
             }
             if (tag.doEndTag() == Tag.SKIP_PAGE) {
-                LOG.warn("Tag.SKIP_PAGE was ignored from a " + tag.getClass().getName() + " tag.");
+                LOG.warn("Tag.SKIP_PAGE was ignored from a {} tag.", tag.getClass().getName());
             }
         }
         
+        @Override
         public void onError(Throwable t) throws Throwable {
             if (isTryCatchFinally) {
                 ((TryCatchFinally) tag).doCatch(t);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/ext/jsp/TaglibFactory.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/ext/jsp/TaglibFactory.java b/src/main/java/freemarker/ext/jsp/TaglibFactory.java
index f9ae4e6..1da76c2 100644
--- a/src/main/java/freemarker/ext/jsp/TaglibFactory.java
+++ b/src/main/java/freemarker/ext/jsp/TaglibFactory.java
@@ -60,6 +60,8 @@ import javax.servlet.jsp.tagext.Tag;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.parsers.SAXParserFactory;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.xml.sax.Attributes;
 import org.xml.sax.EntityResolver;
 import org.xml.sax.InputSource;
@@ -74,7 +76,6 @@ import freemarker.core.Environment;
 import freemarker.ext.beans.BeansWrapper;
 import freemarker.ext.servlet.FreemarkerServlet;
 import freemarker.ext.servlet.HttpRequestHashModel;
-import freemarker.log.Logger;
 import freemarker.template.DefaultObjectWrapper;
 import freemarker.template.ObjectWrapper;
 import freemarker.template.TemplateHashModel;
@@ -112,7 +113,7 @@ public class TaglibFactory implements TemplateHashModel {
     public static final List/*<? extends MetaInfTldSource>*/ DEFAULT_META_INF_TLD_SOURCES
             = Collections.singletonList(WebInfPerLibJarMetaInfTldSource.INSTANCE);
 
-    private static final Logger LOG = Logger.getLogger("freemarker.jsp");
+    private static final Logger LOG = LoggerFactory.getLogger("freemarker.jsp");
 
     private static final int URL_TYPE_FULL = 0;
     private static final int URL_TYPE_ABSOLUTE = 1;
@@ -175,6 +176,7 @@ public class TaglibFactory implements TemplateHashModel {
      *         custom tag or EL function from the library, implemented as a {@link TemplateTransformModel} or
      *         {@link TemplateMethodModelEx}, respectively.
      */
+    @Override
     public TemplateModel get(final String taglibUri) throws TemplateModelException {
         synchronized (lock) {
             {
@@ -287,6 +289,7 @@ public class TaglibFactory implements TemplateHashModel {
     /**
      * Returns false.
      */
+    @Override
     public boolean isEmpty() {
         return false;
     }
@@ -520,10 +523,8 @@ public class TaglibFactory implements TemplateHashModel {
                         } else if (isJarUrl) {
                             addTldLocationsFromJarDirectoryEntryURL(url);
                         } else {
-                            if (LOG.isDebugEnabled()) {
-                                LOG.warn("Can't list entries under this URL; TLD-s won't be discovered here: "
-                                        + urlWithEF.getExternalForm());
-                            }
+                            LOG.debug("Can't list entries under this URL; TLD-s won't be discovered here: {}",
+                                    urlWithEF.getExternalForm());
                         }
                     }
                 }
@@ -534,10 +535,7 @@ public class TaglibFactory implements TemplateHashModel {
     }
     
     private void addTldLocationsFromWebInfPerLibJarMetaInfTlds() throws IOException, SAXException {
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("Looking for TLD locations in servletContext:/WEB-INF/lib/*.{jar,zip}" + META_INF_ABS_PATH
-                    + "*.tld");
-        }
+        LOG.debug("Looking for TLD locations in servletContext:/WEB-INF/lib/*.{jar,zip}{}*.tld", META_INF_ABS_PATH);
 
         Set libEntPaths = servletContext.getResourcePaths("/WEB-INF/lib");
         if (libEntPaths != null) {
@@ -748,6 +746,7 @@ public class TaglibFactory implements TemplateHashModel {
             }
             File[] tldFiles = dir.listFiles(new FilenameFilter() {
     
+                @Override
                 public boolean accept(File urlAsFile, String name) {
                     return isTldFileNameIgnoreCase(name);
                 }
@@ -790,7 +789,7 @@ public class TaglibFactory implements TemplateHashModel {
         try {
             taglibUri = getTaglibUriFromTld(reusedIn, tldLocation.getXmlSystemId());
         } catch (SAXException e) {
-            LOG.error("Error while parsing TLD; skipping: " + tldLocation, e);
+            LOG.error("Error while parsing TLD; skipping: {}", tldLocation, e);
             synchronized (failedTldLocations) {
                 failedTldLocations.add(tldLocation.toString());
             }
@@ -1039,7 +1038,7 @@ public class TaglibFactory implements TemplateHashModel {
             IOException {
         URL jarResourceUrl = servletContext.getResource(jarResourcePath);
         if (jarResourceUrl == null) {
-            LOG.error("ServletContext resource URL was null (missing resource?): " + jarResourcePath);
+            LOG.error("ServletContext resource URL was null (missing resource?): {}", jarResourcePath);
             return null;
         }
 
@@ -1050,7 +1049,7 @@ public class TaglibFactory implements TemplateHashModel {
         }
 
         if (!jarResourceAsFile.isFile()) {
-            LOG.error("Jar file doesn't exist - falling back to stream mode: " + jarResourceAsFile);
+            LOG.error("Jar file doesn't exist - falling back to stream mode: {}", jarResourceAsFile);
             return null;
         }
 
@@ -1210,6 +1209,7 @@ public class TaglibFactory implements TemplateHashModel {
             this.fileResourcePath = fileResourcePath;
         }
     
+        @Override
         public InputStream getInputStream() throws IOException {
             final InputStream in = servletContext.getResourceAsStream(fileResourcePath);
             if (in == null) {
@@ -1218,6 +1218,7 @@ public class TaglibFactory implements TemplateHashModel {
             return in;
         }
     
+        @Override
         public String getXmlSystemId() throws IOException {
             final URL url = servletContext.getResource(fileResourcePath);
             return url != null ? url.toExternalForm() : null;
@@ -1254,6 +1255,7 @@ public class TaglibFactory implements TemplateHashModel {
             return "classpath:" + resourcePath;
         }
     
+        @Override
         public InputStream getInputStream() throws IOException {
             ClassLoader tccl = tryGetThreadContextClassLoader();
             if (tccl != null) {
@@ -1270,6 +1272,7 @@ public class TaglibFactory implements TemplateHashModel {
             return in;
         }
 
+        @Override
         public String getXmlSystemId() throws IOException {
             ClassLoader tccl = tryGetThreadContextClassLoader();
             if (tccl != null) {
@@ -1311,6 +1314,7 @@ public class TaglibFactory implements TemplateHashModel {
             this.entryPath = entryPath != null ? normalizeJarEntryPath(entryPath, false) : null;
         }
 
+        @Override
         public InputStream getInputStream() throws IOException {
             if (entryUrl != null) {
                 try {
@@ -1329,7 +1333,7 @@ public class TaglibFactory implements TemplateHashModel {
                         }
                         throw new RuntimeException(e);
                     }
-                    LOG.error("Failed to open InputStream for URL (will try fallback stream): " + entryUrl);
+                    LOG.error("Failed to open InputStream for URL (will try fallback stream): {}", entryUrl);
                 }
                 // Retry with the fallbackRawJarContentInputStreamFactory comes.
             }
@@ -1385,6 +1389,7 @@ public class TaglibFactory implements TemplateHashModel {
             }
         }
     
+        @Override
         public String getXmlSystemId() {
             return entryUrl != null ? entryUrl.toExternalForm() : null;
         }
@@ -1420,6 +1425,7 @@ public class TaglibFactory implements TemplateHashModel {
             super(
                     tryCreateServletContextJarEntryUrl(servletContext, servletContextJarFilePath, entryPath),
                     new InputStreamFactory() {
+                        @Override
                         public InputStream getInputStream() {
                             return servletContext.getResourceAsStream(servletContextJarFilePath);
                         }
@@ -1442,10 +1448,12 @@ public class TaglibFactory implements TemplateHashModel {
             this.file = file;
         }
 
+        @Override
         public InputStream getInputStream() throws IOException {
             return new FileInputStream(file);
         }
 
+        @Override
         public String getXmlSystemId() throws IOException {
             return file.toURI().toURL().toExternalForm();
         }
@@ -1464,10 +1472,12 @@ public class TaglibFactory implements TemplateHashModel {
             tagsAndFunctions = parseToTagsAndFunctions(ctx, tldPath, wrapper);
         }
 
+        @Override
         public TemplateModel get(String key) {
             return (TemplateModel) tagsAndFunctions.get(key);
         }
 
+        @Override
         public boolean isEmpty() {
             return tagsAndFunctions.isEmpty();
         }
@@ -1730,8 +1740,10 @@ public class TaglibFactory implements TemplateHashModel {
                             tagsAndFunctions.put(tagNameCData, CustomTagAndELFunctionCombiner.combine(
                                     customTagModel, (TemplateMethodModelEx) replacedTagOrFunction));
                         } else {
-                            LOG.warn("TLD contains multiple tags with name " + StringUtil.jQuote(tagNameCData)
-                                    + "; keeping only the last one.");
+                            if (LOG.isWarnEnabled()) {
+                                LOG.warn("TLD contains multiple tags with name " + StringUtil.jQuote(tagNameCData)
+                                        + "; keeping only the last one.");
+                            }
                         }
                     }
 
@@ -1780,8 +1792,10 @@ public class TaglibFactory implements TemplateHashModel {
                             tagsAndFunctions.put(functionNameCData, CustomTagAndELFunctionCombiner.combine(
                                     replacedTagOrFunction, elFunctionModel));
                         } else {
-                            LOG.warn("TLD contains multiple functions with name " + StringUtil.jQuote(functionNameCData)
-                                    + "; keeping only the last one.");
+                            if (LOG.isWarnEnabled()) {
+                                LOG.warn("TLD contains multiple functions with name "
+                                        + StringUtil.jQuote(functionNameCData) + "; keeping only the last one.");
+                            }
                         }
                     }
 
@@ -1866,6 +1880,7 @@ public class TaglibFactory implements TemplateHashModel {
      */
     private static final class EmptyContentEntityResolver implements EntityResolver {
         
+        @Override
         public InputSource resolveEntity(String publicId, String systemId) {
             InputSource is = new InputSource(new ByteArrayInputStream(new byte[0]));
             is.setPublicId(publicId);
@@ -1983,6 +1998,7 @@ public class TaglibFactory implements TemplateHashModel {
             return "URLWithExternalForm(" + externalForm + ")";
         }
 
+        @Override
         public int compareTo(Object that) {
             return this.getExternalForm().compareTo(((URLWithExternalForm) that).getExternalForm());
         }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java b/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java
index a3f6aa3..172f8c5 100644
--- a/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java
+++ b/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java
@@ -31,7 +31,9 @@ import javax.servlet.jsp.el.ELException;
 import javax.servlet.jsp.el.ExpressionEvaluator;
 import javax.servlet.jsp.el.VariableResolver;
 
-import freemarker.log.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import freemarker.template.TemplateModelException;
 import freemarker.template.utility.ClassUtil;
 
@@ -42,13 +44,13 @@ import freemarker.template.utility.ClassUtil;
  * Implementation of PageContext that contains all JSP 2.1 methods.
  */
 public class _FreeMarkerPageContext21 extends FreeMarkerPageContext {
-    private static final Logger LOG = Logger.getLogger("freemarker.jsp");
+    private static final Logger LOG = LoggerFactory.getLogger("freemarker.jsp");
 
     static {
         if (JspFactory.getDefaultFactory() == null) {
             JspFactory.setDefaultFactory(new FreeMarkerJspFactory21());
         }
-        LOG.debug("Using JspFactory implementation class " + 
+        LOG.debug("Using JspFactory implementation class {}", 
                 JspFactory.getDefaultFactory().getClass().getName());
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java b/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java
index 504bbeb..ea78ac4 100644
--- a/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java
+++ b/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java
@@ -40,6 +40,9 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import freemarker.cache.ClassTemplateLoader;
 import freemarker.cache.FileTemplateLoader;
@@ -55,7 +58,6 @@ import freemarker.ext.jsp.TaglibFactory.ClasspathMetaInfTldSource;
 import freemarker.ext.jsp.TaglibFactory.ClearMetaInfTldSource;
 import freemarker.ext.jsp.TaglibFactory.MetaInfTldSource;
 import freemarker.ext.jsp.TaglibFactory.WebInfPerLibJarMetaInfTldSource;
-import freemarker.log.Logger;
 import freemarker.template.Configuration;
 import freemarker.template.ObjectWrapper;
 import freemarker.template.Template;
@@ -318,8 +320,10 @@ import freemarker.template.utility.StringUtil;
  * </ul>
  */
 public class FreemarkerServlet extends HttpServlet {
-    private static final Logger LOG = Logger.getLogger("freemarker.servlet");
-    private static final Logger LOG_RT = Logger.getLogger("freemarker.runtime");
+    private static final Logger LOG = LoggerFactory.getLogger("freemarker.servlet");
+    
+    @Deprecated
+    private static final Logger LOG_RT = LoggerFactory.getLogger("freemarker.runtime");
 
     public static final long serialVersionUID = -2440216393145762479L;
 
@@ -575,9 +579,7 @@ public class FreemarkerServlet extends HttpServlet {
         
         // Process object_wrapper init-param out of order: 
         wrapper = createObjectWrapper();
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("Using object wrapper: " + wrapper);
-        }
+        LOG.debug("Using object wrapper {}", wrapper);
         config.setObjectWrapper(wrapper);
         
         // Process TemplatePath init-param out of order:
@@ -784,7 +786,7 @@ public class FreemarkerServlet extends HttpServlet {
             try {
                 response.setBufferSize(bufferSize.intValue());
             } catch (IllegalStateException e) {
-                LOG.debug("Can't set buffer size any more,", e);
+                LOG.debug("Can't set the response buffer size any more", e);
             }
         }
 
@@ -1621,6 +1623,7 @@ public class FreemarkerServlet extends HttpServlet {
             this.initParamValue = initParamValue;
         }
 
+        @Override
         public String getInitParamValue() {
             return initParamValue;
         }
@@ -1638,6 +1641,7 @@ public class FreemarkerServlet extends HttpServlet {
             this.initParamValue = initParamValue;
         }
 
+        @Override
         public String getInitParamValue() {
             return initParamValue;
         }
@@ -1653,6 +1657,7 @@ public class FreemarkerServlet extends HttpServlet {
             this.initParamValue = initParamValue;
         }
 
+        @Override
         public String getInitParamValue() {
             return initParamValue;
         }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8952cbbb/src/main/java/freemarker/ext/servlet/InitParamParser.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/ext/servlet/InitParamParser.java b/src/main/java/freemarker/ext/servlet/InitParamParser.java
index 6b0665d..c7c4f98 100644
--- a/src/main/java/freemarker/ext/servlet/InitParamParser.java
+++ b/src/main/java/freemarker/ext/servlet/InitParamParser.java
@@ -27,6 +27,9 @@ import java.util.regex.Pattern;
 
 import javax.servlet.ServletContext;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import freemarker.cache.ClassTemplateLoader;
 import freemarker.cache.FileTemplateLoader;
 import freemarker.cache.MultiTemplateLoader;
@@ -34,7 +37,6 @@ import freemarker.cache.TemplateLoader;
 import freemarker.cache.WebappTemplateLoader;
 import freemarker.core._ObjectBuilderSettingEvaluator;
 import freemarker.core._SettingEvaluationEnvironment;
-import freemarker.log.Logger;
 import freemarker.template.Configuration;
 import freemarker.template._TemplateAPI;
 import freemarker.template.utility.StringUtil;
@@ -47,7 +49,7 @@ final class InitParamParser {
     static final String TEMPLATE_PATH_PREFIX_FILE = "file://";
     static final String TEMPLATE_PATH_SETTINGS_BI_NAME = "settings";
     
-    private static final Logger LOG = Logger.getLogger("freemarker.servlet");
+    private static final Logger LOG = LoggerFactory.getLogger("freemarker.servlet");
     
     private InitParamParser() {
         // Not to be instantiated
@@ -72,8 +74,8 @@ final class InitParamParser {
             
             ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
             if (classLoader == null) {
-                LOG.warn("No Thread Context Class Loader was found. Falling back to the class loader of "
-                        + classLoaderClass.getName() + ".");
+                LOG.warn("No Thread Context Class Loader was found. Falling back to the class loader of {}.",
+                        classLoaderClass.getName());
                 classLoader = classLoaderClass.getClassLoader();
             }