Author: ay
Date: Thu Jun 16 12:56:14 2011
New Revision: 1136417

URL: http://svn.apache.org/viewvc?rev=1136417&view=rev
Log:
[CXF-3594] WS-RM server not honoring the Expires value set in the 
CreateSeqeunce message

Added:
    cxf/trunk/rt/ws/rm/src/test/java/org/apache/cxf/ws/rm/ServantTest.java   
(with props)
Modified:
    cxf/trunk/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/Servant.java

Modified: cxf/trunk/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/Servant.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/Servant.java?rev=1136417&r1=1136416&r2=1136417&view=diff
==============================================================================
--- cxf/trunk/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/Servant.java 
(original)
+++ cxf/trunk/rt/ws/rm/src/main/java/org/apache/cxf/ws/rm/Servant.java Thu Jun 
16 12:56:14 2011
@@ -137,9 +137,12 @@ public class Servant implements Invoker 
         }
         Expires ex = create.getExpires();
         
-        if (null != ex || 
supportedDuration.isShorterThan(DatatypeFactory.PT0S)) {
-            Duration effectiveDuration = supportedDuration;
-            if (null != ex && supportedDuration.isLongerThan(ex.getValue()))  {
+        if (null != ex) {
+            Duration effectiveDuration = ex.getValue();
+            // PT0S represents 0 second and the shortest duration but in 
ws-rm, considered the longest 
+            if (DatatypeFactory.PT0S.equals(effectiveDuration) 
+                || (!DatatypeFactory.PT0S.equals(supportedDuration) 
+                    &&  supportedDuration.isShorterThan(effectiveDuration)))  {
                 effectiveDuration = supportedDuration;
             }
             ex = RMUtils.getWSRMFactory().createExpires();

Added: cxf/trunk/rt/ws/rm/src/test/java/org/apache/cxf/ws/rm/ServantTest.java
URL: 
http://svn.apache.org/viewvc/cxf/trunk/rt/ws/rm/src/test/java/org/apache/cxf/ws/rm/ServantTest.java?rev=1136417&view=auto
==============================================================================
--- cxf/trunk/rt/ws/rm/src/test/java/org/apache/cxf/ws/rm/ServantTest.java 
(added)
+++ cxf/trunk/rt/ws/rm/src/test/java/org/apache/cxf/ws/rm/ServantTest.java Thu 
Jun 16 12:56:14 2011
@@ -0,0 +1,209 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.cxf.ws.rm;
+
+import java.util.List;
+
+import javax.xml.datatype.Duration;
+
+import org.apache.cxf.jaxb.DatatypeFactory;
+import org.apache.cxf.message.Exchange;
+import org.apache.cxf.message.ExchangeImpl;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.message.MessageContentsList;
+import org.apache.cxf.message.MessageImpl;
+import org.apache.cxf.ws.addressing.AddressingPropertiesImpl;
+import org.apache.cxf.ws.addressing.AttributedURIType;
+import org.apache.cxf.ws.addressing.ContextUtils;
+import org.apache.cxf.ws.addressing.JAXWSAConstants;
+import org.apache.cxf.ws.rm.manager.AcksPolicyType;
+import org.apache.cxf.ws.rm.manager.DestinationPolicyType;
+import org.easymock.classextension.EasyMock;
+import org.easymock.classextension.IMocksControl;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * 
+ */
+public class ServantTest extends Assert {
+    private static final String SERVICE_URL = 
"http://localhost:9000/SoapContext/GreeterPort";;
+    private static final String DECOUPLED_URL = 
"http://localhost:9990/decoupled_endpoint";;
+
+    private static final org.apache.cxf.ws.rm.manager.ObjectFactory 
RMMANGER_FACTORY = 
+        new org.apache.cxf.ws.rm.manager.ObjectFactory();
+    private static final Duration DURATION_SHORT = 
DatatypeFactory.createDuration("PT5S");
+    private static final Duration DURATION_VERY_SHORT = 
DatatypeFactory.createDuration("PT2S");
+    private static final Duration DURATION_DEFAULT = 
DatatypeFactory.createDuration("P0Y0M0DT0H0M0.0S");
+    
+    private IMocksControl control;
+    
+    @Before
+    public void setUp() {
+        control = EasyMock.createNiceControl();
+    }
+
+    @After
+    public void tearDown() {
+        control.verify();
+    }
+    
+    
+    @Test
+    public void testCreateSequence() throws SequenceFault {
+        RMEndpoint rme = control.createMock(RMEndpoint.class);
+        RMManager manager = new RMManager();
+        Destination destination = new Destination(rme);
+        SequenceIdentifierGenerator generator = manager.new 
DefaultSequenceIdentifierGenerator();
+        manager.setIdGenerator(generator);
+
+        
EasyMock.expect(rme.getDestination()).andReturn(destination).anyTimes();
+        EasyMock.expect(rme.getManager()).andReturn(manager).anyTimes();
+
+        control.replay();
+
+        Servant servant = new Servant(rme);
+        
+        verifyCreateSequenceDefault(servant, manager);
+
+        verifyCreateSequenceExpiresSetAtDestination(servant, manager);
+        
+        verifyCreateSequenceExpiresSetAtSource(servant, manager);
+        
+        verifyCreateSequenceExpiresSetAtBoth(servant, manager);
+        
+    }
+    
+    private void verifyCreateSequenceDefault(Servant servant, RMManager 
manager) throws SequenceFault {
+        DestinationPolicyType dp = 
RMMANGER_FACTORY.createDestinationPolicyType();
+        AcksPolicyType ap = RMMANGER_FACTORY.createAcksPolicyType();
+        dp.setAcksPolicy(ap);
+        
+        manager.setDestinationPolicy(dp);
+        
+        Expires expires = RMUtils.getWSRMFactory().createExpires();
+        expires.setValue(DatatypeFactory.createDuration("P0Y0M0DT0H0M0.0S"));
+        Message message = createTestCreateSequenceMessage(expires, null);
+
+        CreateSequenceResponseType csr = servant.createSequence(message);
+        
+        Expires expires2 = csr.getExpires();
+        
+        assertNotNull(expires2);
+        assertEquals(DatatypeFactory.PT0S, expires2.getValue());
+    }
+
+    private void verifyCreateSequenceExpiresSetAtDestination(Servant servant, 
RMManager manager) 
+        throws SequenceFault {
+        DestinationPolicyType dp = 
RMMANGER_FACTORY.createDestinationPolicyType();
+        AcksPolicyType ap = RMMANGER_FACTORY.createAcksPolicyType();
+        dp.setAcksPolicy(ap);
+        dp.setSequenceExpiration(DURATION_SHORT);
+        manager.setDestinationPolicy(dp);
+        
+        Expires expires = RMUtils.getWSRMFactory().createExpires();
+        expires.setValue(DURATION_DEFAULT);
+        Message message = createTestCreateSequenceMessage(expires, null);
+
+        CreateSequenceResponseType csr = servant.createSequence(message);
+        
+        Expires expires2 = csr.getExpires();
+        
+        assertNotNull(expires2);
+        assertEquals(DURATION_SHORT, expires2.getValue());
+    }
+
+    private void verifyCreateSequenceExpiresSetAtSource(Servant servant, 
RMManager manager) 
+        throws SequenceFault {
+        DestinationPolicyType dp = 
RMMANGER_FACTORY.createDestinationPolicyType();
+        AcksPolicyType ap = RMMANGER_FACTORY.createAcksPolicyType();
+        dp.setAcksPolicy(ap);
+        manager.setDestinationPolicy(dp);
+        
+        Expires expires = RMUtils.getWSRMFactory().createExpires();
+        expires.setValue(DURATION_SHORT);
+    
+        Message message = createTestCreateSequenceMessage(expires, null);      
  
+
+        CreateSequenceResponseType csr = servant.createSequence(message);
+        
+        Expires expires2 = csr.getExpires();
+        
+        assertNotNull(expires2);
+        assertEquals(DURATION_SHORT, expires2.getValue());
+    }
+
+    private void verifyCreateSequenceExpiresSetAtBoth(Servant servant, 
RMManager manager) 
+        throws SequenceFault {
+        DestinationPolicyType dp = 
RMMANGER_FACTORY.createDestinationPolicyType();
+        AcksPolicyType ap = RMMANGER_FACTORY.createAcksPolicyType();
+        dp.setAcksPolicy(ap);
+        dp.setSequenceExpiration(DURATION_SHORT);
+        manager.setDestinationPolicy(dp);
+        
+        Expires expires = RMUtils.getWSRMFactory().createExpires();
+        expires.setValue(DURATION_VERY_SHORT);
+        
+        Message message = createTestCreateSequenceMessage(expires, null);      
  
+        
+        CreateSequenceResponseType csr = servant.createSequence(message);
+        
+        Expires expires2 = csr.getExpires();
+        
+        assertNotNull(expires2);
+        assertEquals(DURATION_VERY_SHORT, expires2.getValue());
+    }
+
+    private static Message createTestCreateSequenceMessage(Expires expires, 
OfferType offer) {
+        Message message = new MessageImpl();
+        Exchange exchange = new ExchangeImpl();
+        exchange.setInMessage(message);
+//        exchange.setOutMessage(new MessageImpl());
+
+        message.put(Message.REQUESTOR_ROLE, Boolean.FALSE);
+        
+        AddressingPropertiesImpl maps = new AddressingPropertiesImpl();
+        String msgId = "urn:uuid:12345-" + Math.random();
+        AttributedURIType id = ContextUtils.getAttributedURI(msgId);
+        maps.setMessageID(id);
+
+        
maps.setAction(ContextUtils.getAttributedURI(RMConstants.getCreateSequenceAction()));
+        maps.setTo(ContextUtils.getAttributedURI(SERVICE_URL));
+
+        maps.setReplyTo(RMUtils.createReference(DECOUPLED_URL));
+        
+        message.put(JAXWSAConstants.SERVER_ADDRESSING_PROPERTIES_INBOUND, 
maps);
+        
+        CreateSequenceType cs = 
RMUtils.getWSRMFactory().createCreateSequenceType();
+        cs.setAcksTo(RMUtils.createReference2004(DECOUPLED_URL));
+
+        cs.setExpires(expires);
+        cs.setOffer(offer);
+        
+        MessageContentsList contents = new MessageContentsList();
+        contents.add(cs);
+        message.setContent(List.class, contents);
+        
+        return message;
+    }
+}

Propchange: 
cxf/trunk/rt/ws/rm/src/test/java/org/apache/cxf/ws/rm/ServantTest.java
------------------------------------------------------------------------------
    svn:executable = *


Reply via email to