Merge branch 'master' of github.com:qos-ch/slf4j
diff --git a/slf4j-jdk14/src/main/java/org/slf4j/impl/JDK14LoggerAdapter.java b/slf4j-jdk14/src/main/java/org/slf4j/impl/JDK14LoggerAdapter.java
old mode 100644
new mode 100755
diff --git a/slf4j-jdk14/src/test/java/org/slf4j/InvocationTest.java b/slf4j-jdk14/src/test/java/org/slf4j/InvocationTest.java
old mode 100644
new mode 100755
index 8c14dfa..8eb09e2
--- a/slf4j-jdk14/src/test/java/org/slf4j/InvocationTest.java
+++ b/slf4j-jdk14/src/test/java/org/slf4j/InvocationTest.java
@@ -24,81 +24,110 @@
  */
 package org.slf4j;
 
-import java.util.logging.Level;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
 
-import junit.framework.TestCase;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+
+import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertNull;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
 
 
 /**
  * Test whether invoking the SLF4J API causes problems or not.
- * 
- * @author Ceki Gulcu
  *
+ * @author Ceki Gulcu
  */
-public class InvocationTest extends TestCase {
+public class InvocationTest {
 
   Level oldLevel;
   java.util.logging.Logger root = java.util.logging.Logger.getLogger("");
-  
-  public InvocationTest (String arg0) {
-    super(arg0);
-  }
 
-  protected void setUp() throws Exception {
-    super.setUp();
+  ListHandler listHandler = new ListHandler();
+
+  @Before
+  public void setUp() throws Exception {
     oldLevel = root.getLevel();
-    root.setLevel(Level.OFF);
+    root.setLevel(Level.FINE);
+    //removeAllHandlers(root);
+    root.addHandler(listHandler);
   }
 
-  protected void tearDown() throws Exception {
-    super.tearDown();
+
+  @After
+  public void tearDown() throws Exception {
     root.setLevel(oldLevel);
+    removeListHandlers(root);
   }
-  
+
+  @Test
   public void test1() {
     Logger logger = LoggerFactory.getLogger("test1");
     logger.debug("Hello world.");
+    assertLogMessage("Hello world.", 0);
   }
-  
-  public void test2() {
+
+
+  @Test
+  public void verifyMessageFormatting() {
     Integer i1 = new Integer(1);
     Integer i2 = new Integer(2);
     Integer i3 = new Integer(3);
     Exception e = new Exception("This is a test exception.");
     Logger logger = LoggerFactory.getLogger("test2");
-    
-    logger.debug("Hello world 1.");
+
+    int index = 0;
+    logger.debug("Hello world");
+    assertLogMessage("Hello world", index++);
+
     logger.debug("Hello world {}", i1);
+    assertLogMessage("Hello world " + i1, index++);
+
     logger.debug("val={} val={}", i1, i2);
+    assertLogMessage("val=1 val=2", index++);
+
     logger.debug("val={} val={} val={}", new Object[]{i1, i2, i3});
+    assertLogMessage("val=1 val=2 val=3", index++);
 
     logger.debug("Hello world 2", e);
+    assertLogMessage("Hello world 2", index);
+    assertException(e.getClass(), index++);
     logger.info("Hello world 2.");
- 
-    
+
     logger.warn("Hello world 3.");
     logger.warn("Hello world 3", e);
- 
-  
+
     logger.error("Hello world 4.");
-    logger.error("Hello world {}", new Integer(3)); 
+    logger.error("Hello world {}", new Integer(3));
     logger.error("Hello world 4.", e);
   }
-  
+
+
+  @Test
   public void testNull() {
     Logger logger = LoggerFactory.getLogger("testNull");
     logger.debug(null);
     logger.info(null);
     logger.warn(null);
     logger.error(null);
-    
+
     Exception e = new Exception("This is a test exception.");
     logger.debug(null, e);
     logger.info(null, e);
     logger.warn(null, e);
     logger.error(null, e);
   }
-  
+
+
+  @Test
   public void testMarker() {
     Logger logger = LoggerFactory.getLogger("testMarker");
     Marker blue = MarkerFactory.getMarker("BLUE");
@@ -106,7 +135,7 @@
     logger.info(blue, "hello");
     logger.warn(blue, "hello");
     logger.error(blue, "hello");
-    
+
     logger.debug(blue, "hello {}", "world");
     logger.info(blue, "hello {}", "world");
     logger.warn(blue, "hello {}", "world");
@@ -117,7 +146,9 @@
     logger.warn(blue, "hello {} and {} ", "world", "universe");
     logger.error(blue, "hello {} and {} ", "world", "universe");
   }
-  
+
+
+  @Test
   public void testMDC() {
     MDC.put("k", "v");
     assertNotNull(MDC.get("k"));
@@ -137,4 +168,50 @@
     } catch (IllegalArgumentException e) {
     }
   }
+
+  private void assertLogMessage(String expected, int index) {
+    LogRecord logRecord = listHandler.recordList.get(index);
+    Assert.assertNotNull(logRecord);
+    assertEquals(expected, logRecord.getMessage());
+  }
+
+  private void assertException(Class exceptionType, int index) {
+    LogRecord logRecord = listHandler.recordList.get(index);
+    Assert.assertNotNull(logRecord);
+    assertEquals(exceptionType, logRecord.getThrown().getClass());
+  }
+
+  private void removeAllHandlers(java.util.logging.Logger logger) {
+    Handler[] handlers = logger.getHandlers();
+    for (Handler h : handlers) {
+      logger.removeHandler(h);
+    }
+  }
+
+
+  void removeListHandlers(java.util.logging.Logger logger) {
+    Handler[] handlers = logger.getHandlers();
+    for (Handler h : handlers) {
+      if (h instanceof ListHandler)
+        logger.removeHandler(h);
+    }
+  }
+
+  static private class ListHandler extends java.util.logging.Handler {
+
+    List<LogRecord> recordList = new ArrayList<LogRecord>();
+
+    @Override
+    public void publish(LogRecord record) {
+      recordList.add(record);
+    }
+
+    @Override
+    public void flush() {
+    }
+
+    @Override
+    public void close() throws SecurityException {
+    }
+  }
 }
diff --git a/slf4j-site/src/site/pages/news.html b/slf4j-site/src/site/pages/news.html
index 4cdb647..e41d7d4 100755
--- a/slf4j-site/src/site/pages/news.html
+++ b/slf4j-site/src/site/pages/news.html
@@ -29,6 +29,19 @@
 
    <hr noshade="noshade" size="1"/>
 
+   <h3>, 2014 - Release of SLF4J 1.7.8 </h3>
+
+   <p>Added <code>MDC.putCloeable</code> method so that it can be used
+   as a <a
+   href="https://docs.oracle.com/javase/7/docs/technotes/guides/language/try-with-resources.html">closeable
+   resource</a> under Java 7.</p>
+
+   <p>Added <code>getContext</code> method returning a hashtable in
+   org.apache.log4j.MDC in the log4j-over-slf4j module.
+   </p>
+
+   <hr noshade="noshade" size="1"/>
+
    <h3>4th of April, 2014 - Release of SLF4J 1.7.7 </h3>
 
    <p>SFL4J API now uses generics. This enhancement was contributed by