Author: simoneg
Date: Mon Dec  6 11:06:11 2010
New Revision: 1042578

URL: http://svn.apache.org/viewvc?rev=1042578&view=rev
Log:
Rewritten as before/after instead of around to avoid AspectJ bug

Modified:
    
labs/magma/trunk/foundation-logging/src/main/java/org/apache/magma/logging/LogThreadLocal.java
    
labs/magma/trunk/foundation-logging/src/main/java/org/apache/magma/logging/Tracing.aj

Modified: 
labs/magma/trunk/foundation-logging/src/main/java/org/apache/magma/logging/LogThreadLocal.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-logging/src/main/java/org/apache/magma/logging/LogThreadLocal.java?rev=1042578&r1=1042577&r2=1042578&view=diff
==============================================================================
--- 
labs/magma/trunk/foundation-logging/src/main/java/org/apache/magma/logging/LogThreadLocal.java
 (original)
+++ 
labs/magma/trunk/foundation-logging/src/main/java/org/apache/magma/logging/LogThreadLocal.java
 Mon Dec  6 11:06:11 2010
@@ -1,5 +1,7 @@
 package org.apache.magma.logging;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Stack;
 
 public class LogThreadLocal {
@@ -13,6 +15,8 @@ public class LogThreadLocal {
        private long timeIn = 0;
        private long timeOut = 0;
        
+       private ArrayList<Long> times = new ArrayList<Long>();
+       
        public LogThreadLocal(ThreadLocal<LogThreadLocal> mytl) {
                this.mytl = mytl;
        }
@@ -82,4 +86,21 @@ public class LogThreadLocal {
                return timeOut;
        }
        
+       private void checkTimeArray() {
+               this.times.ensureCapacity((int)this.counter + 1);
+               while (this.times.size() <= this.counter) {
+                       this.times.add(0l);
+               }               
+       }
+       
+       public void pushTime(long t) {
+               checkTimeArray();
+               this.times.set((int)this.counter, t);
+       }
+       
+       public long popTime() {
+               checkTimeArray();
+               return this.times.get((int)this.counter);
+       }
+       
 };
\ No newline at end of file

Modified: 
labs/magma/trunk/foundation-logging/src/main/java/org/apache/magma/logging/Tracing.aj
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-logging/src/main/java/org/apache/magma/logging/Tracing.aj?rev=1042578&r1=1042577&r2=1042578&view=diff
==============================================================================
--- 
labs/magma/trunk/foundation-logging/src/main/java/org/apache/magma/logging/Tracing.aj
 (original)
+++ 
labs/magma/trunk/foundation-logging/src/main/java/org/apache/magma/logging/Tracing.aj
 Mon Dec  6 11:06:11 2010
@@ -37,11 +37,123 @@ public abstract aspect Tracing {
         * Must be a call, eventually with other conditions
         */
        public abstract pointcut to();
+
+       protected void logIn(final JoinPoint tjp, final String enter, final 
String more) {
+               final LogThreadLocal ltl = tc.get();
+               if (ltl.isInside()) {
+                       return;
+               }
+               ltl.entering();
+               try {
+                       ltl.sendBuffered();
+               } catch (Exception e) {}
+               ltl.increment();
+               try {
+                       final Signature sig = tjp.getSignature();
+                       Object th = tjp.getThis();
+                       Class c = null;
+                       if (th != null) {
+                               c = th.getClass();
+                       } else {
+                               c = tjp.getSignature().getDeclaringType();
+                       }
+                       final Logger l = LoggerFactory.getLogger(c);
+                       final Object[] args = tjp.getArgs();
+                       LogClosure logcl = new LogClosure() {
+                               @Override
+                               public void doLog() {
+                                       if (args != null && args.length > 0) {
+                                               l.debug(">{} {} {}({}) [{}] 
"+more, new Object[] {ltl.getCounter(), enter, sig.toShortString(), args, 
tjp.getSourceLocation()});
+                                       } else {
+                                               l.debug(">{} {} {} [{}] "+more, 
new Object[] {ltl.getCounter(), enter, sig.toShortString(), 
tjp.getSourceLocation()});
+                                       }
+                               }
+                       };
+                       ltl.setBuffered(logcl);
+                       ltl.pushTime(ltl.getTimeOut());
+               } finally {
+                       ltl.exiting();
+               }
+       }
+       
+       protected void logOut(final JoinPoint tjp, Object ret, String exit, 
String compress, final String more) {
+               final LogThreadLocal ltl = tc.get();
+               if (ltl.isInside()) {
+                       return;
+               }
+               ltl.entering();
+               try {
+                       final Signature sig = tjp.getSignature();
+                       Object th = tjp.getThis();
+                       Class c = null;
+                       if (th != null) {
+                               c = th.getClass();
+                       } else {
+                               c = tjp.getSignature().getDeclaringType();
+                       }
+                       final Logger l = LoggerFactory.getLogger(c);
+                       final Object[] args = tjp.getArgs();
+                       double et = ltl.getTimeOut() - ltl.popTime();
+                       et = et / 1000000;
+                       if (ltl.getBuffered() == null) {
+                               l.debug("<{} {} {}({}) took {}ms returned {}", 
new Object[] {ltl.getCounter(), exit, sig.toShortString(), args, new 
Double(et), ret});
+                       } else {
+                               ltl.setBuffered(null);
+                               l.debug("){} {} {}({}) [{}] took {}ms returned 
{} "+more, new Object[] {ltl.getCounter(), compress, sig.toShortString(), args, 
tjp.getSourceLocation(), new Double(et), ret});
+                       }
+                       if (ltl.getCounter() == 1) {
+                               l.debug("Logger used {} on {} total nanos", 
ltl.getTimeIn(), ltl.getTimeOut());
+                       }
+               } finally {
+                       ltl.decrement();
+                       ltl.exiting();                  
+               }
+       }
        
-       private interface Closure {
-               Object doProceed();
+       protected void logException(final JoinPoint tjp, Throwable t) {
+               final LogThreadLocal ltl = tc.get();
+               if (ltl.isInside()) return;
+               if (ltl.getLastException() == t) return;
+               ltl.entering();
+               try {
+                       ltl.setLastException(t);
+                       Signature sig = tjp.getSignature();
+                       Object th = tjp.getThis();
+                       Class c = null;
+                       if (th != null) {
+                               c = th.getClass();
+                       } else {
+                               c = tjp.getSignature().getDeclaringType();
+                       }
+                       Logger l = LoggerFactory.getLogger(c);
+                       Object[] args = tjp.getArgs();
+                       l.warn("<!" + ltl.getCounter() + " exception " + 
sig.toShortString() + "(" + Arrays.toString(args) + ")", t);
+               } finally {
+                       ltl.exiting();                  
+               }               
+       }
+
+       before(): (execution(* *.*(..)) || adviceexecution()) && where() && 
if(tracingActive) {
+               logIn(thisJoinPoint, "Entering", "");
+       }
+       after() returning(Object ret): (execution(* *.*(..)) || 
adviceexecution()) && where() && if(tracingActive) {
+               logOut(thisJoinPoint, ret, "Exited", "Executed", "");
+       }
+       after() throwing(Throwable t): (execution(* *.*(..)) || 
adviceexecution()) && where() && if(tracingActive) {
+               logException(thisJoinPoint, t);
+       }
+
+       before(): (call(* *.*(..)) || call(*.new(..))) && where() && to() && 
if(tracingActive) {
+               logIn(thisJoinPoint, "Calling", "");
+       }
+       after() returning(Object ret): (call(* *.*(..)) || call(*.new(..))) && 
where() && to() && if(tracingActive) {
+               logOut(thisJoinPoint, ret, "Called", "Called", "");
+       }
+       after() throwing(Throwable t): (call(* *.*(..)) || call(*.new(..))) && 
where() && to() && if(tracingActive) {
+               logException(thisJoinPoint, t);
        }
        
+       /*
        protected Object log(final JoinPoint tjp, Closure clos, final String 
enter, String exit, String compress, final String more) {
                final LogThreadLocal ltl = tc.get();
                if (ltl.isInside()) {
@@ -98,7 +210,7 @@ public abstract aspect Tracing {
        }
        
        after(JoinPoint tjp) throwing (Throwable t) :
-               execution(* Tracing.log(..)) && args(tjp,..)
+               execution(* Tracing.log*(..)) && args(tjp,..)
        {
                final LogThreadLocal ltl = tc.get();
                if (ltl.isInside()) return;
@@ -122,7 +234,7 @@ public abstract aspect Tracing {
                }
        }
        
-       Object around(): (execution(* *.*(..)) || adviceexecution()) && where() 
&& if(tracingActive) {
+       Object around(): (execution(* *.*(..))) && where() && if(tracingActive) 
{
                Closure clos = new Closure() {
                        public Object doProceed() {
                                return proceed();
@@ -139,6 +251,8 @@ public abstract aspect Tracing {
                };
                return log(thisJoinPoint, clos, "Calling", "Called", "Called", 
"");
        }
+       
+       */
                
 }
 



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

Reply via email to