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/06/26 22:44:52 UTC

svn commit: r788865 - in /cxf/branches/2.2.x-fixes: ./ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/ rt/fron...

Author: sergeyb
Date: Fri Jun 26 20:44:51 2009
New Revision: 788865

URL: http://svn.apache.org/viewvc?rev=788865&view=rev
Log:
Merged revisions 788752 via svnmerge from 
https://svn.apache.org/repos/asf/cxf/trunk

........
  r788752 | sergeyb | 2009-06-26 17:14:55 +0100 (Fri, 26 Jun 2009) | 1 line
  
  JAXRS : starting with WADL testing
........

Added:
    cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/Book.java
      - copied unchanged from r788752, cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/Book.java
    cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/BookStore.java
      - copied unchanged from r788752, cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/BookStore.java
    cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/Chapter.java
      - copied unchanged from r788752, cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/Chapter.java
    cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/Orders.java
      - copied unchanged from r788752, cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/Orders.java
Modified:
    cxf/branches/2.2.x-fixes/   (props changed)
    cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/RequestPreprocessor.java
    cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java
    cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java
    cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
    cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/WadlGeneratorTest.java
    cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerResourceCreatedSpringProviderTest.java

Propchange: cxf/branches/2.2.x-fixes/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jun 26 20:44:51 2009
@@ -1 +1 @@
-/cxf/trunk:782728-782730,783097,783294,783396,784059,784181-784184,784893,784895,785279-785282,785468,785621,785624,785651,785734,785866,786142,786271-786272,786395,786512,786514,786582-786583,786638,786647,786850,787200,787269,787277-787279,787290-787291,787305,787323,787366,787849,788030,788060,788187,788444,788451,788703,788774,788819-788820
+/cxf/trunk:782728-782730,783097,783294,783396,784059,784181-784184,784893,784895,785279-785282,785468,785621,785624,785651,785734,785866,786142,786271-786272,786395,786512,786514,786582-786583,786638,786647,786850,787200,787269,787277-787279,787290-787291,787305,787323,787366,787849,788030,788060,788187,788444,788451,788703,788752,788774,788819-788820

Propchange: cxf/branches/2.2.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.

Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/RequestPreprocessor.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/RequestPreprocessor.java?rev=788865&r1=788864&r2=788865&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/RequestPreprocessor.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/RequestPreprocessor.java Fri Jun 26 20:44:51 2009
@@ -26,8 +26,10 @@
 
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
+import org.apache.cxf.jaxrs.model.wadl.WadlGenerator;
 import org.apache.cxf.jaxrs.utils.HttpUtils;
 import org.apache.cxf.message.Message;
 
@@ -69,6 +71,7 @@
         MultivaluedMap<String, String> queries = u.getQueryParameters();
         handleTypeQuery(m, queries);
         handleMethod(m, queries, new HttpHeadersImpl(m));
+        checkMetadataRequest(m);
         return new UriInfoImpl(m, null).getPath();
     }
     
@@ -145,4 +148,24 @@
         .put(HttpHeaders.ACCEPT, Collections.singletonList(acceptValue));
     }
     
+    /*
+     * TODO : looks like QueryHandler is well suited for the purpose of serving
+     * wadl/wsdl2 root requests with URIs which can not be used for selecting
+     * ClassResourceInfo which is where RequestFilters invoked after the resource class
+     * has been selected are handy. Consider implementing this method as part of the QueryHandler,
+     * we will need to save the list of ClassResourceInfos on the EndpointInfo though
+     */
+    public void checkMetadataRequest(Message m) {
+        String query = (String)m.get(Message.QUERY_STRING);
+        if (query != null && query.contains(WadlGenerator.WADL_QUERY)) {
+            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);
+                }
+            }
+        }
+    }
 }

Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java?rev=788865&r1=788864&r2=788865&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSInInterceptor.java Fri Jun 26 20:44:51 2009
@@ -86,6 +86,9 @@
         RequestPreprocessor rp = ProviderFactory.getInstance(message).getRequestPreprocessor();
         if (rp != null) {
             rp.preprocess(message, new UriInfoImpl(message, null));
+            if (message.getExchange().get(Response.class) != null) {
+                return;
+            }
         }
         
         String requestContentType = (String)message.get(Message.CONTENT_TYPE);
@@ -143,7 +146,7 @@
                 try {                
                     ori = JAXRSUtils.findTargetMethod(resource, 
                         values.getFirst(URITemplate.FINAL_MATCH_GROUP), httpMethod, values, 
-                        requestContentType, acceptContentTypes);
+                        requestContentType, acceptContentTypes, false);
                     message.getExchange().put(OperationResourceInfo.class, ori);
                 } catch (WebApplicationException ex) {
                     operChecked = true;

Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java?rev=788865&r1=788864&r2=788865&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.java Fri Jun 26 20:44:51 2009
@@ -37,6 +37,7 @@
 import javax.xml.transform.sax.SAXResult;
 
 import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.jaxrs.JAXRSServiceImpl;
 import org.apache.cxf.jaxrs.ext.RequestHandler;
 import org.apache.cxf.jaxrs.impl.HttpHeadersImpl;
 import org.apache.cxf.jaxrs.impl.UriInfoImpl;
@@ -48,6 +49,7 @@
 import org.apache.cxf.jaxrs.provider.JAXBElementProvider;
 import org.apache.cxf.jaxrs.utils.InjectionUtils;
 import org.apache.cxf.message.Message;
+import org.apache.cxf.service.Service;
 import org.apache.cxf.staxutils.StaxUtils;
 import org.apache.cxf.staxutils.StreamWriterContentHandler;
 
@@ -79,11 +81,19 @@
         sbMain.append("<application xmlns=\"").append(WADL_NS).append("\">");
         StringBuilder sbGrammars = new StringBuilder();
         sbGrammars.append("<grammars>");
+        
         StringBuilder sbResources = new StringBuilder();
         sbResources.append("<resources base=\"").append(ui.getBaseUri().toString()).append("\">");
-        handleResource(sbResources, resource, resource.getURITemplate().getValue(),
-                       resource.getURITemplate().getVariables());
+        
+        List<ClassResourceInfo> cris = getResourcesList(m, resource);
+        for (ClassResourceInfo cri : cris) {
+            handleResource(sbResources, cri, cri.getURITemplate().getValue(),
+                           cri.getURITemplate().getVariables());
+        }
         sbResources.append("</resources>");
+        
+        
+        
         sbGrammars.append("</grammars>");
         sbMain.append(sbGrammars.toString());
         sbMain.append(sbResources.toString());
@@ -276,5 +286,9 @@
         return opsWithSamePath;
     }
     
+    public List<ClassResourceInfo> getResourcesList(Message m, ClassResourceInfo cri) {
+        return cri != null ? Collections.singletonList(cri)
+               : ((JAXRSServiceImpl)m.getExchange().get(Service.class)).getClassResourceInfos();
+    }
     
 }

Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java?rev=788865&r1=788864&r2=788865&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java Fri Jun 26 20:44:51 2009
@@ -240,6 +240,17 @@
                                                          MultivaluedMap<String, String> values, 
                                                          String requestContentType, 
                                                          List<MediaType> acceptContentTypes) {
+        return JAXRSUtils.findTargetMethod(resource, path, httpMethod, values, requestContentType, 
+                                           acceptContentTypes, true);
+    }
+    
+    public static OperationResourceInfo findTargetMethod(ClassResourceInfo resource, 
+                                                         String path,
+                                                         String httpMethod, 
+                                                         MultivaluedMap<String, String> values, 
+                                                         String requestContentType, 
+                                                         List<MediaType> acceptContentTypes,
+                                                         boolean logNow) {
         SortedMap<OperationResourceInfo, MultivaluedMap<String, String>> candidateList = 
             new TreeMap<OperationResourceInfo, MultivaluedMap<String, String>>(
                 new OperationResourceInfoComparator());
@@ -306,7 +317,7 @@
                                                    path,
                                                    requestType.toString(),
                                                    convertTypesToString(acceptContentTypes));
-        if (!"OPTIONS".equalsIgnoreCase(httpMethod)) {
+        if (!"OPTIONS".equalsIgnoreCase(httpMethod) && logNow) {
             LOG.warning(errorMsg.toString());
         }
         ResponseBuilder rb = createResponseBuilder(resource, status, methodMatched == 0);

Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/WadlGeneratorTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/WadlGeneratorTest.java?rev=788865&r1=788864&r2=788865&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/WadlGeneratorTest.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/wadl/WadlGeneratorTest.java Fri Jun 26 20:44:51 2009
@@ -18,15 +18,25 @@
  */
 package org.apache.cxf.jaxrs.model.wadl;
 
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.Response;
 
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import org.apache.cxf.helpers.DOMUtils;
+import org.apache.cxf.jaxrs.JAXRSServiceImpl;
 import org.apache.cxf.jaxrs.model.ClassResourceInfo;
-import org.apache.cxf.jaxrs.resources.BookStore;
 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;
@@ -53,16 +63,23 @@
     }
     
     @Test
-    public void testWadl() throws Exception {
+    public void testSingleRootResource() throws Exception {
         WadlGenerator wg = new WadlGenerator();
-        Message m = mockMessage("http://localhost:8080/baz", "/bar", WadlGenerator.WADL_QUERY);
         ClassResourceInfo cri = 
             ResourceUtils.createClassResourceInfo(BookStore.class, BookStore.class, true, true);
+        Message m = mockMessage("http://localhost:8080/baz", "/bar", WadlGenerator.WADL_QUERY, null);
+        
         Response r = wg.handleRequest(m, cri);
+        checkResponse(r);
+        List<Element> els = getWadlResourcesInfo("http://localhost:8080/baz", 1, r.getEntity().toString());
+        checkBookStoreInfo(els.get(0));
+        
+    }
+    
+    private void checkResponse(Response r) throws Exception {
         assertNotNull(r);
         assertEquals(WadlGenerator.WADL_TYPE.toString(),
                      r.getMetadata().getFirst(HttpHeaders.CONTENT_TYPE));
-//        System.out.println(r.getEntity().toString());
 //        File f = new File("test.xml");
 //        f.delete();
 //        f.createNewFile();
@@ -73,18 +90,61 @@
 //        fos.close();
     }
     
-    private Message mockMessage(String baseAddress, String pathInfo, String query) {
+    @Test
+    public void testMultipleRootResources() throws Exception {
+        WadlGenerator wg = new WadlGenerator();
+        ClassResourceInfo cri1 = 
+            ResourceUtils.createClassResourceInfo(BookStore.class, BookStore.class, true, true);
+        ClassResourceInfo cri2 = 
+            ResourceUtils.createClassResourceInfo(Orders.class, Orders.class, true, true);
+        List<ClassResourceInfo> cris = new ArrayList<ClassResourceInfo>();
+        cris.add(cri1);
+        cris.add(cri2);
+        Message m = mockMessage("http://localhost:8080/baz", "/bar", WadlGenerator.WADL_QUERY, cris);
+        Response r = wg.handleRequest(m, null);
+        checkResponse(r);
+        List<Element> els = getWadlResourcesInfo("http://localhost:8080/baz", 2, r.getEntity().toString());
+        checkBookStoreInfo(els.get(0));
+        Element orderResource = els.get(1);
+        assertEquals("/orders", orderResource.getAttribute("path"));
+    }
+
+    private void checkBookStoreInfo(Element resource) {
+        assertEquals("/bookstore/{id}", resource.getAttribute("path"));
+    }
+    
+    private List<Element> getWadlResourcesInfo(String baseURI, int size, String value) throws Exception {
+        Document doc = DOMUtils.readXml(new StringReader(value));
+        Element root = doc.getDocumentElement();
+        assertEquals("http://research.sun.com/wadl/2006/10", root.getNamespaceURI());
+        assertEquals("application", root.getLocalName());
+        List<Element> resourcesEls = DOMUtils.getChildrenWithName(root, 
+                                            "http://research.sun.com/wadl/2006/10", "resources");
+        assertEquals(1, resourcesEls.size());
+        Element resourcesEl =  resourcesEls.get(0);
+        assertEquals(baseURI, resourcesEl.getAttribute("base"));
+        List<Element> resourceEls = 
+            DOMUtils.getChildrenWithName(resourcesEl, 
+                                                "http://research.sun.com/wadl/2006/10", "resource");
+        assertEquals(size, resourceEls.size());
+        return resourceEls;
+    }
+    
+    
+    private Message mockMessage(String baseAddress, String pathInfo, String query,
+                                List<ClassResourceInfo> cris) {
         Message m = new MessageImpl();
-        control.reset();
-        Exchange e = control.createMock(Exchange.class);
+        Exchange e = new ExchangeImpl();
+        e.put(Service.class, new JAXRSServiceImpl(cris));
+        
         m.setExchange(e);
+        control.reset();
         ServletDestination d = control.createMock(ServletDestination.class);
-        e.getDestination();
-        EasyMock.expectLastCall().andReturn(d).anyTimes();
         EndpointInfo epr = new EndpointInfo(); 
         epr.setAddress(baseAddress);
         d.getEndpointInfo();
         EasyMock.expectLastCall().andReturn(epr).anyTimes();
+        e.setDestination(d);
         m.put(Message.REQUEST_URI, pathInfo);
         m.put(Message.QUERY_STRING, query);
         m.put(Message.HTTP_REQUEST_METHOD, "GET");

Modified: cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerResourceCreatedSpringProviderTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerResourceCreatedSpringProviderTest.java?rev=788865&r1=788864&r2=788865&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerResourceCreatedSpringProviderTest.java (original)
+++ cxf/branches/2.2.x-fixes/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerResourceCreatedSpringProviderTest.java Fri Jun 26 20:44:51 2009
@@ -22,13 +22,20 @@
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.net.HttpURLConnection;
 import java.net.Socket;
 import java.net.URL;
 import java.net.URLConnection;
+import java.util.List;
 
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import org.apache.cxf.helpers.DOMUtils;
 import org.apache.cxf.helpers.IOUtils;
+import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
 
 import org.junit.BeforeClass;
@@ -43,6 +50,57 @@
     }
     
     @Test
+    public void testMultipleRootsWadl() throws Exception {
+        List<Element> resourceEls = getWadlResourcesInfo("http://localhost:9080/webapp/",
+                                                         "http://localhost:9080/webapp/", 2);
+        String path1 = resourceEls.get(0).getAttribute("path");
+        int bookStoreInd = path1.contains("/bookstore") ? 0 : 1;
+        int petStoreInd = bookStoreInd == 0 ? 1 : 0;
+        checkBookStoreInfo(resourceEls.get(bookStoreInd));
+        checkPetStoreInfo(resourceEls.get(petStoreInd));
+    }
+    
+    @Test
+    public void testBookStoreWadl() throws Exception {
+        List<Element> resourceEls = getWadlResourcesInfo("http://localhost:9080/webapp/",
+                                                         "http://localhost:9080/webapp/bookstore", 1);
+        checkBookStoreInfo(resourceEls.get(0));
+    }
+    
+    @Test
+    public void testPetStoreWadl() throws Exception {
+        List<Element> resourceEls = getWadlResourcesInfo("http://localhost:9080/webapp/",
+                                                         "http://localhost:9080/webapp/petstore", 1);
+        checkPetStoreInfo(resourceEls.get(0));
+    }
+ 
+    private void checkBookStoreInfo(Element resource) {
+        assertEquals("/bookstore", resource.getAttribute("path"));
+    }
+    
+    private void checkPetStoreInfo(Element resource) {
+        assertEquals("/petstore/", resource.getAttribute("path"));
+    }
+    
+    private List<Element> getWadlResourcesInfo(String baseURI, String requestURI, int size) throws Exception {
+        WebClient client = WebClient.create(requestURI + "?_wadl&_type=xml");
+        Document doc = DOMUtils.readXml(new InputStreamReader(client.get(InputStream.class), "UTF-8"));
+        Element root = doc.getDocumentElement();
+        assertEquals("http://research.sun.com/wadl/2006/10", root.getNamespaceURI());
+        assertEquals("application", root.getLocalName());
+        List<Element> resourcesEls = DOMUtils.getChildrenWithName(root, 
+                                            "http://research.sun.com/wadl/2006/10", "resources");
+        assertEquals(1, resourcesEls.size());
+        Element resourcesEl =  resourcesEls.get(0);
+        assertEquals(baseURI, resourcesEl.getAttribute("base"));
+        List<Element> resourceEls = 
+            DOMUtils.getChildrenWithName(resourcesEl, 
+                                                "http://research.sun.com/wadl/2006/10", "resource");
+        assertEquals(size, resourceEls.size());
+        return resourceEls;
+    }
+    
+    @Test
     public void testGetBook123() throws Exception {
         
         String endpointAddress =