axis-java-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From r...@apache.org
Subject svn commit: r773900 [3/3] - in /webservices/axis2/trunk/java/modules: jaxws-integration/ jaxws-integration/test-resources/wsdl/ jaxws-integration/test/org/apache/axis2/jaxws/sample/ jaxws-integration/test/org/apache/axis2/jaxws/sample/headershandler/ j...
Date Tue, 12 May 2009 13:55:16 GMT
Added: webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/handler/soapheadersadapter/SOAPHeadersAdapterTests.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/handler/soapheadersadapter/SOAPHeadersAdapterTests.java?rev=773900&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/handler/soapheadersadapter/SOAPHeadersAdapterTests.java
(added)
+++ webservices/axis2/trunk/java/modules/jaxws/test/org/apache/axis2/jaxws/handler/soapheadersadapter/SOAPHeadersAdapterTests.java
Tue May 12 13:55:16 2009
@@ -0,0 +1,982 @@
+/*
+ * 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.impl.llom.OMSourcedElementImpl;
+import org.apache.axiom.soap.impl.llom.soap11.SOAP11HeaderImpl;
+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
+        OMElement omEnvelope = messageContext.getMessage().getAsOMElement();
+        
+        // confirm headers are there.  I can cast here only because I know the implementation.
 :)
+        SOAP11HeaderImpl omHeader = (SOAP11HeaderImpl)omEnvelope.getChildElements().next();
+
+        Iterator<OMSourcedElementImpl> 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.
+        OMSourcedElementImpl headerElem1 = it.next();
+        OMSourcedElementImpl 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.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
+        OMElement omEnvelope = messageContext.getMessage().getAsOMElement();
+        
+        // confirm headers are there.  I can cast here only because I know the implementation.
 :)
+        SOAP11HeaderImpl omHeader = (SOAP11HeaderImpl)omEnvelope.getChildElements().next();
+
+        Iterator<OMSourcedElementImpl> 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.
+        OMSourcedElementImpl headerElem1 = it.next();
+        OMSourcedElementImpl 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.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
+        OMElement omEnvelope = messageContext.getMessage().getAsOMElement();
+        
+        // confirm headers are there.  I can cast here only because I know the implementation.
 :)
+        SOAP11HeaderImpl omHeader = (SOAP11HeaderImpl)omEnvelope.getChildElements().next();
+
+        Iterator<OMSourcedElementImpl> 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.
+        OMSourcedElementImpl headerElem1 = it.next();
+        OMSourcedElementImpl 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.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());
+		}
+	}
+	
+}



Mime
View raw message