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/12/24 16:21:00 UTC

svn commit: r893773 - in /cxf/trunk/rt/frontend/jaxrs/src: main/java/org/apache/cxf/jaxrs/impl/ main/java/org/apache/cxf/jaxrs/model/wadl/ main/java/org/apache/cxf/jaxrs/provider/ test/java/org/apache/cxf/jaxrs/impl/ test/java/org/apache/cxf/jaxrs/mode...

Author: sergeyb
Date: Thu Dec 24 15:20:55 2009
New Revision: 893773

URL: http://svn.apache.org/viewvc?rev=893773&view=rev
Log:
JAXRS: enhancing WADL test and making sure a custom WadlGenerator can be plugged-in

Modified:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/RequestPreprocessor.java
    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/provider/ProviderFactory.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/RequestPreprocessorTest.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/WadlGeneratorTest.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/jaxb/Book.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/jaxb/Chapter.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/RequestPreprocessor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/RequestPreprocessor.java?rev=893773&r1=893772&r2=893773&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/RequestPreprocessor.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/RequestPreprocessor.java Thu Dec 24 15:20:55 2009
@@ -29,7 +29,10 @@
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
+import org.apache.cxf.jaxrs.ext.RequestHandler;
+import org.apache.cxf.jaxrs.model.ProviderInfo;
 import org.apache.cxf.jaxrs.model.wadl.WadlGenerator;
+import org.apache.cxf.jaxrs.provider.ProviderFactory;
 import org.apache.cxf.jaxrs.utils.HttpUtils;
 import org.apache.cxf.message.Message;
 
@@ -161,9 +164,14 @@
             String requestURI = (String)m.get(Message.REQUEST_URI);
             String baseAddress = HttpUtils.getBaseAddress(m);
             if (baseAddress.equals(requestURI)) {
-                Response r = new WadlGenerator().handleRequest(m, null);
-                if (r != null) {
-                    m.getExchange().put(Response.class, r);
+                List<ProviderInfo<RequestHandler>> shs = ProviderFactory.getInstance(m).getRequestHandlers();
+                // this is actually being tested by ProviderFactory unit tests but just in case
+                // WadlGenerator, the custom or default one, must be the first one
+                if (shs.size() > 0 && shs.get(0).getProvider() instanceof WadlGenerator) {
+                    Response r = shs.get(0).getProvider().handleRequest(m, null);
+                    if (r != null) {
+                        m.getExchange().put(Response.class, r);
+                    }    
                 }
             }
         }

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=893773&r1=893772&r2=893773&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 Thu Dec 24 15:20:55 2009
@@ -202,7 +202,7 @@
                 if (subcri != null && !visitedResources.contains(subcri)) {
                     String path = ori.getURITemplate().getValue();
                     sb.append("<resource path=\"").append(path).append("\">");
-                    handleDocs(cri.getServiceClass().getAnnotations(), sb);
+                    handleDocs(subcri.getServiceClass().getAnnotations(), sb);
                     handlePathAndMatrixParams(sb, ori);
                     handleResource(sb, jaxbTypes, jaxbProxy, clsMap, subcri, 
                                    visitedResources);

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java?rev=893773&r1=893772&r2=893773&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java Thu Dec 24 15:20:55 2009
@@ -280,15 +280,26 @@
                                                         parameterAnnotations, mediaType, m);
     }
     
-    
-    
     public List<ProviderInfo<RequestHandler>> getRequestHandlers() {
         List<ProviderInfo<RequestHandler>> handlers = null;
         if (requestHandlers.size() == 0) {
             handlers = SHARED_FACTORY.requestHandlers;
         } else {
-            handlers = new ArrayList<ProviderInfo<RequestHandler>>(SHARED_FACTORY.requestHandlers);
+            handlers = new ArrayList<ProviderInfo<RequestHandler>>();
+            boolean customWADLHandler = false;
+            for (int i = 0; i < requestHandlers.size(); i++) {
+                if (requestHandlers.get(i).getProvider() instanceof WadlGenerator) {
+                    customWADLHandler = true;
+                    break;
+                }
+            }
+            if (!customWADLHandler) {
+                // TODO : this works only because we know we only have a single 
+                // system handler which is a default WADLGenerator, think of a better approach
+                handlers.addAll(SHARED_FACTORY.requestHandlers);    
+            }
             handlers.addAll(requestHandlers);
+            
         }
         return Collections.unmodifiableList(handlers);
     }

Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/RequestPreprocessorTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/RequestPreprocessorTest.java?rev=893773&r1=893772&r2=893773&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/RequestPreprocessorTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/RequestPreprocessorTest.java Thu Dec 24 15:20:55 2009
@@ -24,9 +24,22 @@
 import java.util.List;
 import java.util.Map;
 
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.Response;
+
+import org.apache.cxf.endpoint.Endpoint;
+import org.apache.cxf.jaxrs.JAXRSServiceImpl;
+import org.apache.cxf.jaxrs.model.ClassResourceInfo;
+import org.apache.cxf.jaxrs.model.wadl.WadlGenerator;
+import org.apache.cxf.jaxrs.provider.ProviderFactory;
+import org.apache.cxf.jaxrs.utils.ResourceUtils;
 import org.apache.cxf.message.Exchange;
+import org.apache.cxf.message.ExchangeImpl;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.message.MessageImpl;
+import org.apache.cxf.service.Service;
 import org.apache.cxf.service.model.EndpointInfo;
 import org.apache.cxf.transport.servlet.ServletDestination;
 import org.easymock.classextension.EasyMock;
@@ -65,6 +78,20 @@
     }
     
     @Test
+    public void testWadlQuery() {
+        Message m = mockMessage("http://localhost:8080/bar", "/bar", "_wadl", "GET");
+        ClassResourceInfo cri = 
+            ResourceUtils.createClassResourceInfo(TestResource.class, TestResource.class, true, true);
+        m.getExchange().put(Service.class, new JAXRSServiceImpl(Collections.singletonList(cri)));
+        RequestPreprocessor sqh = new RequestPreprocessor();
+        sqh.preprocess(m, new UriInfoImpl(m, null));
+        Response r = m.getExchange().get(Response.class);
+        assertNotNull(r);
+        assertEquals(WadlGenerator.WADL_TYPE.toString(),
+                     r.getMetadata().getFirst(HttpHeaders.CONTENT_TYPE));
+    }
+    
+    @Test
     public void testTypeQuery() {
         Message m = mockMessage("http://localhost:8080", "/bar", "_type=xml", "POST");
         RequestPreprocessor sqh = new RequestPreprocessor();
@@ -86,12 +113,15 @@
                                 String method,
                                 String methodHeader) {
         Message m = new MessageImpl();
-        control.reset();
-        Exchange e = control.createMock(Exchange.class);
+        Exchange e = new ExchangeImpl();
         m.setExchange(e);
+        control.reset();
+        Endpoint endp = control.createMock(Endpoint.class);
+        e.put(Endpoint.class, endp);
+        endp.get(ProviderFactory.class.getName());
+        EasyMock.expectLastCall().andReturn(ProviderFactory.getInstance()).anyTimes();
         ServletDestination d = control.createMock(ServletDestination.class);
-        e.getDestination();
-        EasyMock.expectLastCall().andReturn(d).anyTimes();
+        e.setDestination(d);
         EndpointInfo epr = new EndpointInfo(); 
         epr.setAddress(baseAddress);
         d.getEndpointInfo();
@@ -107,4 +137,12 @@
         control.replay();
         return m;
     }
+    
+    @Path("/test")
+    private static class TestResource {
+        @GET
+        public String get() {
+            return "test";
+        }
+    }
 }

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=893773&r1=893772&r2=893773&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 Thu Dec 24 15:20:55 2009
@@ -142,21 +142,45 @@
                                                           XmlSchemaConstants.XSD_NAMESPACE_URI, "schema");
         assertEquals(1, schemasEls.size());
         assertEquals("http://superbooks", schemasEls.get(0).getAttribute("targetNamespace"));
-        assertEquals(3, DOMUtils.getChildrenWithName(schemasEls.get(0), 
-                       XmlSchemaConstants.XSD_NAMESPACE_URI, "element").size());
-        assertEquals(3, DOMUtils.getChildrenWithName(schemasEls.get(0), 
-                       XmlSchemaConstants.XSD_NAMESPACE_URI, "complexType").size());
+        List<Element> elementEls = DOMUtils.getChildrenWithName(schemasEls.get(0), 
+                            XmlSchemaConstants.XSD_NAMESPACE_URI, "element");
+        assertEquals(3, elementEls.size());
+        assertTrue(checkElement(elementEls, "thebook", "tns:book"));
+        assertTrue(checkElement(elementEls, "thebook2", "tns:book2"));
+        assertTrue(checkElement(elementEls, "thechapter", "tns:chapter"));
+        
+        List<Element> complexTypesEls = DOMUtils.getChildrenWithName(schemasEls.get(0), 
+                                        XmlSchemaConstants.XSD_NAMESPACE_URI, "complexType");
+        assertEquals(3, complexTypesEls.size());
+        
+        assertTrue(checkComplexType(complexTypesEls, "book"));
+        assertTrue(checkComplexType(complexTypesEls, "book2"));
+        assertTrue(checkComplexType(complexTypesEls, "chapter"));
+    }
+    
+    private boolean checkComplexType(List<Element> els, String name) {
+        for (Element e : els) {
+            if (name.equals(e.getAttribute("name"))) {
+                return true;
+            }
+        }
+        return false;
+    }
+    
+    private boolean checkElement(List<Element> els, String name, String type) {
+        for (Element e : els) {
+            if (name.equals(e.getAttribute("name"))
+                && type.equals(e.getAttribute("type"))) {
+                return true;
+            }
+        }
+        return false;
     }
     
     private void checkBookStoreInfo(Element resource) {
         assertEquals("/bookstore/{id}", resource.getAttribute("path"));
         
-        List<Element> docsEls = DOMUtils.getChildrenWithName(resource, 
-                WadlGenerator.WADL_NS, "doc");
-        assertEquals(1, docsEls.size());
-        assertEquals("book store resource", docsEls.get(0).getAttribute("title"));
-        assertEquals("en-us", 
-            docsEls.get(0).getAttributeNS("http://www.w3.org/XML/1998/namespace", "lang"));
+        checkRootDocs(resource);
         
         List<Element> resourceEls = DOMUtils.getChildrenWithName(resource, 
                                          WadlGenerator.WADL_NS, "resource");
@@ -169,75 +193,178 @@
         assertEquals("/booksubresource", resourceEls.get(5).getAttribute("path"));
         assertEquals("/itself", resourceEls.get(6).getAttribute("path"));
         
+        // verify repource starting with "/"
+        // must have a single template parameter
+        List<Element> paramsEls = DOMUtils.getChildrenWithName(resourceEls.get(0), 
+                                                               WadlGenerator.WADL_NS, "param");
+        assertEquals(1, paramsEls.size());
+        checkParameter(paramsEls.get(0), "id", "template", "xs:long");
         
+        // must have 2 methods, GET and PUT
         List<Element> methodEls = DOMUtils.getChildrenWithName(resourceEls.get(0), 
                                                                WadlGenerator.WADL_NS, "method");
-        
         assertEquals(2, methodEls.size());
-        assertEquals("GET", methodEls.get(0).getAttribute("name"));
-        assertEquals("PUT", methodEls.get(1).getAttribute("name"));
-        
-        List<Element> paramsEls = DOMUtils.getChildrenWithName(resourceEls.get(0), 
-                                                               WadlGenerator.WADL_NS, "param");
-        assertEquals(1, paramsEls.size());
-        checkParameter(paramsEls.get(0), "id", "template");
         
+        // verify GET
+        assertEquals("GET", methodEls.get(0).getAttribute("name"));
+        assertEquals(0, DOMUtils.getChildrenWithName(methodEls.get(0), 
+                        WadlGenerator.WADL_NS, "param").size());
+        // check request 
         List<Element> requestEls = DOMUtils.getChildrenWithName(methodEls.get(0), 
                                                                WadlGenerator.WADL_NS, "request");
         assertEquals(1, requestEls.size());
         
+        // 6 parameters are expected
         paramsEls = DOMUtils.getChildrenWithName(requestEls.get(0), 
                                                  WadlGenerator.WADL_NS, "param");
         assertEquals(6, paramsEls.size());
-        checkParameter(paramsEls.get(0), "a", "query");
-        checkParameter(paramsEls.get(1), "b", "query");
-        checkParameter(paramsEls.get(2), "c.a", "query");
-        checkParameter(paramsEls.get(3), "c.b", "query");
-        checkParameter(paramsEls.get(4), "c.d.a", "query");
-        checkParameter(paramsEls.get(5), "c.d.b", "query");
+        checkParameter(paramsEls.get(0), "a", "query", "xs:int");
+        checkParameter(paramsEls.get(1), "b", "query", "xs:int");
+        checkParameter(paramsEls.get(2), "c.a", "query", "xs:int");
+        checkParameter(paramsEls.get(3), "c.b", "query", "xs:int");
+        checkParameter(paramsEls.get(4), "c.d.a", "query", "xs:int");
+        checkParameter(paramsEls.get(5), "c.d.b", "query", "xs:int");
+        assertEquals(0, DOMUtils.getChildrenWithName(requestEls.get(0), 
+                         WadlGenerator.WADL_NS, "representation").size());
+        //check response
+        verifyPlainRepresentation(methodEls.get(0), "response");
+        
+        // verify PUT
+        assertEquals("PUT", methodEls.get(1).getAttribute("name"));
+        verifyPlainRepresentation(methodEls.get(1), "request");
+        
+        verifyResponseWithStatus(methodEls.get(1), "204");
         
+        // verify resource starting with /book2
+        verifyGetResourceMethod(resourceEls.get(1), "prefix1:thebook2");
+        
+        //verify resource starting with /books/{bookid}
         paramsEls = DOMUtils.getChildrenWithName(resourceEls.get(2), 
                                                                WadlGenerator.WADL_NS, "param");
+        // should have 3 parameters
         assertEquals(3, paramsEls.size());
-        checkParameter(paramsEls.get(0), "id", "template");
-        checkParameter(paramsEls.get(1), "bookid", "template");
-        checkParameter(paramsEls.get(2), "mid", "matrix");
+        checkParameter(paramsEls.get(0), "id", "template", "xs:int");
+        checkParameter(paramsEls.get(1), "bookid", "template", "xs:int");
+        checkParameter(paramsEls.get(2), "mid", "matrix", "xs:int");
         
+        // and 2 methods
         methodEls = DOMUtils.getChildrenWithName(resourceEls.get(2), 
                                                  WadlGenerator.WADL_NS, "method");
         assertEquals(2, methodEls.size());
         
+        // POST 
         assertEquals("POST", methodEls.get(0).getAttribute("name"));
         
-        requestEls = DOMUtils.getChildrenWithName(methodEls.get(1), 
-                                                                WadlGenerator.WADL_NS, "request");
+        requestEls = DOMUtils.getChildrenWithName(methodEls.get(0), 
+                                             WadlGenerator.WADL_NS, "request");
         assertEquals(1, requestEls.size());
-        List<Element> repEls = DOMUtils.getChildrenWithName(requestEls.get(0), 
-                                                            WadlGenerator.WADL_NS, "representation");
-        assertEquals(2, repEls.size());
-        assertEquals("application/xml", repEls.get(0).getAttribute("mediaType"));
-        assertEquals("prefix1:thebook", repEls.get(0).getAttribute("element"));
-        assertEquals("application/json", repEls.get(1).getAttribute("mediaType"));
-        assertEquals("", repEls.get(1).getAttribute("element"));
+        paramsEls = DOMUtils.getChildrenWithName(requestEls.get(0), 
+                                                 WadlGenerator.WADL_NS, "param");
+        // should have 2 parameters
+        assertEquals(2, paramsEls.size());
+        checkParameter(paramsEls.get(0), "hid", "header", "xs:int");
+        checkParameter(paramsEls.get(1), "provider.bar", "query", "xs:int");
+        verifyXmlJsonRepresentations(requestEls.get(0), "prefix1:thebook");
         
+        // PUT
         assertEquals("PUT", methodEls.get(1).getAttribute("name"));
-        
-        requestEls = DOMUtils.getChildrenWithName(methodEls.get(0), 
+        requestEls = DOMUtils.getChildrenWithName(methodEls.get(1), 
                                                                 WadlGenerator.WADL_NS, "request");
         assertEquals(1, requestEls.size());
-        repEls = DOMUtils.getChildrenWithName(requestEls.get(0), 
+        verifyXmlJsonRepresentations(requestEls.get(0), "prefix1:thebook");
+        verifyResponseWithStatus(methodEls.get(1), "204");
+        
+        // verify resource starting with /chapter
+        verifyGetResourceMethod(resourceEls.get(3), "prefix1:thechapter");
+        
+        // verify resource starting from /booksubresource
+        // should have 2 parameters
+        paramsEls = DOMUtils.getChildrenWithName(resourceEls.get(5), 
+                         WadlGenerator.WADL_NS, "param");
+        assertEquals(2, paramsEls.size());
+        checkParameter(paramsEls.get(0), "id", "template", "xs:int");
+        checkParameter(paramsEls.get(1), "mid", "matrix", "xs:int");
+        
+        // should have 4 child resources
+        List<Element> subResourceEls = DOMUtils.getChildrenWithName(resourceEls.get(5), 
+                                         WadlGenerator.WADL_NS, "resource");
+        assertEquals(4, subResourceEls.size());        
+        assertEquals("/book", subResourceEls.get(0).getAttribute("path"));
+        assertEquals("/form1", subResourceEls.get(1).getAttribute("path"));
+        assertEquals("/form2", subResourceEls.get(2).getAttribute("path"));
+        assertEquals("/chapter/{cid}", subResourceEls.get(3).getAttribute("path"));
+        // verify subresource /book
+        // GET 
+        verifyGetResourceMethod(subResourceEls.get(0), "prefix1:thebook");
+        
+        // verify subresource /chapter/{id}
+        List<Element> chapterMethodEls = DOMUtils.getChildrenWithName(subResourceEls.get(3), 
+                                                                    WadlGenerator.WADL_NS, "resource");
+        assertEquals(1, chapterMethodEls.size());        
+        assertEquals("/id", chapterMethodEls.get(0).getAttribute("path"));
+        paramsEls = DOMUtils.getChildrenWithName(subResourceEls.get(3), 
+                                                 WadlGenerator.WADL_NS, "param");
+        assertEquals(1, paramsEls.size());
+        checkParameter(paramsEls.get(0), "cid", "template", "xs:int");
+        // GET
+        verifyGetResourceMethod(chapterMethodEls.get(0), "prefix1:thechapter");
+    }
+    
+    private void checkRootDocs(Element el) {
+        List<Element> docsEls = DOMUtils.getChildrenWithName(el, 
+                                                             WadlGenerator.WADL_NS, "doc");
+        assertEquals(1, docsEls.size());
+        assertEquals("book store resource", docsEls.get(0).getAttribute("title"));
+        assertEquals("en-us", 
+            docsEls.get(0).getAttributeNS("http://www.w3.org/XML/1998/namespace", "lang"));
+    }
+    
+    private void verifyGetResourceMethod(Element element, String type) {
+        List<Element> methodEls = DOMUtils.getChildrenWithName(element, WadlGenerator.WADL_NS, "method");
+        assertEquals(1, methodEls.size());
+        assertEquals("GET", methodEls.get(0).getAttribute("name"));
+        assertEquals(0, DOMUtils.getChildrenWithName(methodEls.get(0), 
+                      WadlGenerator.WADL_NS, "request").size());
+        List<Element> responseEls = DOMUtils.getChildrenWithName(methodEls.get(0), 
+                                WadlGenerator.WADL_NS, "response");
+        assertEquals(1, responseEls.size());
+        verifyXmlJsonRepresentations(responseEls.get(0), type);
+    }
+    
+    private void verifyResponseWithStatus(Element element, String status) {
+        List<Element> responseEls = DOMUtils.getChildrenWithName(element, 
+                                       WadlGenerator.WADL_NS, "response");
+        assertEquals(1, responseEls.size());
+        assertEquals(status, responseEls.get(0).getAttribute("status"));
+        assertEquals(0, DOMUtils.getChildrenWithName(responseEls.get(0), 
+            WadlGenerator.WADL_NS, "representation").size());
+    }
+    
+    private void verifyPlainRepresentation(Element element, String name) {
+        List<Element> responseEls = DOMUtils.getChildrenWithName(element, 
+                                 WadlGenerator.WADL_NS, name);
+        assertEquals(1, responseEls.size());
+        List<Element> representationEls = DOMUtils.getChildrenWithName(responseEls.get(0), 
+                    WadlGenerator.WADL_NS, "representation"); 
+        assertEquals(1, representationEls.size());
+        assertEquals("text/plain", representationEls.get(0).getAttribute("mediaType"));
+        assertEquals("", representationEls.get(0).getAttribute("element"));
+    }
+    
+    private void verifyXmlJsonRepresentations(Element element, String type) {
+        List<Element> repEls = DOMUtils.getChildrenWithName(element, 
                                                             WadlGenerator.WADL_NS, "representation");
         assertEquals(2, repEls.size());
         assertEquals("application/xml", repEls.get(0).getAttribute("mediaType"));
-        assertEquals("prefix1:thebook", repEls.get(0).getAttribute("element"));
+        assertEquals(type, repEls.get(0).getAttribute("element"));
         assertEquals("application/json", repEls.get(1).getAttribute("mediaType"));
         assertEquals("", repEls.get(1).getAttribute("element"));
-        
     }
     
-    private void checkParameter(Element paramEl, String name, String type) {
+    private void checkParameter(Element paramEl, String name, String style, String type) {
         assertEquals(name, paramEl.getAttribute("name"));
-        assertEquals(type, paramEl.getAttribute("style"));    
+        assertEquals(style, paramEl.getAttribute("style"));
+        assertEquals(type, paramEl.getAttribute("type"));
     }
     
     private List<Element> getWadlResourcesInfo(Document doc, String baseURI, int size) throws Exception {

Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/jaxb/Book.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/jaxb/Book.java?rev=893773&r1=893772&r2=893773&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/jaxb/Book.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/jaxb/Book.java Thu Dec 24 15:20:55 2009
@@ -23,13 +23,17 @@
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 
+import org.apache.cxf.jaxrs.ext.Description;
+
 @XmlRootElement(name = "thebook", namespace = "http://superbooks")
 @XmlType(name = "book", namespace = "http://superbooks")
+@Description("Book subresource")
 public class Book {
 
     private int id;
@@ -45,14 +49,20 @@
     
     @GET
     @Path("/book")
-    public int getId() {
-        return id;
+    @Produces({"application/xml", "application/json" })
+    @Description("Get the book")
+    public Book getIt() {
+        return this;
     }
     
     public void setId(int ident) {
         id = ident;
     }
     
+    public int getId() {
+        return id;
+    }
+    
     @Path("/chapter/{cid}")
     public Chapter getChapter(@PathParam("cid") int cid) {
         return chapter;

Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/jaxb/Chapter.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/jaxb/Chapter.java?rev=893773&r1=893772&r2=893773&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/jaxb/Chapter.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/jaxb/Chapter.java Thu Dec 24 15:20:55 2009
@@ -20,11 +20,15 @@
 
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 
+import org.apache.cxf.jaxrs.ext.Description;
+
 @XmlRootElement(name = "thechapter", namespace = "http://superbooks")
 @XmlType(name = "chapter", namespace = "http://superbooks")
+@Description("Chapter subresource")
 public class Chapter {
 
     private int id;
@@ -36,12 +40,18 @@
     
     @GET
     @Path("/id")
-    public int getId() {
-        return id;
+    @Produces({"application/xml", "application/json" })
+    @Description("Get the chapter")
+    public Chapter getIt() {
+        return this;
     }
     
     public void setId(int ident) {
         id = ident;
     }
+    
+    public int getId() {
+        return id;
+    }
 
 }

Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java?rev=893773&r1=893772&r2=893773&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/provider/ProviderFactoryTest.java Thu Dec 24 15:20:55 2009
@@ -52,8 +52,11 @@
 import org.apache.cxf.jaxrs.CustomerParameterHandler;
 import org.apache.cxf.jaxrs.JAXBContextProvider;
 import org.apache.cxf.jaxrs.ext.ParameterHandler;
+import org.apache.cxf.jaxrs.ext.RequestHandler;
 import org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper;
+import org.apache.cxf.jaxrs.model.ClassResourceInfo;
 import org.apache.cxf.jaxrs.model.ProviderInfo;
+import org.apache.cxf.jaxrs.model.wadl.WadlGenerator;
 import org.apache.cxf.jaxrs.resources.Book;
 import org.apache.cxf.jaxrs.resources.SuperBook;
 import org.apache.cxf.message.Exchange;
@@ -82,6 +85,49 @@
     }
     
     @Test
+    public void testCustomWadlHandler() {
+        ProviderFactory pf = ProviderFactory.getInstance();
+        assertEquals(1, pf.getRequestHandlers().size());
+        assertTrue(pf.getRequestHandlers().get(0).getProvider() instanceof WadlGenerator);
+        
+        WadlGenerator wg = new WadlGenerator();
+        pf.setUserProviders(Collections.singletonList(wg));
+        assertEquals(1, pf.getRequestHandlers().size());
+        assertTrue(pf.getRequestHandlers().get(0).getProvider() instanceof WadlGenerator);
+        assertSame(wg, pf.getRequestHandlers().get(0).getProvider());
+    }
+    
+    @Test
+    public void testCustomTestHandler() {
+        ProviderFactory pf = ProviderFactory.getInstance();
+        assertEquals(1, pf.getRequestHandlers().size());
+        assertTrue(pf.getRequestHandlers().get(0).getProvider() instanceof WadlGenerator);
+        
+        TestHandler th = new TestHandler();
+        pf.setUserProviders(Collections.singletonList(th));
+        assertEquals(2, pf.getRequestHandlers().size());
+        assertTrue(pf.getRequestHandlers().get(0).getProvider() instanceof WadlGenerator);
+        assertSame(th, pf.getRequestHandlers().get(1).getProvider());
+    }
+    
+    @Test
+    public void testCustomTestAndWadlHandler() {
+        ProviderFactory pf = ProviderFactory.getInstance();
+        assertEquals(1, pf.getRequestHandlers().size());
+        assertTrue(pf.getRequestHandlers().get(0).getProvider() instanceof WadlGenerator);
+        
+        List<Object> providers = new ArrayList<Object>();
+        WadlGenerator wg = new WadlGenerator();
+        providers.add(wg);
+        TestHandler th = new TestHandler();
+        providers.add(th);
+        pf.setUserProviders(providers);
+        assertEquals(2, pf.getRequestHandlers().size());
+        assertSame(wg, pf.getRequestHandlers().get(0).getProvider());
+        assertSame(th, pf.getRequestHandlers().get(1).getProvider());
+    }
+    
+    @Test
     public void testSchemaLocations() {
         ProviderFactory pf = ProviderFactory.getInstance();
         pf.setSchemaLocations(Collections.singletonList("classpath:/test.xsd"));
@@ -556,4 +602,11 @@
         
     }
     
+    private static class TestHandler implements RequestHandler {
+
+        public Response handleRequest(Message m, ClassResourceInfo resourceClass) {
+            return null;
+        }
+        
+    }
 }