You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by jl...@apache.org on 2006/12/22 08:03:29 UTC

svn commit: r489568 - in /incubator/cxf/trunk/api/src: main/java/org/apache/cxf/phase/PhaseInterceptorChain.java test/java/org/apache/cxf/phase/PhaseInterceptorChainTest.java

Author: jliu
Date: Thu Dec 21 23:03:28 2006
New Revision: 489568

URL: http://svn.apache.org/viewvc?view=rev&rev=489568
Log:
Apply patch cxf-320 on behalf of Unreal Jiang.  If add a user interceptor into pre_stream phase and addBefore to SoapPreProtocolOutInterceptor, cxf will throw out "Invalid ordering" exception

Modified:
    incubator/cxf/trunk/api/src/main/java/org/apache/cxf/phase/PhaseInterceptorChain.java
    incubator/cxf/trunk/api/src/test/java/org/apache/cxf/phase/PhaseInterceptorChainTest.java

Modified: incubator/cxf/trunk/api/src/main/java/org/apache/cxf/phase/PhaseInterceptorChain.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/api/src/main/java/org/apache/cxf/phase/PhaseInterceptorChain.java?view=diff&rev=489568&r1=489567&r2=489568
==============================================================================
--- incubator/cxf/trunk/api/src/main/java/org/apache/cxf/phase/PhaseInterceptorChain.java (original)
+++ incubator/cxf/trunk/api/src/main/java/org/apache/cxf/phase/PhaseInterceptorChain.java Thu Dec 21 23:03:28 2006
@@ -270,9 +270,9 @@
     public ListIterator<Interceptor<? extends Message>> getIterator() {
         return new PhaseInterceptorIterator();
     }
-    
 
     protected void insertInterceptor(List<Interceptor> intercs, PhaseInterceptor interc) {
+
         if (intercs.size() == 0) {
             intercs.add(interc);
             return;
@@ -294,9 +294,15 @@
             if (before.contains(cmp.getId()) && i < end) {
                 end = i;
             }
-
             if (cmp.getBefore().contains(interc.getId()) && i > begin) {
                 begin = i;
+                if (end < begin) {
+                    intercs.remove(cmp);
+                    intercs.add(end, cmp);
+                    i = end;
+                    begin = end;
+                    end = begin + 1;
+                }
             }
 
             if (after.contains(cmp.getId()) && i > begin) {
@@ -313,6 +319,7 @@
         }
 
         intercs.add(begin + 1, interc);
+        
     }
 
     void outputChainToLog(boolean modified) {

Modified: incubator/cxf/trunk/api/src/test/java/org/apache/cxf/phase/PhaseInterceptorChainTest.java
URL: http://svn.apache.org/viewvc/incubator/cxf/trunk/api/src/test/java/org/apache/cxf/phase/PhaseInterceptorChainTest.java?view=diff&rev=489568&r1=489567&r2=489568
==============================================================================
--- incubator/cxf/trunk/api/src/test/java/org/apache/cxf/phase/PhaseInterceptorChainTest.java (original)
+++ incubator/cxf/trunk/api/src/test/java/org/apache/cxf/phase/PhaseInterceptorChainTest.java Thu Dec 21 23:03:28 2006
@@ -85,6 +85,41 @@
         assertSame("Unexpected interceptor at this position.", p2, it.next());
         assertTrue(!it.hasNext());
     }
+    
+    AbstractPhaseInterceptor setUpPhaseInterceptor(String phase, String id,
+                                                   Set<String> b, boolean be) {
+        AbstractPhaseInterceptor p = control
+            .createMock(AbstractPhaseInterceptor.class);
+        EasyMock.expect(p.getPhase()).andReturn(phase).anyTimes();
+        EasyMock.expect(p.getId()).andReturn(id).anyTimes();
+        Set<String> after = new HashSet<String>();
+        Set<String> before = null == b ? new HashSet<String>() : b;
+        EasyMock.expect(p.getBefore()).andReturn(before).anyTimes();
+        EasyMock.expect(p.getAfter()).andReturn(after).anyTimes();
+
+        return p;
+    }
+    
+    public void testThreeInterceptorSamePhaseWithOrder() {
+        AbstractPhaseInterceptor p1 = setUpPhaseInterceptor("phase1", "p1");
+        Set<String> before = new HashSet<String>();
+        before.add("p1");
+        AbstractPhaseInterceptor p2 = setUpPhaseInterceptor("phase1", "p2", before, true);
+        Set<String> before1 = new HashSet<String>();
+        before1.add("p2");
+        AbstractPhaseInterceptor p3 = setUpPhaseInterceptor("phase1", "p3", before1, true);
+        control.replay();
+        chain.add(p3);
+        chain.add(p1);
+        chain.add(p2);
+        
+        Iterator<Interceptor<? extends Message>> it = chain.iterator();
+
+        assertSame("Unexpected interceptor at this position.", p3, it.next());
+        assertSame("Unexpected interceptor at this position.", p2, it.next());
+        assertSame("Unexpected interceptor at this position.", p1, it.next());
+        assertTrue(!it.hasNext());
+    }
 
     public void testSingleInterceptorPass() {
         AbstractPhaseInterceptor p = setUpPhaseInterceptor("phase1", "p1");
@@ -298,7 +333,7 @@
 
         return p;
     }
-
+    
     @SuppressWarnings("unchecked")
     void setUpPhaseInterceptorInvocations(AbstractPhaseInterceptor p,
             boolean fail, boolean expectFault) {