SLING-5505 - Allow recording of caller stacktrace with the logs

Refactor to pass on TracerConfig to recording such that extra options for given logger can be accessed

git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1729650 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/sling/tracer/internal/JSONRecording.java b/src/main/java/org/apache/sling/tracer/internal/JSONRecording.java
index f8f785e..b1e76be 100644
--- a/src/main/java/org/apache/sling/tracer/internal/JSONRecording.java
+++ b/src/main/java/org/apache/sling/tracer/internal/JSONRecording.java
@@ -116,7 +116,7 @@
     //~---------------------------------------< Recording >
 
     @Override
-    public void log(Level level, String logger, FormattingTuple tuple) {
+    public void log(TracerConfig tc, Level level, String logger, FormattingTuple tuple) {
         Object[] params = tuple.getArgArray();
         if (TracerContext.QUERY_LOGGER.equals(logger)
                 && params != null && params.length == 2) {
diff --git a/src/main/java/org/apache/sling/tracer/internal/LogTracer.java b/src/main/java/org/apache/sling/tracer/internal/LogTracer.java
index 3cb42d7..ea531ba 100644
--- a/src/main/java/org/apache/sling/tracer/internal/LogTracer.java
+++ b/src/main/java/org/apache/sling/tracer/internal/LogTracer.java
@@ -419,11 +419,12 @@
                 return FilterReply.NEUTRAL;
             }
 
-            if (tracer.shouldLog(logger.getName(), level)) {
+            TracerConfig tc = tracer.findMatchingConfig(logger.getName(), level);
+            if (tc != null) {
                 if (format == null) {
                     return FilterReply.ACCEPT;
                 }
-                if (tracer.log(level, logger.getName(), format, params)) {
+                if (tracer.log(tc, level, logger.getName(), format, params)) {
                     return FilterReply.ACCEPT;
                 }
             }
diff --git a/src/main/java/org/apache/sling/tracer/internal/Recording.java b/src/main/java/org/apache/sling/tracer/internal/Recording.java
index 9e0f88e..e7300c5 100644
--- a/src/main/java/org/apache/sling/tracer/internal/Recording.java
+++ b/src/main/java/org/apache/sling/tracer/internal/Recording.java
@@ -26,7 +26,7 @@
 interface Recording {
     Recording NOOP = new Recording() {
         @Override
-        public void log(Level level, String logger, FormattingTuple tuple) {
+        public void log(TracerConfig tc, Level level, String logger, FormattingTuple tuple) {
 
         }
 
@@ -36,7 +36,7 @@
         }
     };
 
-    void log(Level level, String logger, FormattingTuple tuple);
+    void log(TracerConfig tc, Level level, String logger, FormattingTuple tuple);
 
     /**
      * Register the {@link RequestProgressTracker} associated with
diff --git a/src/main/java/org/apache/sling/tracer/internal/TracerContext.java b/src/main/java/org/apache/sling/tracer/internal/TracerContext.java
index bd12def..5859bce 100644
--- a/src/main/java/org/apache/sling/tracer/internal/TracerContext.java
+++ b/src/main/java/org/apache/sling/tracer/internal/TracerContext.java
@@ -69,19 +69,23 @@
         Arrays.sort(tracers);
     }
 
-    public boolean shouldLog(String logger, Level level) {
+    /**
+     * Finds and returns the matching TracerConfig for given logger and level
+     * If non null it indicates that logging should proceed
+     */
+    public TracerConfig findMatchingConfig(String logger, Level level) {
         for (TracerConfig tc : tracers) {
             TracerConfig.MatchResult mr = tc.match(logger, level);
             if (mr == TracerConfig.MatchResult.MATCH_LOG) {
-                return true;
+                return tc;
             } else if (mr == TracerConfig.MatchResult.MATCH_NO_LOG) {
-                return false;
+                return null;
             }
         }
-        return false;
+        return null;
     }
 
-    public boolean log(Level level, String logger, String format, Object[] params) {
+    public boolean log(TracerConfig tc, Level level, String logger, String format, Object[] params) {
         FormattingTuple tuple = null;
         if (QUERY_LOGGER.equals(logger)
                 && params != null && params.length == 2) {
@@ -94,7 +98,7 @@
         }
 
         if (tuple != null) {
-            recording.log(level, logger, tuple);
+            recording.log(tc, level, logger, tuple);
         }
         return tuple != null;
     }
diff --git a/src/test/java/org/apache/sling/tracer/internal/JSONRecordingTest.java b/src/test/java/org/apache/sling/tracer/internal/JSONRecordingTest.java
index 65041f8..ac8ad3c 100644
--- a/src/test/java/org/apache/sling/tracer/internal/JSONRecordingTest.java
+++ b/src/test/java/org/apache/sling/tracer/internal/JSONRecordingTest.java
@@ -39,6 +39,8 @@
 public class JSONRecordingTest {
     private HttpServletRequest request = mock(HttpServletRequest.class);
 
+    private TracerConfig tc = new TracerConfig(TracerContext.QUERY_LOGGER, Level.INFO);
+
     @Test
     public void logQueries() throws Exception{
         StringWriter sw = new StringWriter();
@@ -46,8 +48,8 @@
         when(request.getMethod()).thenReturn("GET");
         JSONRecording r = new JSONRecording("abc", request, true);
 
-        r.log(Level.INFO, TracerContext.QUERY_LOGGER, MessageFormatter.arrayFormat("foo bar", new Object[]{"x" , "y"}));
-        r.log(Level.INFO, TracerContext.QUERY_LOGGER, MessageFormatter.arrayFormat("foo bar", new Object[]{"x" , "z"}));
+        r.log(tc, Level.INFO, TracerContext.QUERY_LOGGER, MessageFormatter.arrayFormat("foo bar", new Object[]{"x" , "y"}));
+        r.log(tc, Level.INFO, TracerContext.QUERY_LOGGER, MessageFormatter.arrayFormat("foo bar", new Object[]{"x" , "z"}));
 
         r.done();
         r.render(sw);
@@ -79,9 +81,9 @@
         JSONRecording r = new JSONRecording("abc", request, true);
 
         FormattingTuple tp1 = MessageFormatter.arrayFormat("{} is going", new Object[]{"Jack"});
-        r.log(Level.INFO, "foo", tp1);
-        r.log(Level.WARN, "foo.bar", MessageFormatter.arrayFormat("Jill is going", null));
-        r.log(Level.ERROR, "foo.bar",
+        r.log(tc, Level.INFO, "foo", tp1);
+        r.log(tc, Level.WARN, "foo.bar", MessageFormatter.arrayFormat("Jill is going", null));
+        r.log(tc, Level.ERROR, "foo.bar",
                 MessageFormatter.arrayFormat("Jack and {} is going", new Object[]{"Jill" , new Exception()}));
 
         r.done();
diff --git a/src/test/java/org/apache/sling/tracer/internal/LogTracerModelTest.java b/src/test/java/org/apache/sling/tracer/internal/LogTracerModelTest.java
index 2b1d7c0..96c0bad 100644
--- a/src/test/java/org/apache/sling/tracer/internal/LogTracerModelTest.java
+++ b/src/test/java/org/apache/sling/tracer/internal/LogTracerModelTest.java
@@ -24,9 +24,8 @@
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertNull;
 
 public class LogTracerModelTest {
 
@@ -56,9 +55,9 @@
         TracerSet ts = new TracerSet("foo : a.b;level=trace, a.b.c;level=info");
         TracerContext tc = getContext(ts);
 
-        assertTrue(tc.shouldLog("a.b", Level.TRACE));
-        assertTrue(tc.shouldLog("a.b.d", Level.TRACE));
-        assertFalse(tc.shouldLog("a.b.c", Level.TRACE));
+        assertNotNull(tc.findMatchingConfig("a.b", Level.TRACE));
+        assertNotNull(tc.findMatchingConfig("a.b.d", Level.TRACE));
+        assertNull(tc.findMatchingConfig("a.b.c", Level.TRACE));
     }
 
     @Test