Macro for traceEntry(Any*)

Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/9f3a7d6f
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/9f3a7d6f
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/9f3a7d6f

Branch: refs/heads/LOG4J-1181
Commit: 9f3a7d6ffaca7b7ddfd13c31b78c3a5a7a723e81
Parents: ed201df
Author: Mikael Ståldal <mikael.stal...@magine.com>
Authored: Sat Jun 18 23:31:54 2016 +0200
Committer: Mikael Ståldal <mikael.stal...@magine.com>
Committed: Sat Jun 18 23:31:54 2016 +0200

----------------------------------------------------------------------
 .../org/apache/logging/log4j/scala/Logger.scala | 51 +++++++++++---------
 .../logging/log4j/scala/LoggerMacro.scala       | 24 ++++++++-
 .../apache/logging/log4j/scala/LoggerTest.scala | 32 +++++++++++-
 .../org/apache/logging/log4j/scala/Logger.scala | 51 +++++++++++---------
 .../logging/log4j/scala/LoggerMacro.scala       | 26 ++++++++--
 .../apache/logging/log4j/scala/LoggerTest.scala | 32 +++++++++++-
 6 files changed, 163 insertions(+), 53 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9f3a7d6f/log4j-api-scala_2.10/src/main/scala/org/apache/logging/log4j/scala/Logger.scala
----------------------------------------------------------------------
diff --git 
a/log4j-api-scala_2.10/src/main/scala/org/apache/logging/log4j/scala/Logger.scala
 
b/log4j-api-scala_2.10/src/main/scala/org/apache/logging/log4j/scala/Logger.scala
index 9a25f1f..ba15f8f 100644
--- 
a/log4j-api-scala_2.10/src/main/scala/org/apache/logging/log4j/scala/Logger.scala
+++ 
b/log4j-api-scala_2.10/src/main/scala/org/apache/logging/log4j/scala/Logger.scala
@@ -26,7 +26,7 @@ class Logger(val delegate: ExtendedLogger) {
 
   private final val FQCN = classOf[Logger].getName
 
-  
+
   def fatal(marker: Marker, message: Message): Unit =
   macro LoggerMacro.fatalMarkerMsg
 
@@ -50,10 +50,10 @@ class Logger(val delegate: ExtendedLogger) {
 
   def fatal(message: CharSequence): Unit =
   macro LoggerMacro.fatalCseq
-  
+
   def fatal(message: AnyRef): Unit =
   macro LoggerMacro.fatalObject
-  
+
   def fatal(message: Message, cause: Throwable): Unit =
   macro LoggerMacro.fatalMsgThrowable
 
@@ -247,8 +247,8 @@ class Logger(val delegate: ExtendedLogger) {
 
   def trace(message: AnyRef, cause: Throwable): Unit =
   macro LoggerMacro.traceObjectThrowable
-  
-  
+
+
   def log(level: Level, marker: Marker, message: Message): Unit =
   macro LoggerMacro.logMarkerMsg
 
@@ -263,10 +263,10 @@ class Logger(val delegate: ExtendedLogger) {
 
   def log(level: Level, marker: Marker, message: CharSequence, cause: 
Throwable): Unit =
   macro LoggerMacro.logMarkerCseqThrowable
-  
+
   def log(level: Level, marker: Marker, message: AnyRef, cause: Throwable): 
Unit =
   macro LoggerMacro.logMarkerObjectThrowable
-  
+
   def log(level: Level, message: Message): Unit =
   macro LoggerMacro.logMsg
 
@@ -275,7 +275,7 @@ class Logger(val delegate: ExtendedLogger) {
 
   def log(level: Level, message: AnyRef): Unit =
   macro LoggerMacro.logObject
-  
+
   def log(level: Level, message: Message, cause: Throwable): Unit =
   macro LoggerMacro.logMsgThrowable
 
@@ -284,7 +284,7 @@ class Logger(val delegate: ExtendedLogger) {
 
   def log(level: Level, message: AnyRef, cause: Throwable): Unit =
   macro LoggerMacro.logObjectThrowable
-  
+
 
   def isEnabled(level: Level): Boolean = delegate.isEnabled(level)
 
@@ -293,8 +293,8 @@ class Logger(val delegate: ExtendedLogger) {
 
   def traceEntry(): EntryMessage = delegate.traceEntry()
 
-  def traceEntry(params: AnyRef*): EntryMessage =
-    delegate.traceEntry(null, params) // TODO would be useful to have this as 
a macro to avoid varargs array creation
+  def traceEntry(params: Any*): EntryMessage =
+  macro LoggerMacro.traceEntryParams
 
   def traceEntry(message: Message): EntryMessage = delegate.traceEntry(message)
 
@@ -319,13 +319,14 @@ class Logger(val delegate: ExtendedLogger) {
 
   def messageFactory: MessageFactory2 = 
delegate.getMessageFactory.asInstanceOf[MessageFactory2]
 
+
   /** Always logs a message at the specified level. It is the responsibility 
of the caller to ensure the specified
     * level is enabled.
     *
-    * @param level    log level
-    * @param marker   marker or `null`
-    * @param message  message
-    * @param cause    cause or `null`
+    * @param level   log level
+    * @param marker  marker or `null`
+    * @param message message
+    * @param cause   cause or `null`
     */
   private[scala] def logMessage(level: Level, marker: Marker, message: 
Message, cause: Throwable): Unit = {
     delegate.logMessage(FQCN, level, marker, message, cause)
@@ -334,10 +335,10 @@ class Logger(val delegate: ExtendedLogger) {
   /** Always logs a message at the specified level. It is the responsibility 
of the caller to ensure the specified
     * level is enabled.
     *
-    * @param level    log level
-    * @param marker   marker or `null`
-    * @param message  message
-    * @param cause    cause or `null`
+    * @param level   log level
+    * @param marker  marker or `null`
+    * @param message message
+    * @param cause   cause or `null`
     */
   private[scala] def logMessage(level: Level, marker: Marker, message: 
CharSequence, cause: Throwable): Unit = {
     delegate.logMessage(FQCN, level, marker, 
messageFactory.newMessage(message), cause)
@@ -346,13 +347,17 @@ class Logger(val delegate: ExtendedLogger) {
   /** Always logs a message at the specified level. It is the responsibility 
of the caller to ensure the specified
     * level is enabled.
     *
-    * @param level    log level
-    * @param marker   marker or `null`
-    * @param message  message
-    * @param cause    cause or `null`
+    * @param level   log level
+    * @param marker  marker or `null`
+    * @param message message
+    * @param cause   cause or `null`
     */
   private[scala] def logMessage(level: Level, marker: Marker, message: AnyRef, 
cause: Throwable): Unit = {
     delegate.logMessage(FQCN, level, marker, 
messageFactory.newMessage(message), cause)
   }
 
+  private[scala] def traceEntryWithParams(params: Any*): EntryMessage = {
+    delegate.traceEntry(null, params)
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9f3a7d6f/log4j-api-scala_2.10/src/main/scala/org/apache/logging/log4j/scala/LoggerMacro.scala
----------------------------------------------------------------------
diff --git 
a/log4j-api-scala_2.10/src/main/scala/org/apache/logging/log4j/scala/LoggerMacro.scala
 
b/log4j-api-scala_2.10/src/main/scala/org/apache/logging/log4j/scala/LoggerMacro.scala
index 756975e..a1ebee7 100644
--- 
a/log4j-api-scala_2.10/src/main/scala/org/apache/logging/log4j/scala/LoggerMacro.scala
+++ 
b/log4j-api-scala_2.10/src/main/scala/org/apache/logging/log4j/scala/LoggerMacro.scala
@@ -16,7 +16,8 @@
  */
 package org.apache.logging.log4j.scala
 
-import org.apache.logging.log4j.message.Message
+import org.apache.logging.log4j.message.{EntryMessage, Message}
+import org.apache.logging.log4j.spi.AbstractLogger
 import org.apache.logging.log4j.{Level, Marker}
 
 import scala.language.experimental.macros
@@ -332,5 +333,24 @@ private object LoggerMacro {
         c.prefix.splice.logMessage(level.splice, null, message.splice, 
cause.splice)
       }
     )
-  
+
+  def traceEntryParams(c: LoggerContext)(params: c.Expr[Any]*): 
c.Expr[EntryMessage] = {
+    import c.universe._
+    val isEnabled = Apply(
+      Select(Select(c.prefix.tree, newTermName("delegate")), 
newTermName("isEnabled")),
+      List(
+        reify(Level.TRACE).tree,
+        reify(AbstractLogger.ENTRY_MARKER).tree,
+        reify(null.asInstanceOf[AnyRef]).tree,
+        reify(null).tree
+      )
+    )
+
+    val log = Apply(
+      Select(c.prefix.tree, newTermName("traceEntryWithParams")),
+      (params map (_.tree)).toList
+    )
+    c.Expr[EntryMessage](If(isEnabled, log, reify(null).tree))
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9f3a7d6f/log4j-api-scala_2.10/src/test/scala/org/apache/logging/log4j/scala/LoggerTest.scala
----------------------------------------------------------------------
diff --git 
a/log4j-api-scala_2.10/src/test/scala/org/apache/logging/log4j/scala/LoggerTest.scala
 
b/log4j-api-scala_2.10/src/test/scala/org/apache/logging/log4j/scala/LoggerTest.scala
index 1c3a126..359281e 100644
--- 
a/log4j-api-scala_2.10/src/test/scala/org/apache/logging/log4j/scala/LoggerTest.scala
+++ 
b/log4j-api-scala_2.10/src/test/scala/org/apache/logging/log4j/scala/LoggerTest.scala
@@ -17,7 +17,7 @@
 package org.apache.logging.log4j.scala
 
 import org.apache.logging.log4j.message.{Message, ParameterizedMessage, 
ParameterizedMessageFactory}
-import org.apache.logging.log4j.spi.ExtendedLogger
+import org.apache.logging.log4j.spi.{AbstractLogger, ExtendedLogger}
 import org.apache.logging.log4j.{Level, Marker, MarkerManager}
 import org.junit.runner.RunWith
 import org.mockito.Matchers.{any, anyString, eq => eqv}
@@ -428,4 +428,34 @@ class LoggerTest extends FunSuite with Matchers with 
MockitoSugar {
     verify(f.mockLogger, never).logMessage(anyString(), any[Level], 
any[Marker], any[Message], any[Throwable])
   }
 
+
+  test("traceEntry enabled with params") {
+    val f = fixture
+    when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.ENTRY_MARKER, 
null.asInstanceOf[AnyRef], null)).thenReturn(true)
+    val logger = new Logger(f.mockLogger)
+    logger.traceEntry("foo", 17)
+    verify(f.mockLogger).traceEntry(anyString(), any[Array[AnyRef]])
+  }
+
+  test("traceEntry disabled with params") {
+    val f = fixture
+    when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.ENTRY_MARKER, 
null.asInstanceOf[AnyRef], null)).thenReturn(false)
+    val logger = new Logger(f.mockLogger)
+    logger.traceEntry("foo", 17)
+    verify(f.mockLogger, never).traceEntry(anyString(), any[Array[AnyRef]])
+  }
+
+  test("traceEntry without params") {
+    val f = fixture
+    val logger = new Logger(f.mockLogger)
+    logger.traceEntry()
+    verify(f.mockLogger).traceEntry()
+  }
+
+  test("traceEntry with message") {
+    val f = fixture
+    val logger = new Logger(f.mockLogger)
+    logger.traceEntry(msg)
+    verify(f.mockLogger).traceEntry(eqv(msg))
+  }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9f3a7d6f/log4j-api-scala_2.11/src/main/scala/org/apache/logging/log4j/scala/Logger.scala
----------------------------------------------------------------------
diff --git 
a/log4j-api-scala_2.11/src/main/scala/org/apache/logging/log4j/scala/Logger.scala
 
b/log4j-api-scala_2.11/src/main/scala/org/apache/logging/log4j/scala/Logger.scala
index 9a25f1f..ba15f8f 100644
--- 
a/log4j-api-scala_2.11/src/main/scala/org/apache/logging/log4j/scala/Logger.scala
+++ 
b/log4j-api-scala_2.11/src/main/scala/org/apache/logging/log4j/scala/Logger.scala
@@ -26,7 +26,7 @@ class Logger(val delegate: ExtendedLogger) {
 
   private final val FQCN = classOf[Logger].getName
 
-  
+
   def fatal(marker: Marker, message: Message): Unit =
   macro LoggerMacro.fatalMarkerMsg
 
@@ -50,10 +50,10 @@ class Logger(val delegate: ExtendedLogger) {
 
   def fatal(message: CharSequence): Unit =
   macro LoggerMacro.fatalCseq
-  
+
   def fatal(message: AnyRef): Unit =
   macro LoggerMacro.fatalObject
-  
+
   def fatal(message: Message, cause: Throwable): Unit =
   macro LoggerMacro.fatalMsgThrowable
 
@@ -247,8 +247,8 @@ class Logger(val delegate: ExtendedLogger) {
 
   def trace(message: AnyRef, cause: Throwable): Unit =
   macro LoggerMacro.traceObjectThrowable
-  
-  
+
+
   def log(level: Level, marker: Marker, message: Message): Unit =
   macro LoggerMacro.logMarkerMsg
 
@@ -263,10 +263,10 @@ class Logger(val delegate: ExtendedLogger) {
 
   def log(level: Level, marker: Marker, message: CharSequence, cause: 
Throwable): Unit =
   macro LoggerMacro.logMarkerCseqThrowable
-  
+
   def log(level: Level, marker: Marker, message: AnyRef, cause: Throwable): 
Unit =
   macro LoggerMacro.logMarkerObjectThrowable
-  
+
   def log(level: Level, message: Message): Unit =
   macro LoggerMacro.logMsg
 
@@ -275,7 +275,7 @@ class Logger(val delegate: ExtendedLogger) {
 
   def log(level: Level, message: AnyRef): Unit =
   macro LoggerMacro.logObject
-  
+
   def log(level: Level, message: Message, cause: Throwable): Unit =
   macro LoggerMacro.logMsgThrowable
 
@@ -284,7 +284,7 @@ class Logger(val delegate: ExtendedLogger) {
 
   def log(level: Level, message: AnyRef, cause: Throwable): Unit =
   macro LoggerMacro.logObjectThrowable
-  
+
 
   def isEnabled(level: Level): Boolean = delegate.isEnabled(level)
 
@@ -293,8 +293,8 @@ class Logger(val delegate: ExtendedLogger) {
 
   def traceEntry(): EntryMessage = delegate.traceEntry()
 
-  def traceEntry(params: AnyRef*): EntryMessage =
-    delegate.traceEntry(null, params) // TODO would be useful to have this as 
a macro to avoid varargs array creation
+  def traceEntry(params: Any*): EntryMessage =
+  macro LoggerMacro.traceEntryParams
 
   def traceEntry(message: Message): EntryMessage = delegate.traceEntry(message)
 
@@ -319,13 +319,14 @@ class Logger(val delegate: ExtendedLogger) {
 
   def messageFactory: MessageFactory2 = 
delegate.getMessageFactory.asInstanceOf[MessageFactory2]
 
+
   /** Always logs a message at the specified level. It is the responsibility 
of the caller to ensure the specified
     * level is enabled.
     *
-    * @param level    log level
-    * @param marker   marker or `null`
-    * @param message  message
-    * @param cause    cause or `null`
+    * @param level   log level
+    * @param marker  marker or `null`
+    * @param message message
+    * @param cause   cause or `null`
     */
   private[scala] def logMessage(level: Level, marker: Marker, message: 
Message, cause: Throwable): Unit = {
     delegate.logMessage(FQCN, level, marker, message, cause)
@@ -334,10 +335,10 @@ class Logger(val delegate: ExtendedLogger) {
   /** Always logs a message at the specified level. It is the responsibility 
of the caller to ensure the specified
     * level is enabled.
     *
-    * @param level    log level
-    * @param marker   marker or `null`
-    * @param message  message
-    * @param cause    cause or `null`
+    * @param level   log level
+    * @param marker  marker or `null`
+    * @param message message
+    * @param cause   cause or `null`
     */
   private[scala] def logMessage(level: Level, marker: Marker, message: 
CharSequence, cause: Throwable): Unit = {
     delegate.logMessage(FQCN, level, marker, 
messageFactory.newMessage(message), cause)
@@ -346,13 +347,17 @@ class Logger(val delegate: ExtendedLogger) {
   /** Always logs a message at the specified level. It is the responsibility 
of the caller to ensure the specified
     * level is enabled.
     *
-    * @param level    log level
-    * @param marker   marker or `null`
-    * @param message  message
-    * @param cause    cause or `null`
+    * @param level   log level
+    * @param marker  marker or `null`
+    * @param message message
+    * @param cause   cause or `null`
     */
   private[scala] def logMessage(level: Level, marker: Marker, message: AnyRef, 
cause: Throwable): Unit = {
     delegate.logMessage(FQCN, level, marker, 
messageFactory.newMessage(message), cause)
   }
 
+  private[scala] def traceEntryWithParams(params: Any*): EntryMessage = {
+    delegate.traceEntry(null, params)
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9f3a7d6f/log4j-api-scala_2.11/src/main/scala/org/apache/logging/log4j/scala/LoggerMacro.scala
----------------------------------------------------------------------
diff --git 
a/log4j-api-scala_2.11/src/main/scala/org/apache/logging/log4j/scala/LoggerMacro.scala
 
b/log4j-api-scala_2.11/src/main/scala/org/apache/logging/log4j/scala/LoggerMacro.scala
index 808a08f..2105ad9 100644
--- 
a/log4j-api-scala_2.11/src/main/scala/org/apache/logging/log4j/scala/LoggerMacro.scala
+++ 
b/log4j-api-scala_2.11/src/main/scala/org/apache/logging/log4j/scala/LoggerMacro.scala
@@ -16,7 +16,8 @@
  */
 package org.apache.logging.log4j.scala
 
-import org.apache.logging.log4j.message.Message
+import org.apache.logging.log4j.message.{EntryMessage, Message}
+import org.apache.logging.log4j.spi.AbstractLogger
 import org.apache.logging.log4j.{Level, Marker}
 
 import scala.language.experimental.macros
@@ -26,7 +27,7 @@ private object LoggerMacro {
 
   type LoggerContext = blackbox.Context { type PrefixType = Logger }
 
-  
+
   def fatalMarkerMsg(c: LoggerContext)(marker: c.Expr[Marker], message: 
c.Expr[Message]) =
     logMarkerMsg(c)(c.universe.reify(Level.FATAL), marker, message)
 
@@ -332,5 +333,24 @@ private object LoggerMacro {
         c.prefix.splice.logMessage(level.splice, null, message.splice, 
cause.splice)
       }
     )
-  
+
+  def traceEntryParams(c: LoggerContext)(params: c.Expr[Any]*): 
c.Expr[EntryMessage] = {
+    import c.universe._
+    val isEnabled = Apply(
+      Select(Select(c.prefix.tree, newTermName("delegate")), 
newTermName("isEnabled")),
+      List(
+        reify(Level.TRACE).tree,
+        reify(AbstractLogger.ENTRY_MARKER).tree,
+        reify(null.asInstanceOf[AnyRef]).tree,
+        reify(null).tree
+      )
+    )
+
+    val log = Apply(
+      Select(c.prefix.tree, newTermName("traceEntryWithParams")),
+      (params map (_.tree)).toList
+    )
+    c.Expr[EntryMessage](If(isEnabled, log, reify(null).tree))
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9f3a7d6f/log4j-api-scala_2.11/src/test/scala/org/apache/logging/log4j/scala/LoggerTest.scala
----------------------------------------------------------------------
diff --git 
a/log4j-api-scala_2.11/src/test/scala/org/apache/logging/log4j/scala/LoggerTest.scala
 
b/log4j-api-scala_2.11/src/test/scala/org/apache/logging/log4j/scala/LoggerTest.scala
index 1c3a126..359281e 100644
--- 
a/log4j-api-scala_2.11/src/test/scala/org/apache/logging/log4j/scala/LoggerTest.scala
+++ 
b/log4j-api-scala_2.11/src/test/scala/org/apache/logging/log4j/scala/LoggerTest.scala
@@ -17,7 +17,7 @@
 package org.apache.logging.log4j.scala
 
 import org.apache.logging.log4j.message.{Message, ParameterizedMessage, 
ParameterizedMessageFactory}
-import org.apache.logging.log4j.spi.ExtendedLogger
+import org.apache.logging.log4j.spi.{AbstractLogger, ExtendedLogger}
 import org.apache.logging.log4j.{Level, Marker, MarkerManager}
 import org.junit.runner.RunWith
 import org.mockito.Matchers.{any, anyString, eq => eqv}
@@ -428,4 +428,34 @@ class LoggerTest extends FunSuite with Matchers with 
MockitoSugar {
     verify(f.mockLogger, never).logMessage(anyString(), any[Level], 
any[Marker], any[Message], any[Throwable])
   }
 
+
+  test("traceEntry enabled with params") {
+    val f = fixture
+    when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.ENTRY_MARKER, 
null.asInstanceOf[AnyRef], null)).thenReturn(true)
+    val logger = new Logger(f.mockLogger)
+    logger.traceEntry("foo", 17)
+    verify(f.mockLogger).traceEntry(anyString(), any[Array[AnyRef]])
+  }
+
+  test("traceEntry disabled with params") {
+    val f = fixture
+    when(f.mockLogger.isEnabled(Level.TRACE, AbstractLogger.ENTRY_MARKER, 
null.asInstanceOf[AnyRef], null)).thenReturn(false)
+    val logger = new Logger(f.mockLogger)
+    logger.traceEntry("foo", 17)
+    verify(f.mockLogger, never).traceEntry(anyString(), any[Array[AnyRef]])
+  }
+
+  test("traceEntry without params") {
+    val f = fixture
+    val logger = new Logger(f.mockLogger)
+    logger.traceEntry()
+    verify(f.mockLogger).traceEntry()
+  }
+
+  test("traceEntry with message") {
+    val f = fixture
+    val logger = new Logger(f.mockLogger)
+    logger.traceEntry(msg)
+    verify(f.mockLogger).traceEntry(eqv(msg))
+  }
 }

Reply via email to