/*
* 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.jaxws.handler.soapheadersadapter;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPFactory;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPHeaderElement;
import javax.xml.soap.SOAPMessage;
import javax.xml.stream.XMLStreamException;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.ws.WebServiceException;
import junit.framework.TestCase;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMSourcedElement;
import org.apache.axis2.Constants;
import org.apache.axis2.jaxws.core.MessageContext;
import org.apache.axis2.jaxws.handler.LogicalMessageImpl;
import org.apache.axis2.jaxws.handler.SOAPHeadersAdapter;
import org.apache.axis2.jaxws.message.Block;
import org.apache.axis2.jaxws.message.Message;
import org.apache.axis2.jaxws.message.Protocol;
import org.apache.axis2.jaxws.message.factory.MessageFactory;
import org.apache.axis2.jaxws.message.factory.SourceBlockFactory;
import org.apache.axis2.jaxws.message.factory.XMLStringBlockFactory;
import org.apache.axis2.jaxws.registry.FactoryRegistry;
public class SOAPHeadersAdapterTests extends TestCase {
private static final String sampleText = "<pre:a xmlns:pre=\"urn://sample\">"
+ "<b>Hello</b>" + "<c>World</c>" + "</pre:a>";
private static String LARGE_STRING;
static {
// 100k string
for (int i = 0; i < 10000; i++) {
LARGE_STRING += "LongString"; // 10 chars * Integer.MAX_VALUE is pretty big.
}
}
// header 1 (ACOH1)
private static final String identifierACOH1 = "acoh1";
private static final String identifierACOH1namespaceURI = "http://"+identifierACOH1+"ns";
private static final String identifierACOH1prefix = identifierACOH1+"pre";
public static final QName ACOH1_HEADER_QNAME = new QName(identifierACOH1namespaceURI, identifierACOH1, identifierACOH1prefix);
// header 2 (ACOH2)
private static final String identifierACOH2 = "acoh2";
private static final String identifierACOH2namespaceURI = "http://"+identifierACOH2+"ns";
private static final String identifierACOH2prefix = identifierACOH2+"pre";
public static final QName ACOH2_HEADER_QNAME = new QName(identifierACOH2namespaceURI, identifierACOH2, identifierACOH2prefix);
public static final String CONTENT_STRING1 = "content string 1";
public static final String CONTENT_STRING2 = "content string 2";
public void testAddRemove() throws Exception {
MessageContext messageContext = getMessageContext();
SOAPHeadersAdapter.install(messageContext);
SOAPFactory sf = SOAPFactory.newInstance();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e1 = sf.createElement(ACOH1_HEADER_QNAME);
e1.addTextNode(CONTENT_STRING1);
String acoh1 = e1.toString();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e2 = sf.createElement(ACOH1_HEADER_QNAME);
e2.addTextNode(CONTENT_STRING2);
String acoh2 = e2.toString();
List<String> acoh1ContentList = new ArrayList<String>();
acoh1ContentList.add(acoh1);
acoh1ContentList.add(acoh2);
SOAPHeadersAdapter adapter = (SOAPHeadersAdapter)messageContext.getProperty(Constants.JAXWS_OUTBOUND_SOAP_HEADERS);
adapter.put(ACOH1_HEADER_QNAME, acoh1ContentList);
adapter.put(ACOH2_HEADER_QNAME, acoh1ContentList);
adapter.remove(ACOH1_HEADER_QNAME);
assertTrue("Adapter should have one item, but has " + adapter.size(), adapter.size() == 1);
}
public void testAddRemoveEmpty() throws Exception {
MessageContext messageContext = getMessageContext();
SOAPHeadersAdapter.install(messageContext);
SOAPFactory sf = SOAPFactory.newInstance();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e1 = sf.createElement(ACOH1_HEADER_QNAME);
e1.addTextNode(CONTENT_STRING1);
String acoh1 = e1.toString();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e2 = sf.createElement(ACOH2_HEADER_QNAME);
e2.addTextNode(CONTENT_STRING2);
String acoh2 = e2.toString();
List<String> acoh1ContentList = new ArrayList<String>();
acoh1ContentList.add(acoh1);
List<String> acoh2ContentList = new ArrayList<String>();
acoh2ContentList.add(acoh2);
SOAPHeadersAdapter adapter = (SOAPHeadersAdapter)messageContext.getProperty(Constants.JAXWS_OUTBOUND_SOAP_HEADERS);
adapter.put(ACOH1_HEADER_QNAME, acoh1ContentList);
adapter.put(ACOH2_HEADER_QNAME, acoh2ContentList);
adapter.remove(ACOH1_HEADER_QNAME);
adapter.remove(ACOH2_HEADER_QNAME);
// testing isEmpty() method
assertTrue("Adapter should have no items, but has " + adapter.size(), adapter.isEmpty());
// double-check
assertTrue("isEmpty() reported 'true' but we found an item", adapter.get(ACOH1_HEADER_QNAME) == null);
assertTrue("isEmpty() reported 'true' but we found an item", adapter.get(ACOH2_HEADER_QNAME) == null);
}
public void testEmptyList() throws Exception {
MessageContext messageContext = getMessageContext();
SOAPHeadersAdapter.install(messageContext);
SOAPFactory sf = SOAPFactory.newInstance();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e1 = sf.createElement(ACOH1_HEADER_QNAME);
e1.addTextNode(CONTENT_STRING1);
String acoh1 = e1.toString();
List<String> acoh1ContentList = new ArrayList<String>();
acoh1ContentList.add(acoh1);
// leaving this list empty
List<String> acoh2ContentList = new ArrayList<String>();
SOAPHeadersAdapter adapter = (SOAPHeadersAdapter)messageContext.getProperty(Constants.JAXWS_OUTBOUND_SOAP_HEADERS);
adapter.put(ACOH1_HEADER_QNAME, acoh1ContentList);
adapter.put(ACOH2_HEADER_QNAME, acoh2ContentList);
// TODO is this reasonable for a map (the adapter) to ignore an empty list? I think so.
assertTrue("Adapter should have one item, but has " + adapter.size(), adapter.size() == 1);
// double-check
assertTrue(adapter.get(ACOH1_HEADER_QNAME).get(0).equals(acoh1));
// TODO is this reasonable for a map (the adapter) to ignore an empty list? I think so.
assertTrue("We found an item where we shouldn't have.", adapter.get(ACOH2_HEADER_QNAME) == null);
}
public void testKeyEquivalence() throws Exception {
MessageContext messageContext = getMessageContext();
SOAPHeadersAdapter.install(messageContext);
SOAPFactory sf = SOAPFactory.newInstance();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e1 = sf.createElement(ACOH1_HEADER_QNAME);
e1.addTextNode(CONTENT_STRING1);
String acoh1 = e1.toString();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e2 = sf.createElement(ACOH1_HEADER_QNAME);
e2.addTextNode(CONTENT_STRING2);
String acoh2 = e2.toString();
List<String> acoh1ContentList = new ArrayList<String>();
acoh1ContentList.add(acoh1);
// leaving this list empty
List<String> acoh2ContentList = new ArrayList<String>();
acoh2ContentList.add(acoh2);
SOAPHeadersAdapter adapter = (SOAPHeadersAdapter)messageContext.getProperty(Constants.JAXWS_OUTBOUND_SOAP_HEADERS);
QName equivalentKey = new QName(ACOH1_HEADER_QNAME.getNamespaceURI(), ACOH1_HEADER_QNAME.getLocalPart(), ACOH1_HEADER_QNAME.getPrefix());
adapter.put(ACOH1_HEADER_QNAME, acoh1ContentList);
adapter.put(equivalentKey, acoh2ContentList);
// testing that two object keys that pass the QName.equals() will result
// in previously added headers being wiped
assertTrue("Adapter should have one item, but has " + adapter.size(), adapter.size() == 1);
// double-check
assertTrue(adapter.get(ACOH1_HEADER_QNAME).get(0).equals(acoh2));
assertTrue(((List<String>)(adapter.get(ACOH1_HEADER_QNAME))).size() == 1);
}
public void testListItemRemoval() throws Exception {
MessageContext messageContext = getMessageContext();
SOAPHeadersAdapter.install(messageContext);
SOAPFactory sf = SOAPFactory.newInstance();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e1 = sf.createElement(ACOH1_HEADER_QNAME);
e1.addTextNode(CONTENT_STRING1);
String acoh1 = e1.toString();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e2 = sf.createElement(ACOH2_HEADER_QNAME);
e2.addTextNode(CONTENT_STRING2);
String acoh2 = e2.toString();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e3 = sf.createElement(ACOH2_HEADER_QNAME);
e3.addTextNode(LARGE_STRING);
String acoh3 = e3.toString();
List<String> acoh1ContentList = new ArrayList<String>();
acoh1ContentList.add(acoh1);
// leaving this list empty
List<String> acoh2ContentList = new ArrayList<String>();
acoh2ContentList.add(acoh2);
acoh2ContentList.add(acoh3);
SOAPHeadersAdapter adapter = (SOAPHeadersAdapter)messageContext.getProperty(Constants.JAXWS_OUTBOUND_SOAP_HEADERS);
adapter.put(ACOH1_HEADER_QNAME, acoh1ContentList);
adapter.put(ACOH2_HEADER_QNAME, acoh2ContentList);
// remove everything, by different means
adapter.remove(ACOH1_HEADER_QNAME);
// SOAPHeadersAdapter does NOT give back a live list, so these don't mean anything
adapter.get(ACOH2_HEADER_QNAME).remove(0);
adapter.get(ACOH2_HEADER_QNAME).remove(acoh3);
assertTrue("Adapter should have one item, but has " + adapter.size(), adapter.size() == 1);
// double-check
assertTrue(adapter.get(ACOH2_HEADER_QNAME).get(0).equals(acoh2));
assertTrue(adapter.get(ACOH2_HEADER_QNAME).get(1).equals(acoh3));
assertTrue(((List<String>)(adapter.get(ACOH2_HEADER_QNAME))).size() == 2);
}
// TODO review to verify validity of this test's expectations
public void testAddRemoveException() throws Exception {
MessageContext messageContext = getMessageContext();
SOAPHeadersAdapter.install(messageContext);
SOAPFactory sf = SOAPFactory.newInstance();
// QName used here should match the key for the list set on the requestCtx
// NOTE that for this test it intentionally does not match
SOAPElement e1 = sf.createElement(ACOH2_HEADER_QNAME);
e1.addTextNode(CONTENT_STRING1);
String acoh1 = e1.toString();
List<String> acoh1ContentList = new ArrayList<String>();
acoh1ContentList.add(acoh1);
SOAPHeadersAdapter adapter = (SOAPHeadersAdapter)messageContext.getProperty(Constants.JAXWS_OUTBOUND_SOAP_HEADERS);
adapter.put(ACOH1_HEADER_QNAME, acoh1ContentList);
try {
adapter.remove(ACOH1_HEADER_QNAME);
fail("should have got an exception");
} catch (WebServiceException e) {
// it's not ideal to compare exception output, but...
assertTrue(e.getCause().getMessage().contains("Element name from data source is acoh2, not the expected acoh1"));
return;
}
fail("Should have returned in the 'catch' block.");
}
public void testBigContent() throws Exception {
MessageContext messageContext = getMessageContext();
SOAPHeadersAdapter.install(messageContext);
SOAPFactory sf = SOAPFactory.newInstance();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e1 = sf.createElement(ACOH1_HEADER_QNAME);
e1.addTextNode(LARGE_STRING);
String acoh1 = e1.toString();
List<String> acoh1ContentList = new ArrayList<String>();
acoh1ContentList.add(acoh1);
SOAPHeadersAdapter adapter = (SOAPHeadersAdapter)messageContext.getProperty(Constants.JAXWS_OUTBOUND_SOAP_HEADERS);
adapter.put(ACOH1_HEADER_QNAME, acoh1ContentList);
assertTrue("Adapter should have one item, but has " + adapter.size(), adapter.size() == 1);
}
public void testHeaderStringReuse() throws Exception {
MessageContext messageContext = getMessageContext();
SOAPHeadersAdapter.install(messageContext);
SOAPFactory sf = SOAPFactory.newInstance();
// QName used here should match the key for the list set on the requestCtx
// NOTE we are re-using this xml string in three adds, two of which have mismatched QNames
SOAPElement e1 = sf.createElement(ACOH1_HEADER_QNAME);
e1.addTextNode(LARGE_STRING);
String acoh1 = e1.toString();
List<String> acoh1ContentList = new ArrayList<String>();
acoh1ContentList.add(acoh1);
SOAPHeadersAdapter adapter = (SOAPHeadersAdapter)messageContext.getProperty(Constants.JAXWS_OUTBOUND_SOAP_HEADERS);
// Mismatched QNames!
adapter.put(ACOH1_HEADER_QNAME, acoh1ContentList);
adapter.put(ACOH2_HEADER_QNAME, acoh1ContentList);
assertTrue("Adapter should have two items, but has " + adapter.size(), adapter.size() == 2);
}
public void testContainsKey() throws Exception {
MessageContext messageContext = getMessageContext();
SOAPHeadersAdapter.install(messageContext);
SOAPFactory sf = SOAPFactory.newInstance();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e1 = sf.createElement(ACOH1_HEADER_QNAME);
e1.addTextNode(LARGE_STRING);
String acoh1 = e1.toString();
List<String> acoh1ContentList = new ArrayList<String>();
acoh1ContentList.add(acoh1);
SOAPHeadersAdapter adapter = (SOAPHeadersAdapter)messageContext.getProperty(Constants.JAXWS_OUTBOUND_SOAP_HEADERS);
adapter.put(ACOH1_HEADER_QNAME, acoh1ContentList);
assertTrue("Adapter should contain the key " + ACOH1_HEADER_QNAME, adapter.containsKey(ACOH1_HEADER_QNAME));
}
public void testContainsValue() throws Exception {
MessageContext messageContext = getMessageContext();
SOAPHeadersAdapter.install(messageContext);
SOAPFactory sf = SOAPFactory.newInstance();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e1 = sf.createElement(ACOH1_HEADER_QNAME);
e1.addTextNode(LARGE_STRING);
String acoh1 = e1.toString();
List<String> acoh1ContentList = new ArrayList<String>();
acoh1ContentList.add(acoh1);
SOAPHeadersAdapter adapter = (SOAPHeadersAdapter)messageContext.getProperty(Constants.JAXWS_OUTBOUND_SOAP_HEADERS);
adapter.put(ACOH1_HEADER_QNAME, acoh1ContentList);
assertTrue("Adapter should contain the value " + acoh1ContentList, adapter.containsValue(acoh1ContentList));
}
public void testEmpty() throws Exception {
MessageContext messageContext = getMessageContext();
SOAPHeadersAdapter.install(messageContext);
SOAPFactory sf = SOAPFactory.newInstance();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e1 = sf.createElement(ACOH1_HEADER_QNAME);
e1.addTextNode(LARGE_STRING);
String acoh1 = e1.toString();
List<String> acoh1ContentList = new ArrayList<String>();
acoh1ContentList.add(acoh1);
SOAPHeadersAdapter adapter = (SOAPHeadersAdapter)messageContext.getProperty(Constants.JAXWS_OUTBOUND_SOAP_HEADERS);
adapter.put(ACOH1_HEADER_QNAME, acoh1ContentList);
adapter.remove(ACOH1_HEADER_QNAME);
assertTrue("Adapter should be empty.", adapter.isEmpty());
}
public void testValues() throws Exception {
MessageContext messageContext = getMessageContext();
SOAPHeadersAdapter.install(messageContext);
SOAPFactory sf = SOAPFactory.newInstance();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e1 = sf.createElement(ACOH1_HEADER_QNAME);
e1.addTextNode(CONTENT_STRING1);
String acoh1 = e1.toString();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e2 = sf.createElement(ACOH2_HEADER_QNAME);
e2.addTextNode(CONTENT_STRING2);
String acoh2 = e2.toString();
List<String> acoh1ContentList = new ArrayList<String>();
acoh1ContentList.add(acoh1);
List<String> acoh2ContentList = new ArrayList<String>();
acoh2ContentList.add(acoh2);
SOAPHeadersAdapter adapter = (SOAPHeadersAdapter)messageContext.getProperty(Constants.JAXWS_OUTBOUND_SOAP_HEADERS);
adapter.put(ACOH1_HEADER_QNAME, acoh1ContentList);
adapter.put(ACOH2_HEADER_QNAME, acoh2ContentList);
// testing "values()" method
assertTrue(adapter.values().contains(acoh1ContentList));
assertTrue(adapter.values().contains(acoh2ContentList));
// re-check to make sure nothing got corrupted
assertTrue(adapter.get(ACOH1_HEADER_QNAME).get(0).equals(acoh1));
assertTrue(adapter.get(ACOH2_HEADER_QNAME).get(0).equals(acoh2));
}
public void testKeySet() throws Exception {
MessageContext messageContext = getMessageContext();
SOAPHeadersAdapter.install(messageContext);
SOAPFactory sf = SOAPFactory.newInstance();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e1 = sf.createElement(ACOH1_HEADER_QNAME);
e1.addTextNode(CONTENT_STRING1);
String acoh1 = e1.toString();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e2 = sf.createElement(ACOH2_HEADER_QNAME);
e2.addTextNode(CONTENT_STRING2);
String acoh2 = e2.toString();
List<String> acoh1ContentList = new ArrayList<String>();
acoh1ContentList.add(acoh1);
List<String> acoh2ContentList = new ArrayList<String>();
acoh2ContentList.add(acoh2);
SOAPHeadersAdapter adapter = (SOAPHeadersAdapter)messageContext.getProperty(Constants.JAXWS_OUTBOUND_SOAP_HEADERS);
adapter.put(ACOH1_HEADER_QNAME, acoh1ContentList);
adapter.put(ACOH2_HEADER_QNAME, acoh2ContentList);
adapter.remove(ACOH1_HEADER_QNAME);
// testing "keySet()" method
Set<QName> keyset = adapter.keySet();
assertTrue(!keyset.contains(ACOH1_HEADER_QNAME));
assertTrue(keyset.contains(ACOH2_HEADER_QNAME));
// re-check to make sure nothing got corrupted
assertTrue(adapter.get(ACOH2_HEADER_QNAME).get(0).equals(acoh2));
}
public void testEntrySet() throws Exception {
MessageContext messageContext = getMessageContext();
SOAPHeadersAdapter.install(messageContext);
SOAPFactory sf = SOAPFactory.newInstance();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e1 = sf.createElement(ACOH1_HEADER_QNAME);
e1.addTextNode(CONTENT_STRING1);
String acoh1 = e1.toString();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e2 = sf.createElement(ACOH2_HEADER_QNAME);
e2.addTextNode(CONTENT_STRING2);
String acoh2 = e2.toString();
List<String> acoh1ContentList = new ArrayList<String>();
acoh1ContentList.add(acoh1);
List<String> acoh2ContentList = new ArrayList<String>();
acoh2ContentList.add(acoh2);
SOAPHeadersAdapter adapter = (SOAPHeadersAdapter)messageContext.getProperty(Constants.JAXWS_OUTBOUND_SOAP_HEADERS);
Map<QName, List<String>> hm1 = new HashMap<QName, List<String>>();
hm1.put(ACOH1_HEADER_QNAME, acoh1ContentList);
Map<QName, List<String>> hm2 = new HashMap<QName, List<String>>();
hm2.put(ACOH2_HEADER_QNAME, acoh2ContentList);
adapter.putAll(hm1);
adapter.putAll(hm2);
// testing "entrySet()" method
Set<Map.Entry<QName, List<String>>> entryset = adapter.entrySet();
int checkCounter = 0;
for (Iterator it = entryset.iterator();it.hasNext();) {
Map.Entry<QName, List<String>> entry = (Map.Entry<QName, List<String>>)it.next();
// we cannot assume that the order the maps went into
// the adapter will be the order they come out:
if (entry.getKey().equals(ACOH1_HEADER_QNAME)) {
assertTrue(entry.getKey().equals(ACOH1_HEADER_QNAME));
assertTrue(entry.getValue().equals(acoh1ContentList));
checkCounter++;
} else if (entry.getKey().equals(ACOH2_HEADER_QNAME)) {
assertTrue(entry.getKey().equals(ACOH2_HEADER_QNAME));
assertTrue(entry.getValue().equals(acoh2ContentList));
checkCounter += 2;
}
}
assertTrue("Expected entrySet was not returned from SOAPHeadersAdapter.entrySet().", checkCounter == 3);
// re-check to make sure nothing got corrupted
assertTrue(adapter.get(ACOH1_HEADER_QNAME).get(0).equals(acoh1));
assertTrue(adapter.get(ACOH2_HEADER_QNAME).get(0).equals(acoh2));
}
public void testPutAll() throws Exception {
MessageContext messageContext = getMessageContext();
SOAPHeadersAdapter.install(messageContext);
SOAPFactory sf = SOAPFactory.newInstance();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e1 = sf.createElement(ACOH1_HEADER_QNAME);
e1.addTextNode(CONTENT_STRING1);
String acoh1 = e1.toString();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e2 = sf.createElement(ACOH2_HEADER_QNAME);
e2.addTextNode(CONTENT_STRING2);
String acoh2 = e2.toString();
List<String> acoh1ContentList = new ArrayList<String>();
acoh1ContentList.add(acoh1);
List<String> acoh2ContentList = new ArrayList<String>();
acoh2ContentList.add(acoh2);
Map<QName, List<String>> requestHeaders = new HashMap<QName, List<String>>();
requestHeaders.put(ACOH1_HEADER_QNAME, acoh1ContentList);
requestHeaders.put(ACOH2_HEADER_QNAME, acoh2ContentList);
SOAPHeadersAdapter adapter = (SOAPHeadersAdapter)messageContext.getProperty(Constants.JAXWS_OUTBOUND_SOAP_HEADERS);
adapter.putAll(requestHeaders);
// testing "keySet()" method
Set<QName> keyset = adapter.keySet();
assertTrue(keyset.contains(ACOH1_HEADER_QNAME));
assertTrue(keyset.contains(ACOH2_HEADER_QNAME));
// check the data too
assertTrue(adapter.get(ACOH1_HEADER_QNAME).get(0).equals(acoh1));
assertTrue(adapter.get(ACOH2_HEADER_QNAME).get(0).equals(acoh2));
}
// The next few tests exercise the underlying data structures that define a "Message" object
public void testAddRemoveAsSOAPMessage() throws Exception {
MessageContext messageContext = getMessageContext();
SOAPHeadersAdapter.install(messageContext);
SOAPFactory sf = SOAPFactory.newInstance();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e1 = sf.createElement(ACOH1_HEADER_QNAME);
e1.addTextNode(CONTENT_STRING1);
String acoh1 = e1.toString();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e2 = sf.createElement(ACOH1_HEADER_QNAME);
e2.addTextNode(CONTENT_STRING2);
String acoh2 = e2.toString();
List<String> acoh1ContentList = new ArrayList<String>();
acoh1ContentList.add(acoh1);
acoh1ContentList.add(acoh2);
SOAPHeadersAdapter adapter = (SOAPHeadersAdapter)messageContext.getProperty(Constants.JAXWS_OUTBOUND_SOAP_HEADERS);
adapter.put(ACOH1_HEADER_QNAME, acoh1ContentList);
// get message object and convert to SOAPMessage
SOAPMessage soapMessage = messageContext.getMessage().getAsSOAPMessage();
// confirm headers are there
SOAPHeader soapHeader = soapMessage.getSOAPHeader();
Iterator<SOAPHeaderElement> it = soapHeader.getChildElements();
// TODO: not sure if the order of the header additions is or should be preserved.
// in other words, this test may be a little too strict.
SOAPHeaderElement headerElem1 = it.next();
SOAPHeaderElement headerElem2 = it.next();
// should only be two header elements, so...
assertFalse(it.hasNext());
assertTrue(headerElem1.toString().equals(acoh1));
assertTrue(headerElem2.toString().equals(acoh2));
// now that we've done a toString() on the header elements, they've been parsed and
// processed by the underlying OM implementation... let's remove one by way of SOAP
// API, then let's make sure we can still get and manipulate the headers via the
// SOAPHeadersAdapter
// TODO: removeChild gives an exception
//soapHeader.removeChild(headerElem1);
headerElem1.detachNode();
// one is removed, make sure the SOAPHeadersAdapter reflects the change
List<String> contentListAfterSOAPRemoval = adapter.get(ACOH1_HEADER_QNAME);
assertTrue(contentListAfterSOAPRemoval.size() == 1);
// remember we removed headerElem1, so we expect acoh2 to still exist
assertTrue(contentListAfterSOAPRemoval.get(0).equals(acoh2));
}
public void testAddRemoveAsSOAPEnvelope() throws Exception {
MessageContext messageContext = getMessageContext();
SOAPHeadersAdapter.install(messageContext);
SOAPFactory sf = SOAPFactory.newInstance();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e1 = sf.createElement(ACOH1_HEADER_QNAME);
e1.addTextNode(CONTENT_STRING1);
String acoh1 = e1.toString();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e2 = sf.createElement(ACOH1_HEADER_QNAME);
e2.addTextNode(CONTENT_STRING2);
String acoh2 = e2.toString();
List<String> acoh1ContentList = new ArrayList<String>();
acoh1ContentList.add(acoh1);
acoh1ContentList.add(acoh2);
SOAPHeadersAdapter adapter = (SOAPHeadersAdapter)messageContext.getProperty(Constants.JAXWS_OUTBOUND_SOAP_HEADERS);
adapter.put(ACOH1_HEADER_QNAME, acoh1ContentList);
// get message object and convert to SOAPEnvelope
SOAPEnvelope soapEnvelope = messageContext.getMessage().getAsSOAPEnvelope();
// confirm headers are there
SOAPHeader soapHeader = soapEnvelope.getHeader();
Iterator<SOAPHeaderElement> it = soapHeader.getChildElements();
// TODO: not sure if the order of the header additions is or should be preserved.
// in other words, this test may be a little too strict.
SOAPHeaderElement headerElem1 = it.next();
SOAPHeaderElement headerElem2 = it.next();
// should only be two header elements, so...
assertFalse(it.hasNext());
assertTrue(headerElem1.toString().equals(acoh1));
assertTrue(headerElem2.toString().equals(acoh2));
// now that we've done a toString() on the header elements, they've been parsed and
// processed by the underlying OM implementation... let's remove one by way of SOAP
// API, then let's make sure we can still get and manipulate the headers via the
// SOAPHeadersAdapter
// TODO: removeChild gives an exception
//soapHeader.removeChild(headerElem1);
headerElem1.detachNode();
// one is removed, make sure the SOAPHeadersAdapter reflects the change
List<String> contentListAfterSOAPRemoval = adapter.get(ACOH1_HEADER_QNAME);
assertTrue(contentListAfterSOAPRemoval.size() == 1);
// remember we removed headerElem1, so we expect acoh2 to still exist
assertTrue(contentListAfterSOAPRemoval.get(0).equals(acoh2));
}
public void testAddRemoveAsOMElement() throws Exception {
MessageContext messageContext = getMessageContext();
SOAPHeadersAdapter.install(messageContext);
SOAPFactory sf = SOAPFactory.newInstance();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e1 = sf.createElement(ACOH1_HEADER_QNAME);
e1.addTextNode(CONTENT_STRING1);
String acoh1 = e1.toString();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e2 = sf.createElement(ACOH1_HEADER_QNAME);
e2.addTextNode(CONTENT_STRING2);
String acoh2 = e2.toString();
List<String> acoh1ContentList = new ArrayList<String>();
acoh1ContentList.add(acoh1);
acoh1ContentList.add(acoh2);
SOAPHeadersAdapter adapter = (SOAPHeadersAdapter)messageContext.getProperty(Constants.JAXWS_OUTBOUND_SOAP_HEADERS);
adapter.put(ACOH1_HEADER_QNAME, acoh1ContentList);
// get message object and convert to SOAPEnvelope
org.apache.axiom.soap.SOAPEnvelope omEnvelope = (org.apache.axiom.soap.SOAPEnvelope)messageContext.getMessage().getAsOMElement();
// confirm headers are there.
org.apache.axiom.soap.SOAPHeader omHeader = omEnvelope.getHeader();
Iterator<OMElement> it = omHeader.getChildElements();
// TODO: not sure if the order of the header additions is or should be preserved.
// in other words, this test may be a little too strict.
OMSourcedElement headerElem1 = (OMSourcedElement)it.next();
OMSourcedElement headerElem2 = (OMSourcedElement)it.next();
// should only be two header elements, so...
assertFalse(it.hasNext());
assertTrue(headerElem1.toString().equals(acoh1));
assertTrue(headerElem2.toString().equals(acoh2));
// now that we've done a toString() on the header elements, they've been parsed and
// processed by the underlying OM implementation... let's remove one by way of SOAP
// API, then let's make sure we can still get and manipulate the headers via the
// SOAPHeadersAdapter
// TODO: removeChild gives an exception
//soapHeader.removeChild(headerElem1);
headerElem1.detach();
// one is removed, make sure the SOAPHeadersAdapter reflects the change
List<String> contentListAfterSOAPRemoval = adapter.get(ACOH1_HEADER_QNAME);
assertTrue(contentListAfterSOAPRemoval.size() == 1);
// remember we removed headerElem1, so we expect acoh2 to still exist
assertTrue(contentListAfterSOAPRemoval.get(0).equals(acoh2));
}
public void testAddRemoveAsOMElementUsingSourceFactory() throws Exception {
MessageContext messageContext = getMessageContextUsingSourceFactory();
SOAPHeadersAdapter.install(messageContext);
SOAPFactory sf = SOAPFactory.newInstance();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e1 = sf.createElement(ACOH1_HEADER_QNAME);
e1.addTextNode(CONTENT_STRING1);
String acoh1 = e1.toString();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e2 = sf.createElement(ACOH1_HEADER_QNAME);
e2.addTextNode(CONTENT_STRING2);
String acoh2 = e2.toString();
List<String> acoh1ContentList = new ArrayList<String>();
acoh1ContentList.add(acoh1);
acoh1ContentList.add(acoh2);
SOAPHeadersAdapter adapter = (SOAPHeadersAdapter)messageContext.getProperty(Constants.JAXWS_OUTBOUND_SOAP_HEADERS);
adapter.put(ACOH1_HEADER_QNAME, acoh1ContentList);
// get message object and convert to SOAPEnvelope
org.apache.axiom.soap.SOAPEnvelope omEnvelope = (org.apache.axiom.soap.SOAPEnvelope)messageContext.getMessage().getAsOMElement();
// confirm headers are there.
org.apache.axiom.soap.SOAPHeader omHeader = omEnvelope.getHeader();
Iterator<OMElement> it = omHeader.getChildElements();
// TODO: not sure if the order of the header additions is or should be preserved.
// in other words, this test may be a little too strict.
OMSourcedElement headerElem1 = (OMSourcedElement)it.next();
OMSourcedElement headerElem2 = (OMSourcedElement)it.next();
// should only be two header elements, so...
assertFalse(it.hasNext());
assertTrue(headerElem1.toString().equals(acoh1));
assertTrue(headerElem2.toString().equals(acoh2));
// now that we've done a toString() on the header elements, they've been parsed and
// processed by the underlying OM implementation... let's remove one by way of SOAP
// API, then let's make sure we can still get and manipulate the headers via the
// SOAPHeadersAdapter
// TODO: removeChild gives an exception
//soapHeader.removeChild(headerElem1);
headerElem1.detach();
// one is removed, make sure the SOAPHeadersAdapter reflects the change
List<String> contentListAfterSOAPRemoval = adapter.get(ACOH1_HEADER_QNAME);
assertTrue(contentListAfterSOAPRemoval.size() == 1);
// remember we removed headerElem1, so we expect acoh2 to still exist
assertTrue(contentListAfterSOAPRemoval.get(0).equals(acoh2));
}
public void testAddRemoveAsOMElementUsingSourceFactoryLogicalMessageImpl() throws Exception {
MessageContext messageContext = getMessageContextUsingSourceFactory();
SOAPHeadersAdapter.install(messageContext);
SOAPFactory sf = SOAPFactory.newInstance();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e1 = sf.createElement(ACOH1_HEADER_QNAME);
e1.addTextNode(CONTENT_STRING1);
String acoh1 = e1.toString();
// QName used here should match the key for the list set on the requestCtx
SOAPElement e2 = sf.createElement(ACOH1_HEADER_QNAME);
e2.addTextNode(CONTENT_STRING2);
String acoh2 = e2.toString();
List<String> acoh1ContentList = new ArrayList<String>();
acoh1ContentList.add(acoh1);
acoh1ContentList.add(acoh2);
SOAPHeadersAdapter adapter = (SOAPHeadersAdapter)messageContext.getProperty(Constants.JAXWS_OUTBOUND_SOAP_HEADERS);
adapter.put(ACOH1_HEADER_QNAME, acoh1ContentList);
List<String> headersList = adapter.get(ACOH1_HEADER_QNAME);
headersList.get(0).toString(); // trigger some underlying OM implementation parsing
// use the LogicalMessageImpl to get the message payload
MyLogicalMessageImpl logicalMessageImpl = new MyLogicalMessageImpl(messageContext);
Source payload = logicalMessageImpl.getPayload();
payload.toString();
// get message object and convert to SOAPEnvelope
org.apache.axiom.soap.SOAPEnvelope omEnvelope = (org.apache.axiom.soap.SOAPEnvelope)messageContext.getMessage().getAsOMElement();
// confirm headers are there.
org.apache.axiom.soap.SOAPHeader omHeader = omEnvelope.getHeader();
Iterator<OMElement> it = omHeader.getChildElements();
// TODO: not sure if the order of the header additions is or should be preserved.
// in other words, this test may be a little too strict.
OMSourcedElement headerElem1 = (OMSourcedElement)it.next();
OMSourcedElement headerElem2 = (OMSourcedElement)it.next();
// should only be two header elements, so...
assertFalse(it.hasNext());
assertTrue(headerElem1.toString().equals(acoh1));
assertTrue(headerElem2.toString().equals(acoh2));
// now that we've done a toString() on the header elements, they've been parsed and
// processed by the underlying OM implementation... let's remove one by way of SOAP
// API, then let's make sure we can still get and manipulate the headers via the
// SOAPHeadersAdapter
// TODO: removeChild gives an exception
//soapHeader.removeChild(headerElem1);
headerElem1.detach();
// one is removed, make sure the SOAPHeadersAdapter reflects the change
List<String> contentListAfterSOAPRemoval = adapter.get(ACOH1_HEADER_QNAME);
assertTrue(contentListAfterSOAPRemoval.size() == 1);
// remember we removed headerElem1, so we expect acoh2 to still exist
assertTrue(contentListAfterSOAPRemoval.get(0).equals(acoh2));
}
/*
* provide a MessageContext with a valid Message object
*/
private MessageContext getMessageContext() throws XMLStreamException {
// Create a SOAP 1.1 Message
MessageFactory mf = (MessageFactory) FactoryRegistry
.getFactory(MessageFactory.class);
Message m = mf.create(Protocol.soap11);
// Get the BlockFactory
XMLStringBlockFactory f = (XMLStringBlockFactory) FactoryRegistry
.getFactory(XMLStringBlockFactory.class);
Block block = f.createFrom(sampleText, null, null);
// Add the block to the message as normal body content.
m.setBodyBlock(block);
MessageContext messageContext = new MessageContext();
messageContext.setMessage(m);
return messageContext;
}
/*
* provide a MessageContext with a valid Message object
*/
private MessageContext getMessageContextUsingSourceFactory() throws XMLStreamException {
// Create a SOAP 1.1 Message
MessageFactory mf = (MessageFactory) FactoryRegistry
.getFactory(MessageFactory.class);
Message m = mf.create(Protocol.soap11);
// Get the BlockFactory
SourceBlockFactory f = (SourceBlockFactory) FactoryRegistry
.getFactory(SourceBlockFactory.class);
Block block = f.createFrom(new StreamSource(new StringReader(sampleText)), null, null);
// Add the block to the message as normal body content.
m.setBodyBlock(block);
MessageContext messageContext = new MessageContext();
messageContext.setMessage(m);
return messageContext;
}
private class MyLogicalMessageImpl extends LogicalMessageImpl {
public MyLogicalMessageImpl(MessageContext mc) {
super(mc.getMEPContext());
}
}
}