You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by gd...@apache.org on 2001/05/03 16:32:49 UTC

cvs commit: xml-axis/java/src/org/apache/axis/message/events CharactersEvent.java EndElementEvent.java StartElementEvent.java

gdaniels    01/05/03 07:32:48

  Modified:    java/src/org/apache/axis/deployment
                        SimpleDeploymentManager.java
               java/src/org/apache/axis/encoding
                        DeserializationContext.java DeserializerBase.java
                        SOAPEncoding.java SOAPTypeMappingRegistry.java
                        SerializationContext.java Serializer.java
                        TypeMappingRegistry.java
               java/src/org/apache/axis/message ElementRecorder.java
                        MessageElement.java RPCElement.java RPCParam.java
                        SOAPHeader.java SOAPSAXHandler.java
               java/src/org/apache/axis/message/events CharactersEvent.java
                        EndElementEvent.java StartElementEvent.java
  Added:       java/src/org/apache/axis/encoding DeserializerFactory.java
  Removed:     java/src/org/apache/axis/encoding TypeMapper.java
  Log:
  First cut at a more real encoding system, which supports mapping arbitrary
  types to serializers/deserializers.  Needs cleanup (especially in terms of
  how the various pieces learn about each other), but the basic structure
  works.  See samples/encoding for a demo of encoding a custom data
  type.
  
  Revision  Changes    Path
  1.2       +3 -2      xml-axis/java/src/org/apache/axis/deployment/SimpleDeploymentManager.java
  
  Index: SimpleDeploymentManager.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/deployment/SimpleDeploymentManager.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- SimpleDeploymentManager.java	2001/04/29 17:24:58	1.1
  +++ SimpleDeploymentManager.java	2001/05/03 14:31:35	1.2
  @@ -117,8 +117,9 @@
               if (tmr == null) tmr = new TypeMappingRegistry();
               Serializer s = (Serializer)t.getSerializer().newInstance();
               Deserializer d = (Deserializer)t.getDeserializer().newInstance();
  -            tmr.addSerializer(t.getLanguageSpecificType(), s);
  -            tmr.addDeserializer(t.getQName(), d);
  +            // !!! FIXME - new serializer/deserializer system!
  +            //tmr.addSerializer(t.getLanguageSpecificType(), s);
  +            //tmr.addDeserializer(t.getQName(), d);
           }
           
           // deploy handlers
  
  
  
  1.2       +16 -2     xml-axis/java/src/org/apache/axis/encoding/DeserializationContext.java
  
  Index: DeserializationContext.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/DeserializationContext.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DeserializationContext.java	2001/04/26 23:03:08	1.1
  +++ DeserializationContext.java	2001/05/03 14:31:43	1.2
  @@ -72,11 +72,12 @@
   {
       public SOAPSAXHandler baseHandler;
       public Hashtable idMappings = new Hashtable();
  -    public TypeMapper typeMappings = new TypeMapper();
  +    public TypeMappingRegistry mappingRegistry = new SOAPTypeMappingRegistry();
       
       public DeserializationContext(SOAPSAXHandler baseHandler)
       {
           this.baseHandler = baseHandler;
  +        mappingRegistry.setDeserializationContext(this);
       }
       
       public void pushElementHandler(ContentHandler handler)
  @@ -89,6 +90,19 @@
           return (String)baseHandler.getNamespaceURI(prefix);
       }
       
  +    public void setTypeMappingRegistry(TypeMappingRegistry reg)
  +    {
  +        mappingRegistry = reg;
  +        if (reg != null) {
  +            reg.setDeserializationContext(this);
  +        }
  +    }
  +
  +    public TypeMappingRegistry getTypeMappingRegistry()
  +    {
  +        return mappingRegistry;
  +    }
  +    
       public void registerID(String id, MessageElement element)
       {
           // Throw an exception if already registered?
  @@ -102,6 +116,6 @@
       
       public DeserializerBase getDeserializer(QName qName)
       {
  -        return typeMappings.getDeserializer(qName);
  +        return mappingRegistry.getDeserializer(qName);
       }
   }
  
  
  
  1.2       +48 -39    xml-axis/java/src/org/apache/axis/encoding/DeserializerBase.java
  
  Index: DeserializerBase.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/DeserializerBase.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DeserializerBase.java	2001/04/26 23:03:08	1.1
  +++ DeserializerBase.java	2001/05/03 14:31:44	1.2
  @@ -74,80 +74,89 @@
   
   public class DeserializerBase extends DefaultHandler
   {
  -    public static long STARTDOCUMENT  = 0x0002;
  -    public static long ENDDOCUMENT    = 0x0004;
  -    public static long STARTPREFIXMAP = 0x0008;
  -    public static long ENDPREFIXMAP   = 0x0010;
  -    public static long STARTELEMENT   = 0x0020;
  -    public static long ENDELEMENT     = 0x0040;
  -    public static long CHARACTERS     = 0x0080;
  -    public static long WHITESPACE     = 0x0100;
  -    public static long SKIPPEDENTITY  = 0x0200;
  -    public static long PROCESSINGINST = 0x0400;
  -    
  -    private long allowedEvents = 0;
       protected Object value = null;
  +    protected DeserializationContext context = null;
  +    protected DeserializerBase parent = null;
       
       public Object getValue()
       {
           return value;
       }
  +    
  +    public void setDeserializationContext(DeserializationContext context)
  +    {
  +        this.context = context;
  +    }
  +    
  +    public void setParent(DeserializerBase parent)
  +    {
  +        this.parent = parent;
  +    }
       
  -    protected void setAllowedEvents(long mask)
  +    /** Deserialization structure handlers
  +     */
  +    public void onEndChild(String localName, DeserializerBase deserializer)
  +        throws SAXException
       {
  -        allowedEvents = mask;
       }
       
  +    /** DEFAULT IMPLEMENTATIONS OF SAX EVENT HANDLERS
  +     * 
  +     * All of these throw errors at this level, so if you want to allow
  +     * things like children, you need to override these methods in your
  +     * deserializer.
  +     */
       public void startDocument() throws SAXException {
  -        if ((allowedEvents & STARTDOCUMENT) == 0)
  -            throw new SAXException(
  -                "StartDocument event not allowed in this context.");
  +        throw new SAXException(
  +            "StartDocument event not allowed in this context.");
       }
       
       public void endDocument() throws SAXException {
  -        if ((allowedEvents & ENDDOCUMENT) == 0)
  -            throw new SAXException(
  -                "EndDocument event not allowed in this context.");
  +        throw new SAXException(
  +            "EndDocument event not allowed in this context.");
       }
       
       public void startPrefixMapping(String p1, String p2) throws SAXException {
  -        if ((allowedEvents & STARTPREFIXMAP) == 0)
  -            throw new SAXException(
  -                "StartPrefixMapping event not allowed in this context.");
  +        throw new SAXException(
  +            "StartPrefixMapping event not allowed in this context.");
       }
       
       public void endPrefixMapping(String p1) throws SAXException {
  -        if ((allowedEvents & ENDPREFIXMAP) == 0)
  -            throw new SAXException(
  -                "EndPrefixMapping event not allowed in this context.");
  +        throw new SAXException(
  +            "EndPrefixMapping event not allowed in this context.");
       }
       
       public void characters(char[] p1, int p2, int p3) throws SAXException {
  -        if ((allowedEvents & CHARACTERS) == 0)
  -            throw new SAXException(
  -                "Characters event not allowed in this context.");
  +        throw new SAXException(
  +            "Characters event not allowed in this context.");
       }
       
       public void ignorableWhitespace(char[] p1, int p2, int p3) 
           throws SAXException
       {
  -        if ((allowedEvents & WHITESPACE) == 0)
  -            throw new SAXException(
  -                "IgnorableWhitespace event not allowed in this context.");
  +        throw new SAXException(
  +            "IgnorableWhitespace event not allowed in this context.");
       }
  - 
  +    
       public void skippedEntity(String p1) throws SAXException {
  -        if ((allowedEvents & SKIPPEDENTITY) == 0)
  -            throw new SAXException(
  -                "SkippedEntity event not allowed in this context.");
  +        throw new SAXException(
  +            "SkippedEntity event not allowed in this context.");
       }
       
       public void startElement(String namespace, String localName,
                                String qName, Attributes attributes)
           throws SAXException
  +    {
  +        throw new SAXException(
  +            "StartElement event not allowed in this context.");
  +    }
  +
  +    public void endElement(String namespace, String localName,
  +                             String qName)
  +        throws SAXException
       {
  -        if ((allowedEvents & STARTELEMENT) == 0)
  -            throw new SAXException(
  -                "StartElement event not allowed in this context.");
  +        if (parent != null) {
  +            parent.onEndChild(localName, this);
  +        }
       }
   }
  
  
  
  1.2       +45 -103   xml-axis/java/src/org/apache/axis/encoding/SOAPEncoding.java
  
  Index: SOAPEncoding.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/SOAPEncoding.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- SOAPEncoding.java	2001/04/29 17:25:00	1.1
  +++ SOAPEncoding.java	2001/05/03 14:31:46	1.2
  @@ -1,15 +1,14 @@
   package org.apache.axis.encoding;
   
  -import org.w3c.dom.Element;
  -import org.w3c.dom.Document;
  -import org.w3c.dom.Attr;
  +import org.xml.sax.*;
  +import org.xml.sax.helpers.AttributesImpl;
   import org.apache.axis.utils.QName;
   import org.apache.axis.utils.XMLUtils;
   import org.apache.axis.Constants;
   import java.util.Hashtable;
  +import java.io.IOException;
   
  -public class SOAPEncoding implements Serializer, Deserializer { 
  -
  +public class SOAPEncoding implements Serializer { 
       private Hashtable typemap = new Hashtable();
       private Hashtable namemap = new Hashtable();
       
  @@ -30,115 +29,58 @@
           namemap.put(Short.class,   SOAPTypeMappingRegistry.SOAP_SHORT);
       }
       
  -    public Element serialize(QName qname, Object value, TypeMappingRegistry tmr, Document doc) {
  -        Element e;
  -        String name = null;
  -        String ns = null;
  +    public void serialize(QName qname, Attributes attributes,
  +                          Object value, SerializationContext context)
  +        throws IOException
  +    {
           QName xsitype = null;
           Class type = null;
           
  -        if (value != null) type = value.getClass();
  -        if (qname != null) {
  -            name = qname.getLocalPart();
  -            ns = qname.getNamespaceURI();
  -            xsitype = (QName)typemap.get(type);
  +        if (value != null) {
  +            type = value.getClass();
           } else {
  -            if (type != null) {
  -                QName q = (QName)namemap.get(type);
  -                if (q != null) {
  -                    name = q.getLocalPart();
  -                    ns = q.getNamespaceURI();
  -                }
  -            }
  +            // !!! add xsi:null attribute
           }
           
  -        if (name != null) {
  -            if (ns != null) {
  -                e = doc.createElementNS(ns, name);
  -            } else {
  -                e = doc.createElement(name);
  +        if (type != null) {
  +            if (qname == null) {
  +                qname = (QName)namemap.get(type);
               }
  -            if (xsitype != null) {
  -                e.setAttributeNS(Constants.URI_SCHEMA_XSI, "type", Constants.NSPREFIX_SCHEMA_XSD + ":" + xsitype.getLocalPart());
  -            }
  -            if (value != null) {
  -                e.appendChild(doc.createTextNode(value.toString()));
  -            }
  -            return e;
  -        } 
  -        return null;
  -    }
  -
  -    public Object deserialize(Element element, TypeMappingRegistry tmr) {
  -        String xsdprefix = XMLUtils.getPrefix(Constants.URI_SCHEMA_XSD, element);
  -        String xsitype = element.getAttributeNS(Constants.URI_SCHEMA_XSI, "type");
  -        QName name = new QName(element.getNamespaceURI(), element.getLocalName());
  -        String value = element.getFirstChild().getNodeValue();
  +            xsitype = (QName)typemap.get(type);
  +        }
  +        
  +        Attributes attrs = attributes;
  +        String str = context.qName2String(xsitype);
           
           if (xsitype != null) {
  -            if (xsitype.startsWith(xsdprefix + ":")) {
  -                String stype = xsitype.substring(xsdprefix.length() + 1);
  -                QName type = new QName(Constants.URI_SCHEMA_XSD, stype);
  -                if (type.getNamespaceURI().equals(SOAPTypeMappingRegistry.XSD_STRING.getNamespaceURI()) &&
  -                    type.getLocalPart().equals(SOAPTypeMappingRegistry.XSD_STRING.getLocalPart())) {
  -                    return new String(value);
  -                }
  -                if (type.getNamespaceURI().equals(SOAPTypeMappingRegistry.XSD_BOOLEAN.getNamespaceURI()) &&
  -                    type.getLocalPart().equals(SOAPTypeMappingRegistry.XSD_BOOLEAN.getLocalPart())) {
  -                    return new Boolean(value);
  -                }
  -                if (type.getNamespaceURI().equals(SOAPTypeMappingRegistry.XSD_DOUBLE.getNamespaceURI()) &&
  -                    type.getLocalPart().equals(SOAPTypeMappingRegistry.XSD_DOUBLE.getLocalPart())) {
  -                    return new Double(value);
  -                }
  -                if (type.getNamespaceURI().equals(SOAPTypeMappingRegistry.XSD_FLOAT.getNamespaceURI()) &&
  -                    type.getLocalPart().equals(SOAPTypeMappingRegistry.XSD_FLOAT.getLocalPart())) {
  -                    return new Float(value);
  +            // !!! should check if we're writing types or not?
  +            AttributesImpl impl = new AttributesImpl();
  +            boolean gotType = false;
  +            
  +            if (attributes != null) {
  +                for (int i = 0; i < attributes.getLength(); i++) {
  +                    impl.addAttribute(attributes.getURI(i),
  +                                      attributes.getLocalName(i),
  +                                      attributes.getQName(i), "CDATA",
  +                                      attributes.getValue(i));
  +                    if (attributes.getURI(i).equals(Constants.URI_SCHEMA_XSI) &&
  +                        attributes.getLocalName(i).equals("type"))
  +                        gotType = true;
                   }
  -                if (type.getNamespaceURI().equals(SOAPTypeMappingRegistry.XSD_INT.getNamespaceURI()) &&
  -                    type.getLocalPart().equals(SOAPTypeMappingRegistry.XSD_INT.getLocalPart())) {
  -                    return new Integer(value);
  -                }
  -                if (type.getNamespaceURI().equals(SOAPTypeMappingRegistry.XSD_LONG.getNamespaceURI()) &&
  -                    type.getLocalPart().equals(SOAPTypeMappingRegistry.XSD_LONG.getLocalPart())) {
  -                    return new Long(value);
  -                }
  -                if (type.getNamespaceURI().equals(SOAPTypeMappingRegistry.XSD_SHORT.getNamespaceURI()) &&
  -                    type.getLocalPart().equals(SOAPTypeMappingRegistry.XSD_SHORT.getLocalPart())) {
  -                    return new Short(value);
  -                }
               }
  -        }
  -        
  -        if (name.getNamespaceURI().equals(SOAPTypeMappingRegistry.SOAP_STRING.getNamespaceURI()) &&
  -            name.getLocalPart().equals(SOAPTypeMappingRegistry.SOAP_STRING.getLocalPart())) {
  -            return new String(value);
  -        }
  -        if (name.getNamespaceURI().equals(SOAPTypeMappingRegistry.SOAP_BOOLEAN.getNamespaceURI()) &&
  -            name.getLocalPart().equals(SOAPTypeMappingRegistry.SOAP_BOOLEAN.getLocalPart())) {
  -            return new Boolean(value);
  -        }
  -        if (name.getNamespaceURI().equals(SOAPTypeMappingRegistry.SOAP_DOUBLE.getNamespaceURI()) &&
  -            name.getLocalPart().equals(SOAPTypeMappingRegistry.SOAP_DOUBLE.getLocalPart())) {
  -            return new Double(value);
  -        }
  -        if (name.getNamespaceURI().equals(SOAPTypeMappingRegistry.SOAP_FLOAT.getNamespaceURI()) &&
  -            name.getLocalPart().equals(SOAPTypeMappingRegistry.SOAP_FLOAT.getLocalPart())) {
  -            return new Float(value);
  -        }
  -        if (name.getNamespaceURI().equals(SOAPTypeMappingRegistry.SOAP_INT.getNamespaceURI()) &&
  -            name.getLocalPart().equals(SOAPTypeMappingRegistry.SOAP_INT.getLocalPart())) {
  -            return new Integer(value);
  -        }
  -        if (name.getNamespaceURI().equals(SOAPTypeMappingRegistry.SOAP_LONG.getNamespaceURI()) &&
  -            name.getLocalPart().equals(SOAPTypeMappingRegistry.SOAP_LONG.getLocalPart())) {
  -            return new Long(value);
  -        }
  -        if (name.getNamespaceURI().equals(SOAPTypeMappingRegistry.SOAP_SHORT.getNamespaceURI()) &&
  -            name.getLocalPart().equals(SOAPTypeMappingRegistry.SOAP_SHORT.getLocalPart())) {
  -            return new Short(value);
  +            
  +            if (!gotType) {
  +                impl.addAttribute(Constants.URI_SCHEMA_XSI,
  +                               "type", "xsi:type",
  +                               "CDATA", str);
  +            }
  +            
  +            attrs = impl;
           }
  -        
  -        return null;
  +
  +        context.startElement(qname, attrs);
  +        if (value != null)
  +            context.writeString(value.toString());
  +        context.endElement();
       }
   }
  
  
  
  1.2       +80 -21    xml-axis/java/src/org/apache/axis/encoding/SOAPTypeMappingRegistry.java
  
  Index: SOAPTypeMappingRegistry.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/SOAPTypeMappingRegistry.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- SOAPTypeMappingRegistry.java	2001/04/29 17:25:00	1.1
  +++ SOAPTypeMappingRegistry.java	2001/05/03 14:31:48	1.2
  @@ -2,6 +2,7 @@
   
   import org.apache.axis.Constants;
   import org.apache.axis.utils.QName;
  +import org.xml.sax.*;
   
   public class SOAPTypeMappingRegistry extends TypeMappingRegistry { 
       
  @@ -20,29 +21,87 @@
       public static final QName SOAP_LONG = new QName(Constants.URI_SOAP_ENC, "long");
       public static final QName SOAP_SHORT = new QName(Constants.URI_SOAP_ENC, "short");
       
  +    abstract class BasicDeser extends DeserializerBase {
  +        public void startElement(String namespace, String name, String qName,
  +                                 Attributes attributes)
  +        {
  +        }
  +        
  +        public void characters(char [] chars, int start, int end)
  +        {
  +            value = makeValue(new String(chars, start, end));
  +        }
  +        abstract Object makeValue(String source);
  +    }
  +    class IntDeser extends BasicDeser {
  +        Object makeValue(String source) { return new Integer(source); }
  +    }
  +    class IntDeserializerFactory implements DeserializerFactory {
  +        public DeserializerBase getDeserializer() { return new IntDeser(); }
  +    }
  +    class FloatDeser extends BasicDeser {
  +        Object makeValue(String source) { return new Float(source); }
  +    }
  +    class FloatDeserializerFactory implements DeserializerFactory {
  +        public DeserializerBase getDeserializer() { return new FloatDeser(); }
  +    }
  +    class LongDeser extends BasicDeser {
  +        Object makeValue(String source) { return new Long(source); }
  +    }
  +    class LongDeserializerFactory implements DeserializerFactory {
  +        public DeserializerBase getDeserializer() { return new LongDeser(); }
  +    }
  +    class StringDeser extends BasicDeser {
  +        Object makeValue(String source) { return source; };
  +    }
  +    class StringDeserializerFactory implements DeserializerFactory {
  +        public DeserializerBase getDeserializer() { return new StringDeser(); }
  +    }
  +    class BooleanDeser extends BasicDeser {
  +        Object makeValue(String source) { return new Boolean(source); }
  +    }
  +    class BooleanDeserializerFactory implements DeserializerFactory {
  +        public DeserializerBase getDeserializer() { return new BooleanDeser(); }
  +    }
  +    class DoubleDeser extends BasicDeser {
  +        Object makeValue(String source) { return new Double(source); }
  +    }
  +    class DoubleDeserializerFactory implements DeserializerFactory {
  +        public DeserializerBase getDeserializer() { return new DoubleDeser(); }
  +    }
  +    class ShortDeser extends BasicDeser {
  +        Object makeValue(String source) { return new Short(source); }
  +    }
  +    class ShortDeserializerFactory implements DeserializerFactory {
  +        public DeserializerBase getDeserializer() { return new ShortDeser(); }
  +    }
  +
       public SOAPTypeMappingRegistry() {
           SOAPEncoding se = new SOAPEncoding();
  -        addSerializer(java.lang.String.class, se);
  -        addSerializer(java.lang.Boolean.class, se);
  -        addSerializer(java.lang.Double.class, se);
  -        addSerializer(java.lang.Float.class, se);
  -        addSerializer(java.lang.Integer.class, se);
  -        addSerializer(java.lang.Long.class, se);
  -        addSerializer(java.lang.Short.class, se);
  -        addDeserializer(XSD_STRING, se);    
  -        addDeserializer(XSD_BOOLEAN, se);
  -        addDeserializer(XSD_DOUBLE, se);
  -        addDeserializer(XSD_FLOAT, se);
  -        addDeserializer(XSD_INT, se);
  -        addDeserializer(XSD_LONG, se);
  -        addDeserializer(XSD_SHORT, se);
  -        addDeserializer(SOAP_STRING, se);
  -        addDeserializer(SOAP_BOOLEAN, se);
  -        addDeserializer(SOAP_DOUBLE, se);
  -        addDeserializer(SOAP_FLOAT, se);
  -        addDeserializer(SOAP_INT, se);
  -        addDeserializer(SOAP_LONG, se);
  -        addDeserializer(SOAP_SHORT, se);
  +        addSerializer(java.lang.String.class, XSD_STRING, se);
  +        addSerializer(java.lang.Boolean.class, XSD_BOOLEAN, se);
  +        addSerializer(java.lang.Double.class, XSD_DOUBLE, se);
  +        addSerializer(java.lang.Float.class, XSD_FLOAT, se);
  +        addSerializer(java.lang.Integer.class, XSD_INT, se);
  +        addSerializer(java.lang.Long.class, XSD_LONG, se);
  +        addSerializer(java.lang.Short.class, XSD_SHORT, se);
  +        
  +        addDeserializerFactory(XSD_STRING, new StringDeserializerFactory());    
  +        addDeserializerFactory(XSD_BOOLEAN, new BooleanDeserializerFactory());
  +        addDeserializerFactory(XSD_DOUBLE, new DoubleDeserializerFactory());
  +        addDeserializerFactory(XSD_FLOAT, new FloatDeserializerFactory());
  +        addDeserializerFactory(XSD_INT, new IntDeserializerFactory());
  +        addDeserializerFactory(XSD_LONG, new LongDeserializerFactory());
  +        addDeserializerFactory(XSD_SHORT, new ShortDeserializerFactory());
  +        /*
  +        addDeserializerFactory(SOAP_STRING, se);
  +        addDeserializerFactory(SOAP_BOOLEAN, se);
  +        addDeserializerFactory(SOAP_DOUBLE, se);
  +        addDeserializerFactory(SOAP_FLOAT, se);
  +        addDeserializerFactory(SOAP_INT, se);
  +        addDeserializerFactory(SOAP_LONG, se);
  +        addDeserializerFactory(SOAP_SHORT, se);
  +        */
       }
       
   }
  
  
  
  1.4       +18 -2     xml-axis/java/src/org/apache/axis/encoding/SerializationContext.java
  
  Index: SerializationContext.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/SerializationContext.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- SerializationContext.java	2001/04/30 05:16:41	1.3
  +++ SerializationContext.java	2001/05/03 14:31:50	1.4
  @@ -83,13 +83,23 @@
       
       int lastPrefixIndex = 1;
       
  -    TypeMapper typeMapper = new TypeMapper();
  +    TypeMappingRegistry mappingRegistry = new SOAPTypeMappingRegistry();
       
       public SerializationContext(Writer writer)
       {
           this.writer = writer;
       }
       
  +    public void setTypeMappingRegistry(TypeMappingRegistry reg)
  +    {
  +        mappingRegistry = reg;
  +    }
  +    
  +    public TypeMappingRegistry getTypeMappingRegistry()
  +    {
  +        return mappingRegistry;
  +    }
  +    
       public String getPrefixForURI(String uri)
       {
           String prefix = nsStack.getPrefix(uri);
  @@ -129,8 +139,14 @@
       }
       
       public QName getQNameForClass(Class cls)
  +    {
  +        return mappingRegistry.getTypeQName(cls);
  +    }
  +    
  +    public void serialize(QName qName, Attributes attributes, Object value)
  +        throws IOException
       {
  -        return typeMapper.getTypeQName(cls);
  +        mappingRegistry.serialize(qName, attributes, value, this);
       }
       
       public void startElement(QName qName, Attributes attributes)
  
  
  
  1.4       +5 -5      xml-axis/java/src/org/apache/axis/encoding/Serializer.java
  
  Index: Serializer.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/Serializer.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- Serializer.java	2001/04/29 17:35:00	1.3
  +++ Serializer.java	2001/05/03 14:31:52	1.4
  @@ -58,15 +58,15 @@
   //import org.apache.axis.message.Message;
   //import org.apache.axis.message.MessageElement;
   //import org.apache.axis.utils.NSStack;
  +import java.io.IOException;
   import org.apache.axis.utils.QName;
  -import org.w3c.dom.Element;
  -import org.w3c.dom.Document;
  +import org.xml.sax.Attributes;
   
   /**
    * @author James Snell (jasnell@us.ibm.com)
    */
   public interface Serializer { 
  -    
  -    //public MessageElement serialize(QName name, Object value, NSStack nsStack, TypeMappingRegistry tmr, Message message);
  -    public Element serialize(QName name, Object value, TypeMappingRegistry tmr, Document doc);
  +    public void serialize(QName name, Attributes attributes,
  +                          Object value, SerializationContext context)
  +        throws IOException;
   }
  
  
  
  1.4       +60 -20    xml-axis/java/src/org/apache/axis/encoding/TypeMappingRegistry.java
  
  Index: TypeMappingRegistry.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/TypeMappingRegistry.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- TypeMappingRegistry.java	2001/04/29 17:25:00	1.3
  +++ TypeMappingRegistry.java	2001/05/03 14:31:57	1.4
  @@ -61,36 +61,78 @@
   import org.apache.axis.message.*;
   import org.w3c.dom.Element;
   import org.w3c.dom.Document;
  +import org.xml.sax.*;
   import java.io.*;
   
   /**
    * @author James Snell (jasnell@us.ibm.com)
    */
  -public class TypeMappingRegistry implements Serializer, Deserializer { 
  +public class TypeMappingRegistry implements Serializer { 
   
  +    class SerializerDescriptor implements Serializable {
  +        QName typeQName;
  +        Serializer serializer;
  +        SerializerDescriptor(QName typeQName, Serializer serializer)
  +        {
  +            this.typeQName = typeQName;
  +            this.serializer = serializer;
  +        }
  +    }
  +    
       Hashtable s;
       Hashtable d;
  +    DeserializationContext context = null;
  +    
  +    public void setDeserializationContext(DeserializationContext context)
  +    {
  +        this.context = context;
  +    }
  +    
  +    private String generateKey(QName qName)
  +    {
  +        return qName.getNamespaceURI() + " + " + qName.getLocalPart();
  +    }
       
  -    public void addSerializer(Class _class, Serializer serializer) {
  +    public void addSerializer(Class _class, QName qName, Serializer serializer) {
           if (s == null) s = new Hashtable();
  -        s.put(_class, serializer);
  +        s.put(_class, new SerializerDescriptor(qName, serializer));
       }
       
  -    public void addDeserializer(QName qname, Deserializer deserializer) {
  +    public void addDeserializerFactory(QName qname,
  +                                       DeserializerFactory deserializerFactory) {
           if (d == null) d= new Hashtable();
  -        d.put(qname, deserializer);
  +        d.put(generateKey(qname), deserializerFactory);
       }
   
       public Serializer getSerializer(Class _class) {
  -        if (s != null) return (Serializer)s.get(_class);
  +        if (s == null)
  +            return null;
  +        SerializerDescriptor desc = (SerializerDescriptor)s.get(_class);
  +        if (desc != null) return desc.serializer;
           return null;
       }
       
  -    public Deserializer getDeserializer(QName qname) {
  -        if (d != null) return (Deserializer)d.get(qname);
  +    public QName getTypeQName(Class _class) {
  +        if (s == null)
  +            return null;
  +        SerializerDescriptor desc = (SerializerDescriptor)s.get(_class);
  +        if (desc != null) return desc.typeQName;
           return null;
       }
       
  +    public DeserializerBase getDeserializer(QName qname) {
  +        if (d == null)
  +            return null;
  +        
  +        DeserializerFactory factory = (DeserializerFactory)d.get(generateKey(qname));
  +        if (factory == null)
  +            return null;
  +        
  +        DeserializerBase dSer = factory.getDeserializer();
  +        dSer.setDeserializationContext(context);
  +        return dSer;
  +    }
  +    
       public void removeSerializer(Class _class) {
           if (s != null) s.remove(_class);
       }
  @@ -136,24 +178,22 @@
           load(fis);
       }
   
  -    public Element serialize(QName name, Object value, TypeMappingRegistry tmr, Document doc) {
  +    public void serialize(QName name, Attributes attributes,
  +                          Object value, SerializationContext context)
  +        throws IOException
  +    {
           if (value != null) {
               Class _class = value.getClass();
               Serializer ser = getSerializer(_class);
  -            if (tmr == null) tmr = this;
  -            return ser.serialize(name, value, tmr, doc);
  +            if (ser != null) {
  +                ser.serialize(name, attributes, value, context);
  +            } else {
  +                throw new IOException("No serializer found for class " + _class.getName());
  +            }
           }
  -        return null;
  +        // !!! Write out a generic null, or get type info from somewhere else?
       }
   
  -    public Object deserialize(Element element, TypeMappingRegistry tmr) {
  -        QName q = new QName(element.getNamespaceURI(), element.getLocalName());
  -        Deserializer des = getDeserializer(q);
  -        if (tmr == null) tmr = this;
  -        return des.deserialize(element, tmr);
  -    }
  -    
  -    
       //public MessageElement serialize(QName name, Object value, NSStack nsStack, Message message) {
       //    if (value != null) {
       //        Class _class = value.getClass();
  
  
  
  1.1                  xml-axis/java/src/org/apache/axis/encoding/DeserializerFactory.java
  
  Index: DeserializerFactory.java
  ===================================================================
  package org.apache.axis.encoding;
  
  public interface DeserializerFactory
  {
      public DeserializerBase getDeserializer();
  }
  
  
  
  1.3       +6 -3      xml-axis/java/src/org/apache/axis/message/ElementRecorder.java
  
  Index: ElementRecorder.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/ElementRecorder.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ElementRecorder.java	2001/04/28 13:52:15	1.2
  +++ ElementRecorder.java	2001/05/03 14:32:15	1.3
  @@ -84,7 +84,7 @@
           throws SAXException
       {
           if (DEBUG_LOG) {
  -            System.out.println("(rec) startElement ['" + namespace + "' " +
  +            System.err.println("(rec) startElement ['" + namespace + "' " +
                              localName + "]");
           }
           
  @@ -95,7 +95,7 @@
           throws SAXException
       {
           if (DEBUG_LOG) {
  -            System.out.println("(rec) endElement ['" + namespace + "' " +
  +            System.err.println("(rec) endElement ['" + namespace + "' " +
                              localName + "]");
           }
   
  @@ -106,7 +106,7 @@
           throws SAXException
       {
           if (DEBUG_LOG) {
  -            System.out.println("(rec) characters ['" +
  +            System.err.println("(rec) characters ['" +
                                  new String(chars, start, length) + "']");
           }
           
  @@ -123,6 +123,9 @@
           Enumeration e = _events.elements();
           while (e.hasMoreElements()) {
               SAXEvent event = (SAXEvent)e.nextElement();
  +            if (DEBUG_LOG) {
  +                System.err.println("Publishing : " + event);
  +            }
               event.publishToHandler(handler);
           }
       }
  
  
  
  1.11      +3 -0      xml-axis/java/src/org/apache/axis/message/MessageElement.java
  
  Index: MessageElement.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/MessageElement.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- MessageElement.java	2001/05/02 02:49:17	1.10
  +++ MessageElement.java	2001/05/03 14:32:17	1.11
  @@ -75,6 +75,7 @@
       protected String    namespaceURI ;
       protected AttributesImpl attributes;
       protected String    id;
  +    protected String    href;
       protected boolean   isRoot = false;
       protected SOAPEnvelope message = null;
       protected DeserializationContext context = null;
  @@ -123,6 +124,8 @@
           if (id != null) {
               context.registerID(id, this);
           }
  +            
  +        href = attributes.getValue(Constants.ATTR_HREF);
         }
       }
       
  
  
  
  1.3       +6 -1      xml-axis/java/src/org/apache/axis/message/RPCElement.java
  
  Index: RPCElement.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/RPCElement.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- RPCElement.java	2001/05/02 12:16:07	1.2
  +++ RPCElement.java	2001/05/03 14:32:19	1.3
  @@ -90,6 +90,7 @@
           
           public void startElement(String namespace, String name, String qName,
                                    Attributes attributes)
  +            throws SAXException
           {
               if (!passedMyStart) {
                   passedMyStart = true;
  @@ -98,6 +99,7 @@
               
               // Start of an arg...
               RPCParam param = new RPCParam(namespace, name, attributes, context);
  +            
               params.addElement(param);
               if (param.getType() == null) {
                   // No type inline, so check service description.
  @@ -114,7 +116,10 @@
                    */
                   
               }
  -            context.pushElementHandler(param.getContentHandler());
  +            ContentHandler handler = param.getContentHandler();
  +            
  +            handler.startElement(namespace, name, qName, attributes);
  +            context.pushElementHandler(handler);
           }
       }
       public ContentHandler getContentHandler() { return new RPCContentHandler(); }
  
  
  
  1.6       +31 -19    xml-axis/java/src/org/apache/axis/message/RPCParam.java
  
  Index: RPCParam.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/RPCParam.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- RPCParam.java	2001/04/30 05:24:16	1.5
  +++ RPCParam.java	2001/05/03 14:32:20	1.6
  @@ -120,6 +120,13 @@
           this.value = value;
       }
       
  +    public RPCParam(String namespace, String name, Object value)
  +    {
  +        this.namespaceURI = namespace;
  +        this.name = name;
  +        this.value = value;
  +    }
  +    
       public void setRPCElement(RPCElement element)
       {
           myRPCElement = element;
  @@ -142,8 +149,9 @@
           // Look up type and return an appropriate deserializer
           if (typeQName != null) {
               deserializer = context.getDeserializer(typeQName);
  -            if (deserializer != null)
  +            if (deserializer != null) {
                   return deserializer;
  +            }
           }
           
           // If we couldn't find one, just record...
  @@ -153,7 +161,9 @@
            * means)?  In that case we want an easy way to
            * squirt these SAX events to a deserializer.
            */
  -        
  +        if (DEBUG_LOG) {
  +            System.err.println("Creating recorder for " + this.getName());
  +        }
           value = new ElementRecorder();
           return (ElementRecorder)value;
       }
  @@ -183,26 +193,34 @@
       
       public void output(SerializationContext context) throws IOException
       {
  -        AttributesImpl attrs = new AttributesImpl();
  +        AttributesImpl attrs;
           if (deserializer != null) getValue();
           
  -        if ((value != null) && (typeQName == null))
  -            typeQName = context.getQNameForClass(value.getClass());
  +        if (value instanceof ElementRecorder) {
  +            try {
  +                ((ElementRecorder)value).publishToHandler(new SAXOutputter(context));
  +            } catch (SAXException ex) {
  +                throw new IOException(ex.getMessage());
  +            }
  +            return;
  +        } else {
  +            if ((value != null) && (typeQName == null)) {
  +                typeQName = context.getQNameForClass(value.getClass());
  +            }
  +        }
           
           if (attributes != null) {
               // Must be writing a message we parsed earlier, so just put out
               // what's already there.
  -            for (int i = 0; i < attributes.getLength(); i++) {
  -                attrs.addAttribute(attributes.getURI(i), attributes.getLocalName(i),
  -                                   attributes.getQName(i), "CDATA",
  -                                   attributes.getValue(i));
  -            }
  +            attrs = new AttributesImpl(attributes);
           } else {
               // Writing a message from memory out to XML...
               // !!! How do we set other attributes when serializing??
  +            attrs = new AttributesImpl();
               
               ServiceDescription desc = getEnvelope().getServiceDescription();
               if ((desc == null) || desc.getSendTypeAttr()) {
  +                
                   if (typeQName != null) {
                       attrs.addAttribute(Constants.URI_SCHEMA_XSI, "type", "xsi:type",
                                          "CDATA",
  @@ -214,16 +232,10 @@
                   attrs.addAttribute(Constants.URI_SCHEMA_XSI, "null", "xsi:null",
                                      "CDATA", "1");
           }
  -        
  -        context.startElement(new QName(getNamespaceURI(), getName()), attrs);
   
  -        // Output the value...
  -        if (value != null)
  -            if (value instanceof ElementRecorder)
  -                ((ElementRecorder)value).output(context);
  -            else
  -                context.writeString(value.toString());
  +        if (typeQName == null)
  +            typeQName = context.getQNameForClass(value.getClass());
           
  -        context.endElement();
  +        context.serialize(new QName(getNamespaceURI(), getName()), attrs, value);
       }
   }
  
  
  
  1.16      +7 -0      xml-axis/java/src/org/apache/axis/message/SOAPHeader.java
  
  Index: SOAPHeader.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/SOAPHeader.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- SOAPHeader.java	2001/04/26 22:53:40	1.15
  +++ SOAPHeader.java	2001/05/03 14:32:22	1.16
  @@ -55,9 +55,11 @@
   
   package org.apache.axis.message ;
   
  +import java.io.IOException;
   import java.util.* ;
   import org.apache.axis.* ;
   import org.apache.axis.encoding.DeserializationContext;
  +import org.apache.axis.encoding.SerializationContext;
   import org.xml.sax.Attributes;
   
   /** A simple header abstraction.  Extends MessageElement with header-specific
  @@ -117,5 +119,10 @@
   
       public boolean isProcessed() {
           return( processed );
  +    }
  +
  +    public void output(SerializationContext context) throws IOException
  +    {
  +        super.output(context);
       }
   };
  
  
  
  1.5       +5 -0      xml-axis/java/src/org/apache/axis/message/SOAPSAXHandler.java
  
  Index: SOAPSAXHandler.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/SOAPSAXHandler.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- SOAPSAXHandler.java	2001/05/01 22:04:39	1.4
  +++ SOAPSAXHandler.java	2001/05/03 14:32:23	1.5
  @@ -176,6 +176,11 @@
           return envelope;
       }
       
  +    public DeserializationContext getContext()
  +    {
  +        return context;
  +    }
  +    
       /** Grab a namespace prefix
        */
       public String getNamespaceURI(String prefix)
  
  
  
  1.3       +5 -0      xml-axis/java/src/org/apache/axis/message/events/CharactersEvent.java
  
  Index: CharactersEvent.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/events/CharactersEvent.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- CharactersEvent.java	2001/04/28 13:52:16	1.2
  +++ CharactersEvent.java	2001/05/03 14:32:38	1.3
  @@ -91,4 +91,9 @@
       {
           context.writeChars(_characters, _start, _length);
       }
  +    
  +    public String toString()
  +    {
  +        return "[CharactersEvent '" + new String(_characters, _start, _length) + "']";
  +    }
   }
  
  
  
  1.3       +5 -0      xml-axis/java/src/org/apache/axis/message/events/EndElementEvent.java
  
  Index: EndElementEvent.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/events/EndElementEvent.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- EndElementEvent.java	2001/04/28 13:52:16	1.2
  +++ EndElementEvent.java	2001/05/03 14:32:40	1.3
  @@ -97,4 +97,9 @@
           context.writeString(_localPart);
           context.writeString(">");
       }
  +    
  +    public String toString()
  +    {
  +        return "[EndElementEvent " + _qName + " ]";
  +    }
   }
  
  
  
  1.3       +5 -0      xml-axis/java/src/org/apache/axis/message/events/StartElementEvent.java
  
  Index: StartElementEvent.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/events/StartElementEvent.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- StartElementEvent.java	2001/04/28 13:52:16	1.2
  +++ StartElementEvent.java	2001/05/03 14:32:41	1.3
  @@ -109,4 +109,9 @@
           }
           context.writeString(">");
       }
  +    
  +    public String toString()
  +    {
  +        return "[StartElementEvent " + _qName + " ]";
  +    }
   }