Add new Java 8 Logger API.

Change-Id: I5c2ad7cc9f0843063881d3034fb23cf925802b8b
diff --git a/tools/api-checker/config/gwt27_28userApi.conf b/tools/api-checker/config/gwt27_28userApi.conf
index 5af2a09..1ce0f43 100644
--- a/tools/api-checker/config/gwt27_28userApi.conf
+++ b/tools/api-checker/config/gwt27_28userApi.conf
@@ -179,3 +179,14 @@
 
 # Added Objects.requireNonNull(Object, Supplier)
 java.util.Objects::requireNonNull(Ljava/lang/Object;Ljava/lang/String;) OVERLOADED_METHOD_CALL
+
+# Added new Logger lazy logging methods
+java.util.logging.Logger::config(Ljava/lang/String;) OVERLOADED_METHOD_CALL
+java.util.logging.Logger::fine(Ljava/lang/String;) OVERLOADED_METHOD_CALL
+java.util.logging.Logger::finer(Ljava/lang/String;) OVERLOADED_METHOD_CALL
+java.util.logging.Logger::finest(Ljava/lang/String;) OVERLOADED_METHOD_CALL
+java.util.logging.Logger::info(Ljava/lang/String;) OVERLOADED_METHOD_CALL
+java.util.logging.Logger::log(Ljava/util/logging/Level;Ljava/lang/String;) OVERLOADED_METHOD_CALL
+java.util.logging.Logger::log(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/Throwable;) OVERLOADED_METHOD_CALL
+java.util.logging.Logger::severe(Ljava/lang/String;) OVERLOADED_METHOD_CALL
+java.util.logging.Logger::warning(Ljava/lang/String;) OVERLOADED_METHOD_CALL
diff --git a/user/super/com/google/gwt/emul/java/util/logging/Logger.java b/user/super/com/google/gwt/emul/java/util/logging/Logger.java
index c0c7587..b391248 100644
--- a/user/super/com/google/gwt/emul/java/util/logging/Logger.java
+++ b/user/super/com/google/gwt/emul/java/util/logging/Logger.java
@@ -17,6 +17,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.function.Supplier;
 
 /**
  *  An emulation of the java.util.logging.Logger class. See
@@ -87,6 +88,13 @@
     log(Level.CONFIG, msg);
   }
 
+  public void config(Supplier<String> msgSupplier) {
+    if (LOGGING_FALSE || LOGGING_SEVERE || LOGGING_WARNING) {
+      return;
+    }
+    log(Level.CONFIG, msgSupplier);
+  }
+
   public void fine(String msg) {
     if (LOGGING_FALSE || LOGGING_SEVERE || LOGGING_WARNING) {
       return;
@@ -94,6 +102,13 @@
     log(Level.FINE, msg);
   }
 
+  public void fine(Supplier<String> msgSupplier) {
+    if (LOGGING_FALSE || LOGGING_SEVERE || LOGGING_WARNING) {
+      return;
+    }
+    log(Level.FINE, msgSupplier);
+  }
+
   public void finer(String msg) {
     if (LOGGING_FALSE || LOGGING_SEVERE || LOGGING_WARNING) {
       return;
@@ -101,6 +116,13 @@
     log(Level.FINER, msg);
   }
 
+  public void finer(Supplier<String> msgSupplier) {
+    if (LOGGING_FALSE || LOGGING_SEVERE || LOGGING_WARNING) {
+      return;
+    }
+    log(Level.FINER, msgSupplier);
+  }
+
   public void finest(String msg) {
     if (LOGGING_FALSE || LOGGING_SEVERE || LOGGING_WARNING) {
       return;
@@ -108,6 +130,13 @@
     log(Level.FINEST, msg);
   }
 
+  public void finest(Supplier<String> msgSupplier) {
+    if (LOGGING_FALSE || LOGGING_SEVERE || LOGGING_WARNING) {
+      return;
+    }
+    log(Level.FINEST, msgSupplier);
+  }
+
   public void info(String msg) {
     if (LOGGING_FALSE || LOGGING_SEVERE || LOGGING_WARNING) {
       return;
@@ -115,6 +144,13 @@
     log(Level.INFO, msg);
   }
 
+  public void info(Supplier<String> msgSupplier) {
+    if (LOGGING_FALSE || LOGGING_SEVERE || LOGGING_WARNING) {
+      return;
+    }
+    log(Level.INFO, msgSupplier);
+  }
+
   public void warning(String msg) {
     if (LOGGING_FALSE || LOGGING_SEVERE) {
       return;
@@ -122,6 +158,13 @@
     log(Level.WARNING, msg);
   }
 
+  public void warning(Supplier<String> msgSupplier) {
+    if (LOGGING_FALSE || LOGGING_SEVERE) {
+      return;
+    }
+    log(Level.WARNING, msgSupplier);
+  }
+
   public void severe(String msg) {
     if (LOGGING_FALSE) {
       return;
@@ -129,6 +172,13 @@
     log(Level.SEVERE, msg);
   }
 
+  public void severe(Supplier<String> msgSupplier) {
+    if (LOGGING_FALSE) {
+      return;
+    }
+    log(Level.SEVERE, msgSupplier);
+  }
+
   public Handler[] getHandlers() {
     if (LOGGING_FALSE) {
       return new Handler[0];
@@ -154,44 +204,48 @@
   }
 
   public boolean isLoggable(Level messageLevel) {
-    return LOGGING_FALSE
-        ? false : getEffectiveLevel().intValue() <= messageLevel.intValue();
+    if (LOGGING_FALSE) {
+      return false;
+    } else if (LOGGING_SEVERE) {
+      return messageLevel.intValue() >= Level.SEVERE.intValue();
+    } else if (LOGGING_WARNING) {
+      return messageLevel.intValue() >= Level.WARNING.intValue();
+    } else {
+      return messageLevel.intValue() >= getEffectiveLevel().intValue();
+    }
   }
 
   public void log(Level level, String msg) {
     log(level, msg, null);
   }
 
+  public void log(Level level, Supplier<String> msgSupplier) {
+    log(level, null, msgSupplier);
+  }
+
   public void log(Level level, String msg, Throwable thrown) {
     if (LOGGING_FALSE) {
       return;
     }
-    if (LOGGING_SEVERE) {
-      if (level.intValue() >= 1000) {
-        actuallyLog(level, msg, thrown);
-      }
-    } else if (LOGGING_WARNING) {
-      if (level.intValue() >= Level.WARNING.intValue()) {
-        actuallyLog(level, msg, thrown);
-      }
-    } else {
+    if (isLoggable(level)) {
       actuallyLog(level, msg, thrown);
     }
   }
 
+  public void log(Level level, Throwable thrown, Supplier<String> msgSupplier) {
+    if (LOGGING_FALSE) {
+      return;
+    }
+    if (isLoggable(level)) {
+      actuallyLog(level, msgSupplier.get(), thrown);
+    }
+  }
+
   public void log(LogRecord record) {
     if (LOGGING_FALSE) {
       return;
     }
-    if (LOGGING_SEVERE) {
-      if (record.getLevel().intValue() >= 1000) {
-        actuallyLog(record);
-      }
-    } else if (LOGGING_WARNING) {
-      if (record.getLevel().intValue() >= Level.WARNING.intValue()) {
-        actuallyLog(record);
-      }
-    } else {
+    if (isLoggable(record.getLevel())) {
       actuallyLog(record);
     }
   }
@@ -243,26 +297,22 @@
   }
 
   private void actuallyLog(Level level, String msg, Throwable thrown) {
-    if (isLoggable(level)) {
-      LogRecord record = new LogRecord(level, msg);
-      record.setThrown(thrown);
-      record.setLoggerName(getName());
-      actuallyLog(record);
-    }
+    LogRecord record = new LogRecord(level, msg);
+    record.setThrown(thrown);
+    record.setLoggerName(getName());
+    actuallyLog(record);
   }
 
   private void actuallyLog(LogRecord record) {
-    if (isLoggable(record.getLevel())) {
-      for (Handler handler : getHandlers()) {
+    for (Handler handler : getHandlers()) {
+      handler.publish(record);
+    }
+    Logger logger = getUseParentHandlers() ? getParent() : null;
+    while (logger != null) {
+      for (Handler handler : logger.getHandlers()) {
         handler.publish(record);
       }
-      Logger logger = getUseParentHandlers() ? getParent() : null;
-      while (logger != null) {
-        for (Handler handler : logger.getHandlers()) {
-          handler.publish(record);
-        }
-        logger = logger.getUseParentHandlers() ? logger.getParent() : null;
-      }
+      logger = logger.getUseParentHandlers() ? logger.getParent() : null;
     }
   }