/** * 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.cxf.jaxws; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.xml.namespace.QName; import javax.xml.transform.Result; import javax.xml.transform.dom.DOMSource; import javax.xml.ws.BindingProvider; import javax.xml.ws.EndpointReference; import javax.xml.ws.WebServiceException; import javax.xml.ws.WebServiceFeature; import javax.xml.ws.wsaddressing.W3CEndpointReference; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.apache.cxf.BusFactory; import org.apache.cxf.helpers.DOMUtils; import org.apache.cxf.jaxws.spi.ProviderImpl; import org.apache.cxf.staxutils.StaxUtils; import org.apache.hello_world_soap_http.Greeter; import org.apache.hello_world_soap_http.GreeterImpl; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; public class EndpointReferenceTest extends AbstractJaxWsTest { private final QName serviceName = new QName("http://apache.org/hello_world_soap_http", "SOAPService"); private final QName portName = new QName("http://apache.org/hello_world_soap_http", "SoapPort"); @Before public void setUp() throws Exception { } @Test public void testBindingProviderSOAPBinding() throws Exception { javax.xml.ws.Service s = javax.xml.ws.Service .create(new QName("http://apache.org/hello_world_soap_http", "SoapPort")); assertNotNull(s); Greeter greeter = s.getPort(Greeter.class); BindingProvider bindingProvider = (BindingProvider)greeter; EndpointReference er = bindingProvider.getEndpointReference(); assertNotNull(er); //If the BindingProvider instance has a binding that is either SOAP 1.1/HTTP or SOAP //1.2/HTTP, then a W3CEndpointReference MUST be returned. assertTrue(er instanceof W3CEndpointReference); } @Test public void testBindingProviderSOAPBindingStaicService() throws Exception { org.apache.hello_world_soap_http.SOAPService s = new org.apache.hello_world_soap_http.SOAPService(); Greeter greeter = s.getPort(Greeter.class); BindingProvider bindingProvider = (BindingProvider)greeter; EndpointReference er = bindingProvider.getEndpointReference(); assertNotNull(er); //If the BindingProvider instance has a binding that is either SOAP 1.1/HTTP or SOAP //1.2/HTTP, then a W3CEndpointReference MUST be returned. assertTrue(er instanceof W3CEndpointReference); } @Test public void testBindingProviderXMLBindingStaticService() throws Exception { org.apache.hello_world_xml_http.bare.XMLService s = new org.apache.hello_world_xml_http.bare.XMLService(); org.apache.hello_world_xml_http.bare.Greeter greeter = s.getXMLPort(); BindingProvider bindingProvider = (BindingProvider)greeter; //If the binding is XML/HTTP an java.lang.UnsupportedOperationException MUST be thrown. try { bindingProvider.getEndpointReference(); fail("Did not get expected UnsupportedOperationException"); } catch (UnsupportedOperationException e) { //do nothing } } /* * Any JAX-WS supported epr metadata MUST match the Service instances * ServiceName, otherwise a WebServiceExeption MUST be thrown. Any JAX-WS * supported epr metadata MUST match the PortName for the sei, otherwise a * WebServiceException MUST be thrown. If the Service instance has an * associated WSDL, its WSDL MUST be used to determine any binding * information, anyWSDL in a JAX-WS suppported epr metadata MUST be ignored. * If the Service instance does not have a WSDL, then any WSDL inlined in * the JAX-WS supported metadata of the epr MUST be used to determine * binding information. If there is not enough metadata in the Service * instance or in the epr metadata to determine a port, then a * WebServiceException MUST be thrown. */ @Test public void testServiceGetPortUsingEndpointReference() throws Exception { BusFactory.setDefaultBus(getBus()); GreeterImpl greeter1 = new GreeterImpl(); try (EndpointImpl endpoint = new EndpointImpl(getBus(), greeter1, (String)null)) { endpoint.publish("http://localhost:8080/test"); javax.xml.ws.Service s = javax.xml.ws.Service .create(new QName("http://apache.org/hello_world_soap_http", "SoapPort")); InputStream is = getClass().getResourceAsStream("resources/hello_world_soap_http_infoset.xml"); Document doc = StaxUtils.read(is); DOMSource erXML = new DOMSource(doc); EndpointReference endpointReference = EndpointReference.readFrom(erXML); WebServiceFeature[] wfs = new WebServiceFeature[] {}; Greeter greeter = s.getPort(endpointReference, Greeter.class, wfs); String response = greeter.greetMe("John"); assertEquals("Hello John", response); } } @Test public void testEndpointReferenceGetPort() throws Exception { BusFactory.setDefaultBus(getBus()); GreeterImpl greeter1 = new GreeterImpl(); try (EndpointImpl endpoint = new EndpointImpl(getBus(), greeter1, (String)null)) { endpoint.publish("http://localhost:8080/test"); InputStream is = getClass().getResourceAsStream("resources/hello_world_soap_http_infoset.xml"); Document doc = StaxUtils.read(is); DOMSource erXML = new DOMSource(doc); EndpointReference endpointReference = EndpointReference.readFrom(erXML); WebServiceFeature[] wfs = new WebServiceFeature[] {}; Greeter greeter = endpointReference.getPort(Greeter.class, wfs); String response = greeter.greetMe("John"); assertEquals("Hello John", response); } } @Test public void testEndpointGetEndpointReferenceSOAPBinding() throws Exception { GreeterImpl greeter = new GreeterImpl(); try (EndpointImpl endpoint = new EndpointImpl(getBus(), greeter, (String)null)) { endpoint.publish("http://localhost:8080/test"); InputStream is = getClass().getResourceAsStream("resources/hello_world_soap_http_infoset.xml"); Document doc = StaxUtils.read(is); Element referenceParameters = fetchElementByNameAttribute(doc.getDocumentElement(), "wsa:ReferenceParameters", ""); EndpointReference endpointReference = endpoint.getEndpointReference(referenceParameters); assertNotNull(endpointReference); assertTrue(endpointReference instanceof W3CEndpointReference); //A returned W3CEndpointReferenceMUST also contain the specified referenceParameters. //W3CEndpointReference wer = (W3CEndpointReference)endpointReference; endpoint.stop(); } } @Test @Ignore("Not implemented yet") public void testEndpointGetEndpointReferenceXMLBinding() throws Exception { org.apache.hello_world_xml_http.bare.Greeter greeter = new org.apache.hello_world_xml_http.bare.GreeterImpl(); try (EndpointImpl endpoint = new EndpointImpl(getBus(), greeter, (String)null)) { endpoint.publish("http://localhost:8080/test"); try { InputStream is = getClass().getResourceAsStream("resources/hello_world_soap_http_infoset.xml"); Document doc = StaxUtils.read(is); Element referenceParameters = fetchElementByNameAttribute(doc.getDocumentElement(), "wsa:ReferenceParameters", ""); endpoint.getEndpointReference(referenceParameters); fail("Did not get expected UnsupportedOperationException"); } catch (UnsupportedOperationException e) { //do nothing } endpoint.stop(); } } @Test public void testEndpointGetEndpointReferenceW3C() throws Exception { GreeterImpl greeter = new GreeterImpl(); try (EndpointImpl endpoint = new EndpointImpl(getBus(), greeter, (String)null)) { endpoint.publish("http://localhost:8080/test"); InputStream is = getClass().getResourceAsStream("resources/hello_world_soap_http_infoset.xml"); Document doc = StaxUtils.read(is); Element referenceParameters = fetchElementByNameAttribute(doc.getDocumentElement(), "wsa:ReferenceParameters", ""); EndpointReference endpointReference = endpoint.getEndpointReference(W3CEndpointReference.class, referenceParameters); assertNotNull(endpointReference); assertTrue(endpointReference instanceof W3CEndpointReference); //A returned W3CEndpointReferenceMUST also contain the specified referenceParameters. //W3CEndpointReference wer = (W3CEndpointReference)endpointReference; endpoint.stop(); } } @Test public void testEndpointGetEndpointReferenceInvalid() throws Exception { GreeterImpl greeter = new GreeterImpl(); try (EndpointImpl endpoint = new EndpointImpl(getBus(), greeter, (String)null)) { endpoint.publish("http://localhost:8080/test"); try { InputStream is = getClass().getResourceAsStream("resources/hello_world_soap_http_infoset.xml"); Document doc = StaxUtils.read(is); Element referenceParameters = fetchElementByNameAttribute(doc.getDocumentElement(), "wsa:ReferenceParameters", ""); endpoint.getEndpointReference(MyEndpointReference.class, referenceParameters); fail("Did not get expected WebServiceException"); } catch (WebServiceException e) { // do nothing } endpoint.stop(); } } @Test public void testProviderReadEndpointReference() throws Exception { ProviderImpl provider = new ProviderImpl(); InputStream is = getClass().getResourceAsStream("resources/hello_world_soap_http_infoset.xml"); Document doc = StaxUtils.read(is); DOMSource erXML = new DOMSource(doc); EndpointReference endpointReference = provider.readEndpointReference(erXML); assertNotNull(endpointReference); assertTrue(endpointReference instanceof W3CEndpointReference); } @Test public void testProviderCreateW3CEndpointReference() throws Exception { ProviderImpl provider = new ProviderImpl(); InputStream is = getClass().getResourceAsStream("resources/hello_world_soap_http_infoset.xml"); Document doc = StaxUtils.read(is); Element referenceParameter = fetchElementByNameAttribute(doc.getDocumentElement(), "wsa:ReferenceParameters", ""); List<Element> referenceParameters = new ArrayList<>(); if (referenceParameter != null) { referenceParameters.add(referenceParameter); } Element metadata = fetchElementByNameAttribute(doc.getDocumentElement(), "wsa:metadata", ""); List<Element> metadataList = new ArrayList<>(); if (metadata != null) { metadataList.add(metadata); } W3CEndpointReference endpointReference = provider .createW3CEndpointReference("http://localhost:8080/test", serviceName, portName, metadataList, "wsdlDocumentLocation", referenceParameters); assertNotNull(endpointReference); } @Test public void testProviderGetPort() throws Exception { BusFactory.setDefaultBus(getBus()); GreeterImpl greeter1 = new GreeterImpl(); try (EndpointImpl endpoint = new EndpointImpl(getBus(), greeter1, (String)null)) { endpoint.publish("http://localhost:8080/test"); ProviderImpl provider = new ProviderImpl(); InputStream is = getClass().getResourceAsStream("resources/hello_world_soap_http_infoset.xml"); Document doc = StaxUtils.read(is); DOMSource erXML = new DOMSource(doc); EndpointReference endpointReference = EndpointReference.readFrom(erXML); WebServiceFeature[] wfs = new WebServiceFeature[] {}; Greeter greeter = provider.getPort(endpointReference, Greeter.class, wfs); String response = greeter.greetMe("John"); assertEquals("Hello John", response); } } final class MyEndpointReference extends EndpointReference { protected MyEndpointReference() { } public void writeTo(Result result) { // NOT_IMPLEMENTED } } public static Element fetchElementByNameAttribute(Element parent, String elementName, String nameValue) { if (elementName.equals(parent.getTagName()) && parent.getAttribute("name").equals(nameValue)) { return parent; } Element elem = DOMUtils.getFirstElement(parent); while (elem != null) { Element el = fetchElementByNameAttribute(elem, elementName, nameValue); if (el != null) { return el; } elem = DOMUtils.getNextElement(elem); } return null; } }