You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2009/06/26 19:46:56 UTC

svn commit: r788786 - /camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceInterceptor.java

Author: davsclaus
Date: Fri Jun 26 17:46:56 2009
New Revision: 788786

URL: http://svn.apache.org/viewvc?rev=788786&view=rev
Log:
CAMEL-1759: Cleanup of the code in TraceInterceptor and added code comments for the next poor soul reading it.

Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceInterceptor.java

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceInterceptor.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceInterceptor.java?rev=788786&r1=788785&r2=788786&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceInterceptor.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/TraceInterceptor.java Fri Jun 26 17:46:56 2009
@@ -106,65 +106,22 @@
             // before
             if (shouldLog) {
 
-                // TODO: refactor into smaller methods
-                // TODO: add code comments about why we do this
-
+                // whether we should trace it or not, some nodes should be skipped as they are abstract
+                // intermedidate steps for instance related to on completion
                 boolean trace = true;
 
                 // if traceable then register this as the previous node, now it has been logged
                 if (exchange.getUnitOfWork() instanceof TraceableUnitOfWork) {
-
                     TraceableUnitOfWork tuow = (TraceableUnitOfWork) exchange.getUnitOfWork();
 
-                    // special for on exception so we can see it in the trace logs
                     if (node instanceof OnExceptionDefinition) {
-                        // lets see if this is the first time for this exception
-                        int index = tuow.getAndIncrement(node);
-                        if (index == 0) {
-                            Expression exp = new Expression() {
-                                public <T> T evaluate(Exchange exchange, Class<T> type) {
-                                    String label = "OnException";
-                                    if (exchange.getProperty(Exchange.EXCEPTION_CAUGHT) != null) {
-                                        label += "[" + exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class).getClass().getSimpleName() + "]";
-                                    }
-                                    return exchange.getContext().getTypeConverter().convertTo(type, label);
-                                }
-                            };
-                            // yes its first time then do some special to log and trace the start of onException
-                            tuow.addTraced(new DefaultRouteNode(node, exp));
-
-                            // log and trace the processor that was onException so we can see it
-                            logExchange(exchange);
-                            traceExchange(exchange);
-                        }
-
-                        tuow.addTraced(new DefaultRouteNode(node, super.getProcessor()));
-
+                        // special for on exception so we can see it in the trace logs
+                        trace = beforeOnException((OnExceptionDefinition) node, tuow, exchange);
                     } else if (node instanceof OnCompletionDefinition) {
-                        trace = tuow.getLastNode() != null;
-                        
-                        if (exchange.getProperty(Exchange.ON_COMPLETION) != null) {
-                            // we should trace the onCompletion route
-                            int index = tuow.getAndIncrement(node);
-                            if (index == 0) {
-                                // yes its first time then do some special to log and trace the start of onCompletion
-                                Expression exp = new Expression() {
-                                    public <T> T evaluate(Exchange exchange, Class<T> type) {
-                                        String label = "OnCompletion[" + exchange.getProperty(Exchange.CORRELATION_ID) + "]";
-                                        return exchange.getContext().getTypeConverter().convertTo(type, label);
-                                    }
-                                };
-                                tuow.addTraced(new DefaultRouteNode(node, exp));
-                                tuow.addTraced(new DefaultRouteNode(node, super.getProcessor()));
-
-                                // log and trace the processor that was onCompletion so we can see it
-                                logExchange(exchange);
-                                traceExchange(exchange);
-                            } else {
-                                tuow.addTraced(new DefaultRouteNode(node, super.getProcessor()));
-                            }
-                        }
+                        // special for on completion so we can see it in the trace logs
+                        trace = beforeOnCompletion((OnCompletionDefinition) node, tuow, exchange);
                     } else {
+                        // regular so just add it
                         tuow.addTraced(new DefaultRouteNode(node, super.getProcessor()));
                     }
                 }
@@ -179,24 +136,10 @@
                 if (exchange.getUnitOfWork() instanceof TraceableUnitOfWork) {
                     TraceableUnitOfWork tuow = (TraceableUnitOfWork) exchange.getUnitOfWork();
 
-                    // special for intercept() as we would like to trace the processor that was intercepted
-                    // as well, otherwise we only see the intercepted route, but we need the both to be logged/traced
                     if (node instanceof InterceptDefinition) {
-
-                        // get the intercepted processor from the definition
-                        // we need to use the UoW to have its own index of how far we got into the list
-                        // of intercepted processors the intercept definition holds as the intercept
-                        // definition is a single object that is shared by concurrent thread being routed
-                        // so each exchange has its own private counter
-                        InterceptDefinition intercept = (InterceptDefinition) node;
-                        Processor last = intercept.getInterceptedProcessor(tuow.getAndIncrement(intercept));
-                        if (last != null) {
-                            tuow.addTraced(new DefaultRouteNode(node, last));
-
-                            // log and trace the processor that was intercepted so we can see it
-                            logExchange(exchange);
-                            traceExchange(exchange);
-                        }
+                        // special for intercept() as we would like to trace the processor that was intercepted
+                        // as well, otherwise we only see the intercepted route, but we need the both to be logged/traced
+                        afterIntercept((InterceptDefinition) node, tuow, exchange);
                     }
                 }
             }
@@ -237,6 +180,94 @@
 
     // Implementation methods
     //-------------------------------------------------------------------------
+
+    protected boolean beforeOnException(OnExceptionDefinition onException, TraceableUnitOfWork tuow, Exchange exchange) throws Exception {
+        // lets see if this is the first time for this exception
+        int index = tuow.getAndIncrement(node);
+        if (index == 0) {
+            // yes its first time then do some special to log and trace the start of onException
+            Expression exp = new Expression() {
+                public <T> T evaluate(Exchange exchange, Class<T> type) {
+                    String label = "OnException";
+                    if (exchange.getProperty(Exchange.EXCEPTION_CAUGHT) != null) {
+                        label += "[" + exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class).getClass().getSimpleName() + "]";
+                    }
+                    return exchange.getContext().getTypeConverter().convertTo(type, label);
+                }
+            };
+            // add our pesudo node
+            tuow.addTraced(new DefaultRouteNode(node, exp));
+
+            // log and trace the processor that was onException so we can see it imeddiately
+            logExchange(exchange);
+            traceExchange(exchange);
+        }
+
+        // add the processor that is invoked for this onException
+        tuow.addTraced(new DefaultRouteNode(node, super.getProcessor()));
+        return true;
+    }
+
+    protected boolean beforeOnCompletion(OnCompletionDefinition onCompletion, TraceableUnitOfWork tuow, Exchange exchange) throws Exception {
+        // we should only trace when we do the actual onCompletion
+        // the problem is that onCompletion is added at the very beginning of a route to be able to
+        // add synchronization hoos on unit of work so it knows to invoke the onCompletion when the
+        // exchange is done. But in the trace log we want to defer the onCompletion being logged
+        // unitl the exchange is actually completed and is doing the onCompletion routing
+        // so if the last node is null then we have just started and thus should not trace this node
+        boolean answer = tuow.getLastNode() != null;
+
+        if (exchange.getProperty(Exchange.ON_COMPLETION) != null) {
+            // if ON_COMPLETION is not null then we are actually doing the onCompletion routing
+
+            // we should trace the onCompletion route and we want a start log of the onCompletion
+            // step so get the index and see if its 0 then we can add our speical log
+            int index = tuow.getAndIncrement(node);
+            if (index == 0) {
+                // yes its first time then do some special to log and trace the start of onCompletion
+                Expression exp = new Expression() {
+                    public <T> T evaluate(Exchange exchange, Class<T> type) {
+                        String label = "OnCompletion[" + exchange.getProperty(Exchange.CORRELATION_ID) + "]";
+                        return exchange.getContext().getTypeConverter().convertTo(type, label);
+                    }
+                };
+                // add the onCompletion and then the processor that is invoked nest
+                tuow.addTraced(new DefaultRouteNode(node, exp));
+                tuow.addTraced(new DefaultRouteNode(node, super.getProcessor()));
+
+                // log and trace so we get the onCompletion -> processor in the log
+                logExchange(exchange);
+                traceExchange(exchange);
+            } else {
+                // we are doing the onCompletion but this is after the start so just
+                // add the processor and do no special start message
+                tuow.addTraced(new DefaultRouteNode(node, super.getProcessor()));
+            }
+
+        }
+
+        return answer;
+    }
+
+    protected boolean afterIntercept(InterceptDefinition interceptr, TraceableUnitOfWork tuow, Exchange exchange) throws Exception {
+        // get the intercepted processor from the definition
+        // we need to use the UoW to have its own index of how far we got into the list
+        // of intercepted processors the intercept definition holds as the intercept
+        // definition is a single object that is shared by concurrent thread being routed
+        // so each exchange has its own private counter
+        InterceptDefinition intercept = (InterceptDefinition) node;
+        Processor last = intercept.getInterceptedProcessor(tuow.getAndIncrement(intercept));
+        if (last != null) {
+            tuow.addTraced(new DefaultRouteNode(node, last));
+
+            // log and trace the processor that was intercepted so we can see it
+            logExchange(exchange);
+            traceExchange(exchange);
+        }
+
+        return true;
+    }
+
     protected void logExchange(Exchange exchange) {
         // process the exchange that formats and logs it
         logger.process(exchange);