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/14 16:08:22 UTC

cxf git commit: [CXF-7279] Addressing the generic type leak

Repository: cxf
Updated Branches:
  refs/heads/master 792443729 -> d0821bce5


[CXF-7279] Addressing the generic type leak


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

Branch: refs/heads/master
Commit: d0821bce5faa119c882a9000dbe03a124df5b033
Parents: 7924437
Author: Sergey Beryozkin <sb...@gmail.com>
Authored: Tue Mar 14 16:08:08 2017 +0000
Committer: Sergey Beryozkin <sb...@gmail.com>
Committed: Tue Mar 14 16:08:08 2017 +0000

----------------------------------------------------------------------
 .../apache/cxf/jaxrs/utils/InjectionUtils.java  | 22 +++++++-----
 .../org/apache/cxf/systest/jaxrs/Document.java  | 38 ++++++++++++++++++++
 .../cxf/systest/jaxrs/DocumentResource.java     | 35 ++++++++++++++++++
 .../cxf/systest/jaxrs/DocumentResourceImpl.java | 33 +++++++++++++++++
 .../jaxrs/JAXRSClientServerSpringBookTest.java  |  8 +++++
 .../src/test/resources/jaxrs/WEB-INF/beans.xml  |  8 +++++
 6 files changed, 136 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/d0821bce/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
index 042b378..0c4e8e3 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
@@ -1494,15 +1494,21 @@ public final class InjectionUtils {
 
         if (type instanceof TypeVariable) {
             type = InjectionUtils.getSuperType(serviceCls, (TypeVariable<?>)type);
-        } else if (type instanceof ParameterizedType
-            && ((ParameterizedType)type).getActualTypeArguments()[0] instanceof TypeVariable
-            && isSupportedCollectionOrArray(getRawType(type))) {
-            TypeVariable<?> typeVar = (TypeVariable<?>)((ParameterizedType)type).getActualTypeArguments()[0];
-            Type theType = InjectionUtils.getSuperType(serviceCls, typeVar);
-            Class<?> cls = theType instanceof Class
-                ? (Class<?>)theType : InjectionUtils.getActualType(theType, 0);
-            type = new ParameterizedCollectionType(cls);
+        } else if (type instanceof ParameterizedType) {
+            ParameterizedType pt = (ParameterizedType)type;
+            if (pt.getActualTypeArguments()[0] instanceof TypeVariable
+                && isSupportedCollectionOrArray(getRawType(pt))) {
+                TypeVariable<?> typeVar = (TypeVariable<?>)pt.getActualTypeArguments()[0];
+                Type theType = InjectionUtils.getSuperType(serviceCls, typeVar);
+                if (theType instanceof Class) {
+                    type = new ParameterizedCollectionType((Class<?>)theType);
+                } else {
+                    type = processGenericTypeIfNeeded(serviceCls, paramCls, theType);
+                    type = new ParameterizedCollectionType(getRawType(type));
+                }
+            }
         }
+            
         if (type == null || type == Object.class) {
             type = paramCls;
         }

http://git-wip-us.apache.org/repos/asf/cxf/blob/d0821bce/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/Document.java
----------------------------------------------------------------------
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/Document.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/Document.java
new file mode 100644
index 0000000..3331ec6
--- /dev/null
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/Document.java
@@ -0,0 +1,38 @@
+/**
+ * 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.systest.jaxrs;
+
+public class Document<T> {
+    private T t;
+
+    public Document() {
+        
+    }
+    public Document(T t) {
+        this.t = t;
+    }
+    
+    public T getT() {
+        return t;
+    }
+
+    public void setT(T t) {
+        this.t = t;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cxf/blob/d0821bce/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/DocumentResource.java
----------------------------------------------------------------------
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/DocumentResource.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/DocumentResource.java
new file mode 100644
index 0000000..195710b
--- /dev/null
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/DocumentResource.java
@@ -0,0 +1,35 @@
+/**
+ * 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.systest.jaxrs;
+
+import java.util.Set;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+
+@Path("resource")
+public interface DocumentResource<ID, T extends Document<ID>> {
+    @Path("{id}")
+    @GET
+    @Produces("application/json")
+    Set<T> getDocuments(@PathParam("id") ID id);
+}

http://git-wip-us.apache.org/repos/asf/cxf/blob/d0821bce/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/DocumentResourceImpl.java
----------------------------------------------------------------------
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/DocumentResourceImpl.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/DocumentResourceImpl.java
new file mode 100644
index 0000000..a606171
--- /dev/null
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/DocumentResourceImpl.java
@@ -0,0 +1,33 @@
+/**
+ * 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.systest.jaxrs;
+
+import java.util.Collections;
+import java.util.Set;
+
+public class DocumentResourceImpl implements DocumentResource<String, Document<String>> {
+
+    @Override
+    public Set<Document<String>> getDocuments(String id) {
+        Document<String> d = new Document<String>(id);
+        return Collections.singleton(d);
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/cxf/blob/d0821bce/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerSpringBookTest.java
----------------------------------------------------------------------
diff --git a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerSpringBookTest.java b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerSpringBookTest.java
index 647fb3f..a5a3c82 100644
--- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerSpringBookTest.java
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerSpringBookTest.java
@@ -90,6 +90,14 @@ public class JAXRSClientServerSpringBookTest extends AbstractBusClientServerTest
         Book book = wc.replaceHeader("Accept", "application/xml").query("id", 1L).get(Book.class);
         assertEquals("CXF", book.getName());
     }
+    
+    @Test
+    public void testGetDocuments() throws Exception {
+        String baseAddress = "http://localhost:" + PORT + "/the/thedocs/resource/doc";
+        WebClient wc = WebClient.create(baseAddress);
+        Response r = wc.accept("application/json").get();
+        assertEquals("[{\"t\":\"doc\"}]", r.readEntity(String.class));
+    }
 
     @Test
     public void testGetBookWebEx() throws Exception {

http://git-wip-us.apache.org/repos/asf/cxf/blob/d0821bce/systests/jaxrs/src/test/resources/jaxrs/WEB-INF/beans.xml
----------------------------------------------------------------------
diff --git a/systests/jaxrs/src/test/resources/jaxrs/WEB-INF/beans.xml b/systests/jaxrs/src/test/resources/jaxrs/WEB-INF/beans.xml
index bfd097a..49dc91a 100644
--- a/systests/jaxrs/src/test/resources/jaxrs/WEB-INF/beans.xml
+++ b/systests/jaxrs/src/test/resources/jaxrs/WEB-INF/beans.xml
@@ -233,6 +233,14 @@
             <entry key="depthInnerElementCountThreshold" value="2"/>
         </jaxrs:properties>
     </jaxrs:server>
+    <jaxrs:server id="thedocs" address="/thedocs">
+        <jaxrs:serviceBeans>
+            <bean class="org.apache.cxf.systest.jaxrs.DocumentResourceImpl"/>
+        </jaxrs:serviceBeans>
+        <jaxrs:providers>
+            <bean class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider"/>
+        </jaxrs:providers>
+    </jaxrs:server>
     <bean id="jaxbProviderForTypes" class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
         <property name="unmarshallAsJaxbElement" value="true"/>
         <property name="schemaLocations" ref="theSchemaLocations"/>