1   /*
2    * Copyright 2005-2011 the original author or authors.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package org.springframework.ws.soap;
18  
19  import java.util.Iterator;
20  import javax.xml.namespace.QName;
21  
22  import org.springframework.xml.transform.StringResult;
23  import org.springframework.xml.transform.StringSource;
24  
25  import org.junit.Test;
26  
27  import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual;
28  import static org.junit.Assert.*;
29  
30  public abstract class AbstractSoapHeaderTestCase extends AbstractSoapElementTestCase {
31  
32      protected SoapHeader soapHeader;
33  
34      protected static final String NAMESPACE = "http://www.springframework.org";
35  
36      protected static final String PREFIX = "spring";
37  
38      @Override
39      protected final SoapElement createSoapElement() throws Exception {
40          soapHeader = createSoapHeader();
41          return soapHeader;
42      }
43  
44      protected abstract SoapHeader createSoapHeader() throws Exception;
45  
46      @Test
47      public void testAddHeaderElement() throws Exception {
48          QName qName = new QName(NAMESPACE, "localName", PREFIX);
49          SoapHeaderElement headerElement = soapHeader.addHeaderElement(qName);
50          assertNotNull("No SoapHeaderElement returned", headerElement);
51          assertEquals("Invalid qName for element", qName, headerElement.getName());
52          Iterator<SoapHeaderElement> iterator = soapHeader.examineAllHeaderElements();
53          assertTrue("SoapHeader has no elements", iterator.hasNext());
54          String payload = "<content xmlns='http://www.springframework.org'/>";
55          transformer.transform(new StringSource(payload), headerElement.getResult());
56          assertHeaderElementEqual(headerElement,
57                  "<spring:localName xmlns:spring='http://www.springframework.org'><spring:content/></spring:localName>");
58      }
59  
60      @Test
61      public void testRemoveHeaderElement() throws Exception {
62          QName qName = new QName(NAMESPACE, "localName", PREFIX);
63          soapHeader.removeHeaderElement(qName);
64          soapHeader.addHeaderElement(qName);
65          soapHeader.removeHeaderElement(qName);
66          Iterator<SoapHeaderElement> iterator = soapHeader.examineAllHeaderElements();
67          assertFalse("SoapHeader has elements", iterator.hasNext());
68      }
69  
70      @Test
71      public void testExamineAllHeaderElement() throws Exception {
72          QName qName = new QName(NAMESPACE, "localName", PREFIX);
73          SoapHeaderElement headerElement = soapHeader.addHeaderElement(qName);
74          assertEquals("Invalid qName for element", qName, headerElement.getName());
75          assertNotNull("No SoapHeaderElement returned", headerElement);
76          String payload = "<content xmlns='http://www.springframework.org'/>";
77          transformer.transform(new StringSource(payload), headerElement.getResult());
78          Iterator<SoapHeaderElement> iterator = soapHeader.examineAllHeaderElements();
79          assertNotNull("header element iterator is null", iterator);
80          assertTrue("header element iterator has no elements", iterator.hasNext());
81          headerElement = iterator.next();
82          assertEquals("Invalid qName for element", qName, headerElement.getName());
83          StringResult result = new StringResult();
84          transformer.transform(headerElement.getSource(), result);
85          assertXMLEqual("Invalid contents of header element",
86                  "<spring:localName xmlns:spring='http://www.springframework.org'><spring:content/></spring:localName>",
87                  result.toString());
88          assertFalse("header element iterator has too many elements", iterator.hasNext());
89      }
90  
91      @Test
92      public void testExamineHeaderElementWithName() throws Exception {
93          QName name1 = new QName(NAMESPACE, "name1", PREFIX);
94          QName name2 = new QName(NAMESPACE, "name2", PREFIX);
95          soapHeader.addHeaderElement(name1);
96          soapHeader.addHeaderElement(name2);
97          Iterator<SoapHeaderElement> iterator = soapHeader.examineHeaderElements(name1);
98          assertNotNull("header element iterator is null", iterator);
99          assertTrue("header element iterator has no elements", iterator.hasNext());
100         SoapHeaderElement headerElement = iterator.next();
101         assertEquals("Invalid qName for element", name1, headerElement.getName());
102         assertFalse("header element iterator has too many elements", iterator.hasNext());
103     }
104 
105     @Test
106     public void testExamineMustUnderstandHeaderElements() throws Exception {
107         QName qName1 = new QName(NAMESPACE, "localName1", PREFIX);
108         SoapHeaderElement headerElement1 = soapHeader.addHeaderElement(qName1);
109         headerElement1.setMustUnderstand(true);
110         headerElement1.setActorOrRole("role1");
111         QName qName2 = new QName(NAMESPACE, "localName2", PREFIX);
112         SoapHeaderElement headerElement2 = soapHeader.addHeaderElement(qName2);
113         headerElement2.setMustUnderstand(true);
114         headerElement2.setActorOrRole("role2");
115         Iterator<SoapHeaderElement> iterator = soapHeader.examineMustUnderstandHeaderElements("role1");
116         assertNotNull("header element iterator is null", iterator);
117         assertTrue("header element iterator has no elements", iterator.hasNext());
118         SoapHeaderElement headerElement = iterator.next();
119         assertEquals("Invalid name on header element", qName1, headerElement.getName());
120         assertTrue("MustUnderstand not set on header element", headerElement.getMustUnderstand());
121         assertEquals("Invalid role on header element", "role1", headerElement.getActorOrRole());
122         assertFalse("header element iterator has too many elements", iterator.hasNext());
123     }
124 
125     @Test
126     public void testGetResult() throws Exception {
127         String content =
128                 "<spring:localName xmlns:spring='http://www.springframework.org'><spring:content/></spring:localName>";
129         transformer.transform(new StringSource(content), soapHeader.getResult());
130         Iterator<SoapHeaderElement> iterator = soapHeader.examineAllHeaderElements();
131         assertTrue("Header has no children", iterator.hasNext());
132         SoapHeaderElement headerElement = iterator.next();
133         assertFalse("Header has too many children", iterator.hasNext());
134         assertHeaderElementEqual(headerElement, content);
135     }
136 
137     protected void assertHeaderElementEqual(SoapHeaderElement headerElement, String expected) throws Exception {
138         StringResult result = new StringResult();
139         transformer.transform(headerElement.getSource(), result);
140         assertXMLEqual("Invalid contents of header element", expected, result.toString());
141     }
142 
143 
144 }