Author: rgoers
Date: Mon May 31 19:24:10 2010
New Revision: 949837

URL: http://svn.apache.org/viewvc?rev=949837&view=rev
Log:
Fix bug getting proper StackTraceElement. Make PrivateLoggerConfig immutable 
and make members private. Change comments on updateConfiguration to make sense.

Modified:
    
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Log4jLogEvent.java
    
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Logger.java

Modified: 
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Log4jLogEvent.java
URL: 
http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Log4jLogEvent.java?rev=949837&r1=949836&r2=949837&view=diff
==============================================================================
--- 
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Log4jLogEvent.java
 (original)
+++ 
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Log4jLogEvent.java
 Mon May 31 19:24:10 2010
@@ -118,23 +118,8 @@ public class Log4jLogEvent implements Lo
     }
 
     /**
-     * @doubt Not quite sure what is going on with the loop, but looks like it 
might
-     *     drop only the deepest call from the fully qualified class, not all 
of them.
-     * (RG) The loop finds the FQCN and on the next iteration returns the 
StackTraceElement of
-     * the caller of FQCN. Don't know what you mean by "not all of them" as it 
only returns
-     * a single element.
-     *
-     *   Say that FQCN is "MySpecializedLogger" and the stack trace returned 
from getStackTrace is:
-     *
-     *   Log4jLogEvent.getSource
-     *   MySpecializedLogger.log
-     *   MySpecializedLogger.info
-     *   ClientClass.doSomething
-     *   ClientClass.main
-     *
-     *    When walking the stack, next will be set to true  at 
MySpecializedLogger.log
-     *    and MySpecializerLogger.info will be returned (at least from code 
inspection).
-     *
+     * Return the StackTraceElement for the caller. This will be the entry 
that occurs right
+     * before the first occurrence of FQCN as a class name.
      */
     public StackTraceElement getSource() {
         if (fqcnOfLogger == null) {
@@ -144,11 +129,15 @@ public class Log4jLogEvent implements Lo
             StackTraceElement[] stackTrace = 
Thread.currentThread().getStackTrace();
             boolean next = false;
             for (StackTraceElement element : stackTrace) {
+                String className = element.getClassName();
                 if (next) {
+                    if (fqcnOfLogger.equals(className)) {
+                        continue;
+                    }
                     location = element;
                     break;
                 }
-                String className = element.getClassName();
+
                 if (fqcnOfLogger.equals(className)) {
                     next = true;
                 } else if (NOT_AVAIL.equals(className)) {

Modified: 
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Logger.java
URL: 
http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Logger.java?rev=949837&r1=949836&r2=949837&view=diff
==============================================================================
--- 
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Logger.java
 (original)
+++ 
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Logger.java
 Mon May 31 19:24:10 2010
@@ -69,18 +69,14 @@ public class Logger extends AbstractLogg
         return new Logger(context, name);
     }
 
-    /* @Override
-    protected String getFQCN() {
-        return FQCN;
-    } */
-
     public LoggerContext getContext() {
         return context;
     }
 
     public synchronized void setLevel(Level level) {
-        config.level = level;
-        config.intLevel = level.intLevel();
+        if (level != null) {
+            config = new PrivateConfig(config, level);
+        }
     }
 
     public Level getLevel() {
@@ -162,29 +158,27 @@ public class Logger extends AbstractLogg
     }
 
     /**
-     * This method isn't synchronized to serialized updates to config. Rather, 
by doing this
-     * it is guaranteed that all threads will see the update without having to 
declare the variable
-     * volatile.
+     * There are two ways that could be used to guarantee all threads are 
aware of changes to
+     * config. 1. synchronize this method. Accessors don't need to be 
synchronized as Java wil
+     * treat all variables within a synchronized block as volatile. 2. Declare 
the variable
+     * volatile. Option 2 is used here as the performance cost is very low and 
it does a better
+     * job at documenting how it is used.
      *
      * @param config The new Configuration.
-     * @doubt lost me on the comment, this.config is declared volatile. (RG) 
Me too.
      */
     void updateConfiguration(Configuration config) {
         this.config = new PrivateConfig(config, this);
     }
 
     /**
-     * @doubt class is not immutable, so it should not be shared between 
threads. (RG) The class MUST be
-     * shared between threads. The level could be made final and a new 
PrivateConfig constructed when
-     * setLevel is called.
+     * The binding between a Logger and its configuration.
      */
     protected class PrivateConfig {
-       /** @doubt public member variables?  (RG) Should be changed. Did this 
while making the Log4j 1.2 API **/
-        public final LoggerConfig loggerConfig;
-        public final Configuration config;
-        public Level level;
-        public int intLevel;
-        public final Logger logger;
+        private final LoggerConfig loggerConfig;
+        private final Configuration config;
+        private final Level level;
+        private final int intLevel;
+        private final Logger logger;
 
         public PrivateConfig(Configuration config, Logger logger) {
             this.config = config;
@@ -194,6 +188,14 @@ public class Logger extends AbstractLogg
             this.logger = logger;
         }
 
+        public PrivateConfig(PrivateConfig pc, Level level) {
+            this.config = pc.config;
+            this.loggerConfig = pc.loggerConfig;
+            this.level = level;
+            this.intLevel = this.level.intLevel();
+            this.logger = pc.logger;
+        }
+
         public PrivateConfig(PrivateConfig pc, LoggerConfig lc) {
             this.config = pc.config;
             this.loggerConfig = lc;



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to