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:38:19 UTC

svn commit: r788861 - in /cxf/branches/2.2.x-fixes: ./ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/

Author: sergeyb
Date: Fri Jun 26 20:38:19 2009
New Revision: 788861

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

........
  r788444 | sergeyb | 2009-06-25 18:24:46 +0100 (Thu, 25 Jun 2009) | 1 line
  
  JAXRS : some more wadl updates - tests to follow shortly
........

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/model/Parameter.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/ResourceUtils.java

Propchange: cxf/branches/2.2.x-fixes/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jun 26 20:38:19 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,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,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/model/Parameter.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/Parameter.java?rev=788861&r1=788860&r2=788861&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/Parameter.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/Parameter.java Fri Jun 26 20:38:19 2009
@@ -31,8 +31,8 @@
         
     }
     
-    public Parameter(String type, String aValue) {
-        this(ParameterType.valueOf(type), 0, aValue); 
+    public Parameter(String type, int pos, String aValue) {
+        this(ParameterType.valueOf(type), pos, aValue); 
     }
     
     public Parameter(ParameterType type, String aValue) {

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=788861&r1=788860&r2=788861&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:38:19 2009
@@ -18,23 +18,38 @@
  */
 package org.apache.cxf.jaxrs.model.wadl;
 
+import java.io.IOException;
+import java.io.StringWriter;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
+import java.util.logging.Logger;
 
+import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.SchemaOutputResolver;
+import javax.xml.stream.XMLStreamWriter;
+import javax.xml.transform.Result;
+import javax.xml.transform.sax.SAXResult;
 
+import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.jaxrs.ext.RequestHandler;
+import org.apache.cxf.jaxrs.impl.HttpHeadersImpl;
 import org.apache.cxf.jaxrs.impl.UriInfoImpl;
 import org.apache.cxf.jaxrs.model.ClassResourceInfo;
 import org.apache.cxf.jaxrs.model.OperationResourceInfo;
+import org.apache.cxf.jaxrs.model.OperationResourceInfoComparator;
 import org.apache.cxf.jaxrs.model.Parameter;
 import org.apache.cxf.jaxrs.model.ParameterType;
+import org.apache.cxf.jaxrs.provider.JAXBElementProvider;
+import org.apache.cxf.jaxrs.utils.InjectionUtils;
 import org.apache.cxf.message.Message;
+import org.apache.cxf.staxutils.StaxUtils;
+import org.apache.cxf.staxutils.StreamWriterContentHandler;
 
 // TODO :
 // 1. extract JavaDocs and put them into XML comments
@@ -47,6 +62,8 @@
     public static final MediaType WADL_TYPE = MediaType.valueOf("application/vnd.sun.wadl+xml"); 
     public static final String WADL_NS = "http://research.sun.com/wadl/2006/10";    
     
+    private static final Logger LOG = LogUtils.getL7dLogger(WadlGenerator.class);
+    
     public Response handleRequest(Message m, ClassResourceInfo resource) {
         
         if (!"GET".equals(m.get(Message.HTTP_REQUEST_METHOD))) {
@@ -58,16 +75,24 @@
             return null;
         }
         
-        StringBuilder sb = new StringBuilder();
-        sb.append("<application xmlns=\"").append(WADL_NS).append("\">");
-        
-        sb.append("<resources base=\"").append(ui.getBaseUri().toString()).append("\">");
-        handleResource(sb, resource, resource.getURITemplate().getValue(),
+        StringBuilder sbMain = new StringBuilder();
+        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());
-        sb.append("</resources>");
-        sb.append("</application>");
+        sbResources.append("</resources>");
+        sbGrammars.append("</grammars>");
+        sbMain.append(sbGrammars.toString());
+        sbMain.append(sbResources.toString());
+        sbMain.append("</application>");
         
-        return Response.ok().type(WADL_TYPE).entity(sb.toString()).build();
+        HttpHeaders headers = new HttpHeadersImpl(m);
+        MediaType type = headers.getAcceptableMediaTypes().contains(MediaType.APPLICATION_XML_TYPE)
+                      ? MediaType.APPLICATION_XML_TYPE : WADL_TYPE;  
+        return Response.ok().type(type).entity(sbMain.toString()).build();
     }
 
     private void handleResource(StringBuilder sb, ClassResourceInfo cri, String path,
@@ -77,65 +102,55 @@
         
         List<OperationResourceInfo> sortedOps = sortOperationsByPath(
             cri.getMethodDispatcher().getOperationResourceInfos());
-        List<OperationResourceInfo> opsWithSamePath = new LinkedList<OperationResourceInfo>();
-        for (int i = 0; i < sortedOps.size(); i++) {
+        
+        for (OperationResourceInfo ori : sortedOps) {
             
-            if (sortedOps.get(i).getHttpMethod() == null) {
-                Class<?> cls = sortedOps.get(i).getMethodToInvoke().getReturnType();
+            if (ori.getHttpMethod() == null) {
+                Class<?> cls = ori.getMethodToInvoke().getReturnType();
                 ClassResourceInfo subcri = cri.findResource(cls, cls);
                 if (subcri != null) {
-                    handleResource(sb, subcri, sortedOps.get(i).getURITemplate().getValue(), 
-                                   sortedOps.get(i).getURITemplate().getVariables());
-                    opsWithSamePath.clear();
-                    continue;
+                    handleResource(sb, subcri, ori.getURITemplate().getValue(), 
+                                   ori.getURITemplate().getVariables());
                 } else {
-                    handleDynamicSubresource(sb, sortedOps.get(i));
+                    handleDynamicSubresource(sb, ori);
                 }
+                continue;
             }
-            if (opsWithSamePath.size() == 0) {
-                opsWithSamePath.add(sortedOps.get(i));
-            } else if (i > 0 && sortedOps.get(i - 1).getURITemplate().getValue()
-                .equals(sortedOps.get(i).getURITemplate().getValue())) {
-                opsWithSamePath.add(sortedOps.get(i));
-            } else {
-                handleOperation(sb, opsWithSamePath);
-                opsWithSamePath.clear();
-                opsWithSamePath.add(sortedOps.get(i));
-            }
+            handleOperation(sb, ori);
         }
-        handleOperation(sb, opsWithSamePath);
         sb.append("</resource>");
     }
     
-    private void handleOperation(StringBuilder sb, List<OperationResourceInfo> oris) {
-        if (oris.size() == 0) {
-            return;
-        }
-        String path = oris.get(0).getURITemplate().getValue();
+    private void handleOperation(StringBuilder sb, OperationResourceInfo ori) {
+        
+        String path = ori.getURITemplate().getValue();
         boolean isSlash =  "/".equals(path);
         if (!isSlash) {
             sb.append("<resource path=\"").append(path).append("\">");
         }
-        for (OperationResourceInfo ori : oris) {
-            handleTemplateParams(sb, ori.getURITemplate().getVariables());
-            handleMatrixParams(sb, ori);
-        }
-        for (OperationResourceInfo ori : oris) {
-            sb.append("<method name=\"").append(ori.getHttpMethod()).append("\">");
-            if (ori.getMethodToInvoke().getParameterTypes().length != 0) {
-                sb.append("<request>");
-                for (Parameter p : ori.getParameters()) {        
-                    handleParameter(sb, ori, p);             
-                }
-                sb.append("</request>");
-            }
-            if (Void.class != ori.getMethodToInvoke().getReturnType()) {
-                sb.append("<response>");
-                handleRepresentation(sb, ori);
-                sb.append("</response>");
+        handleTemplateParams(sb, ori.getURITemplate().getVariables());
+        handleMatrixParams(sb, ori);
+        
+        sb.append("<method name=\"").append(ori.getHttpMethod()).append("\">");
+        if (ori.getMethodToInvoke().getParameterTypes().length != 0) {
+            sb.append("<request>");
+            for (Parameter p : ori.getParameters()) {        
+                handleParameter(sb, ori, p);             
             }
-            sb.append("</method>");
+            sb.append("</request>");
+        }
+        boolean isVoid = void.class == ori.getMethodToInvoke().getReturnType();
+        if (isVoid) {
+            sb.append("<!-- Only status code is returned -->");
+        }
+        sb.append("<response>");
+        if (void.class != ori.getMethodToInvoke().getReturnType()) {
+            handleRepresentation(sb, ori, ori.getMethodToInvoke().getReturnType(), false);
         }
+        sb.append("</response>");
+        
+        sb.append("</method>");
+        
         if (!isSlash) {
             sb.append("</resource>");
         }
@@ -158,7 +173,8 @@
     
     private void handleParameter(StringBuilder sb, OperationResourceInfo ori, Parameter pm) {
         if (pm.getType() == ParameterType.REQUEST_BODY) {
-            handleRepresentation(sb, ori);
+            handleRepresentation(sb, ori, ori.getMethodToInvoke().getParameterTypes()[pm.getIndex()],
+                                 true);
             return;
         }
         if (pm.getType() == ParameterType.PATH || pm.getType() == ParameterType.MATRIX) {
@@ -193,22 +209,72 @@
         }
     }
     
-    private void handleRepresentation(StringBuilder sb, OperationResourceInfo ori) {
-        sb.append("<representation>");
+    private void handleRepresentation(StringBuilder sb, OperationResourceInfo ori, 
+                                      Class<?> type, boolean inbound) {
+        if (InjectionUtils.isPrimitive(type)) {
+            sb.append("<!-- Primitive type : " + type.getSimpleName() + " -->");
+        }
+        sb.append("<representation");
+        
+        List<MediaType> types = inbound ? ori.getConsumeTypes() : ori.getProduceTypes();
+        boolean wildcardOnly = true; 
+        for (MediaType mt : types) {
+            if (!mt.isWildcardType()) {
+                wildcardOnly = false;
+                break;
+            }
+        }
+        if (!wildcardOnly) {
+            sb.append(" mediaType=\"");
+            for (int i = 0; i < types.size(); i++) {
+                sb.append(types.get(i).toString());
+                if (i + 1 < types.size()) {
+                    sb.append(',');
+                }
+            }
+            if (types.size() > 0) {
+                sb.append("\"");
+            }
+        }
+        sb.append(">");
+        
+        if (!type.isPrimitive()) {
+            // try to use JAXB
+            // TODO : reuse JaxbDatabinding code
+            JAXBElementProvider jaxb = new JAXBElementProvider();
+            try {
+                JAXBContext context = jaxb.getPackageContext(type);
+                if (context == null) {
+                    context = jaxb.getClassContext(type);
+                }
+                if (context != null) {
+                    StringWriter writer = new StringWriter();
+                    XMLStreamWriter streamWriter = StaxUtils.createXMLStreamWriter(writer);
+                    final StreamWriterContentHandler handler = new StreamWriterContentHandler(streamWriter);
+                    context.generateSchema(new SchemaOutputResolver() {
+                        @Override
+                        public Result createOutput(String ns, String file) throws IOException {
+                            SAXResult result = new SAXResult(handler);
+                            result.setSystemId(file);
+                            return result;
+                        }
+                    });
+                    streamWriter.flush();
+                    sb.append(writer.toString());
+                }
+            } catch (Exception ex) {
+                LOG.fine("No schema can be generated from " + type.getName());
+            }
+        }
+        
         sb.append("</representation>");
     }
     
     private List<OperationResourceInfo> sortOperationsByPath(Set<OperationResourceInfo> ops) {
         List<OperationResourceInfo> opsWithSamePath = new LinkedList<OperationResourceInfo>(ops);
-        Collections.sort(opsWithSamePath, new Comparator<OperationResourceInfo>() {
-
-            public int compare(OperationResourceInfo op1, OperationResourceInfo op2) {
-                String path1 = op1.getURITemplate().getValue();
-                String path2 = op2.getURITemplate().getValue();
-                return path1.compareTo(path2);
-            } 
-        
-        });
+        Collections.sort(opsWithSamePath, new OperationResourceInfoComparator());        
         return opsWithSamePath;
     }
+    
+    
 }

Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java?rev=788861&r1=788860&r2=788861&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java Fri Jun 26 20:38:19 2009
@@ -398,8 +398,9 @@
             DOMUtils.findAllElementsByTagNameNS(e, 
                  "http://cxf.apache.org/jaxrs", "param");
         List<Parameter> params = new ArrayList<Parameter>(paramEls.size());
-        for (Element paramEl : paramEls) {
-            Parameter p = new Parameter(paramEl.getAttribute("type"), paramEl.getAttribute("name"));
+        for (int i = 0; i < paramEls.size(); i++) {
+            Element paramEl = paramEls.get(i);
+            Parameter p = new Parameter(paramEl.getAttribute("type"), i, paramEl.getAttribute("name"));
             p.setEncoded(Boolean.valueOf(paramEl.getAttribute("encoded")));
             p.setDefaultValue(paramEl.getAttribute("default"));
             params.add(p);