Repository: cxf
Updated Branches:
  refs/heads/3.0.x-fixes 20cc55284 -> 9a0a6de87


[CXF-7419] Supporting subsesource locators returning classes


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

Branch: refs/heads/3.0.x-fixes
Commit: 9a0a6de878fa762ace57cc460cffdea45b509815
Parents: 20cc552
Author: Sergey Beryozkin <sberyoz...@gmail.com>
Authored: Wed Jul 5 17:05:13 2017 +0100
Committer: Sergey Beryozkin <sberyoz...@gmail.com>
Committed: Thu Jul 6 11:13:45 2017 +0100

----------------------------------------------------------------------
 .../main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java   | 13 ++++++++++++-
 .../java/org/apache/cxf/jaxrs/utils/ResourceUtils.java |  3 +++
 .../java/org/apache/cxf/systest/jaxrs/BookStore.java   |  5 +++++
 .../cxf/systest/jaxrs/JAXRSClientServerBookTest.java   |  6 ++++++
 4 files changed, 26 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/9a0a6de8/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
----------------------------------------------------------------------
diff --git 
a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java 
b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
index 14d9aea..4978569 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
@@ -30,6 +30,7 @@ import java.util.logging.Logger;
 
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.container.AsyncResponse;
+import javax.ws.rs.container.ResourceContext;
 import javax.ws.rs.core.Application;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
@@ -45,6 +46,7 @@ import org.apache.cxf.interceptor.Fault;
 import org.apache.cxf.interceptor.InterceptorChain.State;
 import org.apache.cxf.jaxrs.impl.AsyncResponseImpl;
 import org.apache.cxf.jaxrs.impl.MetadataMap;
+import org.apache.cxf.jaxrs.impl.ResourceContextImpl;
 import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
 import org.apache.cxf.jaxrs.model.ClassResourceInfo;
 import org.apache.cxf.jaxrs.model.OperationResourceInfo;
@@ -235,7 +237,16 @@ public class JAXRSInvoker extends AbstractInvoker {
 
                 result = checkResultObject(result, subResourcePath);
 
-                subCri = cri.getSubResource(methodToInvoke.getReturnType(),
+                Class<?> subResponseType = null;
+                if (result.getClass() == Class.class) {
+                    ResourceContext rc = new ResourceContextImpl(inMessage, 
ori);
+                    result = rc.getResource((Class<?>)result);
+                    subResponseType = 
InjectionUtils.getActualType(methodToInvoke.getGenericReturnType());
+                } else {
+                    subResponseType = methodToInvoke.getReturnType();
+                }
+                
+                subCri = cri.getSubResource(subResponseType,
                     ClassHelper.getRealClass(exchange.getBus(), result), 
result);
                 if (subCri == null) {
                     org.apache.cxf.common.i18n.Message errorM =

http://git-wip-us.apache.org/repos/asf/cxf/blob/9a0a6de8/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java
----------------------------------------------------------------------
diff --git 
a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java 
b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java
index 2c01687..ad1ad74 100644
--- 
a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java
+++ 
b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java
@@ -313,6 +313,9 @@ public final class ResourceUtils {
                 if (httpMethod == null) {
                     // subresource locator
                     Class<?> subClass = m.getReturnType();
+                    if (subClass == Class.class) {
+                        subClass = 
InjectionUtils.getActualType(m.getGenericReturnType());
+                    }
                     if (enableStatic) {
                         ClassResourceInfo subCri = cri.findResource(subClass, 
subClass);
                         if (subCri == null) {

http://git-wip-us.apache.org/repos/asf/cxf/blob/9a0a6de8/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
----------------------------------------------------------------------
diff --git 
a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java 
b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
index 09dedbc..557b6da 100644
--- a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
+++ b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStore.java
@@ -1341,6 +1341,11 @@ public class BookStore {
         return rc.initResource(book2Sub);
     }
     
+    @Path("/booksubresource/class/context")
+    public Class<Book2> getBookSubResourceClass() {
+        return Book2.class;
+    }
+
     @Path("/booksubresourceobject/{bookId}/")
     public Object getBookSubResourceObject(@PathParam("bookId") String id) 
throws BookNotFoundFault {
         return getBookSubResource(id);

http://git-wip-us.apache.org/repos/asf/cxf/blob/9a0a6de8/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
----------------------------------------------------------------------
diff --git 
a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
 
b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
index 148dc24..3c52760 100644
--- 
a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
+++ 
b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerBookTest.java
@@ -2197,6 +2197,12 @@ public class JAXRSClientServerBookTest extends 
AbstractBusClientServerTestBase {
         doTestGetBookWithResourceContext(address);
     }
     
+    @Test
+    public void testGetBookWithResourceContextClass() throws Exception {
+        String address = "http://localhost:"; + PORT + 
"/bookstore/booksubresource/class/context/rc";
+        doTestGetBookWithResourceContext(address);
+    }
+
     private void doTestGetBookWithResourceContext(String address) throws 
Exception {
         WebClient wc = WebClient.create(address);
         wc.accept("application/xml");

Reply via email to