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 2009/07/17 16:41:42 UTC

svn commit: r795104 - in /cxf/trunk/rt/frontend/jaxrs/src: main/java/org/apache/cxf/jaxrs/model/wadl/ main/java/org/apache/cxf/jaxrs/utils/ test/java/org/apache/cxf/jaxrs/model/wadl/

Author: sergeyb
Date: Fri Jul 17 14:41:42 2009
New Revision: 795104

URL: http://svn.apache.org/viewvc?rev=795104&view=rev
Log:
JAX-RS : minor WADL gen updates (handling recursive subresources and parameter beans)

Modified:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/BookStore.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/WadlGeneratorTest.java

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java?rev=795104&r1=795103&r2=795104&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java Fri Jul 17 14:41:42 2009
@@ -119,10 +119,10 @@
             proxy = ReflectionInvokationHandler.createProxyWrapper(context, JAXBContextProxy.class);
         }
         Map<Class<?>, QName> clsMap = new IdentityHashMap<Class<?>, QName>();
-        
+        Set<ClassResourceInfo> visitedResources = new HashSet<ClassResourceInfo>();
         for (ClassResourceInfo cri : cris) {
             handleResource(sbResources, jaxbTypes, proxy, clsMap,
-                           cri, cri.getURITemplate().getValue());
+                           cri, cri.getURITemplate().getValue(), visitedResources);
         }
         sbResources.append("</resources>");
         
@@ -170,7 +170,9 @@
     }
     
     private void handleResource(StringBuilder sb, Set<Class<?>> jaxbTypes, JAXBContextProxy jaxbProxy,
-                                Map<Class<?>, QName> clsMap, ClassResourceInfo cri, String path) {
+                                Map<Class<?>, QName> clsMap, ClassResourceInfo cri, String path,
+                                Set<ClassResourceInfo> visitedResources) {
+        visitedResources.add(cri);
         sb.append("<resource path=\"").append(path).append("\">");
         
         List<OperationResourceInfo> sortedOps = sortOperationsByPath(
@@ -181,11 +183,11 @@
             if (ori.getHttpMethod() == null) {
                 Class<?> cls = ori.getMethodToInvoke().getReturnType();
                 ClassResourceInfo subcri = cri.findResource(cls, cls);
-                if (subcri != null) {
+                if (subcri != null && !visitedResources.contains(subcri)) {
                     handleResource(sb, jaxbTypes, jaxbProxy, clsMap, subcri, 
-                                   ori.getURITemplate().getValue());
+                                   ori.getURITemplate().getValue(), visitedResources);
                 } else {
-                    handleDynamicSubresource(sb, jaxbTypes, jaxbProxy, clsMap, ori);
+                    handleDynamicSubresource(sb, jaxbTypes, jaxbProxy, clsMap, ori, subcri);
                 }
                 continue;
             }
@@ -249,9 +251,14 @@
     }
     
     private void handleDynamicSubresource(StringBuilder sb, Set<Class<?>> jaxbTypes, 
-                 JAXBContextProxy jaxbProxy, Map<Class<?>, QName> clsMap, OperationResourceInfo ori) {
+                 JAXBContextProxy jaxbProxy, Map<Class<?>, QName> clsMap, OperationResourceInfo ori,
+                 ClassResourceInfo subcri) {
         
-        sb.append("<!-- Dynamic subresource -->");
+        if (subcri != null) {
+            sb.append("<!-- Recursive subresource -->");
+        } else {
+            sb.append("<!-- Dynamic subresource -->");    
+        }
         sb.append("<resource path=\"").append(ori.getURITemplate().getValue()).append("\">");
         if (ori.getMethodToInvoke().getParameterTypes().length != 0) {
             sb.append("<request>");
@@ -289,6 +296,19 @@
     }
     
     private void writeParam(StringBuilder sb, Parameter pm, OperationResourceInfo ori) {
+        Class<?> type = ori.getMethodToInvoke().getParameterTypes()[pm.getIndex()];
+        if (!"".equals(pm.getName())) {
+            doWriteParam(sb, pm, type);
+        } else {
+            Map<Parameter, Class<?>> pms = InjectionUtils.getParametersFromBeanClass(type, pm.getType());
+            for (Map.Entry<Parameter, Class<?>> entry : pms.entrySet()) {   
+                doWriteParam(sb, entry.getKey(), entry.getValue());
+            }
+        }
+    }
+    
+    private void doWriteParam(StringBuilder sb, Parameter pm, Class<?> type) {
+        
         sb.append("<param name=\"").append(pm.getName()).append("\" ");
         String style = ParameterType.PATH == pm.getType() ? "template" 
                        : ParameterType.FORM == pm.getType() ? "query"
@@ -297,7 +317,6 @@
         if (pm.getDefaultValue() != null) {
             sb.append(" default=\"").append(pm.getDefaultValue()).append("\"");
         }
-        Class<?> type = ori.getMethodToInvoke().getParameterTypes()[pm.getIndex()];
         String value = XmlSchemaPrimitiveUtils.getSchemaRepresentation(type);
         if (value != null) {
             sb.append(" type=\"").append(value).append("\"");

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java?rev=795104&r1=795103&r2=795104&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java Fri Jul 17 14:41:42 2009
@@ -37,6 +37,7 @@
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.ResourceBundle;
@@ -82,6 +83,7 @@
 import org.apache.cxf.jaxrs.impl.tl.ThreadLocalServletContext;
 import org.apache.cxf.jaxrs.impl.tl.ThreadLocalUriInfo;
 import org.apache.cxf.jaxrs.model.AbstractResourceInfo;
+import org.apache.cxf.jaxrs.model.Parameter;
 import org.apache.cxf.jaxrs.model.ParameterType;
 import org.apache.cxf.jaxrs.provider.ProviderFactory;
 import org.apache.cxf.message.Message;
@@ -809,6 +811,23 @@
         }
     }
     
+    public static Map<Parameter, Class<?>> getParametersFromBeanClass(Class<?> beanClass, 
+                                                                      ParameterType type) {
+        Map<Parameter, Class<?>> params = new LinkedHashMap<Parameter, Class<?>>();
+        for (Method m : beanClass.getMethods()) {
+            if (m.getName().startsWith("get") && m.getParameterTypes().length == 0 
+                && m.getName().length() > 3) {
+                String propertyName = m.getName().substring(3).toLowerCase();
+                if ("class".equals(propertyName)) {
+                    continue;
+                }
+                params.put(new Parameter(type, propertyName), m.getReturnType());
+            }
+        }
+        return params;
+    }
+    
+    
     public static boolean isPrimitive(Class<?> type) {
         return type.isPrimitive() 
             || Number.class.isAssignableFrom(type)

Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/BookStore.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/BookStore.java?rev=795104&r1=795103&r2=795104&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/BookStore.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/BookStore.java Fri Jul 17 14:41:42 2009
@@ -27,6 +27,7 @@
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.HttpHeaders;
 
@@ -37,7 +38,7 @@
 
     @GET 
     @Produces("text/plain")
-    public String getName(@PathParam("id") Long id) {
+    public String getName(@PathParam("id") Long id, @QueryParam("") QueryBean query) {
         return "store";
     }
     
@@ -64,4 +65,21 @@
         return new Chapter(1);
     }
     
+    @Path("itself")
+    public BookStore getItself() {
+        return this;
+    }
+    
+    public static class QueryBean {
+        private int a;
+        private int b;
+        
+        public int getA() {
+            return a;
+        }
+        
+        public int getB() {
+            return b;
+        }
+    }
 }

Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/WadlGeneratorTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/WadlGeneratorTest.java?rev=795104&r1=795103&r2=795104&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/WadlGeneratorTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/WadlGeneratorTest.java Fri Jul 17 14:41:42 2009
@@ -132,20 +132,36 @@
         
         List<Element> resourceEls = DOMUtils.getChildrenWithName(resource, 
                                          WadlGenerator.WADL_NS, "resource");
-        assertEquals(4, resourceEls.size());        
+        assertEquals(5, resourceEls.size());        
         assertEquals("/", resourceEls.get(0).getAttribute("path"));
         assertEquals("/books/{bookid}", resourceEls.get(1).getAttribute("path"));
         assertEquals("/chapter", resourceEls.get(2).getAttribute("path"));
         assertEquals("/booksubresource", resourceEls.get(3).getAttribute("path"));
+        assertEquals("/itself", resourceEls.get(4).getAttribute("path"));
         
         
         List<Element> methodEls = DOMUtils.getChildrenWithName(resourceEls.get(0), 
                                                                WadlGenerator.WADL_NS, "method");
+        
         assertEquals(1, methodEls.size());
         assertEquals("GET", methodEls.get(0).getAttribute("name"));
-                                                           
         
-        List<Element> paramsEls = DOMUtils.getChildrenWithName(resourceEls.get(1), 
+        List<Element> paramsEls = DOMUtils.getChildrenWithName(resourceEls.get(0), 
+                                                               WadlGenerator.WADL_NS, "param");
+        assertEquals(1, paramsEls.size());
+        checkParameter(paramsEls.get(0), "id", "template");
+        
+        List<Element> requestEls = DOMUtils.getChildrenWithName(methodEls.get(0), 
+                                                               WadlGenerator.WADL_NS, "request");
+        assertEquals(1, requestEls.size());
+        
+        paramsEls = DOMUtils.getChildrenWithName(requestEls.get(0), 
+                                                 WadlGenerator.WADL_NS, "param");
+        assertEquals(2, paramsEls.size());
+        checkParameter(paramsEls.get(0), "a", "query");
+        checkParameter(paramsEls.get(1), "b", "query");
+        
+        paramsEls = DOMUtils.getChildrenWithName(resourceEls.get(1), 
                                                                WadlGenerator.WADL_NS, "param");
         assertEquals(3, paramsEls.size());
         checkParameter(paramsEls.get(0), "id", "template");
@@ -157,7 +173,7 @@
         assertEquals(1, methodEls.size());
         assertEquals("POST", methodEls.get(0).getAttribute("name"));
         
-        List<Element> requestEls = DOMUtils.getChildrenWithName(methodEls.get(0), 
+        requestEls = DOMUtils.getChildrenWithName(methodEls.get(0), 
                                                                 WadlGenerator.WADL_NS, "request");
         assertEquals(1, requestEls.size());
         List<Element> repEls = DOMUtils.getChildrenWithName(requestEls.get(0),