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 2011/03/25 14:53:56 UTC

svn commit: r1085366 - in /cxf/trunk/rt/frontend/jaxrs/src: main/java/org/apache/cxf/jaxrs/ext/ main/java/org/apache/cxf/jaxrs/ext/xml/ main/java/org/apache/cxf/jaxrs/model/wadl/ test/java/org/apache/cxf/jaxrs/model/wadl/ test/java/org/apache/cxf/jaxrs...

Author: sergeyb
Date: Fri Mar 25 13:53:56 2011
New Revision: 1085366

URL: http://svn.apache.org/viewvc?rev=1085366&view=rev
Log:
[CXF-3423] Better support for WADL doc extensions

Added:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/Description.java
      - copied, changed from r1084902, cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/Description.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/Descriptions.java   (with props)
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/DocTarget.java   (with props)
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/ElementClass.java
      - copied, changed from r1084902, cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlElement.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/XMLName.java
      - copied, changed from r1084902, cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/xml/XMLName.java
Removed:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/Description.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/xml/XMLName.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlElement.java
Modified:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlGenerator.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
    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

Copied: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/Description.java (from r1084902, cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/Description.java)
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/Description.java?p2=cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/Description.java&p1=cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/Description.java&r1=1084902&r2=1085366&rev=1085366&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/Description.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/Description.java Fri Mar 25 13:53:56 2011
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.cxf.jaxrs.ext;
+package org.apache.cxf.jaxrs.model.wadl;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
@@ -29,7 +29,7 @@ import java.lang.annotation.Target;
  * 
  * See {@link <a href="http://www.w3.org/Submission/wadl/#x3-80002.3">WADL Documentation</a>}.
  */
-@Target({ElementType.TYPE, ElementType.METHOD })
+@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER })
 @Retention(RetentionPolicy.RUNTIME)
 public @interface Description {
     /**
@@ -49,4 +49,9 @@ public @interface Description {
      * the content which will be set as WADL doc content
      */
     String docuri() default "";
+    
+    /**
+     * Target of this description, see {@link DocTarget}
+     */
+    String target() default "";
 }

Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/Descriptions.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/Descriptions.java?rev=1085366&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/Descriptions.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/Descriptions.java Fri Mar 25 13:53:56 2011
@@ -0,0 +1,35 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.cxf.jaxrs.model.wadl;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Collection of categorized {@link Description} annotations.
+ * 
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Descriptions {
+    Description[] value();
+}

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/Descriptions.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/Descriptions.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/DocTarget.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/DocTarget.java?rev=1085366&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/DocTarget.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/DocTarget.java Fri Mar 25 13:53:56 2011
@@ -0,0 +1,60 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.jaxrs.model.wadl;
+
+/**
+ * {@link Description} can use one of DocTarget constants to bind
+ * itself to a specific WADL element.
+ * {@link Description} annotations documenting WADL 'resource', 'method',
+ * 'param' and input 'representation' elements do not have use these constants.   
+ */
+public final class DocTarget {
+    /**
+     * WADL resource element, in most cases it corresponds 
+     * to the root resource or sub-resource classes
+     */
+    public static final String RESOURCE = "resource";
+    /**
+     * WADL method element, corresponds to a class resource method
+     */
+    public static final String METHOD = "method";
+    /**
+     * WADL request param or representation elements, correspond to 
+     * input parameters of the resource method
+     */
+    public static final String PARAM = "param";
+    /**
+     * WADL response representation element, corresponds to 
+     * the return type of the resource method
+     */
+    public static final String RETURN = "return";
+    
+    /**
+     * WADL request element
+     */    
+    public static final String REQUEST = "request";
+    /**
+     * WADL request element
+     */
+    public static final String RESPONSE = "response";
+    
+    private DocTarget() {
+        
+    }
+}

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/DocTarget.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/DocTarget.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Copied: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/ElementClass.java (from r1084902, cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlElement.java)
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/ElementClass.java?p2=cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/ElementClass.java&p1=cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlElement.java&r1=1084902&r2=1085366&rev=1085366&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/WadlElement.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/ElementClass.java Fri Mar 25 13:53:56 2011
@@ -23,10 +23,17 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+/**
+ * References the concrete response or request class for 
+ * WADL generator be able to generate representations and link
+ * them to schema elements. For example, it can be applied to 
+ * methods returning a JAX-RS {@link Response}. 
+ * 
+ */
 @Retention(RetentionPolicy.RUNTIME)
 @Target({ElementType.METHOD })
-public @interface WadlElement {
-    Class<?> request() default WadlElement.class;
-    Class<?> response() default WadlElement.class;
+public @interface ElementClass {
+    Class<?> request() default Object.class;
+    Class<?> response() default Object.class;
 }
 

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=1085366&r1=1085365&r2=1085366&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 Mar 25 13:53:56 2011
@@ -77,10 +77,8 @@ import org.apache.cxf.jaxb.JAXBBeanInfo;
 import org.apache.cxf.jaxb.JAXBContextProxy;
 import org.apache.cxf.jaxb.JAXBUtils;
 import org.apache.cxf.jaxrs.JAXRSServiceImpl;
-import org.apache.cxf.jaxrs.ext.Description;
 import org.apache.cxf.jaxrs.ext.Oneway;
 import org.apache.cxf.jaxrs.ext.RequestHandler;
-import org.apache.cxf.jaxrs.ext.xml.XMLName;
 import org.apache.cxf.jaxrs.ext.xml.XMLSource;
 import org.apache.cxf.jaxrs.impl.HttpHeadersImpl;
 import org.apache.cxf.jaxrs.impl.UriInfoImpl;
@@ -183,7 +181,7 @@ public class WadlGenerator implements Re
         Set<ClassResourceInfo> visitedResources = new HashSet<ClassResourceInfo>();
         for (ClassResourceInfo cri : cris) {
             startResourceTag(sbResources, cri.getServiceClass(), cri.getURITemplate().getValue());
-            handleDocs(cri.getServiceClass().getAnnotations(), sbResources);
+            handleDocs(cri.getServiceClass().getAnnotations(), sbResources, DocTarget.RESOURCE, true);
             handleResource(sbResources, allTypes, qnameResolver, clsMap, cri, visitedResources);
             sbResources.append("</resource>");
         }
@@ -237,11 +235,11 @@ public class WadlGenerator implements Re
             OperationResourceInfo ori = sortedOps.get(i);
 
             if (ori.getHttpMethod() == null) {
-                Class<?> cls = ori.getMethodToInvoke().getReturnType();
+                Class<?> cls = getMethod(ori).getReturnType();
                 ClassResourceInfo subcri = cri.findResource(cls, cls);
                 if (subcri != null && !visitedResources.contains(subcri)) {
                     startResourceTag(sb, subcri.getServiceClass(), ori.getURITemplate().getValue());
-                    handleDocs(subcri.getServiceClass().getAnnotations(), sb);
+                    handleDocs(subcri.getServiceClass().getAnnotations(), sb, DocTarget.RESOURCE, true);
                     handlePathAndMatrixParams(sb, ori);
                     handleResource(sb, jaxbTypes, qnameResolver, clsMap, subcri,
                                    visitedResources);
@@ -276,7 +274,7 @@ public class WadlGenerator implements Re
     private void startMethodTag(StringBuilder sb, OperationResourceInfo ori) {
         sb.append("<method name=\"").append(ori.getHttpMethod()).append("\"");
         if (addResourceAndMethodIds) {
-            sb.append(" id=\"").append(ori.getMethodToInvoke().getName()).append("\"");
+            sb.append(" id=\"").append(getMethod(ori).getName()).append("\"");
         }
         sb.append(">");
     }
@@ -309,9 +307,11 @@ public class WadlGenerator implements Re
         }
 
         startMethodTag(sb, ori);
-        handleDocs(ori.getAnnotatedMethod().getAnnotations(), sb);
-        if (ori.getMethodToInvoke().getParameterTypes().length != 0) {
+        Annotation[] anns = getMethod(ori).getAnnotations();
+        handleDocs(anns, sb, DocTarget.METHOD, true);
+        if (getMethod(ori).getParameterTypes().length != 0) {
             sb.append("<request>");
+            handleDocs(anns, sb, DocTarget.REQUEST, false);
             if (isFormRequest(ori)) {
                 handleFormRepresentation(sb, jaxbTypes, qnameResolver, clsMap, ori, getFormClass(ori));
             } else {
@@ -322,15 +322,17 @@ public class WadlGenerator implements Re
             sb.append("</request>");
         }
         sb.append("<response");
-        boolean isVoid = void.class == ori.getMethodToInvoke().getReturnType();
+        Class<?> returnType = getMethod(ori).getReturnType();
+        boolean isVoid = void.class == returnType;
         if (isVoid) {
-            boolean oneway = ori.getMethodToInvoke().getAnnotation(Oneway.class) != null;
+            boolean oneway = getMethod(ori).getAnnotation(Oneway.class) != null;
             sb.append(" status=\"" + (oneway ? 202 : 204) + "\"");
         }
         sb.append(">");
-        if (void.class != ori.getMethodToInvoke().getReturnType()) {
+        handleDocs(anns, sb, DocTarget.RESPONSE, false);
+        if (!isVoid) {
             handleRepresentation(sb, jaxbTypes, qnameResolver, clsMap, ori,
-                                 ori.getMethodToInvoke().getReturnType(), false);
+                                 returnType, false);
         }
         sb.append("</response>");
 
@@ -402,7 +404,7 @@ public class WadlGenerator implements Re
     private void handleParameter(StringBuilder sb, Set<Class<?>> jaxbTypes,
                                  ElementQNameResolver qnameResolver,
                                  Map<Class<?>, QName> clsMap, OperationResourceInfo ori, Parameter pm) {
-        Class<?> cls = ori.getMethodToInvoke().getParameterTypes()[pm.getIndex()];
+        Class<?> cls = getMethod(ori).getParameterTypes()[pm.getIndex()];
         if (pm.getType() == ParameterType.REQUEST_BODY) {
             handleRepresentation(sb, jaxbTypes, qnameResolver, clsMap, ori, cls, true);
             return;
@@ -425,22 +427,24 @@ public class WadlGenerator implements Re
     }
 
     private Annotation[] getBodyAnnotations(OperationResourceInfo ori, boolean inbound) {
+        Method opMethod = getMethod(ori);
         if (inbound) {
             for (Parameter pm : ori.getParameters()) {
                 if (pm.getType() == ParameterType.REQUEST_BODY) {
-                    return ori.getAnnotatedMethod().getParameterAnnotations()[pm.getIndex()];
+                    return opMethod.getParameterAnnotations()[pm.getIndex()];
                 }
             }
             return new Annotation[]{};
         } else {
-            return ori.getAnnotatedMethod().getDeclaredAnnotations();
+            return opMethod.getDeclaredAnnotations();
         }
     }
 
     private void writeParam(StringBuilder sb, Parameter pm, OperationResourceInfo ori) {
-        Class<?> type = ori.getMethodToInvoke().getParameterTypes()[pm.getIndex()];
+        Method method = getMethod(ori);
+        Class<?> type = method.getParameterTypes()[pm.getIndex()];
         if (!"".equals(pm.getName())) {
-            doWriteParam(sb, pm, type, pm.getName());
+            doWriteParam(sb, pm, type, pm.getName(), method.getParameterAnnotations()[pm.getIndex()]);
         } else {
             doWriteBeanParam(sb, type, pm, null);
         }
@@ -454,14 +458,15 @@ public class WadlGenerator implements Re
                 name = parentName + "." + name;
             }
             if (InjectionUtils.isPrimitive(entry.getValue())) {
-                doWriteParam(sb, entry.getKey(), entry.getValue(), name);
+                doWriteParam(sb, entry.getKey(), entry.getValue(), name, new Annotation[]{});
             } else {
                 doWriteBeanParam(sb, entry.getValue(), entry.getKey(), name);
             }
         }
     }
 
-    protected void doWriteParam(StringBuilder sb, Parameter pm, Class<?> type, String paramName) {
+    protected void doWriteParam(StringBuilder sb, Parameter pm, Class<?> type, String paramName,
+                                Annotation[] anns) {
         sb.append("<param name=\"").append(paramName).append("\" ");
         String style = ParameterType.PATH == pm.getType() ? "template"
                        : ParameterType.FORM == pm.getType() ? "query"
@@ -475,9 +480,25 @@ public class WadlGenerator implements Re
         if (value != null) {
             sb.append(" type=\"").append(value).append("\"");
         }
-        sb.append("/>");
+        addDocsAndCloseElement(sb, anns, "param", DocTarget.PARAM, true);
     }
 
+    private void addDocsAndCloseElement(StringBuilder sb, Annotation[] anns, String elementName,
+                                        String category, boolean allowDefault) {
+        if (isDocAvailable(anns)) {
+            sb.append(">");
+            handleDocs(anns, sb, category, allowDefault);
+            sb.append("</" + elementName + ">");
+        } else {
+            sb.append("/>");
+        }
+    }
+    
+    private boolean isDocAvailable(Annotation[] anns) {
+        return AnnotationUtils.getAnnotation(anns, Description.class) != null
+                   || AnnotationUtils.getAnnotation(anns, Descriptions.class) != null;
+    }
+    
     private void handleRepresentation(StringBuilder sb, Set<Class<?>> jaxbTypes,
                                       ElementQNameResolver qnameResolver,
                                       Map<Class<?>, QName> clsMap, OperationResourceInfo ori,
@@ -489,25 +510,38 @@ public class WadlGenerator implements Re
             types = Collections.singletonList(MediaType.APPLICATION_OCTET_STREAM_TYPE);
         } 
         
+        Method opMethod = getMethod(ori);
         boolean isPrimitive = InjectionUtils.isPrimitive(type);
         for (MediaType mt : types) {
             
             sb.append("<representation");
             sb.append(" mediaType=\"").append(mt.toString()).append("\"");
 
+            boolean allowDefault = true;
+            String docCategory;
+            Annotation[] anns;
+            if (inbound) {
+                int index = getRequestBodyParam(ori).getIndex();
+                anns = opMethod.getParameterAnnotations()[index];
+                docCategory = DocTarget.PARAM;
+            } else {
+                anns = opMethod.getAnnotations();
+                docCategory = DocTarget.RETURN;
+                allowDefault = false;
+            }
             if (isPrimitive) {
                 sb.append(">");    
                 Parameter p = inbound ? getRequestBodyParam(ori) 
                     : new Parameter(ParameterType.REQUEST_BODY, 0, "result"); 
-                doWriteParam(sb, p, type, p.getName() == null ? "request" : p.getName());
+                doWriteParam(sb, p, type, p.getName() == null ? "request" : p.getName(), anns);
                 sb.append("</representation>");
             } else  { 
-                type = getActualJaxbType(type, ori.getAnnotatedMethod(), inbound);
+                type = getActualJaxbType(type, opMethod, inbound);
                 if (qnameResolver != null && mt.getSubtype().contains("xml") && jaxbTypes.contains(type)) {
                     generateQName(sb, qnameResolver, clsMap, type,
                                   getBodyAnnotations(ori, inbound));
                 }
-                sb.append("/>");
+                addDocsAndCloseElement(sb, anns, "representation", docCategory, allowDefault);
             }
         }
         
@@ -546,8 +580,15 @@ public class WadlGenerator implements Re
     }
 
     protected Class<?> getActualJaxbType(Class<?> type, Method resourceMethod, boolean inbound) {
-        WadlElement element = resourceMethod.getAnnotation(WadlElement.class);
-        return element == null ? type : inbound ? element.request() : element.response();
+        ElementClass element = resourceMethod.getAnnotation(ElementClass.class);
+        if  (element != null) {
+            Class<?> cls = inbound ? element.request() : element.response();
+            if (cls != Object.class) {
+                return cls;
+            }
+        }
+        return type;
+        
     }
 
     protected List<OperationResourceInfo> sortOperationsByPath(Set<OperationResourceInfo> ops) {
@@ -684,7 +725,7 @@ public class WadlGenerator implements Re
         for (Parameter p : ori.getParameters()) {
             if (p.getType() == ParameterType.FORM
                 || p.getType() == ParameterType.REQUEST_BODY 
-                && ori.getMethodToInvoke().getParameterTypes()[p.getIndex()] == MultivaluedMap.class) {
+                && getMethod(ori).getParameterTypes()[p.getIndex()] == MultivaluedMap.class) {
                 return true;
             }
         }
@@ -797,11 +838,20 @@ public class WadlGenerator implements Re
         this.ignoreMessageWriters = ignoreMessageWriters;
     }
 
-    private void handleDocs(Annotation[] anns, StringBuilder sb) {
+    private void handleDocs(Annotation[] anns, StringBuilder sb, String category, boolean allowDefault) {
         for (Annotation a : anns) {
+            if (a.annotationType() == Descriptions.class) {
+                Descriptions ds = (Descriptions)a;
+                handleDocs(ds.value(), sb, category, allowDefault);
+                return;
+            }
             if (a.annotationType() == Description.class) {
                 Description d = (Description)a;
-
+                if (d.target().length() == 0 && !allowDefault 
+                    || d.target().length() > 0 && !d.target().equals(category)) {
+                    continue;
+                }
+                
                 sb.append("<doc");
                 if (d.lang().length() > 0) {
                     sb.append(" xml:lang=\"" + d.lang() + "\"");
@@ -1139,6 +1189,11 @@ public class WadlGenerator implements Re
         this.addResourceAndMethodIds = addResourceAndMethodIds;
     }
 
+    private Method getMethod(OperationResourceInfo ori) {
+        Method annMethod = ori.getAnnotatedMethod();
+        return annMethod != null ? annMethod : ori.getMethodToInvoke();
+    }
+    
     private static class SchemaConverter extends DelegatingXMLStreamWriter {
         private static final String SCHEMA_LOCATION = "schemaLocation";
         private Map<String, String> locsMap;

Copied: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/XMLName.java (from r1084902, cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/xml/XMLName.java)
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/XMLName.java?p2=cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/XMLName.java&p1=cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/xml/XMLName.java&r1=1084902&r2=1085366&rev=1085366&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/ext/xml/XMLName.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/wadl/XMLName.java Fri Mar 25 13:53:56 2011
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.cxf.jaxrs.ext.xml;
+package org.apache.cxf.jaxrs.model.wadl;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;

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=1085366&r1=1085365&r2=1085366&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 Mar 25 13:53:56 2011
@@ -35,8 +35,6 @@ import javax.ws.rs.core.Response;
 import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.cxf.aegis.type.java5.IgnoreProperty;
-import org.apache.cxf.jaxrs.ext.Description;
-import org.apache.cxf.jaxrs.ext.xml.XMLName;
 import org.apache.cxf.jaxrs.fortest.jaxb.packageinfo.Book2;
 import org.apache.cxf.jaxrs.model.wadl.jaxb.Book;
 import org.apache.cxf.jaxrs.model.wadl.jaxb.Chapter;
@@ -67,16 +65,25 @@ public class BookStore {
     
     @POST
     @Path("books/{bookid}")
-    @Description("Update the books collection")
+    @Descriptions({ 
+        @Description(value = "Update the books collection", target = DocTarget.METHOD),
+        @Description(value = "Requested Book", target = DocTarget.RETURN),
+        @Description(value = "Request", target = DocTarget.REQUEST),
+        @Description(value = "Response", target = DocTarget.RESPONSE)
+    })
+    
     //CHECKSTYLE:OFF
-    public Book addBook(@PathParam("id") int id,
+    public Book addBook(@Description("book id")
+                        @PathParam("id") int id,
                         @PathParam("bookid") int bookId,
                         @MatrixParam("mid") int matrixId,
+                        @Description("header param")
                         @HeaderParam("hid") int headerId,
                         @CookieParam("cid") int cookieId,
                         @QueryParam("provider.bar") int queryParam,
                         @Context HttpHeaders headers,
-                        @XMLName(value = "{http://books}thesuperbook2", prefix = "p1")
+                        @Description("InputBook")      
+                        @XMLName(value = "{http://books}thesuperbook2")
                         Book2 b) {
         return new Book(1);
     }
@@ -105,7 +112,7 @@ public class BookStore {
     
     @GET
     @Path("chapter2")
-    @WadlElement(response = Chapter.class)
+    @ElementClass(response = Chapter.class)
     public Response getChaper2() {
         return Response.ok().entity(new Chapter(1)).build();
     }

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=1085366&r1=1085365&r2=1085366&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 Mar 25 13:53:56 2011
@@ -326,11 +326,10 @@ public class WadlGeneratorTest extends A
     private void checkBookStoreInfo(Element resource, String bookEl, String book2El, String chapterEl) {
         assertEquals("/bookstore/{id}", resource.getAttribute("path"));
         
-        checkRootDocs(resource);
+        checkDocs(resource, "book store resource", "super resource", "en-us");
+        
+        List<Element> resourceEls = getElements(resource, "resource", 8);
         
-        List<Element> resourceEls = DOMUtils.getChildrenWithName(resource, 
-                                         WadlGenerator.WADL_NS, "resource");
-        assertEquals(8, resourceEls.size());        
         assertEquals("/book2", resourceEls.get(0).getAttribute("path"));
         assertEquals("/books/{bookid}", resourceEls.get(1).getAttribute("path"));
         assertEquals("/chapter", resourceEls.get(2).getAttribute("path"));
@@ -345,18 +344,14 @@ public class WadlGeneratorTest extends A
         verifyParameters(resource, 1, new Param("id", "template", "xs:long"));
         
         // must have 2 methods, GET and PUT
-        List<Element> methodEls = DOMUtils.getChildrenWithName(resource, 
-                                                               WadlGenerator.WADL_NS, "method");
-        assertEquals(2, methodEls.size());
+        List<Element> methodEls = getElements(resource, "method", 2);
         
         // 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());
+        List<Element> requestEls = getElements(methodEls.get(0), "request", 1);
         
         // 4 parameters are expected
         verifyParameters(requestEls.get(0), 4, 
@@ -377,98 +372,97 @@ public class WadlGeneratorTest extends A
         verifyResponseWithStatus(methodEls.get(1), "204");
         
         // verify resource starting with /book2
-        verifyGetResourceMethod(resourceEls.get(0), book2El);
+        verifyGetResourceMethod(resourceEls.get(0), book2El, null);
         
         //verify resource starting with /books/{bookid}
         verifyParameters(resourceEls.get(1), 3, 
-                         new Param("id", "template", "xs:int"),
+                         new Param("id", "template", "xs:int", "book id"),
                          new Param("bookid", "template", "xs:int"),
                          new Param("mid", "matrix", "xs:int"));
         
         // and 2 methods
-        methodEls = DOMUtils.getChildrenWithName(resourceEls.get(1), 
-                                                 WadlGenerator.WADL_NS, "method");
-        assertEquals(2, methodEls.size());
-        
+        methodEls = getElements(resourceEls.get(1), "method", 2);
+                
         // POST 
         assertEquals("POST", methodEls.get(0).getAttribute("name"));
+        checkDocs(methodEls.get(0), "", "Update the books collection", "");
+        requestEls = getElements(methodEls.get(0), "request", 1);
         
-        requestEls = DOMUtils.getChildrenWithName(methodEls.get(0), 
-                                             WadlGenerator.WADL_NS, "request");
-        assertEquals(1, requestEls.size());
+        checkDocs(requestEls.get(0), "", "Request", "");
         
         verifyParameters(requestEls.get(0), 2, 
                          new Param("hid", "header", "xs:int"),
                          new Param("provider.bar", "query", "xs:int"));
-        verifyXmlJsonRepresentations(requestEls.get(0), book2El);
+        
+        verifyXmlJsonRepresentations(requestEls.get(0), book2El, "InputBook");
+        List<Element> responseEls = getElements(methodEls.get(0), "response", 1);
+        checkDocs(responseEls.get(0), "", "Response", "");
+        verifyXmlJsonRepresentations(responseEls.get(0), bookEl, "Requested Book");
         
         // PUT
         assertEquals("PUT", methodEls.get(1).getAttribute("name"));
-        requestEls = DOMUtils.getChildrenWithName(methodEls.get(1), 
-                                                                WadlGenerator.WADL_NS, "request");
+        checkDocs(methodEls.get(1), "", "Update the book", "");
+        requestEls = getElements(methodEls.get(1), "request", 1);
         assertEquals(1, requestEls.size());
-        verifyXmlJsonRepresentations(requestEls.get(0), bookEl);
+        verifyXmlJsonRepresentations(requestEls.get(0), bookEl, null);
         verifyResponseWithStatus(methodEls.get(1), "204");
         
         // verify resource starting with /chapter
-        verifyGetResourceMethod(resourceEls.get(2), chapterEl);
+        verifyGetResourceMethod(resourceEls.get(2), chapterEl, null);
         // verify resource starting with /chapter2
-        verifyGetResourceMethod(resourceEls.get(3), chapterEl);
+        verifyGetResourceMethod(resourceEls.get(3), chapterEl, null);
         
         // verify resource starting from /booksubresource
         // should have 2 parameters
         verifyParameters(resourceEls.get(5), 2, 
                          new Param("id", "template", "xs:int"),
                          new Param("mid", "matrix", "xs:int"));
-        
+        checkDocs(resourceEls.get(5), "", "Book subresource", ""); 
         // should have 4 child resources
-        List<Element> subResourceEls = DOMUtils.getChildrenWithName(resourceEls.get(5), 
-                                         WadlGenerator.WADL_NS, "resource");
-        assertEquals(4, subResourceEls.size());        
+        List<Element> subResourceEls = getElements(resourceEls.get(5), "resource", 4);
+
         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"));
+        checkDocs(subResourceEls.get(3), "", "Chapter subresource", "");
         // verify book-subresource /book resource
         // GET 
-        verifyGetResourceMethod(subResourceEls.get(0), bookEl);
-        
+        verifyGetResourceMethod(subResourceEls.get(0), bookEl, null);
         // verify book-subresource /form1 resource
-        List<Element> form1MethodEls = DOMUtils.getChildrenWithName(subResourceEls.get(1), 
-                                                              WadlGenerator.WADL_NS, "method");
-        assertEquals(1, form1MethodEls.size());
+        List<Element> form1MethodEls = getElements(subResourceEls.get(1), "method", 1);
+        
         assertEquals("POST", form1MethodEls.get(0).getAttribute("name"));
         verifyRepresentation(form1MethodEls.get(0), "request", MediaType.APPLICATION_FORM_URLENCODED, "");
         verifyResponseWithStatus(form1MethodEls.get(0), "204");
         
         // verify book-subresource /form2 resource
-        List<Element> form2MethodEls = DOMUtils.getChildrenWithName(subResourceEls.get(2), 
-                                                                    WadlGenerator.WADL_NS, "method");
-        assertEquals(1, form2MethodEls.size());
+        List<Element> form2MethodEls = getElements(subResourceEls.get(2), "method", 1);
         assertEquals("POST", form2MethodEls.get(0).getAttribute("name"));
         verifyRepresentation(form2MethodEls.get(0), "response", MediaType.TEXT_PLAIN, "");
         verifyRepresentation(form2MethodEls.get(0), "request", MediaType.APPLICATION_FORM_URLENCODED, "");
         
-        List<Element> form2RequestEls = DOMUtils.getChildrenWithName(
-                                        form2MethodEls.get(0), 
-                                        WadlGenerator.WADL_NS, "request");
-        List<Element> form2RequestRepEls = DOMUtils.getChildrenWithName(
-                                        form2RequestEls.get(0), 
-                                        WadlGenerator.WADL_NS, "representation");
+        List<Element> form2RequestEls = getElements(form2MethodEls.get(0), "request", 1);
+        List<Element> form2RequestRepEls = getElements(form2RequestEls.get(0), "representation", 1);
         verifyParameters(form2RequestRepEls.get(0), 2, 
                          new Param("field1", "query", "xs:string"),
                          new Param("field2", "query", "xs:string"));
         
         
         // verify subresource /chapter/{id}
-        List<Element> chapterMethodEls = DOMUtils.getChildrenWithName(subResourceEls.get(3), 
-                                                                    WadlGenerator.WADL_NS, "resource");
-        assertEquals(1, chapterMethodEls.size());        
+        List<Element> chapterMethodEls = getElements(subResourceEls.get(3), "resource", 1);
         assertEquals("/id", chapterMethodEls.get(0).getAttribute("path"));
         verifyParameters(subResourceEls.get(3), 1, 
                          new Param("cid", "template", "xs:int"));
         // GET
-        verifyGetResourceMethod(chapterMethodEls.get(0), chapterEl);
+        verifyGetResourceMethod(chapterMethodEls.get(0), chapterEl, "Get the chapter");
+    }
+    
+    private List<Element> getElements(Element resource, String name, int expectedSize) {
+        List<Element> elements = DOMUtils.getChildrenWithName(resource, 
+                                     WadlGenerator.WADL_NS, name);
+        assertEquals(expectedSize, elements.size());
+        return elements;
     }
     
     private void verifyParameters(Element el, int number, Param... params) {
@@ -478,30 +472,33 @@ public class WadlGeneratorTest extends A
         assertEquals(number, params.length);
         
         for (int i = 0; i < number; i++) {
-            Param p = params[i];
-            checkParameter(paramsEls.get(i), p.getName(), p.getType(), p.getSchemaType());
+            checkParameter(paramsEls.get(i), params[i]);
         }
     }
     
-    private void checkRootDocs(Element el) {
+    private void checkDocs(Element el, String title, String value, String language) {
         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", 
+        assertEquals(title, docsEls.get(0).getAttribute("title"));
+        assertEquals(value, docsEls.get(0).getTextContent());
+        assertEquals(language, 
             docsEls.get(0).getAttributeNS("http://www.w3.org/XML/1998/namespace", "lang"));
     }
     
-    private void verifyGetResourceMethod(Element element, String type) {
+    private void verifyGetResourceMethod(Element element, String type, String docs) {
         List<Element> methodEls = DOMUtils.getChildrenWithName(element, WadlGenerator.WADL_NS, "method");
         assertEquals(1, methodEls.size());
+        if (docs != null) {
+            checkDocs(methodEls.get(0), "", docs, "");
+        }
         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);
+        verifyXmlJsonRepresentations(responseEls.get(0), type, null);
     }
     
     private void verifyResponseWithStatus(Element element, String status) {
@@ -523,30 +520,38 @@ public class WadlGeneratorTest extends A
         List<Element> representationEls = DOMUtils.getChildrenWithName(elements.get(0), 
                     WadlGenerator.WADL_NS, "representation"); 
         assertEquals(1, representationEls.size());
-        verifyMediTypeAndElementValue(representationEls.get(0), mediaType, elementValue);
+        verifyMediTypeAndElementValue(representationEls.get(0), mediaType, elementValue, null);
         if ("text/plain".equals(mediaType)) { 
             String pName = "request".equals(name) ? "request" : "result";
             verifyParameters(representationEls.get(0), 1, new Param(pName, "plain", "xs:string"));
         }
     }
     
-    private void verifyXmlJsonRepresentations(Element element, String type) {
+    private void verifyXmlJsonRepresentations(Element element, String type, String docs) {
         List<Element> repEls = DOMUtils.getChildrenWithName(element, 
-                                                            WadlGenerator.WADL_NS, "representation");
+                                        WadlGenerator.WADL_NS, "representation");
         assertEquals(2, repEls.size());
-        verifyMediTypeAndElementValue(repEls.get(0), "application/xml", type);
-        verifyMediTypeAndElementValue(repEls.get(1), "application/json", "");
+        verifyMediTypeAndElementValue(repEls.get(0), "application/xml", type, docs);
+        verifyMediTypeAndElementValue(repEls.get(1), "application/json", "", docs);
     }
     
-    private void verifyMediTypeAndElementValue(Element el, String mediaType, String elementValue) {
+    private void verifyMediTypeAndElementValue(Element el, String mediaType, String elementValue, 
+                                               String docs) {
         assertEquals(mediaType, el.getAttribute("mediaType"));
         assertEquals(elementValue, el.getAttribute("element"));
+        if (docs != null) {
+            checkDocs(el, "", docs, "");
+        }
     }
     
-    private void checkParameter(Element paramEl, String name, String style, String type) {
-        assertEquals(name, paramEl.getAttribute("name"));
-        assertEquals(style, paramEl.getAttribute("style"));
-        assertEquals(type, paramEl.getAttribute("type"));
+    private void checkParameter(Element paramEl, Param p) {
+        assertEquals(p.getName(), paramEl.getAttribute("name"));
+        assertEquals(p.getType(), paramEl.getAttribute("style"));
+        assertEquals(p.getSchemaType(), paramEl.getAttribute("type"));
+        String docs = p.getDocs();
+        if (docs != null) {
+            checkDocs(paramEl, "", docs, "");
+        }
     }
     
     private List<Element> getWadlResourcesInfo(Document doc, String baseURI, int size) throws Exception {
@@ -591,10 +596,16 @@ public class WadlGeneratorTest extends A
         private String name;
         private String type;
         private String schemaType;
+        private String docs;
         public Param(String name, String type, String schemaType) {
+            this(name, type, schemaType, null);
+        }
+        
+        public Param(String name, String type, String schemaType, String docs) {
             this.name = name;
             this.type = type;
             this.schemaType = schemaType;
+            this.docs = docs;
         }
         
         public String getName() {
@@ -608,5 +619,9 @@ public class WadlGeneratorTest extends A
         public String getSchemaType() {
             return schemaType;
         }
+        
+        public String getDocs() {
+            return docs;
+        }
     }
 }

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=1085366&r1=1085365&r2=1085366&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 Fri Mar 25 13:53:56 2011
@@ -27,14 +27,14 @@ import javax.xml.bind.annotation.XmlElem
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 
-import org.apache.cxf.jaxrs.ext.Description;
-import org.apache.cxf.jaxrs.ext.xml.XMLName;
+import org.apache.cxf.jaxrs.model.wadl.Description;
 import org.apache.cxf.jaxrs.model.wadl.FormInterface;
+import org.apache.cxf.jaxrs.model.wadl.XMLName;
 
 @XmlRootElement(name = "thebook", namespace = "http://superbooks")
 @XmlType(name = "book", namespace = "http://superbooks")
 @Description("Book subresource")
-@XMLName(value = "{http://books}thesuperbook", prefix = "p1")
+@XMLName(value = "{http://books}thesuperbook")
 public class Book implements FormInterface {
 
     private int id;

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=1085366&r1=1085365&r2=1085366&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 Fri Mar 25 13:53:56 2011
@@ -24,13 +24,13 @@ import javax.ws.rs.Produces;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 
-import org.apache.cxf.jaxrs.ext.Description;
-import org.apache.cxf.jaxrs.ext.xml.XMLName;
+import org.apache.cxf.jaxrs.model.wadl.Description;
+import org.apache.cxf.jaxrs.model.wadl.XMLName;
 
 @XmlRootElement(name = "thechapter", namespace = "http://superbooks")
 @XmlType(name = "chapter", namespace = "http://superbooks")
 @Description("Chapter subresource")
-@XMLName(value = "{http://books}thesuperchapter", prefix = "p1")
+@XMLName(value = "{http://books}thesuperchapter")
 public class Chapter {
 
     private int id;