You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2017/03/06 12:38:59 UTC

cxf git commit: [CXF-7262] ClientConfig lost when using templates in the path method, patch from Andy McCright is applied with minor updates, This closes #240

Repository: cxf
Updated Branches:
  refs/heads/master cbd4e7fa6 -> b1c6125f5


[CXF-7262] ClientConfig lost when using templates in the path method, patch from Andy McCright is applied with minor updates, This closes #240


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/b1c6125f
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/b1c6125f
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/b1c6125f

Branch: refs/heads/master
Commit: b1c6125f50b294b0e2ebc927671e2ff53b5001bf
Parents: cbd4e7f
Author: Sergey Beryozkin <sb...@gmail.com>
Authored: Mon Mar 6 12:38:38 2017 +0000
Committer: Sergey Beryozkin <sb...@gmail.com>
Committed: Mon Mar 6 12:38:38 2017 +0000

----------------------------------------------------------------------
 .../cxf/jaxrs/client/spec/ClientImpl.java       |  15 +--
 .../cxf/jaxrs/client/spec/ClientImplTest.java   | 130 +++++++++++++++++++
 .../jaxrs/JAXRS20ClientServerBookTest.java      |  16 +++
 3 files changed, 150 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/b1c6125f/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientImpl.java
----------------------------------------------------------------------
diff --git a/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientImpl.java b/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientImpl.java
index e88a76f..ec20e6c 100644
--- a/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientImpl.java
+++ b/rt/rs/client/src/main/java/org/apache/cxf/jaxrs/client/spec/ClientImpl.java
@@ -462,19 +462,12 @@ public class ClientImpl implements Client {
         }
 
         private WebTarget newWebTarget(UriBuilder newBuilder) {
-            boolean complete = false;
+            WebClient newClient;
             if (targetClient != null) {
-                try {
-                    newBuilder.build();
-                    complete = true;
-                } catch (IllegalArgumentException ex) {
-                    //the builder still has unresolved vars
-                }
-            }
-            if (!complete) {
-                return new WebTargetImpl(newBuilder, getConfiguration());
+                newClient = WebClient.fromClient(targetClient);
+            } else {
+                newClient = null;
             }
-            WebClient newClient = WebClient.fromClient(targetClient);
             return new WebTargetImpl(newBuilder, getConfiguration(), newClient);
         }
 

http://git-wip-us.apache.org/repos/asf/cxf/blob/b1c6125f/rt/rs/client/src/test/java/org/apache/cxf/jaxrs/client/spec/ClientImplTest.java
----------------------------------------------------------------------
diff --git a/rt/rs/client/src/test/java/org/apache/cxf/jaxrs/client/spec/ClientImplTest.java b/rt/rs/client/src/test/java/org/apache/cxf/jaxrs/client/spec/ClientImplTest.java
new file mode 100644
index 0000000..c2f1857
--- /dev/null
+++ b/rt/rs/client/src/test/java/org/apache/cxf/jaxrs/client/spec/ClientImplTest.java
@@ -0,0 +1,130 @@
+/**
+ * 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.jaxrs.client.spec;
+
+import java.util.Arrays;
+
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.WebTarget;
+
+import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.interceptor.Interceptor;
+import org.apache.cxf.jaxrs.client.ClientConfiguration;
+import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.cxf.jaxrs.client.spec.ClientImpl.WebTargetImpl;
+import org.apache.cxf.message.Message;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ClientImplTest extends Assert {
+
+    private static final String MY_INTERCEPTOR_NAME = "MyInterceptor";
+    
+    private static class MyInterceptor implements Interceptor<Message> {
+        @Override
+        public String toString() {
+            return MY_INTERCEPTOR_NAME;
+        }
+        @Override
+        public void handleMessage(Message message) throws Fault {
+            // no-op
+            
+        }
+
+        @Override
+        public void handleFault(Message message) {
+            // no-op
+            
+        }
+    }
+    
+    /**
+     * This test checks that we do not lose track of registered interceptors
+     * on the original client implementation after we create a new impl with
+     * the path(...) method - particularly when the path passed in to the
+     * path(...) method contains a template.
+     */
+    @Test
+    public void testClientConfigCopiedOnPathCallWithTemplates() {
+        Client client = ClientBuilder.newClient();
+        WebTarget webTarget = client.target("http://localhost:8080/");
+        WebClient webClient = getWebClient(webTarget);
+        
+        ClientConfiguration clientConfig = WebClient.getConfig(webClient);
+        clientConfig.setOutInterceptors(Arrays.asList(new MyInterceptor()));
+        assertTrue("Precondition failed - original WebTarget is missing expected interceptor",
+                   doesClientConfigHaveMyInterceptor(webClient));
+        
+        WebTarget webTargetAfterPath = webTarget.path("/rest/{key}/").resolveTemplate("key", "myKey");
+        WebClient webClientAfterPath = getWebClient(webTargetAfterPath);
+        assertTrue("New WebTarget is missing expected interceptor specified on 'parent' WebTarget's client impl",
+                   doesClientConfigHaveMyInterceptor(webClientAfterPath));
+
+        
+    }
+    
+    private WebClient getWebClient(WebTarget webTarget) {
+        webTarget.request();
+        WebTargetImpl webTargetImpl = (WebTargetImpl) webTarget;
+        WebClient webClient = webTargetImpl.getWebClient();
+        assertNotNull("No WebClient is associated with this WebTargetImpl", webClient);
+        return webClient;
+    }
+    
+    private boolean doesClientConfigHaveMyInterceptor(WebClient webClient) {
+        ClientConfiguration clientConfigAfterPath = WebClient.getConfig(webClient);
+        boolean foundMyInterceptor = false;
+        for (Interceptor<?> i : clientConfigAfterPath.getOutInterceptors()) {
+            if (MY_INTERCEPTOR_NAME.equals(i.toString())) {
+                foundMyInterceptor = true;
+                break;
+            }
+        }
+        return foundMyInterceptor;
+    }
+    
+    /**
+     * Similar to <code>testClientConfigCopiedOnPathCallWithTemplates</code>,
+     * this test uses a template, but in the initial call to target().  At this
+     * point, the WebTargetImpl's targetClient field will be null, so we need
+     * this test to ensure that there are no null pointers when creating and
+     * using a template on the first call to target().
+     */
+    @Test
+    public void testTemplateInInitialTarget() {
+        String address = "http://localhost:8080/bookstore/{a}/simple";
+        Client client = ClientBuilder.newClient();
+        WebTarget webTarget = client.target(address).resolveTemplate("a", "bookheaders");
+        webTarget.request("application/xml").header("a", "b");
+        WebClient webClient = getWebClient(webTarget);
+        
+        ClientConfiguration clientConfig = WebClient.getConfig(webClient);
+        clientConfig.setOutInterceptors(Arrays.asList(new MyInterceptor()));
+        assertTrue("Precondition failed - original WebTarget is missing expected interceptor",
+                   doesClientConfigHaveMyInterceptor(webClient));
+        
+        WebTarget webTargetAfterPath = webTarget.path("/rest/{key}/").resolveTemplate("key", "myKey");
+        WebClient webClientAfterPath = getWebClient(webTargetAfterPath);
+        assertTrue("New WebTarget is missing expected interceptor specified on 'parent' WebTarget's client impl",
+                   doesClientConfigHaveMyInterceptor(webClientAfterPath));
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/cxf/blob/b1c6125f/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java
----------------------------------------------------------------------
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java
index e4eb762..d3b63af 100644
--- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRS20ClientServerBookTest.java
@@ -150,6 +150,22 @@ public class JAXRS20ClientServerBookTest extends AbstractBusClientServerTestBase
     }
 
     @Test
+    public void testGetBookSpecTemplate() {
+        String address = "http://localhost:" + PORT + "/bookstore/{a}";
+        Client client = ClientBuilder.newClient();
+        client.register((Object)ClientFilterClientAndConfigCheck.class);
+        client.register(new BTypeParamConverterProvider());
+        client.property("clientproperty", "somevalue");
+        WebTarget webTarget = client.target(address).path("{b}")
+            .resolveTemplate("a", "bookheaders").resolveTemplate("b", "simple");
+        Invocation.Builder builder = webTarget.request("application/xml").header("a", new BType());
+
+        Response r = builder.get();
+        Book book = r.readEntity(Book.class);
+        assertEquals(124L, book.getId());
+        assertEquals("b", r.getHeaderString("a"));
+    }
+    @Test
     public void testGetBookSpec() {
         String address = "http://localhost:" + PORT + "/bookstore/bookheaders/simple";
         Client client = ClientBuilder.newClient();