Support/improve interface-based logger mixin

Project: http://git-wip-us.apache.org/repos/asf/logging-log4j-kotlin/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/logging-log4j-kotlin/commit/2c353e8d
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j-kotlin/tree/2c353e8d
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j-kotlin/diff/2c353e8d

Branch: refs/heads/master
Commit: 2c353e8dc03986ffe820dda1d95038562f7e0e0d
Parents: e391870
Author: Raman Gupta <rocketra...@gmail.com>
Authored: Tue Feb 20 18:47:03 2018 -0500
Committer: Raman Gupta <rocketra...@gmail.com>
Committed: Tue Feb 20 18:47:03 2018 -0500

----------------------------------------------------------------------
 .../log4j/kotlin/sample/LoggingAppMixin.kt      | 63 ++++++++++++++++++++
 .../org/apache/logging/log4j/kotlin/Logger.kt   |  9 ++-
 .../org/apache/logging/log4j/kotlin/Logging.kt  | 32 +++++++---
 .../LoggerCompanionTest.kt                      |  3 +-
 .../LoggerMixinCompanionExtendsTest.kt          | 30 ++++++++++
 .../LoggerMixinExtendsTest.kt                   | 28 +++++++++
 6 files changed, 153 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j-kotlin/blob/2c353e8d/log4j-api-kotlin-sample/src/main/kotlin/org/apache/logging/log4j/kotlin/sample/LoggingAppMixin.kt
----------------------------------------------------------------------
diff --git 
a/log4j-api-kotlin-sample/src/main/kotlin/org/apache/logging/log4j/kotlin/sample/LoggingAppMixin.kt
 
b/log4j-api-kotlin-sample/src/main/kotlin/org/apache/logging/log4j/kotlin/sample/LoggingAppMixin.kt
new file mode 100644
index 0000000..da3de0a
--- /dev/null
+++ 
b/log4j-api-kotlin-sample/src/main/kotlin/org/apache/logging/log4j/kotlin/sample/LoggingAppMixin.kt
@@ -0,0 +1,63 @@
+/*
+ * 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 org.apache.logging.log4j.kotlin.sample
+
+import org.apache.logging.log4j.Level
+import org.apache.logging.log4j.kotlin.Logging
+import org.apache.logging.log4j.kotlin.logger
+import java.util.*
+
+object LoggingAppMixin: Logging {
+  @JvmStatic
+  fun main(args: Array<String>) {
+    val s1 = "foo"
+    val s2 = "bar"
+    val t = RuntimeException("error")
+
+    logger.info { "Hello, world: $s1 $s2" }
+
+    logger.trace("Regular trace")
+
+    logger.trace {
+      logger.info("Inside trace extension!")
+    }
+
+    logger.trace({ "Trace extension with entry message." }) {
+      logger.info("Inside trace extension with supplier!")
+    }
+
+    fun getKey(): Int = logger.trace {
+      Random().nextInt(10)
+    }
+
+    fun getKeyError(): Int = logger.trace {
+      throw Exception("Oops!")
+    }
+
+    logger.info { "Key was ${getKey()}" }
+    try {
+      logger.info { "Key was ${getKeyError()}" }
+    } catch(e: Exception) {
+      Unit
+    }
+
+    logger.throwing(t)
+    logger.throwing(Level.INFO, t)
+
+    logger.catching(t)
+  }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j-kotlin/blob/2c353e8d/log4j-api-kotlin/src/main/kotlin/org/apache/logging/log4j/kotlin/Logger.kt
----------------------------------------------------------------------
diff --git 
a/log4j-api-kotlin/src/main/kotlin/org/apache/logging/log4j/kotlin/Logger.kt 
b/log4j-api-kotlin/src/main/kotlin/org/apache/logging/log4j/kotlin/Logger.kt
index 627d1fa..6ed453e 100644
--- a/log4j-api-kotlin/src/main/kotlin/org/apache/logging/log4j/kotlin/Logger.kt
+++ b/log4j-api-kotlin/src/main/kotlin/org/apache/logging/log4j/kotlin/Logger.kt
@@ -208,11 +208,14 @@ class FunctionalLogger(val log: ExtendedLogger): Logger 
by log {
 }
 
 /**
- * Logger instantiation. Use: `val log = logger()`.
+ * Logger instantiation by function. Use: `val log = logger()`.
  */
 @Suppress("unused")
-inline fun <reified T : Any> T.logger(): FunctionalLogger =
-  FunctionalLogger(LogManager.getContext(T::class.java.classLoader, 
false).getLogger(unwrapCompanionClass(T::class.java).name))
+inline fun <reified T : Any> T.logger() = loggerOf(T::class.java)
+
+fun loggerOf(ofClass: Class<*>): FunctionalLogger {
+  return FunctionalLogger(LogManager.getContext(ofClass.classLoader, 
false).getLogger(unwrapCompanionClass(ofClass).name))
+}
 
 // unwrap companion class to enclosing class given a Java Class
 fun <T : Any> unwrapCompanionClass(ofClass: Class<T>): Class<*> {

http://git-wip-us.apache.org/repos/asf/logging-log4j-kotlin/blob/2c353e8d/log4j-api-kotlin/src/main/kotlin/org/apache/logging/log4j/kotlin/Logging.kt
----------------------------------------------------------------------
diff --git 
a/log4j-api-kotlin/src/main/kotlin/org/apache/logging/log4j/kotlin/Logging.kt 
b/log4j-api-kotlin/src/main/kotlin/org/apache/logging/log4j/kotlin/Logging.kt
index 28229e5..8bd11cd 100644
--- 
a/log4j-api-kotlin/src/main/kotlin/org/apache/logging/log4j/kotlin/Logging.kt
+++ 
b/log4j-api-kotlin/src/main/kotlin/org/apache/logging/log4j/kotlin/Logging.kt
@@ -1,7 +1,21 @@
+/*
+ * 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 org.apache.logging.log4j.kotlin
 
-import org.apache.logging.log4j.Logger
-
 /**
  * An interface-based "mixin" to easily add a log val to a class, named by the 
enclosing class. This allows
  * code like this:
@@ -10,24 +24,26 @@ import org.apache.logging.log4j.Logger
  * import org.apache.logging.log4j.kotlin.Logging
  *
  * class MyClass: Logging {
- *   override val log: Logger = logger()
+ *   // use `logger` as necessary
  * }
  *
  * ```
  *
- * A simpler mechanism is to use the class extension directly, like:
+ * Or declaring the interface on a companion object works just as well:
  *
  * ```
  * import org.apache.logging.log4j.kotlin.logger
  *
  * class MyClass {
- *   val log = logger()
+ *   companion object: Logging
+ *
+ *   // use `logger` as necessary
  * }
  *
  * ```
  */
 interface Logging {
-  val log: Logger
-
-  fun logger(): Logger = this.javaClass.logger()
+  @Suppress("unused")
+  val logger
+    get() = loggerOf(this.javaClass)
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j-kotlin/blob/2c353e8d/log4j-api-kotlin/src/test/kotlin/org.apache.logging.log4j.kotlin/LoggerCompanionTest.kt
----------------------------------------------------------------------
diff --git 
a/log4j-api-kotlin/src/test/kotlin/org.apache.logging.log4j.kotlin/LoggerCompanionTest.kt
 
b/log4j-api-kotlin/src/test/kotlin/org.apache.logging.log4j.kotlin/LoggerCompanionTest.kt
index a661533..1d78b0b 100644
--- 
a/log4j-api-kotlin/src/test/kotlin/org.apache.logging.log4j.kotlin/LoggerCompanionTest.kt
+++ 
b/log4j-api-kotlin/src/test/kotlin/org.apache.logging.log4j.kotlin/LoggerCompanionTest.kt
@@ -24,7 +24,8 @@ class LoggerCompanionTest {
   }
 
   @Test
-  fun `Logging from companion logger works!`() {
+  fun `Logging from a function instantiation via companion logs the correct 
class name`() {
+    // this should log from class LoggerCompanionTest
     log.error("This is an error log.")
   }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4j-kotlin/blob/2c353e8d/log4j-api-kotlin/src/test/kotlin/org.apache.logging.log4j.kotlin/LoggerMixinCompanionExtendsTest.kt
----------------------------------------------------------------------
diff --git 
a/log4j-api-kotlin/src/test/kotlin/org.apache.logging.log4j.kotlin/LoggerMixinCompanionExtendsTest.kt
 
b/log4j-api-kotlin/src/test/kotlin/org.apache.logging.log4j.kotlin/LoggerMixinCompanionExtendsTest.kt
new file mode 100644
index 0000000..223a0b6
--- /dev/null
+++ 
b/log4j-api-kotlin/src/test/kotlin/org.apache.logging.log4j.kotlin/LoggerMixinCompanionExtendsTest.kt
@@ -0,0 +1,30 @@
+/*
+ * 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 org.apache.logging.log4j.kotlin
+
+import org.junit.Test
+
+class LoggerMixinCompanionExtendsTest {
+
+  companion object : Logging
+
+  @Test
+  fun `Logging from an interface mix-in via companion logs the correct class 
name`() {
+    // this should log from class LoggerMixinCompanionExtendsTest
+    logger.error("This is an error log.")
+  }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j-kotlin/blob/2c353e8d/log4j-api-kotlin/src/test/kotlin/org.apache.logging.log4j.kotlin/LoggerMixinExtendsTest.kt
----------------------------------------------------------------------
diff --git 
a/log4j-api-kotlin/src/test/kotlin/org.apache.logging.log4j.kotlin/LoggerMixinExtendsTest.kt
 
b/log4j-api-kotlin/src/test/kotlin/org.apache.logging.log4j.kotlin/LoggerMixinExtendsTest.kt
new file mode 100644
index 0000000..2939833
--- /dev/null
+++ 
b/log4j-api-kotlin/src/test/kotlin/org.apache.logging.log4j.kotlin/LoggerMixinExtendsTest.kt
@@ -0,0 +1,28 @@
+/*
+ * 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 org.apache.logging.log4j.kotlin
+
+import org.junit.Test
+
+class LoggerMixinExtendsTest : Logging {
+
+  @Test
+  fun `Logging using an interface mix-in logs the correct class name`() {
+    // this should log from class LoggerMixinExtendsTest
+    logger.error("This is an error log.")
+  }
+}

Reply via email to