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/08/14 05:49:19 UTC

cvs commit: xml-axis/java/test/encoding TestDeser.java TestHrefs.java TestSer.java

gdaniels    01/08/13 20:49:19

  Modified:    java/docs install.html
               java/src/org/apache/axis Message.java
               java/src/org/apache/axis/encoding
                        DeserializationContext.java Deserializer.java
                        SerializationContext.java TypeMappingRegistry.java
               java/src/org/apache/axis/message BodyBuilder.java
                        EnvelopeBuilder.java HeaderBuilder.java
                        MessageElement.java RPCElement.java
                        SAX2EventRecorder.java SOAPEnvelope.java
                        SOAPHandler.java
               java/src/org/apache/axis/utils NSStack.java
               java/test/RPCDispatch TestRPC.java
               java/test/encoding TestDeser.java TestHrefs.java
                        TestSer.java
  Added:       java/src/org/apache/axis/utils Mapping.java
  Log:
  Now that the alpha has been branched.....
  
  Some fairly major changes to the parsing/deserialization code.
  The main thrust is decoupling deserialization from the creation of
  a MessageElement-based object model for the XML.
  
  *  MessageElements are now created for every XML element, and
     they keep track of their namespace mappings.  The
     functionality that was only in NSStack before is now replicated
     in MessageElement, with the elements searching local mappings
     for a prefix/URI, and asking their parent if it's not found.
  
  *  Keep track of the "current element" in DeserializationContext,
     and look for namespace mappings from there.
  
  *  Deserialization is no longer automatic during the initial
     parse - rather we can parse into MessageElements, record the
     whole message, and then deserialize at the point someone asks
     for an RPCElement's params.  This should help the digsig guys,
     although the general architecture needs another cleaning /
     optimization pass.
  
  *  SAX2Recorder now records a "dummy" event, which indicates
     when the "current element" in a DeserializationContext should
     change.  If the record is playing the events back, it checks
     to see if the target handler is a DeserializationContext, and
     if so, it feeds it the current element events, so it can
     correctly accomplish namespace mappings during deserialization
     after the "normal" NSStack is long empty.
  
  *  Default SOAPHandler behaviour is to make MessageElements,
     assuming we're in the middle of a parse.
  
  *  Pull out Mapping into its own class (used to be inside
     NSSTack)
  
  *  Use DeserializationContext.parse() in Message.java
  
  Revision  Changes    Path
  1.8       +2 -2      xml-axis/java/docs/install.html
  
  Index: install.html
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/docs/install.html,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- install.html	2001/08/13 18:58:58	1.7
  +++ install.html	2001/08/14 03:49:18	1.8
  @@ -180,9 +180,9 @@
           the distribution directory for xml-axis and execute the following
           command:
           <blockquote><code>java samples.stock.GetQuote -lhttp://localhost:8080/axis/servlet/AxisServlet
  -          -uuser1 -wpass1 IBM</code></blockquote>
  +          -uuser1 -wpass1 XXX</code></blockquote>
           </li>
  -        
  +      <li>You should get back "55.25" as a result.</li>
       </ul>
   
       <p><span class="note">Note:</span> 
  
  
  
  1.42      +2 -5      xml-axis/java/src/org/apache/axis/Message.java
  
  Index: Message.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/Message.java,v
  retrieving revision 1.41
  retrieving revision 1.42
  diff -u -r1.41 -r1.42
  --- Message.java	2001/07/21 15:36:01	1.41
  +++ Message.java	2001/08/14 03:49:18	1.42
  @@ -307,20 +307,17 @@
           } else {
               is = new InputSource(new StringReader(getAsString()));
           }
  -        SAXParser parser = XMLUtils.getSAXParser();
           DeserializationContext dser = 
  -            new DeserializationContext(msgContext, messageType);
  +            new DeserializationContext(is, msgContext, messageType);
           
           // This may throw a SAXException
           try {
  -            parser.parse(is, dser);
  +            dser.parse();
           } catch (SAXException e) {
               Exception real = e.getException();
               if (real == null)
                   real = e;
               throw new AxisFault(real);
  -        } catch (IOException ioe) {
  -            throw new AxisFault(ioe);
           }
   
           setCurrentMessage(dser.getEnvelope(), FORM_SOAPENVELOPE);
  
  
  
  1.20      +58 -17    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.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- DeserializationContext.java	2001/08/10 13:08:22	1.19
  +++ DeserializationContext.java	2001/08/14 03:49:18	1.20
  @@ -117,24 +117,38 @@
       
       protected HandlerFactory initialFactory;
       
  -    protected boolean doneParsing = false;
  +    public boolean doneParsing = false;
       protected InputSource inputSource = null;
           
  -    public DeserializationContext(MessageContext ctx, String messageType)
  +    public DeserializationContext(MessageContext ctx, EnvelopeBuilder initialHandler)
       {
           msgContext = ctx;
           
  -        envelope = new SOAPEnvelope();
  +        envelope = initialHandler.getEnvelope();
           envelope.setRecorder(recorder);
  -        envelope.setMessageType(messageType);
           
  -        pushElementHandler(new EnvelopeHandler(new EnvelopeBuilder()));
  +        pushElementHandler(new EnvelopeHandler(initialHandler));
       }
       
  +    MessageElement curElement;
  +    
  +    public void setCurElement(MessageElement el)
  +    {
  +        curElement = el;
  +    }
  +    
       public DeserializationContext(InputSource is, MessageContext ctx, 
                                     String messageType)
       {
  -        this(ctx, messageType);
  +        EnvelopeBuilder builder = new EnvelopeBuilder(messageType);
  +        
  +        msgContext = ctx;
  +        
  +        envelope = builder.getEnvelope();
  +        envelope.setRecorder(recorder);
  +        
  +        pushElementHandler(new EnvelopeHandler(builder));
  +
           inputSource = is;
       }
       
  @@ -166,10 +180,18 @@
           return recorder;
       }
       
  +    public ArrayList getCurrentNSMappings()
  +    {
  +        return (ArrayList)namespaces.peek().clone();
  +    }
  +    
       /** Grab a namespace prefix
        */
       public String getNamespaceURI(String prefix)
       {
  +        if (curElement != null)
  +            return curElement.getNamespaceURI(prefix);
  +
           return namespaces.getNamespaceURI(prefix);
       }
       
  @@ -189,7 +211,7 @@
           //System.out.println("namespace = " + nsURI);
           
           if (nsURI == null)
  -            return null;  // ???
  +            return null;
           
           return new QName(nsURI, qNameStr.substring(i + 1));
       }
  @@ -312,12 +334,22 @@
       public int getStartOfMappingsPos()
       {
           if (startOfMappingsPos == -1) {
  -            return getCurrentRecordPos();
  +            return getCurrentRecordPos() + 1;
           }
           
           return startOfMappingsPos;
       }
       
  +    public void pushNewElement(MessageElement elem)
  +    {
  +        if (recorder != null) {
  +            recorder.newElement(elem);
  +        }
  +        
  +        elem.setParent(curElement);
  +        curElement = elem;
  +    }
  +    
       /****************************************************************
        * Management of sub-handlers (deserializers)
        */
  @@ -384,6 +416,8 @@
           }
           if (recorder != null)
               recorder.endDocument();
  +        
  +        doneParsing = true;
       }
       
       /** Record the current set of prefix mappings in the nsMappings table.
  @@ -485,12 +519,6 @@
                              localName + "]");
           }
           
  -        namespaces.push();
  -        
  -        if (recorder != null)
  -            recorder.startElement(namespace, localName, qName,
  -                                  attributes);
  -        
           String prefix = "";
           int idx = qName.indexOf(":");
           if (idx > 0)
  @@ -504,14 +532,24 @@
                                                          this);
           }
           
  -        if (nextHandler == null)
  -            nextHandler = nullHandler;
  +        if (nextHandler == null) {
  +            nextHandler = new SOAPHandler();
  +        }
           
           pushElementHandler(nextHandler);
  -        
  +
           nextHandler.startElement(namespace, localName, qName,
                                    attributes, this);
           
  +        if (recorder != null) {
  +            recorder.startElement(namespace, localName, qName,
  +                                  attributes);
  +            if (!doneParsing)
  +                curElement.setContentsIndex(recorder.getLength());
  +        }
  +        
  +        namespaces.push();
  +        
           startOfMappingsPos = -1;
       }
       
  @@ -541,6 +579,9 @@
               
           } catch (SAXException e) {
               e.printStackTrace();
  +        } finally {
  +            if (curElement != null)
  +                curElement = curElement.getParent();
           }
       }
   }
  
  
  
  1.10      +30 -4     xml-axis/java/src/org/apache/axis/encoding/Deserializer.java
  
  Index: Deserializer.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/Deserializer.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- Deserializer.java	2001/07/29 13:43:24	1.9
  +++ Deserializer.java	2001/08/14 03:49:18	1.10
  @@ -254,6 +254,10 @@
                                                          localName,
                                                          attributes);
               
  +            if (DEBUG_LOG) {
  +                System.out.println("Deser got type : " + type);
  +            }
  +            
               // We know we're deserializing, and we can't seem to figure
               // out a type... so let's give them a string.
               // ??? Is this the right thing to do?
  @@ -273,6 +277,14 @@
           }
       }
       
  +    public SOAPHandler onStartChild(String namespace, String localName,
  +                             String prefix, Attributes attributes,
  +                             DeserializationContext context)
  +        throws SAXException
  +    {
  +        return null;
  +    }
  +    
       public final void startElement(String namespace, String localName,
                                String qName, Attributes attributes,
                                DeserializationContext context)
  @@ -294,9 +306,23 @@
               }
               
               if (ref instanceof MessageElement) {
  +                /*
  +                if (this.getClass().equals(Deserializer.class)) {
  +                    QName type = ((MessageElement)ref).getType();
  +                    Deserializer dser = 
  +                                   context.getTypeMappingRegistry().getDeserializer(type);
  +                    System.out.println("dser = " + dser);
  +                    if (dser != null) {
  +                        dser.copyValueTargets(this);
  +                        context.replaceElementHandler(dser);
  +                    }
  +                }
  +                */
  +                context.replaceElementHandler(new EnvelopeHandler(this));
  +
                   SAX2EventRecorder r = context.recorder;
                   context.recorder = null;
  -                ((MessageElement)ref).publishContents(context);
  +                ((MessageElement)ref).publishToHandler(context);
                   context.recorder = r;
               }
               
  @@ -332,10 +358,10 @@
               SerializationContext serContext = 
                           new SerializationContext(writer,
                                                    context.getMessageContext());
  +            serContext.setSendDecl(false);
               SAXOutputter so = new SAXOutputter(serContext);
  -            context.getRecorder().replay(startIdx + 1,
  -                                         endIdx - 1,
  -                                         so);
  +            context.curElement.publishContents(so);
  +            
               value = writer.getBuffer().toString();
           }
       }
  
  
  
  1.33      +16 -4     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.32
  retrieving revision 1.33
  diff -u -r1.32 -r1.33
  --- SerializationContext.java	2001/08/09 13:37:59	1.32
  +++ SerializationContext.java	2001/08/14 03:49:18	1.33
  @@ -141,6 +141,11 @@
               doMultiRefs = shouldSendMultiRefs.booleanValue();
       }
       
  +    public void setSendDecl(boolean sendDecl)
  +    {
  +        sendXMLDecl = sendDecl;
  +    }
  +    
       public ServiceDescription getServiceDescription()
       {
           return msgContext.getServiceDescription();
  @@ -153,6 +158,11 @@
       
       public String getPrefixForURI(String uri)
       {
  +        return getPrefixForURI(uri, "ns" + lastPrefixIndex++);
  +    }
  +    
  +    public String getPrefixForURI(String uri, String defaultPrefix)
  +    {
           if ((uri == null) || (uri.equals("")))
               return null;
           
  @@ -164,13 +174,13 @@
           }
           
           if (prefix == null) {
  -            prefix = "ns" + lastPrefixIndex++;
  +            prefix = defaultPrefix;
               registerPrefixForURI(prefix, uri);
           }
           
           return prefix;
       }
  -    
  +
       public void registerPrefixForURI(String prefix, String uri)
       {
           if (DEBUG_LOG) {
  @@ -332,7 +342,7 @@
           
           ArrayList currentMappings = nsStack.peek();
           for (int i = 0; i < currentMappings.size(); i++) {
  -            NSStack.Mapping map = (NSStack.Mapping)currentMappings.get(i);
  +            Mapping map = (Mapping)currentMappings.get(i);
               buf.append(" xmlns");
               if (!map.getPrefix().equals("")) {
                   buf.append(":" + map.getPrefix());
  @@ -424,7 +434,9 @@
               for (int i = 0; i < attrMap.getLength(); i++) {
                 Attr attr = (Attr)attrMap.item(i);
                               
  -              attributes.addAttribute("", attr.getName(), attr.getName(),
  +              attributes.addAttribute(attr.getNamespaceURI(),
  +                                      attr.getName(),
  +                                      attr.getName(),
                                         "CDATA", attr.getValue());
               }
           }
  
  
  
  1.22      +9 -2      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.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- TypeMappingRegistry.java	2001/07/29 13:43:25	1.21
  +++ TypeMappingRegistry.java	2001/08/14 03:49:18	1.22
  @@ -218,8 +218,15 @@
           if (attributes != null)
               attrs.setAttributes(attributes);
           
  -        attrs.addAttribute(Constants.URI_CURRENT_SCHEMA_XSI, "type",
  -                           "xsi:type", "CDATA", context.qName2String(type));
  +        String prefix = context.
  +                           getPrefixForURI(Constants.URI_CURRENT_SCHEMA_XSI,
  +                                           "xsi");
  +        
  +        
  +        attrs.addAttribute(Constants.URI_CURRENT_SCHEMA_XSI,
  +                           "type",
  +                           prefix + ":type",
  +                           "CDATA", context.qName2String(type));
           return attrs;
       }
       
  
  
  
  1.5       +14 -3     xml-axis/java/src/org/apache/axis/message/BodyBuilder.java
  
  Index: BodyBuilder.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/BodyBuilder.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- BodyBuilder.java	2001/07/16 17:37:01	1.4
  +++ BodyBuilder.java	2001/08/14 03:49:19	1.5
  @@ -20,6 +20,13 @@
       boolean gotRPCElement = false;
       boolean isRPCElement = false;
       
  +    private SOAPEnvelope envelope;
  +    
  +    BodyBuilder(SOAPEnvelope envelope)
  +    {
  +        this.envelope = envelope;
  +    }
  +    
       public SOAPHandler onStartChild(String namespace,
                                        String localName,
                                        String prefix,
  @@ -71,13 +78,18 @@
               gotRPCElement = true;
               element = new RPCElement(namespace, localName, prefix,
                                        attributes, context);
  -            handler = new RPCHandler((RPCElement)element);
  +            //handler = new RPCHandler((RPCElement)element);
           } else {
               element = new SOAPBodyElement(namespace, localName, prefix,
                                         attributes, context);
               if (element.getFixupDeserializer() != null)
                   handler = element.getFixupDeserializer();
           }
  +
  +        if (handler == null)
  +            handler = new SOAPHandler();
  +        
  +        handler.myElement = element;
           
           if (DEBUG_LOG) {
               System.err.println("Out BodyBuilder.onStartChild()");
  @@ -93,8 +105,7 @@
           }
           
           if (element != null) {
  -            element.setEndIndex(context.getCurrentRecordPos());
  -            context.envelope.addBodyElement(element);
  +            envelope.addBodyElement(element);
               element = null;
           }
   
  
  
  
  1.5       +23 -7     xml-axis/java/src/org/apache/axis/message/EnvelopeBuilder.java
  
  Index: EnvelopeBuilder.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/EnvelopeBuilder.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- EnvelopeBuilder.java	2001/08/09 20:34:22	1.4
  +++ EnvelopeBuilder.java	2001/08/14 03:49:19	1.5
  @@ -14,6 +14,7 @@
   public class EnvelopeBuilder extends SOAPHandler
   {
       private MessageElement element;
  +    private SOAPEnvelope envelope;
       
       private boolean gotHeader = false;
       private boolean gotBody = false;
  @@ -23,6 +24,18 @@
       private static final QName bodyQName = new QName(Constants.URI_SOAP_ENV,
                                                          Constants.ELEM_BODY);
       
  +    public EnvelopeBuilder(String messageType)
  +    {
  +        envelope = new SOAPEnvelope(false);
  +        envelope.setMessageType(messageType);
  +        myElement = envelope;
  +    }
  +    
  +    public SOAPEnvelope getEnvelope()
  +    {
  +        return envelope;
  +    }
  +    
       public void startElement(String namespace, String localName,
                                String qName, Attributes attributes,
                                DeserializationContext context)
  @@ -40,8 +53,10 @@
           if (idx > 0)
               prefix = qName.substring(0, idx);
   
  -        context.getEnvelope().setPrefix(prefix);
  -        context.getEnvelope().setNamespaceURI(namespace);
  +        envelope.setPrefix(prefix);
  +        envelope.setNamespaceURI(namespace);
  +        envelope.setNSMappings(context.getCurrentNSMappings());
  +        context.pushNewElement(envelope);
       }
       
       public SOAPHandler onStartChild(String namespace,
  @@ -57,7 +72,7 @@
                   throw new SAXException("Only one Header element allowed!");
               
               gotHeader = true;
  -            return new HeaderBuilder();
  +            return new HeaderBuilder(envelope);
           }
           
           if (thisQName.equals(bodyQName)) {
  @@ -65,18 +80,20 @@
                   throw new SAXException("Only one Body element allowed!");
               
               gotBody = true;
  -            return new BodyBuilder();
  +            return new BodyBuilder(envelope);
           }
           
           if (!gotBody)
               throw new SAXException("No custom elements allowed at top level "+
                                      "until after the <Body>");
   
  +        /*
           element = new MessageElement(namespace, localName, prefix,
                                        attributes, context);
           
           if (element.getFixupDeserializer() != null)
               return element.getFixupDeserializer();
  +        */
           
           return null;
       }
  @@ -85,8 +102,7 @@
                              DeserializationContext context)
       {
           if (element != null) {
  -            element.setEndIndex(context.getCurrentRecordPos());
  -            context.getEnvelope().addTrailer(element);
  +            envelope.addTrailer(element);
           }
       }
   
  @@ -95,6 +111,6 @@
           throws SAXException
       {
           // Envelope isn't dirty yet by default...
  -        context.getEnvelope().setDirty(false);
  +        envelope.setDirty(false);
       }
   }
  
  
  
  1.4       +12 -4     xml-axis/java/src/org/apache/axis/message/HeaderBuilder.java
  
  Index: HeaderBuilder.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/HeaderBuilder.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- HeaderBuilder.java	2001/08/09 18:47:01	1.3
  +++ HeaderBuilder.java	2001/08/14 03:49:19	1.4
  @@ -12,7 +12,13 @@
   public class HeaderBuilder extends SOAPHandler
   {
       private SOAPHeader header;
  +    private SOAPEnvelope envelope;
       
  +    HeaderBuilder(SOAPEnvelope envelope)
  +    {
  +        this.envelope = envelope;
  +    }
  +    
       public SOAPHandler onStartChild(String namespace,
                                       String localName,
                                       String prefix,
  @@ -22,14 +28,16 @@
       {
           header = new SOAPHeader(namespace, localName, prefix,
                                   attributes, context);
  -        return null;
  +        
  +        SOAPHandler handler = new SOAPHandler();
  +        handler.myElement = header;
  +
  +        return handler;
       }
       
       public void onEndChild(String namespace, String localName,
                              DeserializationContext context)
       {
  -        header.setEndIndex(context.getCurrentRecordPos());
  -       
  -        context.envelope.addHeader(header);
  +        envelope.addHeader(header);
       }
   }
  
  
  
  1.43      +73 -3     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.42
  retrieving revision 1.43
  diff -u -r1.42 -r1.43
  --- MessageElement.java	2001/08/10 16:29:48	1.42
  +++ MessageElement.java	2001/08/14 03:49:19	1.43
  @@ -68,6 +68,7 @@
   import org.apache.axis.encoding.TypeMappingRegistry;
   import org.apache.axis.MessageContext;
   import org.apache.axis.utils.Debug;
  +import org.apache.axis.utils.Mapping;
   import org.apache.axis.utils.QName;
   import org.apache.axis.utils.XMLUtils;
   import java.util.*;
  @@ -98,16 +99,20 @@
       // Some message representations - as recorded SAX events...
       protected SAX2EventRecorder recorder = null;
       protected int startEventIndex = 0;
  +    protected int startContentsIndex = 0;
       protected int endEventIndex = -1;
       
       // ...or as DOM
       protected Element elementRep = null;
       
  +    protected MessageElement parent = null;
  +    // Do we need links to our children too?
  +    
       public ArrayList namespaces = null;
   
       /** No-arg constructor for building messages?
        */
  -    MessageElement()
  +    public MessageElement()
       {
       }
       
  @@ -124,7 +129,7 @@
           name = elem.getTagName();
       }
       
  -    MessageElement(String namespace, String localPart, String qName,
  +    public MessageElement(String namespace, String localPart, String qName,
                      Attributes attributes, DeserializationContext context)
       {
           if (DEBUG_LOG) {
  @@ -142,6 +147,9 @@
           
           this.context = context;
           this.startEventIndex = context.getStartOfMappingsPos();
  +        
  +        setNSMappings(context.getCurrentNSMappings());
  +        
           this.recorder = context.getRecorder();
   
           if (attributes == null) {
  @@ -207,6 +215,68 @@
       public SAX2EventRecorder getRecorder() { return recorder; }
       public void setRecorder(SAX2EventRecorder rec) { recorder = rec; }
       
  +    public MessageElement getParent() { return parent; }
  +    public void setParent(MessageElement parent) { this.parent = parent; }
  +    
  +    public void setContentsIndex(int index)
  +    {
  +        startContentsIndex = index;
  +    }
  +    
  +    public void setNSMappings(ArrayList namespaces)
  +    {
  +        this.namespaces = namespaces;
  +    }
  +
  +    public String getPrefix(String namespaceURI) {
  +        if ((namespaceURI == null) || (namespaceURI.equals("")))
  +            return null;
  +        
  +        if (href != null) {
  +            return getRealElement().getPrefix(namespaceURI);
  +        }
  +        
  +        if (namespaces != null) {
  +            for (int i = 0; i < namespaces.size(); i++) {
  +                Mapping map = (Mapping)namespaces.get(i);
  +                if (map.getNamespaceURI().equals(namespaceURI))
  +                    return map.getPrefix();
  +            }
  +        }
  +        
  +        if (parent != null)
  +            return parent.getPrefix(namespaceURI);
  +        
  +        return null;
  +    }
  +    
  +    public String getNamespaceURI(String prefix) {
  +        if (prefix == null)
  +            prefix = "";
  +        
  +        if (href != null) {
  +            return getRealElement().getNamespaceURI(prefix);
  +        }
  +        
  +        if (namespaces != null) {
  +            for (int i = 0; i < namespaces.size(); i++) {
  +                Mapping map = (Mapping)namespaces.get(i);
  +                if (map.getPrefix().equals(prefix)) {
  +                    return map.getNamespaceURI();
  +                }
  +            }
  +        }
  +        
  +        if (parent != null)
  +            return parent.getNamespaceURI(prefix);
  +
  +        if (DEBUG_LOG) {
  +            System.err.println(this + " didn't find prefix '" + prefix + "'");
  +        }
  +
  +        return null;
  +    }
  +    
       public Object getValueAsType(QName type) throws Exception
       {
           if (context == null)
  @@ -298,7 +368,7 @@
           if (recorder == null)
               throw new SAXException("No event recorder inside element");
           
  -        recorder.replay(startEventIndex+1, endEventIndex-1, handler);
  +        recorder.replay(startContentsIndex, endEventIndex-1, handler);
       }
       
       /** This is the public output() method, which will always simply use
  
  
  
  1.17      +31 -0     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.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- RPCElement.java	2001/07/18 01:14:50	1.16
  +++ RPCElement.java	2001/08/14 03:49:19	1.17
  @@ -10,11 +10,15 @@
   public class RPCElement extends SOAPBodyElement
   {
       protected Vector params = new Vector();
  +    protected boolean needDeser = false;
       
       public RPCElement(String namespace, String localName, String prefix,
                         Attributes attributes, DeserializationContext context)
       {
           super(namespace, localName, prefix, attributes, context);
  +
  +        // This came from parsing XML, so we need to deserialize it sometime
  +        needDeser = true;
       }
       
       public RPCElement(String namespace, String methodName,
  @@ -52,11 +56,29 @@
           return name;
       }
       
  +    public void deserialize() throws Exception
  +    {
  +        context.pushElementHandler(new EnvelopeHandler(new RPCHandler(this)));
  +        context.setCurElement(this);
  +        
  +        needDeser = false;
  +        
  +        publishToHandler(context);
  +    }
  +    
       /** This gets the FIRST param whose name matches.
        * !!! Should it return more in the case of duplicates?
        */
       public RPCParam getParam(String name)
       {
  +        if (needDeser) {
  +            try {
  +                deserialize();
  +            } catch (Exception e) {
  +                return null;
  +            }
  +        }
  +        
           for (int i = 0; i < params.size(); i++) {
               RPCParam param = (RPCParam)params.elementAt(i);
               if (param.getName().equals(name))
  @@ -68,6 +90,15 @@
       
       public Vector getParams()
       {
  +        if (needDeser) {
  +            try {
  +                deserialize();
  +            } catch (Exception e) {
  +                e.printStackTrace();
  +                return null;
  +            }
  +        }
  +
           return params;
       }
       
  
  
  
  1.2       +26 -0     xml-axis/java/src/org/apache/axis/message/SAX2EventRecorder.java
  
  Index: SAX2EventRecorder.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/SAX2EventRecorder.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- SAX2EventRecorder.java	2001/07/15 16:40:09	1.1
  +++ SAX2EventRecorder.java	2001/08/14 03:49:19	1.2
  @@ -1,8 +1,10 @@
   package org.apache.axis.message;
   
  +import java.util.ArrayList;
   import org.xml.sax.ContentHandler;
   import org.xml.sax.SAXException;
   import org.xml.sax.helpers.AttributesImpl;
  +import org.apache.axis.encoding.DeserializationContext;
   
   /**
    * This class records SAX2 Events and allows
  @@ -21,6 +23,10 @@
       private static final byte STATE_IGNORABLE_WHITESPACE = 8;
       private static final byte STATE_PROCESSING_INSTRUCTION = 9;
       private static final byte STATE_SKIPPED_ENTITY = 10;
  +    
  +    // This is a "custom" event which tells DeserializationContexts
  +    // that the current element is moving down the stack...
  +    private static final byte STATE_NEWELEMENT = 11;
   
       org.xml.sax.Locator locator;
       intArrayVector events = new intArrayVector();
  @@ -85,6 +91,18 @@
           return events.add(STATE_SKIPPED_ENTITY, st.addSymbol(p1), 0,0,0);
       }
       
  +    public int newElement(MessageElement elem)
  +    {
  +        return events.add(STATE_NEWELEMENT, addElement(elem), 0, 0, 0);
  +    }
  +    
  +    ArrayList elements = new ArrayList();
  +    private int addElement(MessageElement elem)
  +    {
  +        elements.add(elem);
  +        return elements.size() - 1;
  +    }
  +    
       public void replay(ContentHandler handler) throws SAXException {
           replay(0, events.getLength() - 1, handler);
       }
  @@ -147,6 +165,14 @@
                   break;
               case STATE_SKIPPED_ENTITY:
                   handler.skippedEntity(st.getSymbol(events.get(n,1)));
  +                break;
  +            case STATE_NEWELEMENT:
  +                if (handler instanceof DeserializationContext) {
  +                    DeserializationContext context =
  +                              (DeserializationContext)handler;
  +                    context.setCurElement(
  +                              (MessageElement)elements.get(events.get(n,1)));
  +                }
                   break;
               }
           }
  
  
  
  1.32      +19 -4     xml-axis/java/src/org/apache/axis/message/SOAPEnvelope.java
  
  Index: SOAPEnvelope.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/SOAPEnvelope.java,v
  retrieving revision 1.31
  retrieving revision 1.32
  diff -u -r1.31 -r1.32
  --- SOAPEnvelope.java	2001/08/10 13:08:22	1.31
  +++ SOAPEnvelope.java	2001/08/14 03:49:19	1.32
  @@ -59,6 +59,7 @@
   import java.util.*;
   import org.apache.axis.encoding.*;
   import org.apache.axis.Constants;
  +import org.apache.axis.utils.Mapping;
   import org.apache.axis.utils.QName;
   import org.apache.axis.AxisFault;
   import org.xml.sax.InputSource;
  @@ -80,12 +81,26 @@
       // This gets passed back into the service description during
       // deserialization 
       public String messageType;
  -  
  +    
       public SOAPEnvelope()
  +    {
  +        this(true);
  +    }
  +  
  +    public SOAPEnvelope(boolean registerPrefixes)
       {
  -        nsDecls.put(Constants.URI_SOAP_ENV, Constants.NSPREFIX_SOAP_ENV);
  -        nsDecls.put(Constants.URI_CURRENT_SCHEMA_XSD, Constants.NSPREFIX_SCHEMA_XSD);
  -        nsDecls.put(Constants.URI_CURRENT_SCHEMA_XSI, Constants.NSPREFIX_SCHEMA_XSI);
  +        if (registerPrefixes) {
  +            if (namespaces == null)
  +                namespaces = new ArrayList();
  +            
  +            namespaces.add(new Mapping(Constants.URI_SOAP_ENV,
  +                                       Constants.NSPREFIX_SOAP_ENV));
  +            namespaces.add(new Mapping(Constants.URI_CURRENT_SCHEMA_XSD,
  +                                       Constants.NSPREFIX_SCHEMA_XSD));
  +            namespaces.add(new Mapping(Constants.URI_CURRENT_SCHEMA_XSI,
  +                                       Constants.NSPREFIX_SCHEMA_XSI));
  +        }
  +        
           setDirty(true);
       }
       
  
  
  
  1.3       +13 -9     xml-axis/java/src/org/apache/axis/message/SOAPHandler.java
  
  Index: SOAPHandler.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/SOAPHandler.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- SOAPHandler.java	2001/07/16 17:37:03	1.2
  +++ SOAPHandler.java	2001/08/14 03:49:19	1.3
  @@ -16,25 +16,28 @@
   
   public class SOAPHandler extends DefaultHandler
   {
  +    public MessageElement myElement = null;
  +    
       public void startElement(String namespace, String localName,
                                String qName, Attributes attributes,
                                DeserializationContext context)
           throws SAXException
       {
  +        // By default, make a new element
  +        if (!context.doneParsing) {
  +            if (myElement == null)
  +                myElement = new MessageElement(namespace, localName,
  +                                               qName, attributes, context);
  +            context.pushNewElement(myElement);
  +        }
       }
       
       public void endElement(String namespace, String localName,
                              DeserializationContext context)
           throws SAXException
  -    {
  -    }
  -    
  -    public final SOAPHandler onStartChild(String namespace, String localName,
  -                             Attributes attributes,
  -                             DeserializationContext context)
  -        throws SAXException
       {
  -        return null;
  +        if (myElement != null)
  +            myElement.setEndIndex(context.getCurrentRecordPos());
       }
       
       public SOAPHandler onStartChild(String namespace, 
  @@ -44,7 +47,8 @@
                                       DeserializationContext context)
           throws SAXException
       {
  -        return null;
  +        SOAPHandler handler = new SOAPHandler();
  +        return handler;
       }
       
       public void onEndChild(String namespace, String localName,
  
  
  
  1.8       +0 -18     xml-axis/java/src/org/apache/axis/utils/NSStack.java
  
  Index: NSStack.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/utils/NSStack.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- NSStack.java	2001/07/16 17:37:07	1.7
  +++ NSStack.java	2001/08/14 03:49:19	1.8
  @@ -63,24 +63,6 @@
    * @author Glen Daniels (gdaniels@macromedia.com)
    */
   public class NSStack {
  -    public static class Mapping {
  -        public String namespaceURI;
  -        public String prefix;
  -        public Mapping(String namespaceURI, String prefix)
  -        {
  -            this.namespaceURI = namespaceURI;
  -            this.prefix = prefix;
  -        }
  -        
  -        public String getNamespaceURI()
  -        {
  -            return namespaceURI;
  -        }
  -        public String getPrefix()
  -        {
  -            return prefix;
  -        }
  -    }
       private static final boolean DEBUG_LOG = false;
       
       private static final ArrayList EMPTY = new ArrayList();
  
  
  
  1.1                  xml-axis/java/src/org/apache/axis/utils/Mapping.java
  
  Index: Mapping.java
  ===================================================================
  package org.apache.axis.utils;
  
  public class Mapping {
      public String namespaceURI;
      public String prefix;
      public Mapping(String namespaceURI, String prefix)
      {
          this.namespaceURI = namespaceURI;
          this.prefix = prefix;
      }
      
      public String getNamespaceURI()
      {
          return namespaceURI;
      }
      public String getPrefix()
      {
          return prefix;
      }
  }
  
  
  
  1.20      +1 -6      xml-axis/java/test/RPCDispatch/TestRPC.java
  
  Index: TestRPC.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/test/RPCDispatch/TestRPC.java,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- TestRPC.java	2001/07/17 14:08:33	1.19
  +++ TestRPC.java	2001/08/14 03:49:19	1.20
  @@ -59,8 +59,6 @@
   
           // Create the message context
           MessageContext msgContext = new MessageContext(engine);
  -        DeserializationContext deserContext =
  -            new DeserializationContext(msgContext, ServiceDescription.REQUEST);
   
           // Set the dispatch either by SOAPAction or methodNS
           String methodNS = null;
  @@ -69,11 +67,8 @@
           // Construct the soap request
           SOAPEnvelope envelope = new SOAPEnvelope();
           msgContext.setRequestMessage(new Message(envelope));
  -        RPCElement body = new RPCElement(methodNS, method, "", null, deserContext);
  +        RPCElement body = new RPCElement(methodNS, method, parms);
           envelope.addBodyElement(body);
  -        for (int i=0; i<parms.length; i++) {
  -            body.addParam(new RPCParam("arg"+i, parms[i]));
  -        }
   
           // Invoke the Axis engine
           try {
  
  
  
  1.16      +6 -0      xml-axis/java/test/encoding/TestDeser.java
  
  Index: TestDeser.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/test/encoding/TestDeser.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- TestDeser.java	2001/08/09 15:05:39	1.15
  +++ TestDeser.java	2001/08/14 03:49:19	1.16
  @@ -208,4 +208,10 @@
       public void testUntyped() throws Exception {
            deserialize("<result>10</result>", "10");
       }
  +    
  +    public static void main(String [] args) throws Exception
  +    {
  +        TestDeser tester = new TestDeser("test");
  +        tester.testUntyped();
  +    }
   }
  
  
  
  1.11      +6 -36     xml-axis/java/test/encoding/TestHrefs.java
  
  Index: TestHrefs.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/test/encoding/TestHrefs.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- TestHrefs.java	2001/08/07 18:58:48	1.10
  +++ TestHrefs.java	2001/08/14 03:49:19	1.11
  @@ -33,7 +33,7 @@
       {
           TestHrefs tester = new TestHrefs("me");
           try {
  -            tester.testStringReference();
  +            tester.testStringReference2();
           } catch (Exception e) {
               e.printStackTrace();
           }
  @@ -91,46 +91,16 @@
          assertEquals("case " + pos, expected, result);
       }
   
  -    public void testStringReference() throws Exception {
  +    public void testStringReference1() throws Exception {
           String result = 
               "<result root=\"0\" id=\"1\" xsi:type=\"xsd:string\">abc</result>";
           deserialize(result, "abc", 0);
  -        deserialize(result, "abc", 1);
  -    }
  -
  -    /*
  -    public void testBoolean() throws Exception {
  -        deserialize("<result xsi:type=\"xsd:boolean\">true</result>",
  -                    new Boolean(true));
  -    }
  -
  -    public void testDouble() throws Exception {
  -        deserialize("<result xsi:type=\"xsd:double\">3.14</result>",
  -                    new Double(3.14));
  -    }
  -
  -    public void testFloat() throws Exception {
  -        deserialize("<result xsi:type=\"xsd:float\">3.14</result>",
  -                    new Float(3.14F));
       }
   
  -    public void testInt() throws Exception {
  -        deserialize("<result xsi:type=\"xsd:int\">10</result>",
  -                    new Integer(10));
  -    }
  -
  -    public void testLong() throws Exception {
  -        deserialize("<result xsi:type=\"xsd:long\">17</result>",
  -                    new Long(17));
  -    }
  -
  -    public void testShort() throws Exception {
  -        deserialize("<result xsi:type=\"xsd:short\">3</result>",
  -                    new Short((short)3));
  +    public void testStringReference2() throws Exception {
  +        String result = 
  +            "<result root=\"0\" id=\"1\" xsi:type=\"xsd:string\">abc</result>";
  +        deserialize(result, "abc", 1);
       }
   
  -    public void testUntyped() throws Exception {
  -         deserialize("<result>10</result>", "10");
  -    }
  -    */
   }
  
  
  
  1.8       +10 -0     xml-axis/java/test/encoding/TestSer.java
  
  Index: TestSer.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/test/encoding/TestSer.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- TestSer.java	2001/07/15 23:38:30	1.7
  +++ TestSer.java	2001/08/14 03:49:19	1.8
  @@ -17,6 +17,12 @@
   
       public static final String myNS = "urn:myNS";
       
  +    public static void main(String [] args) throws Exception
  +    {
  +        TestSer tester = new TestSer("TestSer");
  +        tester.testData();
  +    }
  +    
       public TestSer(String name) {
           super(name);
       }
  @@ -45,6 +51,10 @@
           msg.output(context);
           
           String msgString = stringWriter.toString();
  +        
  +        System.out.println("---");
  +        System.out.println(msgString);
  +        System.out.println("---");
           
           StringReader reader = new StringReader(msgString);