You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by bi...@apache.org on 2008/09/13 18:40:19 UTC

svn commit: r694981 - in /cxf/trunk: rt/core/src/main/java/org/apache/cxf/service/ rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/ rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/databinding/ rt/databinding/aegis/src/main/java/org/apac...

Author: bimargulies
Date: Sat Sep 13 09:40:18 2008
New Revision: 694981

URL: http://svn.apache.org/viewvc?rev=694981&view=rev
Log:
Replace use of SOAP-encoding for char with a specialization of integer.


Added:
    cxf/trunk/systests/src/test/java/org/apache/cxf/systest/aegis/CharacterSchemaTest.java   (with props)
    cxf/trunk/systests/src/test/resources/aegisSportsServiceBeans.xml   (with props)
Modified:
    cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/ServiceImpl.java
    cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/AegisContext.java
    cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/databinding/AegisDatabinding.java
    cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/DefaultTypeMapping.java
    cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/Type.java
    cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanType.java
    cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/CharacterAsStringType.java
    cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/services/SimpleBean.java
    cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/basic/BeanTest.java
    cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/types/SchemaJavascriptBuilder.java
    cxf/trunk/systests/src/test/java/org/apache/cxf/systest/aegis/SportsService.java
    cxf/trunk/systests/src/test/java/org/apache/cxf/systest/aegis/SportsServiceImpl.java
    cxf/trunk/systests/src/test/java/org/apache/cxf/systest/aegis/mtom/MtomTest.java

Modified: cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/ServiceImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/ServiceImpl.java?rev=694981&r1=694980&r2=694981&view=diff
==============================================================================
--- cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/ServiceImpl.java (original)
+++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/ServiceImpl.java Sat Sep 13 09:40:18 2008
@@ -117,4 +117,9 @@
     public void setProperties(Map<String, Object> properties) {
         this.putAll(properties);
     }
+    
+    @Override
+    public String toString() {
+        return "[ServiceImpl " + getName() + "]";
+    }
 }

Modified: cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/AegisContext.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/AegisContext.java?rev=694981&r1=694980&r2=694981&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/AegisContext.java (original)
+++ cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/AegisContext.java Sat Sep 13 09:40:18 2008
@@ -18,15 +18,21 @@
  */
 package org.apache.cxf.aegis;
 
+import java.io.IOException;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
 import javax.xml.namespace.QName;
+import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.XMLStreamWriter;
 
+import org.w3c.dom.Document;
+
+import org.xml.sax.SAXException;
+
 import org.apache.cxf.aegis.type.AbstractTypeCreator;
 import org.apache.cxf.aegis.type.DefaultTypeCreator;
 import org.apache.cxf.aegis.type.DefaultTypeMapping;
@@ -40,40 +46,48 @@
 import org.apache.cxf.aegis.type.java5.Java5TypeCreator;
 import org.apache.cxf.common.classloader.ClassLoaderUtils;
 import org.apache.cxf.common.util.SOAPConstants;
+import org.apache.cxf.helpers.DOMUtils;
+import org.jaxen.JaxenException;
+import org.jaxen.jdom.JDOMXPath;
+import org.jdom.Element;
+import org.jdom.Namespace;
 
 /**
- * The Aegis Databinding context object. This object coordinates the data binding process: reading
- * and writing XML.
- * 
- * By default, this object sets up a default set of type mappings. 
- * This consists of two DefaultTypeMapping objects. The first is empty
- * and has the Default, Java5, and XML TypeCreator classes configured. The second contains the
- * standard mappings of the stock types. If a type can't be mapped in either, then the creators 
- * create a mapping and store it in the first one.
- * 
- * The application can control some parameters of the type creators by creating a TypeCreationOptions
- * object and setting properties. The application can add custom mappings to the type mapping, or 
- * even use its own classes for the TypeMapping or TypeCreator objects.
- *
- * Aegis, unlike JAXB, has no concept of a 'root element'. So, an application that 
- * uses Aegis without a web service has to either depend on xsi:type (at least for 
- * root elements) or have its own mapping from elements to classes, and pass the 
- * resulting Class objects to the readers.
- * At this level, the application must specify the initial set of classes to make 
- * make use of untyped collections or .aegis.xml files.
- * 
- * If the application leaves this list empty, and reads XML messages, then no .aegis.xml files 
- * are used unless the application has specified a Class&lt;T&gt; for the root of a 
- * particular item read. Specifically, if the application just leaves it to Aegis to
- * map an element tagged with an xsi:type to a class, Aegis can't know that some arbitrary class in
- * some arbitrary package is mapped to a particular schema type by QName in a
- * mapping XML file.
- * 
- * At the level of the CXF data binding, the 'root elements' are defined by the WSDL message parts.
- * Additional classes that participate are termed 'override' classes.
- * 
+ * The Aegis Databinding context object. This object coordinates the data binding process: reading and writing
+ * XML. By default, this object sets up a default set of type mappings. This consists of two
+ * DefaultTypeMapping objects. The first is empty and has the Default, Java5, and XML TypeCreator classes
+ * configured. The second contains the standard mappings of the stock types. If a type can't be mapped in
+ * either, then the creators create a mapping and store it in the first one. The application can control some
+ * parameters of the type creators by creating a TypeCreationOptions object and setting properties. The
+ * application can add custom mappings to the type mapping, or even use its own classes for the TypeMapping or
+ * TypeCreator objects. Aegis, unlike JAXB, has no concept of a 'root element'. So, an application that uses
+ * Aegis without a web service has to either depend on xsi:type (at least for root elements) or have its own
+ * mapping from elements to classes, and pass the resulting Class objects to the readers. At this level, the
+ * application must specify the initial set of classes to make make use of untyped collections or .aegis.xml
+ * files. If the application leaves this list empty, and reads XML messages, then no .aegis.xml files are used
+ * unless the application has specified a Class&lt;T&gt; for the root of a particular item read. Specifically,
+ * if the application just leaves it to Aegis to map an element tagged with an xsi:type to a class, Aegis
+ * can't know that some arbitrary class in some arbitrary package is mapped to a particular schema type by
+ * QName in a mapping XML file. At the level of the CXF data binding, the 'root elements' are defined by the
+ * WSDL message parts. Additional classes that participate are termed 'override' classes.
  */
 public class AegisContext {
+
+    /**
+     * Namespace used for miscellaneous Aegis types.
+     */
+    public static final String SCHEMA_NS = "http://cxf.apache.org/aegisTypes";
+    private static JDOMXPath importTypesXpath;
+
+    static {
+        try {
+            importTypesXpath = new JDOMXPath("xsd:import[@namespace='" + SCHEMA_NS + "']");
+            importTypesXpath.addNamespace(SOAPConstants.XSD_PREFIX, SOAPConstants.XSD);
+        } catch (JaxenException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
     private boolean writeXsiTypes;
     private boolean readXsiTypes = true;
 
@@ -89,6 +103,8 @@
     private boolean mtomUseXmime;
     // this URI goes into the type map.
     private String mappingNamespaceURI;
+    private Document typesSchemaDocument;
+
     /**
      * Construct a context.
      */
@@ -97,7 +113,7 @@
         rootClasses = new HashSet<Class<?>>();
         rootTypeQNames = new HashSet<QName>();
     }
-    
+
     public TypeCreator createTypeCreator() {
         AbstractTypeCreator xmlCreator = createRootTypeCreator();
 
@@ -121,10 +137,10 @@
         return creator;
     }
 
-
     /**
-     * Initialize the context. The encodingStyleURI allows .aegis.xml files to have multiple mappings 
-     * for, say, SOAP 1.1 versus SOAP 1.2. Passing null uses a default URI. 
+     * Initialize the context. The encodingStyleURI allows .aegis.xml files to have multiple mappings for,
+     * say, SOAP 1.1 versus SOAP 1.2. Passing null uses a default URI.
+     * 
      * @param mappingNamespaceURI URI to select mappings based on the encoding.
      */
     public void initialize() {
@@ -135,7 +151,7 @@
         if (typeMapping == null) {
             boolean defaultNillable = configuration.isDefaultNillable();
             TypeMapping baseTM = DefaultTypeMapping.createDefaultTypeMapping(defaultNillable, mtomUseXmime);
-            // The use of the XSD URI in the mapping is, MAGIC. 
+            // The use of the XSD URI in the mapping is, MAGIC.
             if (mappingNamespaceURI == null) {
                 mappingNamespaceURI = SOAPConstants.XSD;
             }
@@ -143,34 +159,29 @@
             defaultTypeMapping.setTypeCreator(createTypeCreator());
             typeMapping = defaultTypeMapping;
         }
-        
+
         processRootTypes();
     }
-    
-    
-    public AegisReader<org.w3c.dom.Element>
-    createDomElementReader() {
+
+    public AegisReader<org.w3c.dom.Element> createDomElementReader() {
         return new AegisElementDataReader(this);
     }
-    
-    public AegisReader<XMLStreamReader>
-    createXMLStreamReader() {
+
+    public AegisReader<XMLStreamReader> createXMLStreamReader() {
         return new AegisXMLStreamDataReader(this);
     }
-    
-    public AegisWriter<org.w3c.dom.Element>
-    createDomElementWriter() {
+
+    public AegisWriter<org.w3c.dom.Element> createDomElementWriter() {
         return new AegisElementDataWriter(this);
     }
-    
-    public AegisWriter<XMLStreamWriter>
-    createXMLStreamWriter() {
+
+    public AegisWriter<XMLStreamWriter> createXMLStreamWriter() {
         return new AegisXMLStreamDataWriter(this);
     }
-    
+
     /**
-     * If a class was provided as part of the 'root' list, retrieve it's Type by
-     * Class.
+     * If a class was provided as part of the 'root' list, retrieve it's Type by Class.
+     * 
      * @param clazz
      * @return
      */
@@ -181,10 +192,10 @@
             return null;
         }
     }
-    
+
     /**
-     * If a class was provided as part of the root list, retrieve it's Type by schema
-     * type QName.
+     * If a class was provided as part of the root list, retrieve it's Type by schema type QName.
+     * 
      * @param schemaTypeName
      * @return
      */
@@ -195,10 +206,11 @@
             return null;
         }
     }
-    
+
     /**
      * Examine a list of override classes, and register all of them.
-     * @param tm      type manager for this binding
+     * 
+     * @param tm type manager for this binding
      * @param classes list of class names
      */
     private void processRootTypes() {
@@ -216,11 +228,11 @@
                 } catch (ClassNotFoundException e) {
                     throw new DatabindingException("Could not find override type class: " + typeName, e);
                 }
-                
+
                 rootClasses.add(c);
             }
         }
-         
+
         for (Class<?> c : rootClasses) {
             Type t = typeMapping.getType(c);
             if (t == null) {
@@ -236,20 +248,58 @@
         }
     }
 
+    public static boolean schemaImportsUtilityTypes(Element schemaElement) {
+        try {
+            return importTypesXpath.selectSingleNode(schemaElement) != null;
+        } catch (JaxenException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public Document getTypesSchemaDocument() {
+        ensureTypesSchemaDocument();
+        return typesSchemaDocument;
+    }
+
+    private void ensureTypesSchemaDocument() {
+        if (typesSchemaDocument != null) {
+            return;
+        }
+        try {
+            typesSchemaDocument = DOMUtils.readXml(getClass()
+                .getResourceAsStream("/META-INF/cxf/aegisTypes.xsd"));
+        } catch (SAXException e) {
+            throw new RuntimeException(e);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        } catch (ParserConfigurationException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static void addUtilityTypesToSchema(Element root) {
+        if (schemaImportsUtilityTypes(root)) {
+            return;
+        }
+        Element element = new Element("import", SOAPConstants.XSD_PREFIX, SOAPConstants.XSD);
+        root.addContent(0, element);
+        element.setAttribute("namespace", SCHEMA_NS);
+        root.addNamespaceDeclaration(Namespace.getNamespace("aegisTypes", SCHEMA_NS));
+    }
+
     /**
-     * Retrieve the set of root class names. Note that if the application
-     * specifies the root classes by Class instead of by name, this will
-     * return null.
+     * Retrieve the set of root class names. Note that if the application specifies the root classes by Class
+     * instead of by name, this will return null.
+     * 
      * @return
      */
     public Set<String> getRootClassNames() {
         return rootClassNames;
     }
-    
+
     /**
-     * Set the root class names. This function is a convenience for Spring
-     * configuration. It sets the same underlying 
-     * collection as {@link #setRootClasses(Set)}.
+     * Set the root class names. This function is a convenience for Spring configuration. It sets the same
+     * underlying collection as {@link #setRootClasses(Set)}.
      * 
      * @param classNames
      */
@@ -257,8 +307,9 @@
         rootClassNames = classNames;
     }
 
-    /** 
+    /**
      * Return the type mapping configuration associated with this context.
+     * 
      * @return Returns the configuration.
      * @deprecated 2.1
      */
@@ -266,8 +317,9 @@
         return configuration;
     }
 
-    /** 
+    /**
      * Return the type mapping configuration associated with this context.
+     * 
      * @return Returns the configuration.
      */
     public TypeCreationOptions getTypeCreationOptions() {
@@ -275,8 +327,8 @@
     }
 
     /**
-     * Set the configuration object. The configuration specifies default
-     * type mapping behaviors. 
+     * Set the configuration object. The configuration specifies default type mapping behaviors.
+     * 
      * @param configuration The configuration to set.
      * @deprecated 2.1
      */
@@ -285,8 +337,8 @@
     }
 
     /**
-     * Set the configuration object. The configuration specifies default
-     * type mapping behaviors.
+     * Set the configuration object. The configuration specifies default type mapping behaviors.
+     * 
      * @param configuration The configuration to set.
      */
     public void setTypeCreationOptions(TypeCreationOptions newConfiguration) {
@@ -302,8 +354,8 @@
     }
 
     /**
-     * Controls whether Aegis writes xsi:type attributes on all elements.
-     * False by default.
+     * Controls whether Aegis writes xsi:type attributes on all elements. False by default.
+     * 
      * @param flag
      */
     public void setWriteXsiTypes(boolean flag) {
@@ -311,9 +363,9 @@
     }
 
     /**
-     * Controls the use of xsi:type attributes when reading objects. By default,
-     * xsi:type reading is enabled. When disabled, Aegis will only map for objects
-     * that the application manually maps in the type mapping. 
+     * Controls the use of xsi:type attributes when reading objects. By default, xsi:type reading is enabled.
+     * When disabled, Aegis will only map for objects that the application manually maps in the type mapping.
+     * 
      * @param flag
      */
     public void setReadXsiTypes(boolean flag) {
@@ -322,6 +374,7 @@
 
     /**
      * Return the type mapping object used by this context.
+     * 
      * @return
      */
     public TypeMapping getTypeMapping() {
@@ -330,6 +383,7 @@
 
     /**
      * Set the type mapping object used by this context.
+     * 
      * @param typeMapping
      */
     public void setTypeMapping(TypeMapping typeMapping) {
@@ -338,16 +392,17 @@
 
     /**
      * Retrieve the Aegis type objects for the root classes.
+     * 
      * @return the set of type objects.
      */
     public Set<Type> getRootTypes() {
         return rootTypes;
     }
-    
-    
-    /** 
-     * This property provides support for interfaces. If there is a mapping from an interface's Class<T>
-     * to a string containing a class name, Aegis will create proxy objects of that class name.
+
+    /**
+     * This property provides support for interfaces. If there is a mapping from an interface's Class<T> to a
+     * string containing a class name, Aegis will create proxy objects of that class name.
+     * 
      * @see org.apache.cxf.aegis.type.basic.BeanType
      * @return
      */
@@ -365,6 +420,7 @@
 
     /**
      * The list of initial classes.
+     * 
      * @param rootClasses
      */
     public void setRootClasses(Set<Class<?>> rootClasses) {
@@ -373,6 +429,7 @@
 
     /**
      * Is MTOM enabled in this context?
+     * 
      * @return
      */
     public boolean isMtomEnabled() {
@@ -385,6 +442,7 @@
 
     /**
      * Should this service use schema for MTOM types xmime:base64Binary instead of xsd:base64Binary?
+     * 
      * @return
      */
     public boolean isMtomUseXmime() {
@@ -396,10 +454,10 @@
     }
 
     /**
-     * What URI identifies the type mapping for this context? 
-     * When the XMLTypeCreator reads .aegis.xml file, it will only read mappings for
-     * this URI (or no URI). When the abstract type creator is otherwise at a loss
-     * for a namespace URI, it will use this URI.
+     * What URI identifies the type mapping for this context? When the XMLTypeCreator reads .aegis.xml file,
+     * it will only read mappings for this URI (or no URI). When the abstract type creator is otherwise at a
+     * loss for a namespace URI, it will use this URI.
+     * 
      * @return
      */
     public String getMappingNamespaceURI() {

Modified: cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/databinding/AegisDatabinding.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/databinding/AegisDatabinding.java?rev=694981&r1=694980&r2=694981&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/databinding/AegisDatabinding.java (original)
+++ cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/databinding/AegisDatabinding.java Sat Sep 13 09:40:18 2008
@@ -104,7 +104,7 @@
      * @deprecated 2.1
      */
     public static final String READ_XSI_TYPE_KEY = "readXsiType";
-
+    
     protected static final int IN_PARAM = 0;
     protected static final int OUT_PARAM = 1;
     protected static final int FAULT_PARAM = 2;
@@ -460,6 +460,8 @@
 
         Map<String, String> namespaceMap = getDeclaredNamespaceMappings();
         boolean needXmimeSchema = false;
+        // utility types.
+        boolean needTypesSchema = false;
 
         for (Map.Entry<String, Set<Type>> entry : tns2Type.entrySet()) {
             String xsdPrefix = SOAPConstants.XSD_PREFIX;
@@ -501,6 +503,9 @@
             if (schemaImportsXmime(e)) {
                 needXmimeSchema = true;
             }
+            if (AegisContext.schemaImportsUtilityTypes(e)) {
+                needTypesSchema = true;
+            }
 
             try {
                 NamespaceMap nsMap = new NamespaceMap();
@@ -545,6 +550,15 @@
                 addSchemaDocument(si, col, xmimeSchemaDocument, AbstractXOPType.XML_MIME_NS);
             }
         }
+        
+        if (needTypesSchema) {
+            org.w3c.dom.Document schema = aegisContext.getTypesSchemaDocument(); 
+            for (ServiceInfo si : s.getServiceInfos()) {
+                SchemaCollection col = si.getXmlSchemaCollection();
+                addSchemaDocument(si, col, schema, AegisContext.SCHEMA_NS);
+            }
+        }
+        
     }
 
     public QName getSuggestedName(Service s, TypeMapping tm, OperationInfo op, int param) {

Modified: cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/DefaultTypeMapping.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/DefaultTypeMapping.java?rev=694981&r1=694980&r2=694981&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/DefaultTypeMapping.java (original)
+++ cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/DefaultTypeMapping.java Sat Sep 13 09:40:18 2008
@@ -45,6 +45,7 @@
 import org.apache.cxf.aegis.type.basic.BigIntegerType;
 import org.apache.cxf.aegis.type.basic.BooleanType;
 import org.apache.cxf.aegis.type.basic.CalendarType;
+import org.apache.cxf.aegis.type.basic.CharacterAsStringType;
 import org.apache.cxf.aegis.type.basic.CharacterType;
 import org.apache.cxf.aegis.type.basic.DateTimeType;
 import org.apache.cxf.aegis.type.basic.DoubleType;
@@ -230,7 +231,6 @@
                         new BooleanType());
         defaultRegister(tm, defaultNillable, Calendar.class, XMLSchemaQNames.XSD_DATETIME,
                         new CalendarType());
-        defaultRegister(tm, defaultNillable, Character.class, Soap11.ENCODED_CHAR, new CharacterType());
         defaultRegister(tm, defaultNillable, Date.class, XMLSchemaQNames.XSD_DATETIME, new DateTimeType());
         defaultRegister(tm, defaultNillable, Document.class, XMLSchemaQNames.XSD_ANY, new DocumentType());
         defaultRegister(tm, defaultNillable, Element.class, XMLSchemaQNames.XSD_ANY,
@@ -282,6 +282,7 @@
         fillStandardMappings(soapTM, defaultNillable, enableMtomXmime);
 
         defaultRegister(soapTM, defaultNillable, boolean.class, Soap11.ENCODED_BOOLEAN, new BooleanType());
+        defaultRegister(soapTM, defaultNillable, char.class, Soap11.ENCODED_CHAR, new CharacterType());
         defaultRegister(soapTM, defaultNillable, int.class, Soap11.ENCODED_INT, new IntType());
         defaultRegister(soapTM, defaultNillable, short.class, Soap11.ENCODED_SHORT, new ShortType());
         defaultRegister(soapTM, defaultNillable, double.class, Soap11.ENCODED_DOUBLE, new DoubleType());
@@ -314,6 +315,12 @@
         // by convention, the default mapping is against the XML schema URI.
         DefaultTypeMapping tm = new DefaultTypeMapping(SOAPConstants.XSD);
         fillStandardMappings(tm, defaultNillable, enableMtomXmime);
+        defaultRegister(tm, defaultNillable, Character.class, 
+                        CharacterAsStringType.CHARACTER_AS_STRING_TYPE_QNAME,
+                        new CharacterAsStringType());
+        defaultRegister(tm, defaultNillable, char.class, 
+                        CharacterAsStringType.CHARACTER_AS_STRING_TYPE_QNAME,
+                        new CharacterAsStringType());
 
         registerIfAvailable(tm, defaultNillable, "javax.xml.datatype.Duration", XMLSchemaQNames.XSD_DURATION,
                             "org.apache.cxf.aegis.type.java5.DurationType");

Modified: cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/Type.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/Type.java?rev=694981&r1=694980&r2=694981&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/Type.java (original)
+++ cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/Type.java Sat Sep 13 09:40:18 2008
@@ -213,6 +213,14 @@
         return false;
     }
     
+    /**
+     * True if this type requires the import of the aegisTypes schema.
+     * @return
+     */
+    public boolean usesUtilityTypes() {
+        return false;
+    }
+    
     public boolean hasMinOccurs() {
         return false;
     }

Modified: cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanType.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanType.java?rev=694981&r1=694980&r2=694981&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanType.java (original)
+++ cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/BeanType.java Sat Sep 13 09:40:18 2008
@@ -30,6 +30,7 @@
 import java.util.Set;
 import javax.xml.namespace.QName;
 
+import org.apache.cxf.aegis.AegisContext;
 import org.apache.cxf.aegis.Context;
 import org.apache.cxf.aegis.DatabindingException;
 import org.apache.cxf.aegis.type.Type;
@@ -454,6 +455,7 @@
 
         Element seq = null;
         boolean needXmime = false;
+        boolean needUtilityTypes = false;
         
         // Write out schema for elements
         for (Iterator itr = inf.getElements(); itr.hasNext();) {
@@ -486,11 +488,16 @@
 
             writeTypeReference(name, nameWithPrefix, element, type, prefix, root);
             needXmime |= type.usesXmime();
+            needUtilityTypes |= type.usesUtilityTypes();
         }
         
         if (needXmime) {
             addXmimeToSchema(root);
         }
+        
+        if (needUtilityTypes) {
+            AegisContext.addUtilityTypesToSchema(root);
+        }
 
         /**
          * if future proof then add <xsd:any/> element

Modified: cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/CharacterAsStringType.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/CharacterAsStringType.java?rev=694981&r1=694980&r2=694981&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/CharacterAsStringType.java (original)
+++ cxf/trunk/rt/databinding/aegis/src/main/java/org/apache/cxf/aegis/type/basic/CharacterAsStringType.java Sat Sep 13 09:40:18 2008
@@ -19,6 +19,8 @@
 
 package org.apache.cxf.aegis.type.basic;
 
+import javax.xml.namespace.QName;
+
 import org.apache.cxf.aegis.Context;
 import org.apache.cxf.aegis.DatabindingException;
 import org.apache.cxf.aegis.type.Type;
@@ -30,20 +32,20 @@
  */
 public class CharacterAsStringType extends Type {
     
-    private StringType stringType;
+    public static final QName CHARACTER_AS_STRING_TYPE_QNAME 
+        = new QName("http://cxf.apache.org/aegisTypes", "char");
+    
+    private IntType intType;
     
     public CharacterAsStringType() {
-        stringType = new StringType();
+        intType = new IntType();
     }
 
     /** {@inheritDoc}*/
     @Override
     public Object readObject(MessageReader reader, Context context) throws DatabindingException {
-        String string = (String)stringType.readObject(reader, context);
-        if (string.length() == 0) {
-            return Character.valueOf((char)0);
-        }
-        return new Character(string.charAt(0));
+        Integer readInteger = (Integer)intType.readObject(reader, context);
+        return new Character((char)readInteger.intValue());
     }
 
     /** {@inheritDoc}*/
@@ -51,6 +53,12 @@
     public void writeObject(Object object, MessageWriter writer, Context context) 
         throws DatabindingException {
         Character charObject = (Character) object;
-        stringType.writeObject(charObject.toString(), writer, context);
+        intType.writeObject(Integer.valueOf(charObject.charValue()), writer, context);
+    }
+
+    @Override
+    public boolean usesUtilityTypes() {
+        return true;
     }
+
 }

Modified: cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/services/SimpleBean.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/services/SimpleBean.java?rev=694981&r1=694980&r2=694981&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/services/SimpleBean.java (original)
+++ cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/services/SimpleBean.java Sat Sep 13 09:40:18 2008
@@ -31,6 +31,7 @@
     private int[] numbers;
     
     private Character character;
+    private char primitiveCharacter;
 
     public int[] getNumbers() {
         return numbers;
@@ -73,4 +74,12 @@
     public void setCharacter(Character character) {
         this.character = character;
     }
+
+    public char getPrimitiveChar() {
+        return primitiveCharacter;
+    }
+
+    public void setPrimitiveChar(char pchar) {
+        this.primitiveCharacter = pchar;
+    }
 }

Modified: cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/basic/BeanTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/basic/BeanTest.java?rev=694981&r1=694980&r2=694981&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/basic/BeanTest.java (original)
+++ cxf/trunk/rt/databinding/aegis/src/test/java/org/apache/cxf/aegis/type/basic/BeanTest.java Sat Sep 13 09:40:18 2008
@@ -25,6 +25,9 @@
 
 import javax.xml.namespace.QName;
 
+import org.w3c.dom.Attr;
+import org.w3c.dom.NodeList;
+
 import org.apache.cxf.aegis.AbstractAegisTest;
 import org.apache.cxf.aegis.AegisContext;
 import org.apache.cxf.aegis.Context;
@@ -329,6 +332,37 @@
         assertInvalid("//xsd:complexType[@name='IntBean']/xsd:sequence/xsd:element[@name='int1'][@nillable]",
                       schema);
     }
+    
+    @Test
+    public void testCharMappings() throws Exception {
+        context = new AegisContext();
+        context.initialize();
+        mapping = context.getTypeMapping();
+
+        BeanType type = (BeanType)mapping.getTypeCreator().createType(SimpleBean.class);
+        type.setTypeClass(SimpleBean.class);
+        type.setTypeMapping(mapping);
+
+        Element types = new Element("types", "xsd", SOAPConstants.XSD);
+        Element schema = new Element("schema", "xsd", SOAPConstants.XSD);
+        types.addContent(schema);
+
+        new Document(types);
+
+        type.writeSchema(schema);
+
+        NodeList typeAttrNode = 
+            assertValid("//xsd:complexType[@name='SimpleBean']/xsd:sequence/xsd:element[@name='character']"
+                       + "/@type", 
+                       schema); 
+        assertEquals(1, typeAttrNode.getLength());
+        Attr typeAttr = (Attr)typeAttrNode.item(0);
+        String typeQnameString = typeAttr.getValue();
+        String[] pieces = typeQnameString.split(":");
+        assertEquals(CharacterAsStringType.CHARACTER_AS_STRING_TYPE_QNAME.getLocalPart(),
+                     pieces[1]);
+    }
+    
     @Test
     public void testNullNonNillableWithDate() throws Exception {
         BeanTypeInfo info = new BeanTypeInfo(DateBean.class, "urn:Bean");
@@ -363,7 +397,7 @@
         type.setSchemaType(new QName("urn:Bean", "bean"));
 
         PropertyDescriptor[] pds = info.getPropertyDescriptors();
-        assertEquals(5, pds.length);
+        assertEquals(6, pds.length);
 
         ExtendedBean bean = new ExtendedBean();
         bean.setHowdy("howdy");

Modified: cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/types/SchemaJavascriptBuilder.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/types/SchemaJavascriptBuilder.java?rev=694981&r1=694980&r2=694981&view=diff
==============================================================================
--- cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/types/SchemaJavascriptBuilder.java (original)
+++ cxf/trunk/rt/javascript/src/main/java/org/apache/cxf/javascript/types/SchemaJavascriptBuilder.java Sat Sep 13 09:40:18 2008
@@ -39,9 +39,11 @@
 import org.apache.cxf.service.model.SchemaInfo;
 import org.apache.ws.commons.schema.XmlSchema;
 import org.apache.ws.commons.schema.XmlSchemaAny;
+import org.apache.ws.commons.schema.XmlSchemaAttribute;
 import org.apache.ws.commons.schema.XmlSchemaComplexType;
 import org.apache.ws.commons.schema.XmlSchemaElement;
 import org.apache.ws.commons.schema.XmlSchemaObject;
+import org.apache.ws.commons.schema.XmlSchemaObjectCollection;
 import org.apache.ws.commons.schema.XmlSchemaObjectTable;
 import org.apache.ws.commons.schema.XmlSchemaSequence;
 import org.apache.ws.commons.schema.XmlSchemaSimpleType;
@@ -311,6 +313,8 @@
         utils.startIf("extraNamespaces");
         utils.appendExpression("' ' + extraNamespaces");
         utils.endBlock();
+        // attributes
+        complexTypeSerializeAttributes(type, "this._");
         utils.appendString(">");
         utils.endBlock();
         code.append(bodyCode);
@@ -324,6 +328,14 @@
         code.append(nameManager.getJavascriptName(name) + ".prototype.serialize = " + functionName + ";\n\n");
     }
 
+    private void complexTypeSerializeAttributes(XmlSchemaComplexType type, String string) {
+        XmlSchemaObjectCollection attributes = type.getAttributes();
+        for (int ax = 0; ax < attributes.getCount(); ax++) {
+            @SuppressWarnings("unused") // work in progress.
+            XmlSchemaAttribute attribute = (XmlSchemaAttribute)attributes.getItem(ax);
+        }
+    }
+
     /**
      * Build the serialization code for a complex type. At the top level, this
      * operates on single items, so it does not pay attention to minOccurs and

Added: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/aegis/CharacterSchemaTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/aegis/CharacterSchemaTest.java?rev=694981&view=auto
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/aegis/CharacterSchemaTest.java (added)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/aegis/CharacterSchemaTest.java Sat Sep 13 09:40:18 2008
@@ -0,0 +1,79 @@
+/**
+ * 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.systest.aegis;
+
+import javax.xml.namespace.QName;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.aegis.type.basic.CharacterAsStringType;
+import org.apache.cxf.endpoint.Server;
+import org.apache.cxf.test.TestUtilities;
+import org.junit.Test;
+import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
+
+/**
+ * 
+ */
+public class CharacterSchemaTest extends AbstractDependencyInjectionSpringContextTests {
+    
+    private TestUtilities testUtilities;
+    
+    public CharacterSchemaTest() {
+        testUtilities = new TestUtilities(getClass());
+    }
+    
+    @Override
+    protected String[] getConfigLocations() {
+        return new String[] {"classpath:aegisSportsServiceBeans.xml"};
+    }
+    
+    @Test
+    public void testSchema() throws Exception {
+        testUtilities.setBus((Bus)applicationContext.getBean("cxf"));
+        testUtilities.addDefaultNamespaces();
+        testUtilities.addNamespace("aegis", "http://cxf.apache.org/aegisTypes");
+        Server s = testUtilities.
+            getServerForService(new QName("http://aegis.systest.cxf.apache.org/", 
+                                          "SportsService"));
+        assertNotNull(s);
+        Document wsdl = testUtilities.getWSDLDocument(s); 
+        assertNotNull(wsdl);
+        NodeList typeAttrList = 
+            testUtilities.assertValid("//xsd:complexType[@name='SimpleBean']/xsd:sequence"
+                                      + "/xsd:element[@name='character']"
+                                      + "/@type", 
+                                      wsdl); 
+        Attr typeAttr = (Attr)typeAttrList.item(0);
+        String typeAttrValue = typeAttr.getValue();
+        // now, this thing is a qname with a :, and we have to work out if it's correct.
+        String[] pieces = typeAttrValue.split(":");
+        assertEquals(CharacterAsStringType.CHARACTER_AS_STRING_TYPE_QNAME.getLocalPart(),
+                     pieces[1]);
+        Node elementNode = typeAttr.getOwnerElement();
+        String url = testUtilities.resolveNamespacePrefix(pieces[0], elementNode);
+        assertEquals(CharacterAsStringType.CHARACTER_AS_STRING_TYPE_QNAME.getNamespaceURI(),
+                     url);
+    }
+}

Propchange: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/aegis/CharacterSchemaTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/aegis/CharacterSchemaTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/aegis/SportsService.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/aegis/SportsService.java?rev=694981&r1=694980&r2=694981&view=diff
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/aegis/SportsService.java (original)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/aegis/SportsService.java Sat Sep 13 09:40:18 2008
@@ -23,11 +23,15 @@
 
 import javax.jws.WebService;
 
+import org.apache.cxf.aegis.services.SimpleBean;
+
 @WebService(targetNamespace = "http://cxf.apache.org/systest/aegis/sports")
 public interface SportsService {
     Collection<Team> getTeams();
     
     String testForMinOccurs0(String a, Integer b, String c);
     AttributeBean getAttributeBean();
+    // SimpleBean has relevant properties
+    SimpleBean getSimpleBean();
 }
 

Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/aegis/SportsServiceImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/aegis/SportsServiceImpl.java?rev=694981&r1=694980&r2=694981&view=diff
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/aegis/SportsServiceImpl.java (original)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/aegis/SportsServiceImpl.java Sat Sep 13 09:40:18 2008
@@ -23,6 +23,8 @@
 import java.util.Collection;
 import java.util.List;
 
+import org.apache.cxf.aegis.services.SimpleBean;
+
 /**
  * 
  */
@@ -43,4 +45,8 @@
         return new AttributeBean();
     }
 
+    public SimpleBean getSimpleBean() {
+        return new SimpleBean();
+    }
+
 }

Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/aegis/mtom/MtomTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/aegis/mtom/MtomTest.java?rev=694981&r1=694980&r2=694981&view=diff
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/aegis/mtom/MtomTest.java (original)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/aegis/mtom/MtomTest.java Sat Sep 13 09:40:18 2008
@@ -36,9 +36,6 @@
 import org.apache.cxf.common.util.SOAPConstants;
 import org.apache.cxf.endpoint.Server;
 import org.apache.cxf.frontend.ClientProxyFactoryBean;
-import org.apache.cxf.frontend.ServerFactoryBean;
-import org.apache.cxf.interceptor.LoggingInInterceptor;
-import org.apache.cxf.interceptor.LoggingOutInterceptor;
 import org.apache.cxf.systest.aegis.mtom.fortest.DataHandlerBean;
 import org.apache.cxf.systest.aegis.mtom.fortest.MtomTestImpl;
 import org.apache.cxf.test.TestUtilities;
@@ -75,11 +72,7 @@
             props.put("mtom-enabled", Boolean.TRUE);
         }
         proxyFac.setProperties(props);
-        ServerFactoryBean server = (ServerFactoryBean)applicationContext.getBean("mtom-server");
-        
-        server.getServer().getEndpoint().getInInterceptors().add(new LoggingInInterceptor());
-        server.getServer().getEndpoint().getOutInterceptors().add(new LoggingOutInterceptor());
-        
+
         client = (org.apache.cxf.systest.aegis.mtom.fortest.MtomTest)proxyFac.create();
         impl = (MtomTestImpl)applicationContext.getBean("mtomImpl");
     }

Added: cxf/trunk/systests/src/test/resources/aegisSportsServiceBeans.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/resources/aegisSportsServiceBeans.xml?rev=694981&view=auto
==============================================================================
--- cxf/trunk/systests/src/test/resources/aegisSportsServiceBeans.xml (added)
+++ cxf/trunk/systests/src/test/resources/aegisSportsServiceBeans.xml Sat Sep 13 09:40:18 2008
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+	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.
+-->
+
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:simple="http://cxf.apache.org/simple"
+	xmlns:jaxws="http://cxf.apache.org/jaxws"
+	xmlns:cxf="http://cxf.apache.org/core"
+	xsi:schemaLocation="
+http://www.springframework.org/schema/beans 
+http://www.springframework.org/schema/beans/spring-beans.xsd
+http://cxf.apache.org/simple
+http://cxf.apache.org/schemas/simple.xsd
+http://cxf.apache.org/jaxws
+http://cxf.apache.org/schemas/jaxws.xsd
+http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd">
+
+	<import resource="classpath:META-INF/cxf/cxf.xml" />
+	<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
+	<import resource="classpath:META-INF/cxf/cxf-extension-http.xml" />
+	<import resource="classpath:META-INF/cxf/cxf-extension-http-jetty.xml" />
+	
+	<bean id="sportsImpl"
+		class="org.apache.cxf.systest.aegis.SportsServiceImpl" />
+
+	<simple:server id="sports-server" address="http://localhost:9002/sports"
+		serviceClass="org.apache.cxf.systest.aegis.SportsService">
+		<simple:dataBinding>
+			<bean
+				class="org.apache.cxf.aegis.databinding.AegisDatabinding"/>
+		</simple:dataBinding>
+		<simple:serviceBean>
+			<ref bean="sportsImpl" />
+		</simple:serviceBean>
+	</simple:server>
+</beans>
\ No newline at end of file

Propchange: cxf/trunk/systests/src/test/resources/aegisSportsServiceBeans.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/systests/src/test/resources/aegisSportsServiceBeans.xml
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: cxf/trunk/systests/src/test/resources/aegisSportsServiceBeans.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml