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),