/* * 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.description.impl; import junit.framework.TestCase; import org.apache.axis2.jaxws.description.DescriptionFactory; import org.apache.axis2.jaxws.description.EndpointDescription; import org.apache.axis2.jaxws.description.ServiceDescription; import org.apache.axis2.jaxws.description.builder.DescriptionBuilderComposite; import org.apache.axis2.jaxws.i18n.Messages; import javax.jws.WebService; import javax.xml.namespace.QName; import javax.xml.ws.Holder; import javax.xml.ws.Service; import javax.xml.ws.WebServiceClient; import javax.xml.ws.WebServiceException; import java.io.File; import java.net.MalformedURLException; import java.net.URL; /** * Test client sparse composite support in the MDQ layer at the Endpoint creation level. */ /** * */ public class ClientDBCSupportEndpointTests extends TestCase { private String namespaceURI = "http://org.apache.axis2.jaxws.description.impl.ClientDBCSupportEndpointTests"; private String svcLocalPart = "svcLocalPart"; private String portLocalPart = "portLocalPart"; /** * Verify that the code that doesn't use a composite continues to work correctly. */ public void testPreDBCFunctionality() { QName serviceQName = new QName(namespaceURI, svcLocalPart); ServiceDescription svcDesc = DescriptionFactory.createServiceDescription(null, serviceQName, ClientDBCSupportEndpointServiceSubclass.class); assertNotNull(svcDesc); ServiceDescriptionImpl svcDescImpl = (ServiceDescriptionImpl) svcDesc; DescriptionBuilderComposite svcDescComposite = svcDescImpl.getDescriptionBuilderComposite(); assertNotNull(svcDescComposite); Class testServiceClass = svcDescComposite.getCorrespondingClass(); assertNotNull(testServiceClass); assertEquals(ClientDBCSupportEndpointServiceSubclass.class, testServiceClass); // Now update with an SEI QName portQName = new QName(namespaceURI, portLocalPart); EndpointDescription epDesc = DescriptionFactory.updateEndpoint(svcDesc, ClientDBCSupportEndpointSEI.class, portQName, DescriptionFactory.UpdateType.GET_PORT); assertNotNull(epDesc); EndpointDescriptionImpl epDescImpl = (EndpointDescriptionImpl) epDesc; DescriptionBuilderComposite epDescComposite = epDescImpl.getDescriptionBuilderComposite(); Class seiClass = epDescComposite.getCorrespondingClass(); assertEquals(ClientDBCSupportEndpointSEI.class, seiClass); // Make sure we didn't overwrite the class in the ServiceDesc composite assertEquals(ClientDBCSupportEndpointServiceSubclass.class, svcDescComposite.getCorrespondingClass()); } /** * Verify that the code that uses a simple empty sparse composite to create an endpoint. */ public void testSimpleComposite() { QName serviceQName = new QName(namespaceURI, svcLocalPart); ServiceDescription svcDesc = DescriptionFactory.createServiceDescription(null, serviceQName, ClientDBCSupportEndpointServiceSubclass.class); assertNotNull(svcDesc); ServiceDescriptionImpl svcDescImpl = (ServiceDescriptionImpl) svcDesc; DescriptionBuilderComposite svcDescComposite = svcDescImpl.getDescriptionBuilderComposite(); assertNotNull(svcDescComposite); Class testServiceClass = svcDescComposite.getCorrespondingClass(); assertNotNull(testServiceClass); assertEquals(ClientDBCSupportEndpointServiceSubclass.class, testServiceClass); // Now update with an SEI QName portQName = new QName(namespaceURI, portLocalPart); DescriptionBuilderComposite setEpDescComposite = new DescriptionBuilderComposite(); Object compositeKey = "Key1"; EndpointDescription epDesc = DescriptionFactory.updateEndpoint(svcDesc, ClientDBCSupportEndpointSEI.class, portQName, DescriptionFactory.UpdateType.GET_PORT, setEpDescComposite, compositeKey); assertNotNull(epDesc); EndpointDescriptionImpl epDescImpl = (EndpointDescriptionImpl) epDesc; DescriptionBuilderComposite epDescComposite = epDescImpl.getDescriptionBuilderComposite(); // The sparse composite should NOT be equal to the composite in the EndpointDescription // The sparse composite SHOULD be equal to the sparse composite contained in the EndpointDescription assertNotSame(setEpDescComposite, epDescComposite); assertEquals(setEpDescComposite, epDescComposite.getSparseComposite(compositeKey)); Class seiClass = epDescComposite.getCorrespondingClass(); assertEquals(ClientDBCSupportEndpointSEI.class, seiClass); // Make sure we didn't overwrite the class in the ServiceDesc composite assertEquals(ClientDBCSupportEndpointServiceSubclass.class, svcDescComposite.getCorrespondingClass()); } /** * A composite can not be specified when doing an AddPort */ public void testAddPort() { QName serviceQName = new QName(namespaceURI, svcLocalPart); ServiceDescription svcDesc = DescriptionFactory.createServiceDescription(null, serviceQName, ClientDBCSupportEndpointServiceSubclass.class); assertNotNull(svcDesc); ServiceDescriptionImpl svcDescImpl = (ServiceDescriptionImpl) svcDesc; DescriptionBuilderComposite svcDescComposite = svcDescImpl.getDescriptionBuilderComposite(); assertNotNull(svcDescComposite); Class testServiceClass = svcDescComposite.getCorrespondingClass(); assertNotNull(testServiceClass); assertEquals(ClientDBCSupportEndpointServiceSubclass.class, testServiceClass); // Now update with an SEI QName portQName = new QName(namespaceURI, portLocalPart); DescriptionBuilderComposite setEpDescComposite = new DescriptionBuilderComposite(); Object compositeKey = "Key1"; try { EndpointDescription epDesc = DescriptionFactory.updateEndpoint(svcDesc, ClientDBCSupportEndpointSEI.class, portQName, DescriptionFactory.UpdateType.ADD_PORT, setEpDescComposite, compositeKey); fail("Should have caught an exception"); } catch (WebServiceException e) { // Expected path } } /** * Composite can not be specified with a CREATE_DISPATCH */ public void testCreateDispatch() { QName serviceQName = new QName(namespaceURI, svcLocalPart); ServiceDescription svcDesc = DescriptionFactory.createServiceDescription(null, serviceQName, ClientDBCSupportEndpointServiceSubclass.class); assertNotNull(svcDesc); ServiceDescriptionImpl svcDescImpl = (ServiceDescriptionImpl) svcDesc; DescriptionBuilderComposite svcDescComposite = svcDescImpl.getDescriptionBuilderComposite(); assertNotNull(svcDescComposite); Class testServiceClass = svcDescComposite.getCorrespondingClass(); assertNotNull(testServiceClass); assertEquals(ClientDBCSupportEndpointServiceSubclass.class, testServiceClass); // Now update with an SEI QName portQName = new QName(namespaceURI, portLocalPart); DescriptionBuilderComposite setEpDescComposite = new DescriptionBuilderComposite(); Object compositeKey = "Key1"; try { EndpointDescription epDesc = DescriptionFactory.updateEndpoint(svcDesc, null /* SEI can't be specified */, portQName, DescriptionFactory.UpdateType.CREATE_DISPATCH, setEpDescComposite, compositeKey); fail("Should have caught an exception"); } catch (WebServiceException e) { // Expected path String msg = Messages.getMessage("serviceDescErr6"); assertTrue(e.toString().contains(msg)); } } /** * Update a port that was created from WSDL (i.e. a declared port) with a composite. To get * into a state where a declared port would need to be updated: * 1) Do a CREATE_DISPATCH on a declared wsdl port * 2) Do a GET_PORT on that port, providing an SEI. * In this case, the EndpointDescription is shared between the two, but the sparse composite * specified on the GET_PORT should be unique to it. */ public void testUpdateDeclaredPort() { QName serviceQName = new QName(namespaceURI, svcLocalPart); ServiceDescription svcDesc = DescriptionFactory.createServiceDescription(getWsdlURL(), serviceQName, Service.class); QName portQName = new QName(namespaceURI, portLocalPart); // First we do a CREATE_DISPATCH to create the EndpointDescription for the WSDL port. // Note that we don't specify a composite (because that isn't allowed for CREATE_DISPATCH) // and one will be created by the runtime EndpointDescription epDescForCreate = DescriptionFactory.updateEndpoint(svcDesc, null /* SEI can't be specified */, portQName, DescriptionFactory.UpdateType.CREATE_DISPATCH); EndpointDescriptionImpl epDescImpl = (EndpointDescriptionImpl) epDescForCreate; DescriptionBuilderComposite createDispatchComposite = epDescImpl.getDescriptionBuilderComposite(); assertNotNull(createDispatchComposite); // There really shouldn't be any sparse composites at this point; make sure by checking a // couple obvious things that might be used as a key. assertNull(epDescImpl.getDescriptionBuilderComposite().getSparseComposite(createDispatchComposite)); assertNull(epDescImpl.getDescriptionBuilderComposite().getSparseComposite(null)); DescriptionBuilderComposite updateEndpointComposite = new DescriptionBuilderComposite(); Object compositeKey = "KEY1"; EndpointDescription epDescForGetPort = DescriptionFactory.updateEndpoint(svcDesc, ClientDBCSupportEndpointSEI.class, portQName, DescriptionFactory.UpdateType.GET_PORT, updateEndpointComposite, compositeKey); assertEquals(epDescForCreate, epDescForGetPort); // The update needs to have set the sparse composite (like for a given ServiceDelegate // instance) without having lost the different composite for the create. The EndpointDescripton // can be shared, but the sparse composite overrides they contain need to be unique (like to the ServiceDelegates) assertTrue(createDispatchComposite != updateEndpointComposite); assertEquals(updateEndpointComposite, epDescImpl.getDescriptionBuilderComposite().getSparseComposite(compositeKey)); // Make sure this didn't change any of the sparse information (which is none) for the previous create assertNull(epDescImpl.getDescriptionBuilderComposite().getSparseComposite(createDispatchComposite)); assertNull(epDescImpl.getDescriptionBuilderComposite().getSparseComposite(null)); } /** * Do multiple GET_PORT on the same service. This should share the same EndpointDescription * but the sparse composite specified on GET_PORT should be unique to each key. */ public void testMultipleGetPort() { QName serviceQName = new QName(namespaceURI, svcLocalPart); ServiceDescription svcDesc = DescriptionFactory.createServiceDescription(getWsdlURL(), serviceQName, Service.class); QName portQName = new QName(namespaceURI, portLocalPart); // Do the first GetPort using sd1 as a key for the sparse composite DescriptionBuilderComposite sd1Composite = new DescriptionBuilderComposite(); Object sd1 = "SD1"; EndpointDescription epDescForGetPort1 = DescriptionFactory.updateEndpoint(svcDesc, ClientDBCSupportEndpointSEI.class, portQName, DescriptionFactory.UpdateType.GET_PORT, sd1Composite, sd1); assertNotNull(epDescForGetPort1); EndpointDescriptionImpl epDescImpl1 = (EndpointDescriptionImpl) epDescForGetPort1; assertEquals(sd1Composite, epDescImpl1.getDescriptionBuilderComposite().getSparseComposite(sd1)); // Do the second GetPort using sd2 as a key for the sparse composite DescriptionBuilderComposite sd2Composite = new DescriptionBuilderComposite(); Object sd2 = "SD2"; EndpointDescription epDescForGetPort2 = DescriptionFactory.updateEndpoint(svcDesc, ClientDBCSupportEndpointSEI.class, portQName, DescriptionFactory.UpdateType.GET_PORT, sd2Composite, sd2); assertNotNull(epDescForGetPort2); assertEquals(epDescForGetPort1, epDescForGetPort2); EndpointDescriptionImpl epDescImpl2 = (EndpointDescriptionImpl) epDescForGetPort2; assertNotSame(sd1Composite, sd2Composite); assertEquals(sd2Composite, epDescImpl2.getDescriptionBuilderComposite().getSparseComposite(sd2)); assertEquals(sd1Composite, epDescImpl1.getDescriptionBuilderComposite().getSparseComposite(sd1)); } static URL getWsdlURL() { URL url = null; String wsdlLocation = null; try { try{ String baseDir = new File(System.getProperty("basedir",".")).getCanonicalPath(); wsdlLocation = new File(baseDir + "/test-resources/wsdl/ClientEndpointMetadata.wsdl").getAbsolutePath(); }catch(Exception e){ e.printStackTrace(); fail("Exception creating File(WSDL): " + e.toString()); } File file = new File(wsdlLocation); url = file.toURL(); } catch (MalformedURLException e) { e.printStackTrace(); fail("Exception converting WSDL file to URL: " + e.toString()); } return url; } } @WebServiceClient(targetNamespace="originalTNS", wsdlLocation="originalWsdlLocation") class ClientDBCSupportEndpointServiceSubclass extends javax.xml.ws.Service { protected ClientDBCSupportEndpointServiceSubclass(URL wsdlDocumentLocation, QName serviceName) { super(wsdlDocumentLocation, serviceName); } } @WebService interface ClientDBCSupportEndpointSEI { public String echo (String string); } @WebService(serviceName = "EchoService", endpointInterface="org.apache.ws.axis2.tests.EchoPort") class ClientDBCSupportEndpointEchoServiceImplWithSEI { public void echo(Holder<String> text) { text.value = "Echo " + text.value; } }