From 04dfafe19f0d3687d0f0b3e51d2d5bf3d19b58bf Mon Sep 17 00:00:00 2001
From: boli <boli@localhost>
Date: Wed, 07 Mar 2007 23:38:55 +0000
Subject: [PATCH] Enable AspectJ weaving for the new debug logging framework: - This commit does not allow for configuring the debug logger over protocol. It can only be configured on server startup using properties. - The settings specified during startup will remain in effect for the duration of the server. - All messages are printed to standard out. - Weaving could be turned off with the -DDEBUG_BUILD=false property when building the server. - By default, the debug logger is off on server startup. It could be enabled by using the -Dorg.opends.server.debug.enabled=true. - Debug targets may be defined with the -Dorg.opends.server.debug.target property. The syntax of this property can be found on the opends.dev.java.net documentation section. - Debug logging is turned on by default on unit tests and printed on test failure.  - Default debug target for unit tests could be changed by using the -Dorg.opends.test.debug.target property.

---
 opends/src/server/org/opends/server/loggers/debug/Tracer.java |  390 +++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 290 insertions(+), 100 deletions(-)

diff --git a/opends/src/server/org/opends/server/loggers/debug/Tracer.java b/opends/src/server/org/opends/server/loggers/debug/Tracer.java
index 687fc8d..c3f5183 100644
--- a/opends/src/server/org/opends/server/loggers/debug/Tracer.java
+++ b/opends/src/server/org/opends/server/loggers/debug/Tracer.java
@@ -39,6 +39,7 @@
 import org.opends.server.util.ServerConstants;
 import org.opends.server.util.StaticUtils;
 import org.opends.server.api.ProtocolElement;
+import org.opends.server.api.DirectoryThread;
 import org.opends.server.loggers.*;
 import org.opends.server.types.DebugLogCategory;
 import org.opends.server.types.DebugLogLevel;
@@ -53,7 +54,11 @@
  * Logging is always done at a level basis, with debug log messages
  * exceeding the trace threshold being traced, others being discarded.
  */
-@Aspect("pertypewithin(*)")
+@Aspect("pertypewithin(!@Tracer.NoDebugTracing org.opends.server..*+ && " +
+    "!org.opends.server.loggers.*+ && " +
+    "!org.opends.server.loggers.debug..*+ &&" +
+    "!org.opends.server.types.DebugLogLevel+ && " +
+    "!org.opends.server.types.DebugLogCategory+)")
 public class Tracer
 {
   /**
@@ -76,7 +81,7 @@
   /**
    * Pointcut for matching all toString() methods.
    */
-  @Pointcut("execution(String *..toString())")
+  @Pointcut("execution(* *..toString(..))")
   private void toStringMethod()
   {
   }
@@ -91,6 +96,16 @@
   }
 
   /**
+   * Pointcut for matching all getDebugProperties() methods.
+   * TODO: Make this less general. Find out if pointcut matches
+   * subclass methods.
+   */
+  @Pointcut("execution(* *..getDebugProperties(..))")
+  private void getDebugPropertiesMethod()
+  {
+  }
+
+  /**
    * Pointcut for matching debugMessage() methods.
    */
   @Pointcut("call(public static void org.opends.server." +
@@ -194,9 +209,8 @@
    * Pointcut to exclude all pointcuts which should not be adviced by the
    * debug logger.
    */
-  @Pointcut("within(Tracer+) || within(org.opends.server.loggers.debug..*) " +
-      "|| toStringMethod() " +
-      "|| getMessageMethod() || logMethods()")
+  @Pointcut("toStringMethod() || getMessageMethod() || " +
+      "getDebugPropertiesMethod() || logMethods()")
   private void excluded()
   {
   }
@@ -204,16 +218,47 @@
   /**
    * Pointcut for matching the execution of all public methods.
    */
-  @Pointcut("execution(!@NoDebugTracing public * *(..)) && !excluded()")
-  void tracedMethod()
+  @Pointcut("execution(!@(Tracer.NoDebugTracing || " +
+      "Tracer.NoEntryDebugTracing) public * *(..)) && " +
+      "!excluded()")
+  void tracedEntryMethod()
+  {
+  }
+
+  /**
+   * Pointcut for matching the execution of all public methods.
+   */
+  @Pointcut("execution(!@(Tracer.NoDebugTracing || " +
+      "Tracer.NoExitDebugTracing) public * *(..)) && " +
+      "!excluded()")
+  void tracedExitMethod()
+  {
+  }
+
+  /**
+   * Pointcut for matching the execution of all public methods.
+   */
+  @Pointcut("execution(@Tracer.TraceThrown public * *(..)) && " +
+      "!excluded()")
+  void tracedThrownMethod()
   {
   }
 
   /**
    * Pointcut for matching the execution of all constructors.
    */
-  @Pointcut("execution(!@NoDebugTracing public new(..)) && !excluded()")
-  void tracedConstructor()
+  @Pointcut("execution(!@(Tracer.NoDebugTracing || " +
+      "Tracer.NoEntryDebugTracing) public new(..)) && !excluded()")
+  void tracedEntryConstructor()
+  {
+  }
+
+  /**
+   * Pointcut for matching the execution of all constructors.
+   */
+  @Pointcut("execution(!@(Tracer.NoDebugTracing || " +
+      "Tracer.NoExitDebugTracing) public new(..)) && !excluded()")
+  void tracedExitConstructor()
   {
   }
 
@@ -222,19 +267,12 @@
    *
    * @return if debug logging is enabled.
    */
-  @Pointcut("if() && tracingScope()")
+  @Pointcut("if()")
   public static boolean shouldTrace()
   {
-    return DebugLogger.enabled;
+    return DebugLogger.staticEnabled;
   }
 
-  /**
-   * Pointcut for matching only within the scope of the server packages.
-   */
-  @Pointcut("within(!@NoDebugTracing org.opends.server..*)")
-  protected void tracingScope()
-  {
-  }
 
   //The default level to log constructor exectuions.
   private static final LogLevel DEFAULT_CONSTRUCTOR_LEVEL =
@@ -242,6 +280,12 @@
   //The default level to log method entry and exit pointcuts.
   private static final LogLevel DEFAULT_ENTRY_EXIT_LEVEL =
       DebugLogLevel.VERBOSE;
+  //The default level to log method entry and exit pointcuts.
+  private static final LogLevel DEFAULT_THROWN_LEVEL =
+      DebugLogLevel.ERROR;
+
+  private static final DebugMessageFormatter msgFormatter =
+      new DebugMessageFormatter();
 
   // The class this tracer traces.
   private String className;
@@ -258,13 +302,12 @@
    *
    * @param thisJoinPointStaticPart the JoinPoint reflection object.
    */
-  @Before("staticinitialization(*) && tracingScope()")
+  @Before("staticinitialization(*)")
   public void initializeTracer(JoinPoint.StaticPart thisJoinPointStaticPart)
   {
     className = thisJoinPointStaticPart.getSignature().getDeclaringTypeName();
     logger = DebugLogger.getLogger();
     logger.registerTracer(className, this);
-    updateSettings();
   }
 
   /**
@@ -272,7 +315,7 @@
    *
    * @param thisJoinPoint the JoinPoint reflection object.
    */
-  @Before("shouldTrace() && tracedConstructor()")
+  @Before("shouldTrace() && tracedEntryConstructor()")
   public void traceConstructor(JoinPoint thisJoinPoint)
   {
     LogCategory category = DebugLogCategory.CONSTRUCTOR;
@@ -294,7 +337,7 @@
    * @param thisJoinPoint the JoinPoint reflection object.
    * @param obj the object this method operations on.
    */
-  @Before("shouldTrace() && tracedMethod() && nonStaticContext(obj)")
+  @Before("shouldTrace() && tracedEntryMethod() && nonStaticContext(obj)")
   public void traceNonStaticMethodEntry(JoinPoint thisJoinPoint, Object obj)
   {
     LogCategory category = DebugLogCategory.ENTER;
@@ -315,7 +358,7 @@
    *
    * @param thisJoinPoint the JoinPoint reflection object.
    */
-  @Before("shouldTrace() && tracedMethod() && staticContext()")
+  @Before("shouldTrace() && tracedEntryMethod() && staticContext()")
   public void traceStaticMethodEntry(JoinPoint thisJoinPoint)
   {
     LogCategory category = DebugLogCategory.ENTER;
@@ -337,8 +380,8 @@
    * @param thisJoinPointStaticPart the JoinPoint reflection object.
    * @param ret the return value of the method.
    */
-  @AfterReturning(pointcut = "shouldTrace() && tracedMethod() &&" +
-                             "traceConstructor()",
+  @AfterReturning(pointcut = "shouldTrace() && " +
+      "(tracedExitMethod() || tracedExitConstructor())",
                   returning = "ret")
   public void traceReturn(JoinPoint.StaticPart thisJoinPointStaticPart,
                           Object ret)
@@ -359,12 +402,42 @@
   /**
    * AspectJ Implementation.
    *
-   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object.
+   * @param thisJoinPointStaticPart the JoinPoint reflection object.
+   * @param ex the exception thrown.
+   */
+  @AfterThrowing(pointcut = "shouldTrace() && tracedThrownMethod()",
+                 throwing = "ex")
+  public void traceThrown(JoinPoint.StaticPart thisJoinPointStaticPart,
+                          Throwable ex)
+  {
+    LogCategory category = DebugLogCategory.THROWN;
+    LogLevel level = DEFAULT_THROWN_LEVEL;
+    Signature signature = thisJoinPointStaticPart.getSignature();
+    TraceSettings settings = getSettings(signature.getName());
+    if (level.intValue() >=
+        getEffectiveLevel(settings, category).intValue())
+    {
+      SourceLocation sl = thisJoinPointStaticPart.getSourceLocation();
+      publish(category, level, signature.toLongString(), sl.toString(),
+              null, null , new Object[]{ex}, settings);
+    }
+  }
+
+  /**
+   * AspectJ Implementation.
+   *
+   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object
+   *                                         of the code that contains the
+   *                                         debug call.
+   * @param thisJoinPointStaticPart the JoinPoint reflection object.
    * @param msg message to format and log.
    */
   @Around("shouldTrace() && logVerboseMethod() && args(msg)")
   public void traceVerbose(JoinPoint.EnclosingStaticPart
-                             thisEnclosingJoinPointStaticPart, String msg)
+                             thisEnclosingJoinPointStaticPart,
+                           JoinPoint.StaticPart
+                            thisJoinPointStaticPart,
+                           String msg)
   {
     LogLevel level = DebugLogLevel.VERBOSE;
     LogCategory category = DebugLogCategory.MESSAGE;
@@ -373,7 +446,7 @@
     if (level.intValue() >=
         getEffectiveLevel(settings, category).intValue())
     {
-      SourceLocation sl = thisEnclosingJoinPointStaticPart.getSourceLocation();
+      SourceLocation sl = thisJoinPointStaticPart.getSourceLocation();
       publish(category, level, signature.toLongString(),
               sl.toString(), null, msg, null, settings);
     }
@@ -382,13 +455,18 @@
   /**
    * AspectJ Implementation.
    *
-   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object.
+   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object
+   *                                         of the code that contains the
+   *                                         debug call.
+   * @param thisJoinPointStaticPart the JoinPoint reflection object.
    * @param msg message to format and log.
    * @param msgArgs arguments to place into the format string.
    */
   @Around("shouldTrace() && logVerboseMethod() && args(msg, msgArgs)")
   public void traceVerbose(JoinPoint.EnclosingStaticPart
                              thisEnclosingJoinPointStaticPart,
+                           JoinPoint.StaticPart
+                            thisJoinPointStaticPart,
                            String msg, Object[] msgArgs)
   {
     LogLevel level = DebugLogLevel.VERBOSE;
@@ -398,7 +476,7 @@
     if (level.intValue() >=
         getEffectiveLevel(settings, category).intValue())
     {
-      SourceLocation sl = thisEnclosingJoinPointStaticPart.getSourceLocation();
+      SourceLocation sl = thisJoinPointStaticPart.getSourceLocation();
       publish(category, level, signature.toLongString(),
               sl.toString(), null, msg, msgArgs, settings);
     }
@@ -407,12 +485,18 @@
   /**
    * AspectJ Implementation.
    *
-   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object.
+   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object
+   *                                         of the code that contains the
+   *                                         debug call.
+   * @param thisJoinPointStaticPart the JoinPoint reflection object.
    * @param msg message to format and log.
    */
   @Around("shouldTrace() && logInfoMethod() && args(msg)")
   public void traceInfo(JoinPoint.EnclosingStaticPart
-                          thisEnclosingJoinPointStaticPart, String msg)
+                          thisEnclosingJoinPointStaticPart,
+                        JoinPoint.StaticPart
+                            thisJoinPointStaticPart,
+                        String msg)
   {
     LogLevel level = DebugLogLevel.INFO;
     LogCategory category = DebugLogCategory.MESSAGE;
@@ -421,7 +505,7 @@
     if (level.intValue() >=
         getEffectiveLevel(settings, category).intValue())
     {
-      SourceLocation sl = thisEnclosingJoinPointStaticPart.getSourceLocation();
+      SourceLocation sl = thisJoinPointStaticPart.getSourceLocation();
       publish(category, level, signature.toLongString(),
               sl.toString(), null, msg, null, settings);
     }
@@ -430,13 +514,18 @@
   /**
    * AspectJ Implementation.
    *
-   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object.
+   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object
+   *                                         of the code that contains the
+   *                                         debug call.
+   * @param thisJoinPointStaticPart the JoinPoint reflection object.
    * @param msg message to format and log.
    * @param msgArgs arguments to place into the format string.
    */
   @Around("shouldTrace() && logInfoMethod() && args(msg, msgArgs)")
   public void traceInfo(JoinPoint.EnclosingStaticPart
                           thisEnclosingJoinPointStaticPart,
+                        JoinPoint.StaticPart
+                            thisJoinPointStaticPart,
                         String msg, Object[] msgArgs)
   {
     LogLevel level = DebugLogLevel.INFO;
@@ -446,7 +535,7 @@
     if (level.intValue() >=
         getEffectiveLevel(settings, category).intValue())
     {
-      SourceLocation sl = thisEnclosingJoinPointStaticPart.getSourceLocation();
+      SourceLocation sl = thisJoinPointStaticPart.getSourceLocation();
       publish(category, level, signature.toLongString(),
               sl.toString(), null, msg, msgArgs, settings);
     }
@@ -455,12 +544,18 @@
   /**
    * AspectJ Implementation.
    *
-   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object.
+   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object
+   *                                         of the code that contains the
+   *                                         debug call.
+   * @param thisJoinPointStaticPart the JoinPoint reflection object.
    * @param msg message to format and log.
    */
   @Around("shouldTrace() && logWarningMethod() && args(msg)")
   public void traceWarning(JoinPoint.EnclosingStaticPart
-                             thisEnclosingJoinPointStaticPart, String msg)
+                             thisEnclosingJoinPointStaticPart,
+                           JoinPoint.StaticPart
+                            thisJoinPointStaticPart,
+                           String msg)
 
   {
     LogLevel level = DebugLogLevel.WARNING;
@@ -470,7 +565,7 @@
     if (level.intValue() >=
         getEffectiveLevel(settings, category).intValue())
     {
-      SourceLocation sl = thisEnclosingJoinPointStaticPart.getSourceLocation();
+      SourceLocation sl = thisJoinPointStaticPart.getSourceLocation();
       publish(category, level, signature.toLongString(),
               sl.toString(), null, msg, null, settings);
     }
@@ -479,13 +574,18 @@
   /**
    * AspectJ Implementation.
    *
-   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object.
+   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object
+   *                                         of the code that contains the
+   *                                         debug call.
+   * @param thisJoinPointStaticPart the JoinPoint reflection object.
    * @param msg message to format and log.
    * @param msgArgs arguments to place into the format string.
    */
   @Around("shouldTrace() && logWarningMethod() && args(msg, msgArgs)")
   public void traceWarning(JoinPoint.EnclosingStaticPart
                              thisEnclosingJoinPointStaticPart,
+                           JoinPoint.StaticPart
+                            thisJoinPointStaticPart,
                            String msg, Object[] msgArgs)
   {
     LogLevel level = DebugLogLevel.WARNING;
@@ -495,7 +595,7 @@
     if (level.intValue() >=
         getEffectiveLevel(settings, category).intValue())
     {
-      SourceLocation sl = thisEnclosingJoinPointStaticPart.getSourceLocation();
+      SourceLocation sl = thisJoinPointStaticPart.getSourceLocation();
       publish(category, level, signature.toLongString(),
               sl.toString(), null, msg, msgArgs, settings);
     }
@@ -504,12 +604,18 @@
   /**
    * AspectJ Implementation.
    *
-   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object.
+   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object
+   *                                         of the code that contains the
+   *                                         debug call.
+   * @param thisJoinPointStaticPart the JoinPoint reflection object.
    * @param msg message to format and log.
    */
   @Around("shouldTrace() && logErrorMethod() && args(msg)")
   public void traceError(JoinPoint.EnclosingStaticPart
-                           thisEnclosingJoinPointStaticPart, String msg)
+                           thisEnclosingJoinPointStaticPart,
+                         JoinPoint.StaticPart
+                            thisJoinPointStaticPart,
+                         String msg)
 
   {
     LogLevel level = DebugLogLevel.ERROR;
@@ -519,7 +625,7 @@
     if (level.intValue() >=
         getEffectiveLevel(settings, category).intValue())
     {
-      SourceLocation sl = thisEnclosingJoinPointStaticPart.getSourceLocation();
+      SourceLocation sl = thisJoinPointStaticPart.getSourceLocation();
       publish(category, level, signature.toLongString(),
               sl.toString(), null, msg, null, settings);
     }
@@ -528,13 +634,18 @@
   /**
    * AspectJ Implementation.
    *
-   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object.
+   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object
+   *                                         of the code that contains the
+   *                                         debug call.
+   * @param thisJoinPointStaticPart the JoinPoint reflection object.
    * @param msg message to format and log.
    * @param msgArgs arguments to place into the format string.
    */
   @Around("shouldTrace() && logErrorMethod() && args(msg, msgArgs)")
   public void traceError(JoinPoint.EnclosingStaticPart
                            thisEnclosingJoinPointStaticPart,
+                         JoinPoint.StaticPart
+                            thisJoinPointStaticPart,
                          String msg, Object[] msgArgs)
   {
     LogLevel level = DebugLogLevel.ERROR;
@@ -544,7 +655,7 @@
     if (level.intValue() >=
         getEffectiveLevel(settings, category).intValue())
     {
-      SourceLocation sl = thisEnclosingJoinPointStaticPart.getSourceLocation();
+      SourceLocation sl = thisJoinPointStaticPart.getSourceLocation();
       publish(category, level, signature.toLongString(),
               sl.toString(), null, msg, msgArgs, settings);
     }
@@ -553,13 +664,18 @@
   /**
    * AspectJ Implementation.
    *
-   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object.
+   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object
+   *                                         of the code that contains the
+   *                                         debug call.
+   * @param thisJoinPointStaticPart the JoinPoint reflection object.
    * @param level the level of the log message.
    * @param msg message to format and log.
    */
   @Around("shouldTrace() && logMessageMethod() && args(level, msg)")
   public void traceMessage(JoinPoint.EnclosingStaticPart
                              thisEnclosingJoinPointStaticPart,
+                           JoinPoint.StaticPart
+                            thisJoinPointStaticPart,
                            LogLevel level, String msg)
   {
     LogCategory category = DebugLogCategory.MESSAGE;
@@ -568,7 +684,7 @@
     if (level.intValue() >=
         getEffectiveLevel(settings, category).intValue())
     {
-      SourceLocation sl = thisEnclosingJoinPointStaticPart.getSourceLocation();
+      SourceLocation sl = thisJoinPointStaticPart.getSourceLocation();
       publish(category, level, signature.toLongString(), sl.toString(),
               null, msg, null, settings);
     }
@@ -577,7 +693,10 @@
   /**
    * AspectJ Implementation.
    *
-   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object.
+   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object
+   *                                         of the code that contains the
+   *                                         debug call.
+   * @param thisJoinPointStaticPart the JoinPoint reflection object.
    * @param level the level of the log message.
    * @param msg message to format and log.
    * @param msgArgs arguments to place into the format string.
@@ -585,6 +704,8 @@
   @Around("shouldTrace() && logMessageMethod() && args(level, msg, msgArgs)")
   public void traceMessage(JoinPoint.EnclosingStaticPart
                              thisEnclosingJoinPointStaticPart,
+                           JoinPoint.StaticPart
+                            thisJoinPointStaticPart,
                            LogLevel level, String msg, Object... msgArgs)
   {
     LogCategory category = DebugLogCategory.MESSAGE;
@@ -593,7 +714,7 @@
     if (level.intValue() >=
         getEffectiveLevel(settings, category).intValue())
     {
-      SourceLocation sl = thisEnclosingJoinPointStaticPart.getSourceLocation();
+      SourceLocation sl = thisJoinPointStaticPart.getSourceLocation();
       publish(category, level, signature.toLongString(), sl.toString(),
               null, msg, msgArgs, settings);
     }
@@ -602,13 +723,18 @@
   /**
    * AspectJ Implementation.
    *
-   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object.
+   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object
+   *                                         of the code that contains the
+   *                                         debug call.
+   * @param thisJoinPointStaticPart the JoinPoint reflection object.
    * @param level the level of the log message.
    * @param ex the exception thrown.
    */
   @Around("shouldTrace() && logThrownMethod() && args(level, ex)")
   public void traceThrown(JoinPoint.EnclosingStaticPart
                             thisEnclosingJoinPointStaticPart,
+                          JoinPoint.StaticPart
+                            thisJoinPointStaticPart,
                           LogLevel level, Throwable ex)
   {
     LogCategory category = DebugLogCategory.THROWN;
@@ -617,7 +743,7 @@
     if (level.intValue() >=
         getEffectiveLevel(settings, category).intValue())
     {
-      SourceLocation sl = thisEnclosingJoinPointStaticPart.getSourceLocation();
+      SourceLocation sl = thisJoinPointStaticPart.getSourceLocation();
       publish(category, level, signature.toLongString(), sl.toString(),
               null, null , new Object[]{ex}, settings);
     }
@@ -626,13 +752,18 @@
   /**
    * AspectJ Implementation.
    *
-   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object.
+   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object
+   *                                         of the code that contains the
+   *                                         debug call.
+   * @param thisJoinPointStaticPart the JoinPoint reflection object.
    * @param level the level of the log message.
    * @param ex the exception caught.
    */
   @Around("shouldTrace() && logCaughtMethod() && args(level, ex)")
   public void traceCaught(JoinPoint.EnclosingStaticPart
                             thisEnclosingJoinPointStaticPart,
+                          JoinPoint.StaticPart
+                            thisJoinPointStaticPart,
                           LogLevel level, Throwable ex)
   {
     LogCategory category = DebugLogCategory.CAUGHT;
@@ -641,7 +772,7 @@
     if (level.intValue() >=
         getEffectiveLevel(settings, category).intValue())
     {
-      SourceLocation sl = thisEnclosingJoinPointStaticPart.getSourceLocation();
+      SourceLocation sl = thisJoinPointStaticPart.getSourceLocation();
       publish(category, level, signature.toLongString(), sl.toString(),
               null, null , new Object[]{ex}, settings);
     }
@@ -650,7 +781,10 @@
   /**
    * AspectJ Implementation.
    *
-   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object.
+   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object
+   *                                         of the code that contains the
+   *                                         debug call.
+   * @param thisJoinPointStaticPart the JoinPoint reflection object.
    * @param level the level of the log message.
    * @param status status of the JE operation.
    * @param database the database handle.
@@ -662,6 +796,8 @@
       "database, txn, key, data)")
   public void traceJEAccess(JoinPoint.EnclosingStaticPart
                               thisEnclosingJoinPointStaticPart,
+                            JoinPoint.StaticPart
+                              thisJoinPointStaticPart,
                             LogLevel level, OperationStatus status,
                             Database database, Transaction txn,
                             DatabaseEntry key, DatabaseEntry data)
@@ -704,26 +840,29 @@
         builder.append(" txnid=none");
       }
 
-      // If the operation was successful we log the same common information
-      // plus the key and data under category DATABASE_READ or DATABASE_WRITE
-      if (status == OperationStatus.SUCCESS)
+      builder.append(ServerConstants.EOL);
+      if(key != null)
       {
-        builder.append(ServerConstants.EOL);
-        builder.append(" key:");
+        builder.append("key:");
         builder.append(ServerConstants.EOL);
         StaticUtils.byteArrayToHexPlusAscii(builder, key.getData(), 4);
-        if (data != null)
-        {
-          builder.append("data(len=");
-          builder.append(data.getSize());
-          builder.append("):");
-          builder.append(ServerConstants.EOL);
-          StaticUtils.byteArrayToHexPlusAscii(builder, data.getData(), 4);
-        }
+      }
+
+      // If the operation was successful we log the same common information
+      // plus the data
+      if (status == OperationStatus.SUCCESS && data != null)
+      {
+
+        builder.append("data(len=");
+        builder.append(data.getSize());
+        builder.append("):");
+        builder.append(ServerConstants.EOL);
+        StaticUtils.byteArrayToHexPlusAscii(builder, data.getData(), 4);
+
       }
 
 
-      SourceLocation sl = thisEnclosingJoinPointStaticPart.getSourceLocation();
+      SourceLocation sl = thisJoinPointStaticPart.getSourceLocation();
       publish(category, level, signature.toLongString(), sl.toString(), null,
               builder.toString(), null, settings);
     }
@@ -731,13 +870,18 @@
 
   /**
    * AspectJ Implementation.
-   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object.
+   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object
+   *                                         of the code that contains the
+   *                                         debug call.
+   * @param thisJoinPointStaticPart the JoinPoint reflection object.
    * @param level the level of the log message.
    * @param data the data to dump.
    */
   @Around("shouldTrace() && logDataMethod() && args(level, data)")
   public void traceData(JoinPoint.EnclosingStaticPart
                           thisEnclosingJoinPointStaticPart,
+                        JoinPoint.StaticPart
+                          thisJoinPointStaticPart,
                         LogLevel level, byte[] data)
   {
     LogCategory category = DebugLogCategory.DATA;
@@ -756,7 +900,7 @@
         builder.append(ServerConstants.EOL);
         StaticUtils.byteArrayToHexPlusAscii(builder, data, 4);
         SourceLocation sl =
-            thisEnclosingJoinPointStaticPart.getSourceLocation();
+            thisJoinPointStaticPart.getSourceLocation();
         publish(category, level, signature.toLongString(), sl.toString(), null,
                 builder.toString(), null, settings);
       }
@@ -766,13 +910,18 @@
   /**
    * AspectJ Implementation.
    *
-   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object.
+   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object
+   *                                         of the code that contains the
+   *                                         debug call.
+   * @param thisJoinPointStaticPart the JoinPoint reflection object.
    * @param level the level of the log message.
    * @param element the protocol element to dump.
    */
   @Around("shouldTrace() && logProtocolElementMethod() && args(level, element)")
   public void traceProtocolElement(JoinPoint.EnclosingStaticPart
                                      thisEnclosingJoinPointStaticPart,
+                                   JoinPoint.StaticPart
+                                     thisJoinPointStaticPart,
                                    LogLevel level, ProtocolElement element)
   {
     LogCategory category = DebugLogCategory.PROTOCOL;
@@ -787,7 +936,7 @@
         builder.append(ServerConstants.EOL);
         element.toString(builder, 4);
         SourceLocation sl =
-            thisEnclosingJoinPointStaticPart.getSourceLocation();
+            thisJoinPointStaticPart.getSourceLocation();
         publish(category, level, signature.toLongString(), sl.toString(), null,
                 builder.toString(), null, settings);
       }
@@ -797,13 +946,18 @@
   /**
    * AspectJ Implementation.
    *
-   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object.
+   * @param thisEnclosingJoinPointStaticPart the JoinPoint reflection object
+   *                                         of the code that contains the
+   *                                         debug call.
+   * @param thisJoinPointStaticPart the JoinPoint reflection object.
    * @param level the level of the log message.
    * @param buffer the data to dump.
    */
   @Around("shouldTrace() && logDataMethod() && args(level, buffer)")
   public void traceData(JoinPoint.EnclosingStaticPart
                           thisEnclosingJoinPointStaticPart,
+                        JoinPoint.StaticPart
+                          thisJoinPointStaticPart,
                         LogLevel level, ByteBuffer buffer)
   {
     LogCategory category = DebugLogCategory.DATA;
@@ -823,7 +977,7 @@
         builder.append(ServerConstants.EOL);
         StaticUtils.byteArrayToHexPlusAscii(builder, data, 4);
         SourceLocation sl =
-            thisEnclosingJoinPointStaticPart.getSourceLocation();
+            thisJoinPointStaticPart.getSourceLocation();
         publish(category, level, signature.toLongString(), sl.toString(), null,
                 builder.toString(), null, settings);
       }
@@ -839,9 +993,10 @@
   {
     int stackDepth = 0;
 
-    if(DebugLogCategory.ENTER.equals(category))
+    if (DebugLogCategory.ENTER.equals(category) ||
+        DebugLogCategory.CONSTRUCTOR.equals(category))
     {
-      if (settings.noArgs)
+      if(settings.noArgs)
       {
         msgArgs = null;
       }
@@ -849,12 +1004,11 @@
       {
         msg = buildDefaultEntryMessage(msgArgs.length);
       }
-
-      stackDepth = settings.stackDepth;
     }
-    if(DebugLogCategory.EXIT.equals(category))
+
+    else if(DebugLogCategory.EXIT.equals(category))
     {
-      if (settings.noRetVal)
+      if(settings.noRetVal)
       {
         msgArgs = null;
       }
@@ -863,18 +1017,26 @@
         msg = "returned={%s}";
       }
     }
-    if(DebugLogCategory.THROWN.equals(category))
+
+    else if(DebugLogCategory.THROWN.equals(category))
     {
-      if (msg == null)
+      if(msg == null)
       {
         msg = "threw={%s}";
       }
-      stackDepth = settings.stackDepth;
+    }
+
+    else if(DebugLogCategory.CAUGHT.equals(category))
+    {
+      if(msg == null)
+      {
+        msg = "caught={%s}";
+      }
     }
 
     if (msg != null && msgArgs != null)
     {
-      msg = String.format(msg, msgArgs);
+      msg = msgFormatter.format(msg, msgArgs);
     }
 
 
@@ -883,21 +1045,25 @@
     record.setSignature(method);
     record.setSourceLocation(srcLocation);
 
+    Thread thread = Thread.currentThread();
+    if(thread instanceof DirectoryThread)
+    {
+      record.setThreadProperties(
+          ((DirectoryThread)thread).getDebugProperties());
+    }
+
+    //Stack trace applies only to entry and thrown exception messages.
+    if(DebugLogCategory.ENTER.equals(category) ||
+        DebugLogCategory.THROWN.equals(category))
+    {
+      stackDepth = settings.stackDepth;
+    }
+
     // Inject a stack trace if requested
     if (stackDepth > 0) {
 
       //Generate a dummy exception to get stack trace if necessary
-      Throwable t;
-      if(!DebugLogCategory.THROWN.equals(category) || msgArgs == null
-          || msgArgs[0] == null)
-      {
-       t= new NullPointerException();
-      }
-      else
-      {
-        t = (Throwable)msgArgs[0];
-      }
-
+      Throwable t= new NullPointerException();
       String stack=
           DebugStackTraceFormatter.formatStackTrace(t,
                                    DebugStackTraceFormatter.SMART_FRAME_FILTER,
@@ -988,15 +1154,15 @@
 
   /**
    * Update the settings for this tracer.
+   *
+   * @param config the new trace configuration.
    */
-  protected void updateSettings()
+  protected void updateSettings(DebugConfiguration config)
   {
     synchronized (this)
     {
-      this.settings =
-          logger.getConfiguration().getTraceSettings(className);
-      this.methodSettings =
-          logger.getConfiguration().getMethodSettings(className);
+      this.settings = config.getTraceSettings(className);
+      this.methodSettings = config.getMethodSettings(className);
     }
   }
 
@@ -1027,4 +1193,28 @@
     return getEffectiveLevel(settings, category);
   }
 
+  /**
+   * Classes and methods annotated with @NoDebugTracing will not be weaved with
+   * debug logging statements by AspectJ.
+   */
+  public @interface NoDebugTracing {}
+
+  /**
+   * Methods annotated with @NoEntryDebugTracing will not be weaved with
+   * entry debug logging statements by AspectJ.
+   */
+  public @interface NoEntryDebugTracing {}
+
+  /**
+   * Methods annotated with @NoExitDebugTracing will not be weaved with
+   * exit debug logging statements by AspectJ.
+   */
+  public @interface NoExitDebugTracing {}
+
+  /**
+   * Methods annotated with @TraceThrown will not be weaved by AspectJ with
+   * debug logging statements when an exception is thrown from the method.
+   */
+  public @interface TraceThrown {}
+
 }

--
Gitblit v1.10.0