blob: 876fd3862395a2286f082a2092ab789cb5a5646e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.axis2.saaj;
import junit.framework.Assert;
import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPConstants;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPFactory;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPHeaderElement;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import javax.xml.soap.Text;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.util.ArrayList;
import java.util.Iterator;
@RunWith(SAAJTestRunner.class)
public class SOAPHeaderTest extends Assert {
private MessageFactory mf = null;
private SOAPMessage msg = null;
private SOAPPart sp = null;
private SOAPEnvelope envelope = null;
private SOAPHeader hdr = null;
private SOAPHeaderElement she1 = null;
private SOAPHeaderElement she2 = null;
@Validated @Test
public void testAddHeaderElements() throws Exception {
javax.xml.soap.SOAPMessage soapMessage =
javax.xml.soap.MessageFactory.newInstance().createMessage();
javax.xml.soap.SOAPEnvelope soapEnv =
soapMessage.getSOAPPart().getEnvelope();
javax.xml.soap.SOAPHeader header = soapEnv.getHeader();
try {
header.addChildElement("ebxmlms1");
} catch (Exception e) {
assertTrue(e instanceof SOAPException);
}
assertTrue(header.addChildElement("ebxmlms1", "ns-prefix",
"http://test.apache.org") instanceof SOAPHeaderElement);
((SOAPHeaderElement)header.getFirstChild()).addTextNode("test add");
assertTrue(header.addHeaderElement(
soapEnv.createName("ebxmlms2", "ns-prefix", "http://test2.apache.org")) != null);
assertTrue(header.addHeaderElement(
new PrefixedQName("http://test3.apache.org", "ebxmlms3", "ns-prefix")) != null);
SOAPHeaderElement firstChild = (SOAPHeaderElement)header.getFirstChild();
assertEquals("ebxmlms1", firstChild.getLocalName());
assertEquals("ns-prefix", firstChild.getPrefix());
assertEquals("http://test.apache.org", firstChild.getNamespaceURI());
SOAPHeaderElement secondChild = (SOAPHeaderElement)firstChild.getNextSibling();
assertEquals("ebxmlms2", secondChild.getLocalName());
assertEquals("ns-prefix", secondChild.getPrefix());
assertEquals("http://test2.apache.org", secondChild.getNamespaceURI());
SOAPHeaderElement lastChild = (SOAPHeaderElement)header.getLastChild();
assertEquals("ebxmlms3", lastChild.getLocalName());
assertEquals("ns-prefix", lastChild.getPrefix());
assertEquals("http://test3.apache.org", lastChild.getNamespaceURI());
SOAPHeaderElement fourthChild = (SOAPHeaderElement)lastChild.getPreviousSibling();
assertEquals("ebxmlms2", fourthChild.getLocalName());
assertEquals("ns-prefix", fourthChild.getPrefix());
assertEquals("http://test2.apache.org", fourthChild.getNamespaceURI());
Iterator it = header.getChildElements();
int numOfHeaderElements = 0;
while (it.hasNext()) {
Object o = it.next();
assertTrue(o instanceof SOAPHeaderElement);
SOAPHeaderElement el = (SOAPHeaderElement)o;
String lName = el.getLocalName();
assertTrue(lName.equals("ebxmlms" + ++numOfHeaderElements));
}
assertEquals(3, numOfHeaderElements);
}
@Validated @Test
public void testHeaders() {
try {
// Create message factory and SOAP factory
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPFactory soapFactory = SOAPFactory.newInstance();
// Create a message
SOAPMessage message = messageFactory.createMessage();
// Get the SOAP header from the message and
// add headers to it
SOAPHeader header = message.getSOAPHeader();
String nameSpace = "ns";
String nameSpaceURI = "http://gizmos.com/NSURI";
Name order =
soapFactory.createName("orderDesk", nameSpace, nameSpaceURI);
SOAPHeaderElement orderHeader = header.addHeaderElement(order);
orderHeader.setActor("http://gizmos.com/orders");
Name shipping =
soapFactory.createName("shippingDesk", nameSpace, nameSpaceURI);
SOAPHeaderElement shippingHeader =
header.addHeaderElement(shipping);
shippingHeader.setActor("http://gizmos.com/shipping");
Name confirmation =
soapFactory.createName("confirmationDesk", nameSpace,
nameSpaceURI);
SOAPHeaderElement confirmationHeader =
header.addHeaderElement(confirmation);
confirmationHeader.setActor("http://gizmos.com/confirmations");
Name billing =
soapFactory.createName("billingDesk", nameSpace, nameSpaceURI);
SOAPHeaderElement billingHeader = header.addHeaderElement(billing);
billingHeader.setActor("http://gizmos.com/billing");
// Add header with mustUnderstand attribute
Name tName =
soapFactory.createName("Transaction", "t",
"http://gizmos.com/orders");
SOAPHeaderElement transaction = header.addHeaderElement(tName);
transaction.setMustUnderstand(true);
transaction.addTextNode("5");
// Get the SOAP body from the message but leave
// it empty
SOAPBody body = message.getSOAPBody();
message.saveChanges();
// Display the message that would be sent
//System.out.println("\n----- Request Message ----\n");
//message.writeTo(System.out);
// Look at the headers
Iterator allHeaders = header.examineAllHeaderElements();
while (allHeaders.hasNext()) {
SOAPHeaderElement headerElement =
(SOAPHeaderElement)allHeaders.next();
Name headerName = headerElement.getElementName();
//System.out.println("\nHeader name is " +
// headerName.getQualifiedName());
//System.out.println("Actor is " + headerElement.getActor());
//System.out.println("mustUnderstand is " +
// headerElement.getMustUnderstand());
}
} catch (Exception e) {
fail("Enexpected Exception " + e);
}
}
@Before
public void setUp() throws Exception {
msg = MessageFactory.newInstance().createMessage();
sp = msg.getSOAPPart();
envelope = sp.getEnvelope();
hdr = envelope.getHeader();
}
@Validated @Test
public void testExamineHeader() {
SOAPHeaderElement she = null;
try {
she1 = hdr.addHeaderElement(envelope.createName("foo1", "f1", "foo1-URI"));
she1.setActor("actor-URI");
Iterator iterator = hdr.examineAllHeaderElements();
int cnt = 0;
while (iterator.hasNext()) {
cnt++;
she = (SOAPHeaderElement)iterator.next();
if (!she.equals(she1)) {
fail("SOAP Header Elements do not match");
}
}
if (cnt != 1) {
fail("SOAPHeaderElement count mismatch: expected 1, received " + cnt);
}
iterator = hdr.examineAllHeaderElements();
if (!iterator.hasNext()) {
fail("no elements in iterator - unexpected");
}
} catch (Exception e) {
fail("Unexpected Exception: " + e);
}
}
@Validated @Test
public void testAddNotUnderstoodHeaderElement() throws Exception {
javax.xml.soap.SOAPMessage soapMessage =
javax.xml.soap.MessageFactory.newInstance(
SOAPConstants.SOAP_1_2_PROTOCOL).createMessage();
javax.xml.soap.SOAPEnvelope soapEnv =
soapMessage.getSOAPPart().getEnvelope();
javax.xml.soap.SOAPHeader header = soapEnv.getHeader();
SOAPElement soapElement = header.addNotUnderstoodHeaderElement(
new QName("http://foo.org", "foo", "f"));
assertNotNull(soapElement);
Name name = soapElement.getElementName();
String uri = name.getURI();
String localName = name.getLocalName();
assertEquals(SOAPConstants.URI_NS_SOAP_1_2_ENVELOPE, uri);
//Validate the LocalName which must be NotUnderstood
assertEquals("NotUnderstood", localName);
}
@Validated @Test
public void testAddUpgradeHeaderElement() throws Exception {
javax.xml.soap.SOAPMessage soapMessage =
javax.xml.soap.MessageFactory.newInstance(
SOAPConstants.SOAP_1_2_PROTOCOL).createMessage();
javax.xml.soap.SOAPEnvelope soapEnv =
soapMessage.getSOAPPart().getEnvelope();
javax.xml.soap.SOAPHeader header = soapEnv.getHeader();
// create a list of supported URIs.
ArrayList supported = new ArrayList();
supported.add(SOAPConstants.URI_NS_SOAP_1_2_ENVELOPE);
supported.add(SOAPConstants.URI_NS_SOAP_ENVELOPE);
SOAPElement soapElement = header.addUpgradeHeaderElement(supported.iterator());
assertNotNull(soapElement);
Name name = soapElement.getElementName();
String uri = name.getURI();
String localName = name.getLocalName();
//Validate the URI which must be SOAPConstants.URI_NS_SOAP_1_2_ENVELOPE);
assertTrue(uri.equals(SOAPConstants.URI_NS_SOAP_1_2_ENVELOPE));
assertTrue(localName.equals("Upgrade"));
}
@Validated @Test
public void testExamineHeaderElements() throws Exception {
javax.xml.soap.SOAPMessage soapMessage =
javax.xml.soap.MessageFactory.newInstance(
SOAPConstants.SOAP_1_2_PROTOCOL).createMessage();
javax.xml.soap.SOAPEnvelope soapEnv =
soapMessage.getSOAPPart().getEnvelope();
javax.xml.soap.SOAPHeader header = soapEnv.getHeader();
SOAPHeaderElement soapHeaderElement =
header.addHeaderElement(envelope.createName("foo1", "f1", "foo1-URI"));
Iterator iterator = null;
soapHeaderElement.setRole("role-URI");
iterator = header.examineHeaderElements("role1-URI");
int count = 0;
while (iterator.hasNext()) {
count++;
iterator.next();
}
assertEquals(0, count);
}
@Validated @Test
public void testExamineHeaderElements2() throws Exception {
javax.xml.soap.SOAPMessage soapMessage =
javax.xml.soap.MessageFactory.newInstance().createMessage();
javax.xml.soap.SOAPEnvelope soapEnv =
soapMessage.getSOAPPart().getEnvelope();
javax.xml.soap.SOAPHeader header = soapEnv.getHeader();
SOAPHeaderElement soapHeaderElement = null;
try {
// Add some soap header elements
SOAPElement se = header.addHeaderElement(
envelope.createName("Header1", "prefix", "http://myuri"))
.addTextNode("This is Header1");
soapHeaderElement = (SOAPHeaderElement)se;
soapHeaderElement.setMustUnderstand(true);
se = header.addHeaderElement(
envelope.createName("Header2", "prefix", "http://myuri"))
.addTextNode("This is Header2");
soapHeaderElement = (SOAPHeaderElement)se;
soapHeaderElement.setMustUnderstand(false);
se = header.addHeaderElement(
envelope.createName("Header3", "prefix", "http://myuri"))
.addTextNode("This is Header3");
soapHeaderElement = (SOAPHeaderElement)se;
soapHeaderElement.setMustUnderstand(true);
se = header.addHeaderElement(
envelope.createName("Header4", "prefix", "http://myuri"))
.addTextNode("This is Header4");
soapHeaderElement = (SOAPHeaderElement)se;
soapHeaderElement.setMustUnderstand(false);
Iterator iterator = header.examineAllHeaderElements();
//validating Iterator count .... should be 4");
int cnt = 0;
while (iterator.hasNext()) {
cnt++;
soapHeaderElement = (SOAPHeaderElement)iterator.next();
}
assertEquals(cnt, 4);
iterator = header.examineHeaderElements(SOAPConstants.URI_SOAP_ACTOR_NEXT);
cnt = 0;
while (iterator.hasNext()) {
cnt++;
soapHeaderElement = (SOAPHeaderElement)iterator.next();
}
assertEquals(cnt, 0);
} catch (Exception e) {
fail("Unexpected Exception: " + e);
}
}
@Validated @Test
public void testQNamesOnHeader() {
SOAPHeaderElement headerElement = null;
try {
//SOAP1.1 and SOAP1.2 requires all HeaderElements to be namespace qualified
//Try adding HeaderElement with unqualified QName not belonging to any namespace
//(expect SOAPException)
headerElement = hdr.addHeaderElement(envelope.createName("Transaction"));
fail("Did not throw expected SOAPException");
} catch (SOAPException e) {
//Did throw expected SOAPException
} catch (Exception e) {
fail("Unexpected Exception: " + e.getMessage());
}
}
@Validated @Test
public void testAppendChild() throws Exception {
MessageFactory fact = MessageFactory.newInstance();
SOAPMessage message = fact.createMessage();
SOAPHeader soapHeader = message.getSOAPHeader();
assertEquals(0, soapHeader.getChildNodes().getLength());
assertFalse(soapHeader.getChildElements().hasNext());
Document doc = soapHeader.getOwnerDocument();
String namespace = "http://example.com";
String localName = "GetLastTradePrice";
Element getLastTradePrice = doc.createElementNS(namespace, localName);
Element symbol = doc.createElement("symbol");
symbol.setAttribute("foo", "bar");
getLastTradePrice.appendChild(symbol);
org.w3c.dom.Text def = doc.createTextNode("DEF");
symbol.appendChild(def);
soapHeader.appendChild(getLastTradePrice);
assertEquals(1, soapHeader.getChildNodes().getLength());
Iterator iter = soapHeader.getChildElements();
assertTrue(iter.hasNext());
Object obj = iter.next();
// must be SOAPHeaderElement
assertTrue(obj instanceof SOAPHeaderElement);
SOAPElement soapElement = (SOAPElement)obj;
assertEquals(namespace, soapElement.getNamespaceURI());
assertEquals(localName, soapElement.getLocalName());
iter = soapElement.getChildElements();
assertTrue(iter.hasNext());
obj = iter.next();
assertTrue(obj instanceof SOAPElement);
soapElement = (SOAPElement)obj;
assertEquals(null, soapElement.getNamespaceURI());
assertEquals("symbol", soapElement.getLocalName());
assertFalse(iter.hasNext());
iter = soapElement.getChildElements();
assertTrue(iter.hasNext());
obj = iter.next();
assertTrue(obj instanceof Text);
Text text = (Text)obj;
assertEquals("DEF", text.getData());
assertFalse(iter.hasNext());
}
@Validated @Test
public void testAXIS2_5006() throws Exception {
MessageFactory fact = MessageFactory.newInstance();
SOAPMessage message = fact.createMessage();
SOAPHeader header = message.getSOAPHeader();
Document doc = message.getSOAPPart();
Element orgElement = doc.createElementNS("urn:ns", "ns:test");
orgElement.appendChild(doc.createElementNS(null, "child1"));
orgElement.appendChild(doc.createElementNS(null, "child2"));
orgElement.appendChild(doc.createElementNS(null, "child3"));
header.appendChild(orgElement);
SOAPElement element = (SOAPElement)header.getChildElements().next();
assertTrue(element instanceof SOAPHeaderElement);
assertEquals(3, element.getChildNodes().getLength());
}
@Validated @Test
public void testExtractAllHeaderElements() throws Exception {
MessageFactory fact = MessageFactory.newInstance();
SOAPMessage message = fact.createMessage();
SOAPHeader header = message.getSOAPHeader();
SOAPHeaderElement headerElement1 = header.addHeaderElement(new QName("urn:ns1", "test1", "p1"));
SOAPHeaderElement headerElement2 = header.addHeaderElement(new QName("urn:ns2", "test2", "p2"));
Iterator it = header.extractAllHeaderElements();
assertTrue(it.hasNext());
assertSame(headerElement1, it.next());
assertTrue(it.hasNext());
assertSame(headerElement2, it.next());
assertFalse(it.hasNext());
assertEquals(0, header.getChildNodes().getLength());
}
}