You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2010/01/08 22:33:14 UTC

svn commit: r897327 - in /cxf/branches/2.2.x-fixes: ./ rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/databinding/ rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/ systests/databinding/src/test/java/org/apache/cxf/systest/ae...

Author: dkulp
Date: Fri Jan  8 21:33:13 2010
New Revision: 897327

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

........
  r897324 | dkulp | 2010-01-08 16:28:22 -0500 (Fri, 08 Jan 2010) | 2 lines
  
  [CXF-2598] Add support for the minOccurs and nillable annotations on the
  method return/params
........

Modified:
    cxf/branches/2.2.x-fixes/   (props changed)
    cxf/branches/2.2.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/databinding/AegisDatabinding.java
    cxf/branches/2.2.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/AnnotationReader.java
    cxf/branches/2.2.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/XmlElement.java
    cxf/branches/2.2.x-fixes/systests/databinding/src/test/java/org/apache/cxf/systest/aegis/AegisJaxWs.java

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

Modified: cxf/branches/2.2.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/databinding/AegisDatabinding.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/databinding/AegisDatabinding.java?rev=897327&r1=897326&r2=897327&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/databinding/AegisDatabinding.java (original)
+++ cxf/branches/2.2.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/databinding/AegisDatabinding.java Fri Jan  8 21:33:13 2010
@@ -18,6 +18,7 @@
  */
 package org.apache.cxf.aegis.databinding;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 import java.util.Collection;
 import java.util.HashMap;
@@ -40,6 +41,7 @@
 import org.apache.cxf.aegis.type.TypeCreationOptions;
 import org.apache.cxf.aegis.type.TypeCreator;
 import org.apache.cxf.aegis.type.TypeMapping;
+import org.apache.cxf.aegis.type.java5.AnnotationReader;
 import org.apache.cxf.aegis.type.mtom.AbstractXOPType;
 import org.apache.cxf.common.WSDLConstants;
 import org.apache.cxf.common.classloader.ClassLoaderUtils;
@@ -350,16 +352,34 @@
                 }
             }
             
-            // The concept of type.isNillable is questionable: how are types nillable? 
+            Annotation[] anns = part.getProperty("parameter.annotations", Annotation[].class);
+
+            long miValue = -1;
+            if (type.hasMinOccurs()) {
+                miValue = type.getMinOccurs();
+            }
+            Integer i = AnnotationReader.getMinOccurs(anns);
+            if (i != null) {
+                miValue = i;
+            }
+            if (miValue > 0) {
+                part.setProperty("minOccurs", Long.toString(miValue));
+            }
+
+            
+            // The concept of type.isNillable is questionable: how are types nillable?
             // However, this if at least allow .aegis.xml files to get control.
             if (part.getProperty("nillable") == null) {
-                part.setProperty("nillable", Boolean.valueOf(type.isNillable()));
-            }
-            if (type.hasMinOccurs()) {
-                long miValue = type.getMinOccurs();
-                if (miValue != 0) {
-                    part.setProperty("minOccurs", Long.toString(miValue));
+                boolean isNil = type.isNillable();
+                Boolean b = AnnotationReader.isNillable(anns);
+                if (b != null || (miValue != 0 && isNil)) {
+                    part.setProperty("nillable", b == null ? isNil : b);
                 }
+                /*
+                if (miValue == -1 && (b == null ? isNil : b)) {
+                    part.setProperty("minOccurs", "1");
+                }
+                */
             }
             if (type.hasMaxOccurs()) {
                 String moValue;
@@ -369,6 +389,7 @@
                     part.setProperty("maxOccurs", moValue);
                 }
             }
+            
 
             part2Type.put(part, type);
 

Modified: cxf/branches/2.2.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/AnnotationReader.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/AnnotationReader.java?rev=897327&r1=897326&r2=897327&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/AnnotationReader.java (original)
+++ cxf/branches/2.2.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/AnnotationReader.java Fri Jan  8 21:33:13 2010
@@ -78,7 +78,7 @@
 
     // PMD incorrectly identifies this as a string comparison
     @SuppressWarnings("unchecked")
-    public boolean isNillable(AnnotatedElement element) {
+    public Boolean isNillable(AnnotatedElement element) {
         return Boolean.TRUE.equals(getAnnotationValue("nillable", // NOPMD
                 element,
                 Boolean.FALSE,
@@ -86,6 +86,17 @@
                 XFIRE_XML_ELEMENT,
                 XML_ELEMENT));
     }
+    @SuppressWarnings("unchecked")
+    public static Boolean isNillable(Annotation[] anns) {
+        if (anns == null) {
+            return null;
+        }
+        return (Boolean)getAnnotationValue("nillable", // NOPMD
+                anns,
+                XmlElement.class,
+                XFIRE_XML_ELEMENT,
+                XML_ELEMENT);
+    }
 
     @SuppressWarnings("unchecked")
     public Class getType(AnnotatedElement element) {
@@ -252,7 +263,26 @@
 
         return 0;
     }
+    @SuppressWarnings("unchecked")
+    public static Integer getMinOccurs(Annotation[] anns) {
+        if (anns == null) {
+            return null;
+        }
+        String minOccurs = (String) getAnnotationValue("minOccurs",
+                anns,
+                XmlElement.class,
+                XFIRE_XML_ELEMENT);
+        if (minOccurs != null) {
+            return Integer.valueOf(minOccurs);
+        }
 
+        // check jaxb annotation
+        Boolean required = (Boolean) getAnnotationValue("required", anns, XML_ELEMENT);
+        if (Boolean.TRUE.equals(required)) {
+            return 1;
+        }
+        return null;
+    }
     @SuppressWarnings("unchecked")
     public boolean isExtensibleElements(AnnotatedElement element, boolean defaultValue) {
         Boolean extensibleElements = (Boolean) getAnnotationValue("extensibleElements",
@@ -316,8 +346,27 @@
         }
         return null;
     }
+    static Object getAnnotationValue(String name,
+                                     Annotation[] anns,
+                                     Class<? extends Annotation>... annotations) {
+        for (Class<?> annotation : annotations) {
+            if (annotation != null) {
+                try {
+                    for (Annotation ann : anns) {
+                        if (annotation.isInstance(ann)) {
+                            Method method = ann.getClass().getMethod(name);
+                            return method.invoke(ann);
+                        }
+                    }
+                } catch (Exception ignored) {
+                    // annotation did not have value
+                }
+            }
+        }
+        return null;
+    }
 
-    Object getAnnotationValue(String name,
+    static Object getAnnotationValue(String name,
             Method method,
             int index,
             Object ignoredValue,

Modified: cxf/branches/2.2.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/XmlElement.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/XmlElement.java?rev=897327&r1=897326&r2=897327&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/XmlElement.java (original)
+++ cxf/branches/2.2.x-fixes/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/java5/XmlElement.java Fri Jan  8 21:33:13 2010
@@ -26,7 +26,7 @@
 import org.apache.cxf.aegis.type.Type;
 
 @Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.METHOD)
+@Target({ ElementType.METHOD, ElementType.PARAMETER })
 public @interface XmlElement {
     Class type() default Type.class;
 

Modified: cxf/branches/2.2.x-fixes/systests/databinding/src/test/java/org/apache/cxf/systest/aegis/AegisJaxWs.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/systests/databinding/src/test/java/org/apache/cxf/systest/aegis/AegisJaxWs.java?rev=897327&r1=897326&r2=897327&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/systests/databinding/src/test/java/org/apache/cxf/systest/aegis/AegisJaxWs.java (original)
+++ cxf/branches/2.2.x-fixes/systests/databinding/src/test/java/org/apache/cxf/systest/aegis/AegisJaxWs.java Fri Jan  8 21:33:13 2010
@@ -43,6 +43,7 @@
     Map<Integer, Item> getItemsMapSpecified();
 
     @WebMethod
+    @org.apache.cxf.aegis.type.java5.XmlElement(nillable = false, minOccurs = "1")
     Item getItemByKey(@WebParam(name = "key1")
                       String key1, @WebParam(name = "key2")
                       String key2);