1   /*
2    * Copyright 2005-2010 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.saaj.support;
18  
19  import java.io.InputStream;
20  import javax.xml.namespace.QName;
21  import javax.xml.parsers.DocumentBuilder;
22  import javax.xml.parsers.DocumentBuilderFactory;
23  import javax.xml.soap.MessageFactory;
24  import javax.xml.soap.MimeHeaders;
25  import javax.xml.soap.Name;
26  import javax.xml.soap.SOAPEnvelope;
27  import javax.xml.soap.SOAPException;
28  import javax.xml.soap.SOAPMessage;
29  
30  import org.springframework.core.io.ClassPathResource;
31  import org.springframework.core.io.Resource;
32  import org.springframework.util.StringUtils;
33  
34  import org.junit.Assert;
35  import org.junit.Before;
36  import org.junit.Test;
37  import org.w3c.dom.Document;
38  
39  import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual;
40  
41  public class SaajUtilsTest {
42  
43      private MessageFactory messageFactory;
44  
45      @Before
46      public void setUp() throws Exception {
47          messageFactory = MessageFactory.newInstance();
48      }
49  
50      @Test
51      public void testToName() throws Exception {
52          SOAPMessage message = messageFactory.createMessage();
53          QName qName = new QName("localPart");
54          SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
55          Name name = SaajUtils.toName(qName, envelope);
56          Assert.assertNotNull("Invalid name", name);
57          Assert.assertEquals("Invalid local part", qName.getLocalPart(), name.getLocalName());
58          Assert.assertFalse("Invalid prefix", StringUtils.hasLength(name.getPrefix()));
59          Assert.assertFalse("Invalid namespace", StringUtils.hasLength(name.getURI()));
60      }
61  
62      @Test
63      public void testToNameNamespace() throws Exception {
64          SOAPMessage message = messageFactory.createMessage();
65          QName qName = new QName("namespace", "localPart");
66          SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
67          envelope.addNamespaceDeclaration("prefix", "namespace");
68          Name name = SaajUtils.toName(qName, envelope);
69          Assert.assertNotNull("Invalid name", name);
70          Assert.assertEquals("Invalid namespace", qName.getNamespaceURI(), name.getURI());
71          Assert.assertEquals("Invalid local part", qName.getLocalPart(), name.getLocalName());
72          Assert.assertEquals("Invalid prefix", "prefix", name.getPrefix());
73      }
74  
75      @Test
76      public void testToNameNamespacePrefix() throws Exception {
77          SOAPMessage message = messageFactory.createMessage();
78          QName qName = new QName("namespace", "localPart", "prefix");
79          SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
80          Name name = SaajUtils.toName(qName, envelope);
81          Assert.assertNotNull("Invalid name", name);
82          Assert.assertEquals("Invalid namespace", qName.getNamespaceURI(), name.getURI());
83          Assert.assertEquals("Invalid local part", qName.getLocalPart(), name.getLocalName());
84          Assert.assertEquals("Invalid prefix", qName.getPrefix(), name.getPrefix());
85      }
86  
87      @Test
88      public void testToQName() throws Exception {
89          SOAPMessage message = messageFactory.createMessage();
90          Name name = message.getSOAPPart().getEnvelope().createName("localPart", null, null);
91          QName qName = SaajUtils.toQName(name);
92          Assert.assertNotNull("Invalid qName", qName);
93          Assert.assertEquals("Invalid namespace", name.getURI(), qName.getNamespaceURI());
94          Assert.assertFalse("Invalid prefix", StringUtils.hasLength(qName.getPrefix()));
95          Assert.assertFalse("Invalid namespace", StringUtils.hasLength(qName.getNamespaceURI()));
96      }
97  
98      @Test
99      public void testToQNameNamespace() throws Exception {
100         SOAPMessage message = messageFactory.createMessage();
101         Name name = message.getSOAPPart().getEnvelope().createName("localPart", null, "namespace");
102         QName qName = SaajUtils.toQName(name);
103         Assert.assertNotNull("Invalid qName", qName);
104         Assert.assertEquals("Invalid namespace", name.getURI(), qName.getNamespaceURI());
105         Assert.assertEquals("Invalid local part", name.getLocalName(), qName.getLocalPart());
106         Assert.assertFalse("Invalid prefix", StringUtils.hasLength(qName.getPrefix()));
107     }
108 
109     @Test
110     public void testToQNamePrefixNamespace() throws Exception {
111         SOAPMessage message = messageFactory.createMessage();
112         Name name = message.getSOAPPart().getEnvelope().createName("localPart", "prefix", "namespace");
113         QName qName = SaajUtils.toQName(name);
114         Assert.assertNotNull("Invalid qName", qName);
115         Assert.assertEquals("Invalid namespace", name.getURI(), qName.getNamespaceURI());
116         Assert.assertEquals("Invalid local part", name.getLocalName(), qName.getLocalPart());
117         Assert.assertEquals("Invalid prefix", name.getPrefix(), qName.getPrefix());
118     }
119 
120     @Test
121     public void testLoadMessage() throws Exception {
122         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
123         factory.setNamespaceAware(true);
124         DocumentBuilder builder = factory.newDocumentBuilder();
125         Document document = builder.parse(getClass().getResourceAsStream("soapMessage.xml"));
126         SOAPMessage soapMessage =
127                 SaajUtils.loadMessage(new ClassPathResource("soapMessage.xml", getClass()), messageFactory);
128         assertXMLEqual(soapMessage.getSOAPPart(), document);
129     }
130 
131     @Test
132     public void testGetSaajVersion() throws Exception {
133         Assert.assertEquals("Invalid SAAJ version", SaajUtils.SAAJ_13, SaajUtils.getSaajVersion());
134     }
135 
136     @Test(expected = SOAPException.class)
137     public void testGetSaajVersionInvalidEnvelope() throws Exception {
138         Resource resource = new ClassPathResource("invalidNamespaceReferenceSoapMessage.xml", getClass());
139         InputStream in = resource.getInputStream();
140         MimeHeaders headers = new MimeHeaders();
141         SOAPMessage soapMessage = messageFactory.createMessage(headers, in);
142         SaajUtils.getSaajVersion(soapMessage);
143     }
144 
145 }