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 2009/10/28 14:33:41 UTC

svn commit: r830533 - in /cxf/trunk: rt/core/src/main/java/org/apache/cxf/interceptor/ rt/management/src/main/java/org/apache/cxf/management/interceptor/ rt/management/src/test/java/org/apache/cxf/management/interceptor/ rt/ws/addr/src/main/java/org/ap...

Author: dkulp
Date: Wed Oct 28 13:33:40 2009
New Revision: 830533

URL: http://svn.apache.org/viewvc?rev=830533&view=rev
Log:
[CXF-2505, CXF-2502, CXF-2489] Bunch of fixes for WS-A + WS-Sec + Mgmt

Modified:
    cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/LoggingInInterceptor.java
    cxf/trunk/rt/management/src/main/java/org/apache/cxf/management/interceptor/AbstractMessageResponseTimeInterceptor.java
    cxf/trunk/rt/management/src/main/java/org/apache/cxf/management/interceptor/ResponseTimeMessageInInterceptor.java
    cxf/trunk/rt/management/src/main/java/org/apache/cxf/management/interceptor/ResponseTimeMessageOutInterceptor.java
    cxf/trunk/rt/management/src/test/java/org/apache/cxf/management/interceptor/ResponseTimeMessageOutInterceptorTest.java
    cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/MAPAggregator.java
    cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java
    cxf/trunk/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/RMInInterceptor.java
    cxf/trunk/systests/ws-specs/src/test/java/org/apache/cxf/systest/ws/security/WSSecurityClientTest.java
    cxf/trunk/systests/ws-specs/src/test/java/org/apache/cxf/systest/ws/security/server.xml

Modified: cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/LoggingInInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/LoggingInInterceptor.java?rev=830533&r1=830532&r2=830533&view=diff
==============================================================================
--- cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/LoggingInInterceptor.java (original)
+++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/LoggingInInterceptor.java Wed Oct 28 13:33:40 2009
@@ -60,11 +60,15 @@
     }
 
     protected void logging(Message message) throws Fault {
+        if (message.containsKey(LoggingMessage.ID_KEY)) {
+            return;
+        }
         String id = (String)message.getExchange().get(LoggingMessage.ID_KEY);
         if (id == null) {
             id = LoggingMessage.nextId();
             message.getExchange().put(LoggingMessage.ID_KEY, id);
         }
+        message.put(LoggingMessage.ID_KEY, id);
         final LoggingMessage buffer 
             = new LoggingMessage("Inbound Message\n----------------------------", id);
 

Modified: cxf/trunk/rt/management/src/main/java/org/apache/cxf/management/interceptor/AbstractMessageResponseTimeInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/management/src/main/java/org/apache/cxf/management/interceptor/AbstractMessageResponseTimeInterceptor.java?rev=830533&r1=830532&r2=830533&view=diff
==============================================================================
--- cxf/trunk/rt/management/src/main/java/org/apache/cxf/management/interceptor/AbstractMessageResponseTimeInterceptor.java (original)
+++ cxf/trunk/rt/management/src/main/java/org/apache/cxf/management/interceptor/AbstractMessageResponseTimeInterceptor.java Wed Oct 28 13:33:40 2009
@@ -108,7 +108,7 @@
             
             String serviceName = "\"" + service.getName() + "\"";            
             String portName = "\"" + endpoint.getEndpointInfo().getName().getLocalPart() + "\"";
-            String operationName = "\"" + opInfo.getName().getLocalPart() + "\"";
+            String operationName = opInfo == null ? null : "\"" + opInfo.getName().getLocalPart() + "\"";
             
             StringBuffer buffer = new StringBuffer();
             buffer.append(ManagementConstants.DEFAULT_DOMAIN_NAME + ":");
@@ -123,14 +123,16 @@
             buffer.append(ManagementConstants.PORT_NAME_PROP + "=" + portName);
             String serviceCounterName = buffer.toString();
             
-            buffer.append("," + ManagementConstants.OPERATION_NAME_PROP + "=" + operationName);
-            String operationCounterName = buffer.toString();
-            try {               
+            try {           
                 ObjectName serviceCounter = 
                     new ObjectName(serviceCounterName);                
                 cr.increaseCounter(serviceCounter, mhtr);
-                ObjectName operationCounter = new ObjectName(operationCounterName);
-                cr.increaseCounter(operationCounter, mhtr);                
+                if (operationName != null) {
+                    buffer.append("," + ManagementConstants.OPERATION_NAME_PROP + "=" + operationName);
+                    String operationCounterName = buffer.toString();
+                    ObjectName operationCounter = new ObjectName(operationCounterName);
+                    cr.increaseCounter(operationCounter, mhtr);                
+                }
             } catch (Exception exception) {
                 LOG.log(Level.WARNING, "CREATE_COUNTER_OBJECTNAME_FAILED", exception);
             }

Modified: cxf/trunk/rt/management/src/main/java/org/apache/cxf/management/interceptor/ResponseTimeMessageInInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/management/src/main/java/org/apache/cxf/management/interceptor/ResponseTimeMessageInInterceptor.java?rev=830533&r1=830532&r2=830533&view=diff
==============================================================================
--- cxf/trunk/rt/management/src/main/java/org/apache/cxf/management/interceptor/ResponseTimeMessageInInterceptor.java (original)
+++ cxf/trunk/rt/management/src/main/java/org/apache/cxf/management/interceptor/ResponseTimeMessageInInterceptor.java Wed Oct 28 13:33:40 2009
@@ -46,7 +46,11 @@
     @Override
     public void handleFault(Message message) {
         Exchange ex = message.getExchange();
-        ex.put(FaultMode.class, message.get(FaultMode.class));
+        FaultMode mode = message.get(FaultMode.class);
+        if (mode == null) {
+            mode = FaultMode.RUNTIME_FAULT;
+        }
+        ex.put(FaultMode.class, mode);
         endHandlingMessage(ex);
     }
 }

Modified: cxf/trunk/rt/management/src/main/java/org/apache/cxf/management/interceptor/ResponseTimeMessageOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/management/src/main/java/org/apache/cxf/management/interceptor/ResponseTimeMessageOutInterceptor.java?rev=830533&r1=830532&r2=830533&view=diff
==============================================================================
--- cxf/trunk/rt/management/src/main/java/org/apache/cxf/management/interceptor/ResponseTimeMessageOutInterceptor.java (original)
+++ cxf/trunk/rt/management/src/main/java/org/apache/cxf/management/interceptor/ResponseTimeMessageOutInterceptor.java Wed Oct 28 13:33:40 2009
@@ -34,6 +34,9 @@
     
     public void handleMessage(Message message) throws Fault {
         Exchange ex = message.getExchange();
+        if (Boolean.TRUE.equals(message.get(Message.PARTIAL_RESPONSE_MESSAGE))) {
+            return;
+        }
         if (isClient(message)) {
             if (ex.isOneWay()) {
                 message.getInterceptorChain().add(ending);

Modified: cxf/trunk/rt/management/src/test/java/org/apache/cxf/management/interceptor/ResponseTimeMessageOutInterceptorTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/management/src/test/java/org/apache/cxf/management/interceptor/ResponseTimeMessageOutInterceptorTest.java?rev=830533&r1=830532&r2=830533&view=diff
==============================================================================
--- cxf/trunk/rt/management/src/test/java/org/apache/cxf/management/interceptor/ResponseTimeMessageOutInterceptorTest.java (original)
+++ cxf/trunk/rt/management/src/test/java/org/apache/cxf/management/interceptor/ResponseTimeMessageOutInterceptorTest.java Wed Oct 28 13:33:40 2009
@@ -34,6 +34,7 @@
         // need to increase the counter and is not a client
         setupCounterRepository(true, false);
         setupExchangeForMessage();
+        EasyMock.expect(message.get(Message.PARTIAL_RESPONSE_MESSAGE)).andReturn(Boolean.FALSE).anyTimes();
         EasyMock.expect(message.getExchange()).andReturn(exchange);
         EasyMock.expect(message.get(Message.REQUESTOR_ROLE)).andReturn(Boolean.FALSE).anyTimes();
         EasyMock.expect(exchange.getOutMessage()).andReturn(message);
@@ -116,6 +117,7 @@
         setupCounterRepository(true, true);
         setupExchangeForMessage();
         EasyMock.expect(message.getExchange()).andReturn(exchange).anyTimes();
+        EasyMock.expect(message.get(Message.PARTIAL_RESPONSE_MESSAGE)).andReturn(Boolean.FALSE).anyTimes();
         EasyMock.expect(message.get(Message.REQUESTOR_ROLE)).andReturn(Boolean.TRUE).anyTimes(); 
         EasyMock.expect(exchange.getOutMessage()).andReturn(message);
         EasyMock.expect(exchange.get(FaultMode.class)).andReturn(null);
@@ -146,6 +148,7 @@
     
     @Test
     public void testClientMessageOut() {
+        EasyMock.expect(message.get(Message.PARTIAL_RESPONSE_MESSAGE)).andReturn(Boolean.FALSE).anyTimes();
         EasyMock.expect(message.get(Message.REQUESTOR_ROLE)).andReturn(Boolean.TRUE);
         EasyMock.expect(message.getExchange()).andReturn(exchange);
         EasyMock.expect(exchange.isOneWay()).andReturn(false);

Modified: cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/MAPAggregator.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/MAPAggregator.java?rev=830533&r1=830532&r2=830533&view=diff
==============================================================================
--- cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/MAPAggregator.java (original)
+++ cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/MAPAggregator.java Wed Oct 28 13:33:40 2009
@@ -165,6 +165,7 @@
      * @param message the current message
      */
     public void  handleFault(Message message) {
+        message.put(MAPAggregator.class.getName(), this);
     }
 
     /**
@@ -342,8 +343,8 @@
                 // request/response MAPs must be aggregated
                 aggregate(message, isFault);
             }
-        } else if (!ContextUtils.isRequestor(message)) {
-            // responder validates incoming MAPs
+        } else if (!ContextUtils.isRequestor(message)) {            
+            //responder validates incoming MAPs
             AddressingPropertiesImpl maps = getMAPs(message, false, false);
             boolean isOneway = message.getExchange().isOneWay();
             if (null == maps && !addressingRequired) {

Modified: cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java?rev=830533&r1=830532&r2=830533&view=diff
==============================================================================
--- cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java (original)
+++ cxf/trunk/rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java Wed Oct 28 13:33:40 2009
@@ -49,6 +49,7 @@
 import org.apache.cxf.headers.Header;
 import org.apache.cxf.helpers.CastUtils;
 import org.apache.cxf.helpers.DOMUtils;
+import org.apache.cxf.interceptor.Interceptor;
 import org.apache.cxf.message.Exchange;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.phase.Phase;
@@ -58,6 +59,7 @@
 import org.apache.cxf.ws.addressing.ContextUtils;
 import org.apache.cxf.ws.addressing.EndpointReferenceType;
 import org.apache.cxf.ws.addressing.JAXWSAConstants;
+import org.apache.cxf.ws.addressing.MAPAggregator;
 import org.apache.cxf.ws.addressing.Names;
 import org.apache.cxf.ws.addressing.ReferenceParametersType;
 import org.apache.cxf.ws.addressing.RelatesToType;
@@ -115,11 +117,31 @@
      */
     public void handleFault(SoapMessage message) {
         AddressingProperties maps = ContextUtils.retrieveMAPs(message, false, true, false);
-        if (ContextUtils.isRequestor(message) 
-            && !message.getExchange().isOneWay()
-            && maps != null) {
-            //fault occured trying to sent the message, remove it
-            uncorrelatedExchanges.remove(maps.getMessageID().getValue());
+        if (!message.getExchange().isOneWay()) {
+            if (ContextUtils.isRequestor(message)
+                && maps != null) {
+                //fault occurred trying to send the message, remove it
+                uncorrelatedExchanges.remove(maps.getMessageID().getValue());
+            } else if (!ContextUtils.isRequestor(message) 
+                && maps == null
+                && !message.containsKey(MAPAggregator.class.getName())) {
+                //fault occurred while processing the incoming message, but possibly
+                //before the MAPAggregator was called.   We need to see if we can
+                //try and map this if at all possible so a FaultTo/ReplyTo can
+                //be properly determined to get the fault back to the rightful
+                //place.
+                for (Interceptor<? extends Message> i : message.getInterceptorChain()) {
+                    if (i instanceof MAPAggregator) {
+                        try {
+                            MAPAggregator agg = (MAPAggregator)i;
+                            agg.handleMessage(message);
+                        } catch (Throwable t) {
+                            //ignore
+                        }
+                        return;
+                    }
+                }
+            }
         }
     }
 

Modified: cxf/trunk/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/RMInInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/RMInInterceptor.java?rev=830533&r1=830532&r2=830533&view=diff
==============================================================================
--- cxf/trunk/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/RMInInterceptor.java (original)
+++ cxf/trunk/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/RMInInterceptor.java Wed Oct 28 13:33:40 2009
@@ -41,6 +41,11 @@
         addBefore(MAPAggregator.class.getName());
     }
    
+    @Override
+    public void handleFault(Message message) {
+        message.put(MAPAggregator.class.getName(), true);
+    }
+
     protected void handle(Message message) throws SequenceFault, RMException {
         LOG.entering(getClass().getName(), "handleMessage");
         

Modified: cxf/trunk/systests/ws-specs/src/test/java/org/apache/cxf/systest/ws/security/WSSecurityClientTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/ws-specs/src/test/java/org/apache/cxf/systest/ws/security/WSSecurityClientTest.java?rev=830533&r1=830532&r2=830533&view=diff
==============================================================================
--- cxf/trunk/systests/ws-specs/src/test/java/org/apache/cxf/systest/ws/security/WSSecurityClientTest.java (original)
+++ cxf/trunk/systests/ws-specs/src/test/java/org/apache/cxf/systest/ws/security/WSSecurityClientTest.java Wed Oct 28 13:33:40 2009
@@ -36,11 +36,17 @@
 import javax.xml.ws.handler.Handler;
 import javax.xml.ws.handler.MessageContext;
 import javax.xml.ws.http.HTTPBinding;
+import javax.xml.ws.soap.AddressingFeature;
+import javax.xml.ws.soap.SOAPBinding;
+import javax.xml.ws.soap.SOAPFaultException;
 
 import org.apache.cxf.BusFactory;
 import org.apache.cxf.bus.spring.SpringBusFactory;
+import org.apache.cxf.jaxws.DispatchImpl;
 import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
+import org.apache.cxf.transport.http.HTTPConduit;
 import org.apache.hello_world_soap_http.Greeter;
+
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -170,8 +176,52 @@
         result = source2String(dispatcher.invoke(new StreamSource(is)));
         assertTrue(result.indexOf("Fault") != -1);
     }
+    
+    @Test
+    public void testDecoupledFaultFromSecurity() throws Exception {
+        Dispatch<Source> dispatcher = null;
+        java.io.InputStream is = null;
+        
+        //
+        // Sending no security headers should result in a Fault
+        //
+        dispatcher = createUsernameTokenDispatcher(true);
+        is = getClass().getResourceAsStream("test-data/NoHeadersRequest.xml");
+        try {
+            dispatcher.invoke(new StreamSource(is));
+            fail("exception should have been generated");
+        } catch (SOAPFaultException ex) {
+            assertTrue(ex.getMessage().contains("Security"));
+        }
+
+        //
+        // Sending and empty header should result in a Fault
+        //
+        dispatcher = createUsernameTokenDispatcher(true);
+        is = getClass().getResourceAsStream("test-data/EmptyHeaderRequest.xml");
+        try {
+            dispatcher.invoke(new StreamSource(is));
+            fail("exception should have been generated");
+        } catch (SOAPFaultException ex) {
+            assertTrue(ex.getMessage().contains("Security"));
+        }
+        //
+        // Sending and empty security header should result in a Fault
+        //
+        dispatcher = createUsernameTokenDispatcher(true);
+        is = getClass().getResourceAsStream("test-data/EmptySecurityHeaderRequest.xml");
+        try {
+            dispatcher.invoke(new StreamSource(is));
+            fail("exception should have been generated");
+        } catch (SOAPFaultException ex) {
+            assertTrue(ex.getMessage().contains("Security"));
+        }
 
+    }
     private static Dispatch<Source> createUsernameTokenDispatcher() {
+        return createUsernameTokenDispatcher(false);
+    }
+    private static Dispatch<Source> createUsernameTokenDispatcher(boolean decoupled) {
         //
         // Set up the client (stolen from JAX-RS system test)
         //
@@ -182,13 +232,14 @@
         );
         service.addPort(
             USERNAME_TOKEN_PORT_QNAME,
-            HTTPBinding.HTTP_BINDING,
+            decoupled ? SOAPBinding.SOAP11HTTP_BINDING : HTTPBinding.HTTP_BINDING, 
             "http://localhost:9000/GreeterService/UsernameTokenPort"
         );
         final Dispatch<Source> dispatcher = service.createDispatch(
             USERNAME_TOKEN_PORT_QNAME,
             Source.class,
-            Service.Mode.MESSAGE
+            Service.Mode.MESSAGE,
+            new AddressingFeature(decoupled, decoupled)
         );
         final java.util.Map<String, Object> requestContext =
             dispatcher.getRequestContext();
@@ -196,6 +247,10 @@
             MessageContext.HTTP_REQUEST_METHOD,
             "POST"
         );
+        if (decoupled) {
+            HTTPConduit cond = (HTTPConduit)((DispatchImpl)dispatcher).getClient().getConduit();
+            cond.getClient().setDecoupledEndpoint("http://localhost:9001/decoupled");
+        }
         return dispatcher;
     }
 

Modified: cxf/trunk/systests/ws-specs/src/test/java/org/apache/cxf/systest/ws/security/server.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/ws-specs/src/test/java/org/apache/cxf/systest/ws/security/server.xml?rev=830533&r1=830532&r2=830533&view=diff
==============================================================================
--- cxf/trunk/systests/ws-specs/src/test/java/org/apache/cxf/systest/ws/security/server.xml (original)
+++ cxf/trunk/systests/ws-specs/src/test/java/org/apache/cxf/systest/ws/security/server.xml Wed Oct 28 13:33:40 2009
@@ -23,6 +23,8 @@
     xmlns:jaxws="http://cxf.apache.org/jaxws"
     xmlns:test="http://apache.org/hello_world_soap_http"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:wsa="http://cxf.apache.org/ws/addressing"
+    
     xsi:schemaLocation="http://cxf.apache.org/core
         http://cxf.apache.org/schemas/core.xsd
         http://www.springframework.org/schema/beans
@@ -51,6 +53,9 @@
         serviceName="test:GreeterService"
         endpointName="test:UsernameTokenPort"
         >
+        <jaxws:features>
+        	<wsa:addressing/>
+        </jaxws:features>
         <jaxws:inInterceptors>
             <ref bean="UsernameToken_Request"/>
             <bean class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor"/>