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/06 17:57:21 UTC

cvs commit: xml-axis/java/src/org/apache/axis/message RPCElement.java RPCParam.java SOAPEnvelope.java SOAPSAXHandler.java

gdaniels    01/05/06 08:57:21

  Modified:    java/src/org/apache/axis Message.java
               java/src/org/apache/axis/encoding ArraySerializer.java
                        DeserializerBase.java
               java/src/org/apache/axis/message RPCElement.java
                        RPCParam.java SOAPEnvelope.java SOAPSAXHandler.java
  Log:
  Improvements to array serialization and ID/HREF handling.
  
  We should now hopefully be able to pass all the interop echo tests
  (including echoStructArray) even when getting results with arbitrary
  usage of id/hrefs.
  
  Some salient points about the changes:
  
  * RPCParams now process their own startElement events,
    and get pushed onto the element handler stack like anything
    else.  This is a step towards cleaning up the handler
    model, and allows us to much more simply process things
    like the type attribute on the target of an href.
  
  * Due to the above, I put in a replaceElementHandler()
    method in SOAPSAXHandler.  This lets the RPCParam
    put its deserializer at the top of the stack once it
    starts getting content, without pushing an extra level.
  
  * Create a new MessageContext in Message if we need
    one and haven't had one assigned.  This was breaking
    many of the tests that created Messages directly.
  
  * Now that the basics are almost all there, it's time for
    more tests and cleanup.
  
  Revision  Changes    Path
  1.31      +2 -0      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.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- Message.java	2001/05/05 23:44:43	1.30
  +++ Message.java	2001/05/06 15:57:20	1.31
  @@ -331,6 +331,8 @@
       
       // ThreadedSAXAdapter parser = 
       //    new ThreadedSAXAdapter(new org.apache.xerces.parsers.SAXParser(), is);
  +    if (msgContext == null)
  +        msgContext = new MessageContext();
       SAXAdapter parser = 
           new SAXAdapter(new org.apache.xerces.parsers.SAXParser(), is, 
                          msgContext);
  
  
  
  1.3       +0 -5      xml-axis/java/src/org/apache/axis/encoding/ArraySerializer.java
  
  Index: ArraySerializer.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/ArraySerializer.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ArraySerializer.java	2001/05/05 18:23:55	1.2
  +++ ArraySerializer.java	2001/05/06 15:57:20	1.3
  @@ -93,8 +93,6 @@
       {
           super.startElement(namespace, localName, qName, attributes);
           
  -        System.out.println("In Array.startElement");
  -
           QName arrayTypeValue = context.getQNameFromString(
                    attributes.getValue(Constants.URI_SOAP_ENC,
                                        Constants.ATTR_ARRAY_TYPE));
  @@ -164,9 +162,6 @@
                                String qName, Attributes attributes)
           throws SAXException
       {
  -        // Array element
  -        System.out.println("In array element...");
  -        
           // !!! Check position attribute, type attribute....
           QName itemType = context.getTypeFromAttributes(attributes);
           
  
  
  
  1.6       +0 -29     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.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- DeserializerBase.java	2001/05/05 13:47:12	1.5
  +++ DeserializerBase.java	2001/05/06 15:57:20	1.6
  @@ -209,35 +209,6 @@
                                String qName, Attributes attributes)
           throws SAXException
       {
  -        String href = attributes.getValue("href");
  -        if (href != null) {
  -            if (DEBUG_LOG) {
  -                System.err.println("looking for href " + href);
  -            }
  -            
  -            MessageElement target = context.getElementByID(href.substring(1));
  -            if (target != null) {
  -                if (DEBUG_LOG)
  -                    System.out.println("found target " + target);
  -                
  -                DeserializerBase rec = target.getContentHandler();
  -                if (rec == null)
  -                    throw new SAXException("No handler in target element?");
  -                
  -                if (rec instanceof ElementRecorder) {
  -                    ((ElementRecorder)rec).publishChildrenToHandler(context.getSAXHandler());
  -                } else {
  -                    this.value = rec.value;
  -                }
  -                
  -                // Might want to somehow write deserialized version
  -                // back to the IDmapping table...
  -                
  -                return;
  -            }
  -            
  -            context.addFixupHandler(href.substring(1), this);
  -        }
       }
       
       public void endElement(String namespace, String localName,
  
  
  
  1.7       +1 -18     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.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- RPCElement.java	2001/05/05 22:16:58	1.6
  +++ RPCElement.java	2001/05/06 15:57:20	1.7
  @@ -144,25 +144,8 @@
           RPCParam param = new RPCParam(namespace, name, attributes, context);
           
           params.addElement(param);
  -        if (param.getType() == null) {
  -            // No type inline, so check service description.
  -            ServiceDescription serviceDesc = context.getServiceDescription();
  -            if (serviceDesc != null) {
  -                param.setType(serviceDesc.getParamTypeByName(getEnvelope().getMessageType(),
  -                                                             param.getName()));
  -            }
  -        } else {
  -            /** !!! If we have a service description and this is an
  -            * explicitly-typed param, we might want to check here to
  -            * see if the xsi:type val is indeed a subtype of the type
  -            * we expect from the service description.
  -            */
  -            
  -        }
           
  -        DeserializerBase handler = param.getContentHandler(context);
  -        
  -        context.pushElementHandler(handler);
  +        context.pushElementHandler(param);
       }
   
       public void output(SerializationContext context)
  
  
  
  1.15      +44 -2     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.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- RPCParam.java	2001/05/05 22:16:58	1.14
  +++ RPCParam.java	2001/05/06 15:57:20	1.15
  @@ -83,8 +83,6 @@
       {
           super(namespace, localName, attrs, context);
           name = localName;
  -        
  -        typeQName = context.getTypeFromAttributes(attrs);
       }
       
       /** Constructor for building up messages.
  @@ -119,8 +117,52 @@
           return super.getEnvelope();
       }
       
  +    public void startElement(String namespace, String localName,
  +                             String qName, Attributes attributes)
  +        throws SAXException
  +    {
  +        if (DEBUG_LOG) {
  +            System.err.println("Start element in RPCParam.");
  +        }
  +        typeQName = context.getTypeFromAttributes(attributes);
  +        if (typeQName == null) {
  +            // No type inline, so check service description.
  +            ServiceDescription serviceDesc = context.getServiceDescription();
  +            if (serviceDesc != null) {
  +                setType(serviceDesc.getParamTypeByName(getEnvelope().getMessageType(),
  +                                                             name));
  +            }
  +        } else {
  +            /** !!! If we have a service description and this is an
  +            * explicitly-typed param, we might want to check here to
  +            * see if the xsi:type val is indeed a subtype of the type
  +            * we expect from the service description.
  +            */
  +        }
  +        
  +        DeserializerBase dSer = getContentHandler(context);
  +        
  +        context.getSAXHandler().replaceElementHandler(dSer);
  +        
  +        dSer.startElement(namespace,localName,qName,attributes);
  +    }
  +    
       public DeserializerBase getContentHandler(DeserializationContext context)
       {
  +        // !!! Does this check want to live here?
  +        if (typeQName == null) {
  +            QName myQName = new QName(namespaceURI, name);
  +            if (myQName.equals(SOAPTypeMappingRegistry.SOAP_ARRAY)) {
  +                typeQName = SOAPTypeMappingRegistry.SOAP_ARRAY;
  +            } else if (myQName.equals(SOAPTypeMappingRegistry.SOAP_INT)) {
  +                typeQName = SOAPTypeMappingRegistry.XSD_INT;
  +            } else if (myQName.equals(SOAPTypeMappingRegistry.SOAP_BOOLEAN)) {
  +                typeQName = SOAPTypeMappingRegistry.XSD_BOOLEAN;
  +            } else if (myQName.equals(SOAPTypeMappingRegistry.SOAP_SHORT)) {
  +                typeQName = SOAPTypeMappingRegistry.XSD_SHORT;
  +            }
  +        }
  +
           // Look up type and return an appropriate deserializer
           if (typeQName != null) {
               deserializer = context.getDeserializer(typeQName);
  
  
  
  1.23      +3 -0      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.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- SOAPEnvelope.java	2001/05/05 22:16:59	1.22
  +++ SOAPEnvelope.java	2001/05/06 15:57:20	1.23
  @@ -133,6 +133,9 @@
               handler.parseToEnd();
           }
           
  +        if (bodyElements.isEmpty())
  +            return null;
  +        
           return (SOAPBodyElement)bodyElements.elementAt(0);
       }
       
  
  
  
  1.10      +56 -5     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.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- SOAPSAXHandler.java	2001/05/05 22:16:59	1.9
  +++ SOAPSAXHandler.java	2001/05/06 15:57:20	1.10
  @@ -131,7 +131,7 @@
               if ((serviceDesc != null) && (!serviceDesc.isRPC())) {
                   return new SOAPBodyElement(namespace, localName, attributes, context);
               }
  -            
  +
               return RPCElement.getFactory().createElement(namespace,
                                                            localName,
                                                            attributes,
  @@ -333,6 +333,15 @@
           }
       }
       
  +    /** This is so RPCParams can replace themselves on the handler stack
  +     * without pushing.  Allows deserialization of multi-refs to work
  +     * correctly.
  +     */
  +    public void replaceElementHandler(DeserializerBase newHandler)
  +    {
  +        elementHandler = newHandler;
  +    }
  +    
       /****************************************************************
        * SAX event handlers
        */
  @@ -391,6 +400,44 @@
           if (elementHandler != null) elementHandler.skippedEntity(p1);
       }
   
  +    public boolean needsStartElement(Attributes attributes)
  +        throws SAXException
  +    {
  +        String href = attributes.getValue(Constants.ATTR_HREF);
  +        if (href != null) {
  +            if (DEBUG_LOG) {
  +                System.err.println("looking for href " + href);
  +            }
  +            
  +            MessageElement target = context.getElementByID(href.substring(1));
  +            if (target != null) {
  +                if (DEBUG_LOG)
  +                    System.out.println("found target " + target);
  +                
  +                DeserializerBase rec = target.getContentHandler();
  +                if (rec == null)
  +                    throw new SAXException("No handler in target element?");
  +                
  +                if (rec instanceof ElementRecorder) {
  +                    ((ElementRecorder)rec).publishToHandler(context.getSAXHandler());
  +                } else {
  +                    System.out.println("Setting value to " + rec.getValue());
  +                    elementHandler.setValue(rec.getValue());
  +                }
  +                
  +                // Might want to somehow write deserialized version
  +                // back to the IDmapping table...
  +                
  +                return false;
  +            }
  +            
  +            context.addFixupHandler(href.substring(1), elementHandler);
  +            return false;
  +        }
  +
  +        return true;
  +    }
  +    
       /** This is a big workhorse.  Manage the state of the parser, check for
        * basic SOAP compliance (envelope, then optional header, then body, etc).
        * 
  @@ -415,8 +462,10 @@
               // push another handler onto the element stack.
               elementHandler.onStartChild(namespace, localName, qName, attributes);
               
  -            // This may, therefore, refer to a different handler than the last line.
  -            elementHandler.startElement(namespace, localName, qName, attributes);
  +            if (needsStartElement(attributes)) {
  +                // This may, therefore, refer to a different handler than the last one.
  +                elementHandler.startElement(namespace, localName, qName, attributes);
  +            }
               
               recordingDepth++;
               
  @@ -506,7 +555,7 @@
               default:
                   throw new SAXException("In unknown parsing state!");
               }
  -            
  +
               // Let the event stream run until the end of this element,
               // sending the events to an appropriate handler.
               if (element != null) {
  @@ -536,7 +585,9 @@
                   pushElementHandler(handler);
   
                   elementHandler.setDeserializationContext(context);
  -                elementHandler.startElement(namespace, localName, qName, attributes);
  +                
  +                if (needsStartElement(attributes))
  +                    elementHandler.startElement(namespace, localName, qName, attributes);
               }
           } catch (SAXException saxEx) {
               throw saxEx;