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 di...@apache.org on 2004/10/15 01:37:03 UTC

cvs commit: ws-axis/java/test/message TestMessageElement.java

dims        2004/10/14 16:37:03

  Modified:    java/src/org/apache/axis/message MessageElement.java
                        NodeImpl.java
               java/test/message TestMessageElement.java
  Log:
  Fix for AXIS-1532 - NodeImpl#setValue() does not behave according to SAAJ Node API
  from Ian P. Springer (ian.springer@hp.com)
  
  Revision  Changes    Path
  1.185     +13 -0     ws-axis/java/src/org/apache/axis/message/MessageElement.java
  
  Index: MessageElement.java
  ===================================================================
  RCS file: /home/cvs/ws-axis/java/src/org/apache/axis/message/MessageElement.java,v
  retrieving revision 1.184
  retrieving revision 1.185
  diff -u -r1.184 -r1.185
  --- MessageElement.java	14 Oct 2004 18:50:16 -0000	1.184
  +++ MessageElement.java	14 Oct 2004 23:37:03 -0000	1.185
  @@ -2079,4 +2079,17 @@
           }
           return null;
       }
  +
  +    public void setValue( String value )
  +    {
  +        // if possible, get objectValue in sync with Node value
  +        if (children==null) {
  +            try {
  +                setObjectValue(value);
  +            } catch ( SOAPException soape ) {
  +                log.debug("setValue()", soape);
  +            }
  +        }
  +        super.setValue(value);
  +    }
   }
  
  
  
  1.6       +12 -11    ws-axis/java/src/org/apache/axis/message/NodeImpl.java
  
  Index: NodeImpl.java
  ===================================================================
  RCS file: /home/cvs/ws-axis/java/src/org/apache/axis/message/NodeImpl.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- NodeImpl.java	14 Oct 2004 18:50:17 -0000	1.5
  +++ NodeImpl.java	14 Oct 2004 23:37:03 -0000	1.6
  @@ -652,18 +652,19 @@
        */
       public void setValue(String value) {
           if (this instanceof org.apache.axis.message.Text) {
  -            this.setNodeValue(value);
  -            return;
  -        }
  -        if (children != null)
  -            for (int i = 0; i < children.size(); i++) {
  -                NodeImpl child = (NodeImpl) children.get(i);
  -                if (child instanceof org.apache.axis.message.Text) {
  -                    child.setValue(value);
  -                    return;
  -                }
  +            setNodeValue(value);
  +        } else if (children != null) {
  +            if (children.size() != 1) {
  +                throw new IllegalStateException( "setValue() may not be called on a non-Text node with more than one child." );
  +            }
  +            javax.xml.soap.Node child = (javax.xml.soap.Node) children.get(0);
  +            if (!(child instanceof org.apache.axis.message.Text)) {
  +                throw new IllegalStateException( "setValue() may not be called on a non-Text node with a non-Text child." );
               }
  -        throw new IllegalStateException("Cannot call set for Non Text Node");
  +            ((javax.xml.soap.Text)child).setNodeValue(value);
  +        } else {
  +            appendChild(new org.apache.axis.message.Text(value));
  +        }
       }
   
       /**
  
  
  
  1.17      +89 -14    ws-axis/java/test/message/TestMessageElement.java
  
  Index: TestMessageElement.java
  ===================================================================
  RCS file: /home/cvs/ws-axis/java/test/message/TestMessageElement.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- TestMessageElement.java	29 Jul 2004 21:40:28 -0000	1.16
  +++ TestMessageElement.java	14 Oct 2004 23:37:03 -0000	1.17
  @@ -18,17 +18,18 @@
   
   import org.apache.axis.Message;
   import org.apache.axis.MessageContext;
  +import org.apache.axis.server.AxisServer;
   import org.apache.axis.client.AxisClient;
   import org.apache.axis.encoding.DeserializationContext;
   import org.apache.axis.message.EnvelopeBuilder;
   import org.apache.axis.message.MessageElement;
   import org.apache.axis.message.PrefixedQName;
   import org.apache.axis.soap.SOAPConstants;
  +import org.apache.axis.soap.MessageFactoryImpl;
   import org.apache.axis.utils.XMLUtils;
   import org.w3c.dom.Document;
  -import org.w3c.dom.Element;
  -import org.w3c.dom.CDATASection;
   import org.xml.sax.Attributes;
  +import org.xml.sax.InputSource;
   import test.AxisTestBase;
   
   import javax.xml.namespace.QName;
  @@ -40,17 +41,20 @@
   import javax.xml.soap.SOAPEnvelope;
   import javax.xml.soap.SOAPMessage;
   import javax.xml.soap.SOAPPart;
  -import javax.xml.parsers.DocumentBuilderFactory;
  -import javax.xml.parsers.DocumentBuilder;
  +import javax.xml.soap.Text;
   import java.io.ByteArrayInputStream;
   import java.io.ByteArrayOutputStream;
   import java.io.ObjectInputStream;
   import java.io.ObjectOutputStream;
   import java.io.StringReader;
  +import java.io.OutputStream;
   import java.util.Iterator;
   
  +import junit.framework.TestSuite;
  +import junit.textui.TestRunner;
  +
   /**
  - * Test MessageElement class.
  + * Test {@link MessageElement} class.
    *
    * @author Glyn Normington (glyn@apache.org)
    */
  @@ -101,6 +105,7 @@
           assertEquals("Child 1 not found", child1, c1only.next());
           assertTrue("Unexpected child", !c1only.hasNext());
       }
  +
       public void testDetachNode() throws Exception {
           SOAPConstants sc = SOAPConstants.SOAP11_CONSTANTS;
           EnvelopeBuilder eb = new EnvelopeBuilder(Message.REQUEST, sc);
  @@ -193,9 +198,6 @@
               String A_PREFIX = "a";
               String A_NAMESPACE_URI = "http://schemas.com/a";
               String AA_TAG = "AA";
  -            String B_TAG = "B";
  -            String B_PREFIX = "b";
  -            String B_NAMESPACE_URI = "http://schemas.com/b";
   
               MessageFactory messageFactory = MessageFactory.newInstance();
               SOAPMessage message = messageFactory.createMessage();
  @@ -207,7 +209,7 @@
   
               Name aName = envelope.createName(A_TAG, A_PREFIX, A_NAMESPACE_URI);
               SOAPBodyElement aBodyElement = body.addBodyElement(aName);
  -            SOAPElement bElement = aBodyElement.addChildElement(AA_TAG, A_PREFIX);
  +            aBodyElement.addChildElement(AA_TAG, A_PREFIX);
               String data = envelope.toString();
   
               MessageContext ctx = new MessageContext(new AxisClient());
  @@ -219,8 +221,8 @@
               MessageElement elem = dser.getEnvelope().getBodyByName(A_NAMESPACE_URI, A_TAG);
               Iterator iterator = elem.getChildElements();
               while(iterator.hasNext()){
  -                MessageElement elem2 = (MessageElement)iterator.next();
  -                Name name = elem2.getElementName();
  +                MessageElement childElem = (MessageElement)iterator.next();
  +                Name name = childElem.getElementName();
                   assertEquals(A_NAMESPACE_URI, name.getURI());
                   assertEquals(AA_TAG, name.getLocalName());
               }    
  @@ -304,9 +306,82 @@
           System.out.println(xmlOut);
           this.assertXMLEqual(xmlIn,xmlOut);
       }
  -    
  +
  +    /**
  +     * Test setting the text value on a MessageElement in various ways.
  +     *
  +     * @throws Exception on error
  +     */ 
  +    public void testSetValue() throws Exception
  +    {
  +        MessageElement me;
  +        final QName name = new QName( "urn:xyz", "foo", "xyz" );
  +        final String value = "java";
  +        // Test #1: set value via MessageElement(name, value) constructor
  +        me = new MessageElement( name, value );
  +        assertEquals( value, me.getValue() );
  +        assertEquals( value, me.getObjectValue() );
  +        // Test #2a: set value via setValue(value)
  +        me = new MessageElement( name );
  +        me.setValue( value );
  +        assertEquals( value, me.getValue() );
  +        assertEquals( value, me.getObjectValue() );
  +        // Test #2b: call setValue(value) on SOAPElement w/ more than one child (illegal)
  +        me = new MessageElement( name );
  +        me.addTextNode("cobol");
  +        me.addTextNode("fortran");
  +        try
  +        {
  +            me.setValue( value );
  +            fail("setValue() should throw an IllegalStateException when called on a SOAPElement with more than one child");
  +        }
  +        catch ( RuntimeException re )
  +        {
  +            assertTrue(re instanceof IllegalStateException);
  +        }
  +        // Test #2c: call setValue(value) on SOAPElement w/ a non-Text child (illegal)
  +        me = new MessageElement( name );
  +        me.addChildElement("pascal");
  +        try
  +        {
  +            me.setValue( value );
  +            fail("setValue() should throw an IllegalStateException when called on a SOAPElement with a non-Text child");
  +        }
  +        catch ( RuntimeException re )
  +        {
  +            assertTrue(re instanceof IllegalStateException);
  +        }
  +        // Test #2d: set value via setValue(value) on Text child
  +        me = new MessageElement( name );
  +        me.addTextNode( "c++" );
  +        Object child = me.getChildren().get(0);
  +        assertTrue( child instanceof Text );
  +        ((Text)child).setValue( value );
  +        assertEquals( value, me.getValue());
  +        assertEquals( null, me.getObjectValue());
  +        // Test #3: set value via setObjectValue(value)
  +        me = new MessageElement( name );
  +        me.setObjectValue( value );
  +        assertEquals( value, me.getValue());
  +        assertEquals( value, me.getObjectValue());
  +        // Test #4: set value via addTextNode(value)
  +        me = new MessageElement( name );
  +        me.addTextNode( value );
  +        assertEquals( value, me.getValue());
  +        assertEquals( null, me.getObjectValue());
  +        // Test #5: set value via dser.parse()
  +        SOAPMessage msg = MessageFactoryImpl.newInstance().createMessage();
  +        msg.getSOAPBody().addChildElement(new org.apache.axis.message.SOAPBodyElement(name, value));
  +        OutputStream os = new ByteArrayOutputStream( );
  +        msg.writeTo(os);
  +        DeserializationContext dser = new DeserializationContext(new InputSource(new StringReader(os.toString())), new MessageContext(new AxisServer()),Message.REQUEST);
  +        dser.parse();
  +        me = (MessageElement) dser.getEnvelope().getBodyElements().get( 0 );
  +        assertEquals( value, me.getValue());
  +        assertEquals( value, me.getObjectValue());
  +    }
  +
       public static void main(String[] args) throws Exception {
  -        TestMessageElement tester = new TestMessageElement("TestMessageElement");
  -        tester.testQNameAttrTest();
  +        new TestRunner().doRun( new TestMessageElement( "TestMessageElement" ) );
       }
   }