You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2010/01/06 18:47:03 UTC

svn commit: r896575 - in /cxf/branches/2.2.x-fixes: ./ api/src/main/java/org/apache/cxf/logging/ api/src/main/java/org/apache/cxf/phase/ api/src/test/java/org/apache/cxf/phase/

Author: dkulp
Date: Wed Jan  6 17:47:02 2010
New Revision: 896575

URL: http://svn.apache.org/viewvc?rev=896575&view=rev
Log:
Merged revisions 896560 via svnmerge from 
https://svn.apache.org/repos/asf/cxf/trunk

........
  r896560 | dkulp | 2010-01-06 12:36:07 -0500 (Wed, 06 Jan 2010) | 2 lines
  
  [CXF-2596] Add a FaultLogger to allow custom handling of fault logging
  Patch from Tomas Majak applied.   Thanks!
........

Added:
    cxf/branches/2.2.x-fixes/api/src/main/java/org/apache/cxf/logging/
      - copied from r896560, cxf/trunk/api/src/main/java/org/apache/cxf/logging/
    cxf/branches/2.2.x-fixes/api/src/main/java/org/apache/cxf/logging/FaultLogger.java
      - copied unchanged from r896560, cxf/trunk/api/src/main/java/org/apache/cxf/logging/FaultLogger.java
Modified:
    cxf/branches/2.2.x-fixes/   (props changed)
    cxf/branches/2.2.x-fixes/api/src/main/java/org/apache/cxf/phase/PhaseInterceptorChain.java
    cxf/branches/2.2.x-fixes/api/src/test/java/org/apache/cxf/phase/PhaseInterceptorChainTest.java

Propchange: cxf/branches/2.2.x-fixes/
            ('svn:mergeinfo' removed)

Propchange: cxf/branches/2.2.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.

Modified: cxf/branches/2.2.x-fixes/api/src/main/java/org/apache/cxf/phase/PhaseInterceptorChain.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/api/src/main/java/org/apache/cxf/phase/PhaseInterceptorChain.java?rev=896575&r1=896574&r2=896575&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/api/src/main/java/org/apache/cxf/phase/PhaseInterceptorChain.java (original)
+++ cxf/branches/2.2.x-fixes/api/src/main/java/org/apache/cxf/phase/PhaseInterceptorChain.java Wed Jan  6 17:47:02 2010
@@ -35,6 +35,7 @@
 import org.apache.cxf.interceptor.Fault;
 import org.apache.cxf.interceptor.Interceptor;
 import org.apache.cxf.interceptor.InterceptorChain;
+import org.apache.cxf.logging.FaultLogger;
 import org.apache.cxf.message.Exchange;
 import org.apache.cxf.message.FaultMode;
 import org.apache.cxf.message.Message;
@@ -82,6 +83,7 @@
     private Message pausedMessage;
     private MessageObserver faultObserver;
     private PhaseInterceptorIterator iterator;
+    private final boolean isFineLogging;
     
     // currently one chain for one request/response, use below as signal 
     // to avoid duplicate fault processing on nested calling of
@@ -91,6 +93,8 @@
     
     
     private PhaseInterceptorChain(PhaseInterceptorChain src) {
+        isFineLogging = LOG.isLoggable(Level.FINE);
+        
         //only used for clone
         state = State.EXECUTING;
         
@@ -127,7 +131,8 @@
     
     public PhaseInterceptorChain(SortedSet<Phase> ps) {
         state = State.EXECUTING;
-        
+        isFineLogging = LOG.isLoggable(Level.FINE);
+
         int numPhases = ps.size();
         phases = new Phase[numPhases];
         nameMap = new HashMap<String, Integer>();
@@ -194,7 +199,7 @@
                 + ((phaseName == null) ? ": Phase declaration is missing." 
                 : ": Phase " + phaseName + " specified does not exist."));
         } else {            
-            if (LOG.isLoggable(Level.FINE)) {
+            if (isFineLogging) {
                 LOG.fine("Adding interceptor " + i + " to phase " + phaseName);
             }
 
@@ -223,7 +228,6 @@
     @SuppressWarnings("unchecked")
     public synchronized boolean doIntercept(Message message) {
         updateIterator();
-        boolean isFineLogging = LOG.isLoggable(Level.FINE);
         pausedMessage = message;
 
         Message oldMessage = CURRENT_MESSAGE.get();
@@ -264,37 +268,17 @@
                                 description.append("\' ");
                             }
                         }
-                        
-                        FaultMode mode = message.get(FaultMode.class);
-                        if (mode == FaultMode.CHECKED_APPLICATION_FAULT) {
-                            if (LOG.isLoggable(Level.FINE)) { 
-                                LogUtils.log(LOG, Level.FINE,
-                                             "Application " + description
-                                             + "has thrown exception, unwinding now", ex);
-                            } else if (LOG.isLoggable(Level.INFO)) {
-                                Throwable t = ex;
-                                if (ex instanceof Fault
-                                    && ex.getCause() != null) {
-                                    t = ex.getCause();
-                                }                            
-                                
-                                LogUtils.log(LOG, Level.INFO,
-                                             "Application " + description
-                                             + "has thrown exception, unwinding now: "
-                                             + t.getClass().getName() 
-                                             + ": " + ex.getMessage());
-                            }
-                        } else if (LOG.isLoggable(Level.WARNING)) {
-                            if (mode == FaultMode.UNCHECKED_APPLICATION_FAULT) {
-                                LogUtils.log(LOG, Level.WARNING,
-                                             "Application " + description
-                                             + "has thrown exception, unwinding now", ex);
-                            } else {
-                                LogUtils.log(LOG, Level.WARNING,
-                                             "Interceptor for " + description
-                                             + "has thrown exception, unwinding now", ex);
-                            }
+
+                        FaultLogger flogger = (FaultLogger)
+                                message.getContextualProperty(FaultLogger.class.getName());
+                        boolean useDefaultLogging = true;
+                        if (flogger != null) {
+                            useDefaultLogging = flogger.log(ex, description.toString(), message);
+                        }
+                        if (useDefaultLogging) {
+                            doDefaultLogging(message, ex, description);
                         }
+
     
                         message.setContent(Exception.class, ex);
                         boolean isOneWay = false;
@@ -320,7 +304,40 @@
             CURRENT_MESSAGE.set(oldMessage);
         }
     }
-    
+
+    private void doDefaultLogging(Message message, RuntimeException ex, StringBuilder description) {
+        FaultMode mode = message.get(FaultMode.class);
+        if (mode == FaultMode.CHECKED_APPLICATION_FAULT) {
+            if (isFineLogging) {
+                LogUtils.log(LOG, Level.FINE,
+                             "Application " + description
+                             + "has thrown exception, unwinding now", ex);
+            } else if (LOG.isLoggable(Level.INFO)) {
+                Throwable t = ex;
+                if (ex instanceof Fault
+                    && ex.getCause() != null) {
+                    t = ex.getCause();
+                }
+
+                LogUtils.log(LOG, Level.INFO,
+                             "Application " + description
+                             + "has thrown exception, unwinding now: "
+                             + t.getClass().getName()
+                             + ": " + ex.getMessage());
+            }
+        } else if (LOG.isLoggable(Level.WARNING)) {
+            if (mode == FaultMode.UNCHECKED_APPLICATION_FAULT) {
+                LogUtils.log(LOG, Level.WARNING,
+                             "Application " + description
+                             + "has thrown exception, unwinding now", ex);
+            } else {
+                LogUtils.log(LOG, Level.WARNING,
+                             "Interceptor for " + description
+                             + "has thrown exception, unwinding now", ex);
+            }
+        }
+    }
+
     /**
      * Intercept a message, invoking each phase's handlers in turn,
      * starting after the specified interceptor.
@@ -374,7 +391,6 @@
     
     @SuppressWarnings("unchecked")
     private void unwind(Message message) {
-        boolean isFineLogging = LOG.isLoggable(Level.FINE);
         while (iterator.hasPrevious()) {
             Interceptor currentInterceptor = iterator.previous();
             if (isFineLogging) {
@@ -604,7 +620,7 @@
     }
     
     private void outputChainToLog(boolean modified) {
-        if (LOG.isLoggable(Level.FINE)) {
+        if (isFineLogging) {
             if (modified) {
                 LOG.fine(toString(" was modified"));
             } else {

Modified: cxf/branches/2.2.x-fixes/api/src/test/java/org/apache/cxf/phase/PhaseInterceptorChainTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/api/src/test/java/org/apache/cxf/phase/PhaseInterceptorChainTest.java?rev=896575&r1=896574&r2=896575&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/api/src/test/java/org/apache/cxf/phase/PhaseInterceptorChainTest.java (original)
+++ cxf/branches/2.2.x-fixes/api/src/test/java/org/apache/cxf/phase/PhaseInterceptorChainTest.java Wed Jan  6 17:47:02 2010
@@ -30,6 +30,8 @@
 import org.apache.cxf.continuations.SuspendedInvocationException;
 import org.apache.cxf.interceptor.Interceptor;
 import org.apache.cxf.interceptor.InterceptorChain;
+import org.apache.cxf.logging.FaultLogger;
+import org.apache.cxf.message.FaultMode;
 import org.apache.cxf.message.Message;
 import org.easymock.classextension.EasyMock;
 import org.easymock.classextension.IMocksControl;
@@ -214,6 +216,36 @@
     }
 
     @Test
+    public void testSingleInterceptorFailWithCustomLogger() throws Exception {
+        AbstractPhaseInterceptor p = setUpPhaseInterceptor("phase1", "p1");
+        setUpPhaseInterceptorInvocations(p, true, true);
+        setUpCustomLogger(true, true, false);
+        control.replay();
+        chain.add(p);
+        chain.doIntercept(message);
+    }
+
+    @Test
+    public void testSingleInterceptorFailWithCustomLoggerAndDefaultLogging() throws Exception {
+        AbstractPhaseInterceptor p = setUpPhaseInterceptor("phase1", "p1");
+        setUpPhaseInterceptorInvocations(p, true, true);
+        setUpCustomLogger(true, true, true);
+        control.replay();
+        chain.add(p);
+        chain.doIntercept(message);
+    }
+
+    @Test
+    public void testSingleInterceptorFailWithoutCustomLogger() throws Exception {
+        AbstractPhaseInterceptor p = setUpPhaseInterceptor("phase1", "p1");
+        setUpPhaseInterceptorInvocations(p, true, true);
+        setUpCustomLogger(false, true, false);
+        control.replay();
+        chain.add(p);
+        chain.doIntercept(message);
+    }
+
+    @Test
     public void testTwoInterceptorsInSamePhasePass() throws Exception {
         AbstractPhaseInterceptor p1 = setUpPhaseInterceptor("phase1", "p1");
         setUpPhaseInterceptorInvocations(p1, false, false);
@@ -412,6 +444,33 @@
         }
     }
 
+    private void setUpCustomLogger(boolean useCustomLogger, 
+                                   boolean expectFault, 
+                                   boolean returnFromCustomLogger) {
+        if (useCustomLogger) {
+            FaultLogger customLogger = control.createMock(FaultLogger.class);
+            message.getContextualProperty(FaultLogger.class.getName());
+            EasyMock.expectLastCall().andReturn(customLogger);
+            if (expectFault) {
+                customLogger.log(EasyMock.isA(Exception.class),
+                                 EasyMock.isA(String.class), 
+                                 EasyMock.isA(Message.class));
+                EasyMock.expectLastCall().andReturn(returnFromCustomLogger);
+                if (returnFromCustomLogger) {
+                    //default logging should also be invoked
+                    //not too beautiful way to verify that defaultLogging was invoked.
+                    message.get(FaultMode.class);
+                    EasyMock.expectLastCall().andReturn(FaultMode.RUNTIME_FAULT);
+                }
+            }
+        } else {
+            message.getContextualProperty(FaultLogger.class.getName());
+            EasyMock.expectLastCall().andReturn(null);
+        }
+
+    }
+
+
     public class InsertingPhaseInterceptor extends
             AbstractPhaseInterceptor<Message> {
         int invoked;