/* * 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.spi; import junit.framework.TestCase; import org.apache.axis2.context.ConfigurationContext; import org.apache.axis2.jaxws.ClientConfigurationFactory; import org.apache.axis2.jaxws.catalog.impl.OASISCatalogManager; import org.apache.axis2.jaxws.description.DescriptionTestUtils2; import org.apache.axis2.jaxws.description.ServiceDescription; import org.apache.axis2.jaxws.description.builder.DescriptionBuilderComposite; import org.apache.axis2.jaxws.description.builder.WebServiceClientAnnot; import org.apache.axis2.jaxws.description.impl.DescriptionFactoryImpl; import org.apache.axis2.metadata.registry.MetadataFactoryRegistry; import javax.xml.namespace.QName; import javax.xml.ws.Service; import javax.xml.ws.WebServiceClient; import javax.xml.ws.WebServiceException; import java.io.File; import java.lang.reflect.Field; import java.net.MalformedURLException; import java.net.URL; import java.util.Iterator; /** * Test creation of a generic Service and generated Service with and without additional * metadata specified during the creation of the service. Additional metadata could be supplied * by a runtime in order to support JSR-109 deployment descriptors or injection of WebServiceRef * annotations. */ public class ClientMetadataTest extends TestCase { static final String namespaceURI = "http://description.jaxws.axis2.apache.org"; static final String svcLocalPart = "svcLocalPart"; static final String originalWsdl = "ClientMetadata.wsdl"; static final String overridenWsdl = "ClientMetadataOverriden.wsdl"; static final String otherWsdl = "ClientMetadataOther.wsdl"; static final String originalWsdl_portLocalPart = "portLocalPart"; static final String overridenWsdl_portLocalPart = "portLocalPartOverriden"; static final String otherWsdl_portLocalPart = "portLocalPartOther"; static final String uniqueCatalog = "test-resources/unique-catalog.xml"; /** * Test Service.create(QName) with no composite specified */ public void test1ArgServiceWithoutComposite() { QName serviceQName = new QName(namespaceURI, svcLocalPart); Service service = Service.create(serviceQName); assertNotNull(service); ServiceDelegate serviceDelegate = DescriptionTestUtils2.getServiceDelegate(service); assertNotNull(serviceDelegate); ServiceDescription serviceDesc = serviceDelegate.getServiceDescription(); assertNotNull(serviceDesc); DescriptionBuilderComposite dbcInServiceDesc = DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc); assertNotNull(dbcInServiceDesc); assertEquals(Service.class, dbcInServiceDesc.getCorrespondingClass()); // Since this is a generic Service with no overrides, there will be no WebServiceClient annotation WebServiceClient wsClient = dbcInServiceDesc.getWebServiceClientAnnot(); assertNull(wsClient); // No WSDL should have been used, so no Ports should be found assertTrue("Wrong WSDL used", validatePort(service, null)); } /** * Service.create(URL, QName) with no composite specified */ public void test2ArgServiceWithoutComposite() { QName serviceQName = new QName(namespaceURI, svcLocalPart); URL wsdlUrl = getWsdlURL(otherWsdl); Service service = Service.create(wsdlUrl, serviceQName); assertNotNull(service); ServiceDelegate serviceDelegate = DescriptionTestUtils2.getServiceDelegate(service); assertNotNull(serviceDelegate); ServiceDescription serviceDesc = serviceDelegate.getServiceDescription(); assertNotNull(serviceDesc); DescriptionBuilderComposite dbcInServiceDesc = DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc); assertNotNull(dbcInServiceDesc); assertEquals(Service.class, dbcInServiceDesc.getCorrespondingClass()); // Since this is a generic Service with no overrides, there will be no WebServiceClient annotation WebServiceClient wsClient = dbcInServiceDesc.getWebServiceClientAnnot(); assertNull(wsClient); // WSDL was specified on the create, so make sure the right one was used by checking the ports assertTrue("Wrong WSDL used", validatePort(service, otherWsdl_portLocalPart)); } /** * Service.create(QName) with a composite specified but no override in the composite */ public void test1ArgServiceWithComposite() { QName serviceQName = new QName(namespaceURI, svcLocalPart); DescriptionBuilderComposite composite = new DescriptionBuilderComposite(); assertNull(ServiceDelegate.getServiceMetadata()); // Use the proprietary SPI to create a service with additional metadata specified ServiceDelegate.setServiceMetadata(composite); Service service = Service.create(serviceQName); assertNotNull(service); // Verify that the composite has been reset so that it would not affect the next Service assertNull(ServiceDelegate.getServiceMetadata()); ServiceDelegate serviceDelegate = DescriptionTestUtils2.getServiceDelegate(service); assertNotNull(serviceDelegate); ServiceDescription serviceDesc = serviceDelegate.getServiceDescription(); assertNotNull(serviceDesc); DescriptionBuilderComposite dbcInServiceDesc = DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc); assertSame(composite, dbcInServiceDesc.getSparseComposite(serviceDelegate)); assertEquals(Service.class, dbcInServiceDesc.getCorrespondingClass()); // Since this is a generic Service with no overrides, there will be no WebServiceClient annotation WebServiceClient wsClient = dbcInServiceDesc.getWebServiceClientAnnot(); assertNull(wsClient); // No WSDL should have been used, so no Ports should be found assertTrue("Wrong WSDL used", validatePort(service, null)); } /** * Service.create(URL, QName) with a composite specified but no override in the composite */ public void test2ArgServiceWithComposite() { QName serviceQName = new QName(namespaceURI, svcLocalPart); DescriptionBuilderComposite composite = new DescriptionBuilderComposite(); URL wsdlUrl = getWsdlURL(otherWsdl); // Use the proprietary SPI to create a service with additional metadata specified ServiceDelegate.setServiceMetadata(composite); Service service = Service.create(wsdlUrl, serviceQName); assertNotNull(service); // Verify that the composite has been reset so that it would not affect the next Service assertNull(ServiceDelegate.getServiceMetadata()); ServiceDelegate serviceDelegate = DescriptionTestUtils2.getServiceDelegate(service); assertNotNull(serviceDelegate); ServiceDescription serviceDesc = serviceDelegate.getServiceDescription(); assertNotNull(serviceDesc); DescriptionBuilderComposite dbcInServiceDesc = DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc); assertSame(composite, dbcInServiceDesc.getSparseComposite(serviceDelegate)); assertEquals(Service.class, dbcInServiceDesc.getCorrespondingClass()); // Since this is a generic Service with no overrides, there will be no WebServiceClient annotation WebServiceClient wsClient = dbcInServiceDesc.getWebServiceClientAnnot(); assertNull(wsClient); // WSDL was specified on the create, so make sure the right one was used by checking the ports assertTrue("Wrong WSDL used", validatePort(service, otherWsdl_portLocalPart)); } /** * Generated service constructor() with no composite specified */ public void testNoArgGeneratedService() { Service service = new ClientMetadataGeneratedService(); assertNotNull(service); ServiceDelegate serviceDelegate = DescriptionTestUtils2.getServiceDelegate(service); assertNotNull(serviceDelegate); ServiceDescription serviceDesc = serviceDelegate.getServiceDescription(); assertNotNull(serviceDesc); DescriptionBuilderComposite dbcInServiceDesc = DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc); assertEquals(ClientMetadataGeneratedService.class, dbcInServiceDesc.getCorrespondingClass()); // There is WebServiceClient on the generated Service WebServiceClient wsClient = dbcInServiceDesc.getWebServiceClientAnnot(); assertNotNull(wsClient); assertEquals(originalWsdl, wsClient.wsdlLocation()); assertEquals("originalTNS", wsClient.targetNamespace()); assertEquals("", wsClient.name()); // WSDL not specified, so generated Service should use the annotation value assertTrue("Wrong WSDL Used", validatePort(service, originalWsdl_portLocalPart)); } /** * Generated service constructor(URL, QName) with no composite specified */ public void test2ArgGeneratedService() { Service service = new ClientMetadataGeneratedService(getWsdlURL(otherWsdl), new QName(namespaceURI, svcLocalPart)); assertNotNull(service); ServiceDelegate serviceDelegate = DescriptionTestUtils2.getServiceDelegate(service); assertNotNull(serviceDelegate); ServiceDescription serviceDesc = serviceDelegate.getServiceDescription(); assertNotNull(serviceDesc); DescriptionBuilderComposite dbcInServiceDesc = DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc); assertEquals(ClientMetadataGeneratedService.class, dbcInServiceDesc.getCorrespondingClass()); // There is WebServiceClient on the generated Service WebServiceClient wsClient = dbcInServiceDesc.getWebServiceClientAnnot(); assertNotNull(wsClient); assertEquals(originalWsdl, wsClient.wsdlLocation()); assertEquals("originalTNS", wsClient.targetNamespace()); assertEquals("", wsClient.name()); // WSDL was specified on the generated Service constructor, // so make sure the right one was used by checking the ports assertTrue("Wrong WSDL used", validatePort(service, otherWsdl_portLocalPart)); } /** * Generated service constructor() with composite specified but no override in composite */ public void testNoArgGeneratedServiceWithComposite() { DescriptionBuilderComposite composite = new DescriptionBuilderComposite(); ServiceDelegate.setServiceMetadata(composite); Service service = new ClientMetadataGeneratedService(); assertNotNull(service); assertNull(ServiceDelegate.getServiceMetadata()); ServiceDelegate serviceDelegate = DescriptionTestUtils2.getServiceDelegate(service); assertNotNull(serviceDelegate); ServiceDescription serviceDesc = serviceDelegate.getServiceDescription(); assertNotNull(serviceDesc); DescriptionBuilderComposite dbcInServiceDesc = DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc); assertSame(composite, dbcInServiceDesc.getSparseComposite(serviceDelegate)); assertEquals(ClientMetadataGeneratedService.class, dbcInServiceDesc.getCorrespondingClass()); // There is WebServiceClient on the generated Service and it wasn't overriden in the composite WebServiceClient wsClient = dbcInServiceDesc.getWebServiceClientAnnot(); assertNotNull(wsClient); assertEquals(originalWsdl, wsClient.wsdlLocation()); assertEquals("originalTNS", wsClient.targetNamespace()); assertEquals("", wsClient.name()); // No WSDL override specified in the composite, so generated Service should use the annotation value assertTrue("Wrong WSDL Used", validatePort(service, originalWsdl_portLocalPart)); } /** * Generated service constructor(URL, QName) with composite specified but no override in composite */ public void test2ArgGeneratedServiceWithComposite() { DescriptionBuilderComposite composite = new DescriptionBuilderComposite(); ServiceDelegate.setServiceMetadata(composite); Service service = new ClientMetadataGeneratedService(getWsdlURL(otherWsdl), new QName(namespaceURI, svcLocalPart)); assertNotNull(service); assertNull(ServiceDelegate.getServiceMetadata()); ServiceDelegate serviceDelegate = DescriptionTestUtils2.getServiceDelegate(service); assertNotNull(serviceDelegate); ServiceDescription serviceDesc = serviceDelegate.getServiceDescription(); assertNotNull(serviceDesc); DescriptionBuilderComposite dbcInServiceDesc = DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc); assertSame(composite, dbcInServiceDesc.getSparseComposite(serviceDelegate)); assertEquals(ClientMetadataGeneratedService.class, dbcInServiceDesc.getCorrespondingClass()); // There is WebServiceClient on the generated Service and it wasn't overriden in the composite WebServiceClient wsClient = dbcInServiceDesc.getWebServiceClientAnnot(); assertNotNull(wsClient); assertEquals(originalWsdl, wsClient.wsdlLocation()); assertEquals("originalTNS", wsClient.targetNamespace()); assertEquals("", wsClient.name()); // WSDL was specified on the generated Service constructor, and none in the composite // so should get the WSDL specified on the constructor assertTrue("Wrong WSDL used", validatePort(service, otherWsdl_portLocalPart)); } /** * Service.create(QName) with a composite that specifies a wsdlLocation override */ public void test1ArgServiceOverrideWsdlLocation() { QName serviceQName = new QName(namespaceURI, svcLocalPart); DescriptionBuilderComposite composite = new DescriptionBuilderComposite(); WebServiceClientAnnot wsClientAnno = WebServiceClientAnnot.createWebServiceClientAnnotImpl(null, null, getWsdlLocation(overridenWsdl)); composite.setWebServiceClientAnnot(wsClientAnno); // Use the proprietary SPI to create a service with additional metadata specified ServiceDelegate.setServiceMetadata(composite); Service service = Service.create(serviceQName); assertNotNull(service); // Verify that the composite has been reset so that it would not affect the next Service assertNull(ServiceDelegate.getServiceMetadata()); ServiceDelegate serviceDelegate = DescriptionTestUtils2.getServiceDelegate(service); assertNotNull(serviceDelegate); ServiceDescription serviceDesc = serviceDelegate.getServiceDescription(); assertNotNull(serviceDesc); DescriptionBuilderComposite dbcInServiceDesc = DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc); assertSame(composite, dbcInServiceDesc.getSparseComposite(serviceDelegate)); assertEquals(Service.class, dbcInServiceDesc.getCorrespondingClass()); // This is a generic Service with overrides, there will be WebServiceClient annotation WebServiceClient wsClient = dbcInServiceDesc.getWebServiceClientAnnot(); assertNull(wsClient); wsClient = dbcInServiceDesc.getWebServiceClientAnnot(serviceDelegate); assertNotNull(wsClient); assertEquals(getWsdlLocation(overridenWsdl), wsClient.wsdlLocation()); assertNull(wsClient.targetNamespace()); assertNull(wsClient.name()); // WSDL override specified in the composite assertTrue("Wrong WSDL used", validatePort(service, overridenWsdl_portLocalPart)); } /** * Service.create(QName) with a composite that overrides the TargetNamespace. Most of the * other tests override the WSDL Location since that is what a JSR-109 DD can specify. This * test makes sure other values can be overridden as well */ public void test1ArgServiceOverrideTNS() { QName serviceQName = new QName(namespaceURI, svcLocalPart); DescriptionBuilderComposite composite = new DescriptionBuilderComposite(); WebServiceClientAnnot wsClientAnno = WebServiceClientAnnot.createWebServiceClientAnnotImpl(null, "overrideTNS", null); composite.setWebServiceClientAnnot(wsClientAnno); // Use the proprietary SPI to create a service with additional metadata specified ServiceDelegate.setServiceMetadata(composite); Service service = Service.create(serviceQName); assertNotNull(service); // Verify that the composite has been reset so that it would not affect the next Service assertNull(ServiceDelegate.getServiceMetadata()); ServiceDelegate serviceDelegate = DescriptionTestUtils2.getServiceDelegate(service); assertNotNull(serviceDelegate); ServiceDescription serviceDesc = serviceDelegate.getServiceDescription(); assertNotNull(serviceDesc); DescriptionBuilderComposite dbcInServiceDesc = DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc); assertSame(composite, dbcInServiceDesc.getSparseComposite(serviceDelegate)); assertEquals(Service.class, dbcInServiceDesc.getCorrespondingClass()); // The target namespace for the key should be overriden; it should not be overriden for // no key. WebServiceClient wsClient = dbcInServiceDesc.getWebServiceClientAnnot(); assertNull(wsClient); WebServiceClient wsClientKeyed = dbcInServiceDesc.getWebServiceClientAnnot(serviceDelegate); assertNotNull(wsClientKeyed); assertNull(wsClientKeyed.wsdlLocation()); assertEquals("overrideTNS", wsClientKeyed.targetNamespace()); assertNull(wsClientKeyed.name()); } /** * Service.create(QName) with a composite that specifies a CatalogManager override */ public void test1ArgServiceOverrideCatalogManager() { QName serviceQName = new QName(namespaceURI, svcLocalPart); DescriptionBuilderComposite composite = new DescriptionBuilderComposite(); OASISCatalogManager catalogManager = new OASISCatalogManager(); catalogManager.setCatalogFiles(getCatalogLocation(uniqueCatalog)); composite.setCatalogManager(catalogManager); // Use the proprietary SPI to create a service with additional metadata specified ServiceDelegate.setServiceMetadata(composite); Service service = Service.create(serviceQName); assertNotNull(service); // Verify that the composite has been reset so that it would not affect the next Service assertNull(ServiceDelegate.getServiceMetadata()); ServiceDelegate serviceDelegate = DescriptionTestUtils2.getServiceDelegate(service); assertNotNull(serviceDelegate); ServiceDescription serviceDesc = serviceDelegate.getServiceDescription(); assertNotNull(serviceDesc); DescriptionBuilderComposite dbcInServiceDesc = DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc); assertSame(composite, dbcInServiceDesc.getSparseComposite(serviceDelegate)); assertEquals(Service.class, dbcInServiceDesc.getCorrespondingClass()); // Verify that the CatalogManager for the Service uses the unique catalog file. String serviceCatalogFile = (String) dbcInServiceDesc.getSparseComposite(serviceDelegate).getCatalogManager().getCatalogFiles().get(0); assertEquals(serviceCatalogFile, getCatalogLocation(uniqueCatalog)); } /** * Service.create(URL, QName) with a composite that specifies a wsdlLocation override */ public void test2ArgServiceOverrideWsdlLocation() { QName serviceQName = new QName(namespaceURI, svcLocalPart); URL wsdlUrl = getWsdlURL(otherWsdl); DescriptionBuilderComposite composite = new DescriptionBuilderComposite(); WebServiceClientAnnot wsClientAnno = WebServiceClientAnnot.createWebServiceClientAnnotImpl(null, null, getWsdlLocation(overridenWsdl)); composite.setWebServiceClientAnnot(wsClientAnno); // Use the proprietary SPI to create a service with additional metadata specified ServiceDelegate.setServiceMetadata(composite); Service service = Service.create(wsdlUrl, serviceQName); assertNotNull(service); // Verify that the composite has been reset so that it would not affect the next Service assertNull(ServiceDelegate.getServiceMetadata()); ServiceDelegate serviceDelegate = DescriptionTestUtils2.getServiceDelegate(service); assertNotNull(serviceDelegate); ServiceDescription serviceDesc = serviceDelegate.getServiceDescription(); assertNotNull(serviceDesc); DescriptionBuilderComposite dbcInServiceDesc = DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc); assertSame(composite, dbcInServiceDesc.getSparseComposite(serviceDelegate)); assertEquals(Service.class, dbcInServiceDesc.getCorrespondingClass()); // Since this is a generic Service with overrides, there will be a WebServiceClient annotation WebServiceClient wsClient = dbcInServiceDesc.getWebServiceClientAnnot(); assertNull(wsClient); wsClient = dbcInServiceDesc.getWebServiceClientAnnot(serviceDelegate); assertNotNull(wsClient); assertEquals(getWsdlLocation(overridenWsdl), wsClient.wsdlLocation()); assertNull(wsClient.targetNamespace()); assertNull(wsClient.name()); // WSDL override specified in the composite assertTrue("Wrong WSDL used", validatePort(service, overridenWsdl_portLocalPart)); } /** * Service.create(URL, QName) with a composite that specifies a CatalogManager override */ public void test2ArgServiceOverrideCatalogManager() { QName serviceQName = new QName(namespaceURI, svcLocalPart); URL wsdlUrl = getWsdlURL(otherWsdl); DescriptionBuilderComposite composite = new DescriptionBuilderComposite(); OASISCatalogManager catalogManager = new OASISCatalogManager(); catalogManager.setCatalogFiles(getCatalogLocation(uniqueCatalog)); composite.setCatalogManager(catalogManager); // Use the proprietary SPI to create a service with additional metadata specified ServiceDelegate.setServiceMetadata(composite); Service service = Service.create(wsdlUrl, serviceQName); assertNotNull(service); // Verify that the composite has been reset so that it would not affect the next Service assertNull(ServiceDelegate.getServiceMetadata()); ServiceDelegate serviceDelegate = DescriptionTestUtils2.getServiceDelegate(service); assertNotNull(serviceDelegate); ServiceDescription serviceDesc = serviceDelegate.getServiceDescription(); assertNotNull(serviceDesc); DescriptionBuilderComposite dbcInServiceDesc = DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc); assertSame(composite, dbcInServiceDesc.getSparseComposite(serviceDelegate)); assertEquals(Service.class, dbcInServiceDesc.getCorrespondingClass()); // Verify that the CatalogManager for the Service uses the unique catalog file. String serviceCatalogFile = (String) dbcInServiceDesc.getSparseComposite(serviceDelegate).getCatalogManager().getCatalogFiles().get(0); assertEquals(serviceCatalogFile, getCatalogLocation(uniqueCatalog)); } /** * Generated service constructor() with a composite that specifies a wsdlLocation override */ public void testNoArgGeneratedServiceOverrideWsdlLocation() { DescriptionBuilderComposite composite = new DescriptionBuilderComposite(); WebServiceClientAnnot wsClientAnno = WebServiceClientAnnot.createWebServiceClientAnnotImpl(null, null, getWsdlLocation(overridenWsdl)); composite.setWebServiceClientAnnot(wsClientAnno); ServiceDelegate.setServiceMetadata(composite); Service service = new ClientMetadataGeneratedService(); assertNotNull(service); assertNull(ServiceDelegate.getServiceMetadata()); ServiceDelegate serviceDelegate = DescriptionTestUtils2.getServiceDelegate(service); assertNotNull(serviceDelegate); ServiceDescription serviceDesc = serviceDelegate.getServiceDescription(); assertNotNull(serviceDesc); DescriptionBuilderComposite dbcInServiceDesc = DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc); assertSame(composite, dbcInServiceDesc.getSparseComposite(serviceDelegate)); assertEquals(ClientMetadataGeneratedService.class, dbcInServiceDesc.getCorrespondingClass()); // There is WebServiceClient on the generated Service and it was overriden in the composite // for this key, however the keyless composite should not have any overrides. WebServiceClient wsClient = dbcInServiceDesc.getWebServiceClientAnnot(); assertNotNull(wsClient); assertEquals(originalWsdl, wsClient.wsdlLocation()); assertEquals("originalTNS", wsClient.targetNamespace()); assertEquals("", wsClient.name()); WebServiceClient wsClientKeyed = dbcInServiceDesc.getWebServiceClientAnnot(serviceDelegate); assertNotSame(wsClient, wsClientKeyed); assertEquals(getWsdlLocation(overridenWsdl), wsClientKeyed.wsdlLocation()); assertEquals("originalTNS", wsClientKeyed.targetNamespace()); assertEquals("", wsClientKeyed.name()); // WSDL override specified in the composite assertTrue("Wrong WSDL used", validatePort(service, overridenWsdl_portLocalPart)); } /** * Generated service constructor() with a composite that specifies a CatalogManager override */ public void testNoArgGeneratedServiceOverrideCatalogManager() { DescriptionBuilderComposite composite = new DescriptionBuilderComposite(); OASISCatalogManager catalogManager = new OASISCatalogManager(); catalogManager.setCatalogFiles(getCatalogLocation(uniqueCatalog)); composite.setCatalogManager(catalogManager); ServiceDelegate.setServiceMetadata(composite); Service service = new ClientMetadataGeneratedService(); assertNotNull(service); assertNull(ServiceDelegate.getServiceMetadata()); ServiceDelegate serviceDelegate = DescriptionTestUtils2.getServiceDelegate(service); assertNotNull(serviceDelegate); ServiceDescription serviceDesc = serviceDelegate.getServiceDescription(); assertNotNull(serviceDesc); DescriptionBuilderComposite dbcInServiceDesc = DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc); assertSame(composite, dbcInServiceDesc.getSparseComposite(serviceDelegate)); assertEquals(ClientMetadataGeneratedService.class, dbcInServiceDesc.getCorrespondingClass()); // Verify that the CatalogManager for the Service uses the unique catalog file. String serviceCatalogFile = (String) dbcInServiceDesc.getSparseComposite(serviceDelegate).getCatalogManager().getCatalogFiles().get(0); assertEquals(serviceCatalogFile, getCatalogLocation(uniqueCatalog)); } /** * Generated service constructor(URL, QName) with a composite that specifies a wsdlLocation override */ public void test2ArgGeneratedServiceOverrideWsdlLocation() { DescriptionBuilderComposite composite = new DescriptionBuilderComposite(); WebServiceClientAnnot wsClientAnno = WebServiceClientAnnot.createWebServiceClientAnnotImpl(null, null, getWsdlLocation(overridenWsdl)); composite.setWebServiceClientAnnot(wsClientAnno); ServiceDelegate.setServiceMetadata(composite); Service service = new ClientMetadataGeneratedService(getWsdlURL(otherWsdl), new QName(namespaceURI, svcLocalPart)); assertNotNull(service); assertNull(ServiceDelegate.getServiceMetadata()); ServiceDelegate serviceDelegate = DescriptionTestUtils2.getServiceDelegate(service); assertNotNull(serviceDelegate); ServiceDescription serviceDesc = serviceDelegate.getServiceDescription(); assertNotNull(serviceDesc); DescriptionBuilderComposite dbcInServiceDesc = DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc); assertSame(composite, dbcInServiceDesc.getSparseComposite(serviceDelegate)); assertEquals(ClientMetadataGeneratedService.class, dbcInServiceDesc.getCorrespondingClass()); // There is WebServiceClient on the generated Service and it was overriden in the composite // for this key, however the keyless composite should not have any overrides. WebServiceClient wsClient = dbcInServiceDesc.getWebServiceClientAnnot(); assertNotNull(wsClient); assertEquals(originalWsdl, wsClient.wsdlLocation()); assertEquals("originalTNS", wsClient.targetNamespace()); assertEquals("", wsClient.name()); WebServiceClient wsClientKeyed = dbcInServiceDesc.getWebServiceClientAnnot(serviceDelegate); assertNotSame(wsClient, wsClientKeyed); assertEquals(getWsdlLocation(overridenWsdl), wsClientKeyed.wsdlLocation()); assertEquals("originalTNS", wsClientKeyed.targetNamespace()); assertEquals("", wsClientKeyed.name()); // WSDL override specified in the composite assertTrue("Wrong WSDL used", validatePort(service, overridenWsdl_portLocalPart)); } /** * Generated service constructor(URL, QName) with a composite that specifies a * target Namespace override. Most of the other tests are based on wsdlLocation since * that is what JSR-109 DDs override. This test verifies that other members can also * be override. */ public void test2ArgGeneratedServiceOverrideTNS() { DescriptionBuilderComposite composite = new DescriptionBuilderComposite(); WebServiceClientAnnot wsClientAnno = WebServiceClientAnnot.createWebServiceClientAnnotImpl(null, "overrideTNS", getWsdlLocation(overridenWsdl)); composite.setWebServiceClientAnnot(wsClientAnno); ServiceDelegate.setServiceMetadata(composite); Service service = new ClientMetadataGeneratedService(getWsdlURL(otherWsdl), new QName(namespaceURI, svcLocalPart)); assertNotNull(service); assertNull(ServiceDelegate.getServiceMetadata()); ServiceDelegate serviceDelegate = DescriptionTestUtils2.getServiceDelegate(service); assertNotNull(serviceDelegate); ServiceDescription serviceDesc = serviceDelegate.getServiceDescription(); assertNotNull(serviceDesc); DescriptionBuilderComposite dbcInServiceDesc = DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc); assertSame(composite, dbcInServiceDesc.getSparseComposite(serviceDelegate)); assertEquals(ClientMetadataGeneratedService.class, dbcInServiceDesc.getCorrespondingClass()); // There is WebServiceClient on the generated Service and it was overriden in the composite // for this key, however the keyless composite should not have any overrides. WebServiceClient wsClient = dbcInServiceDesc.getWebServiceClientAnnot(); assertNotNull(wsClient); assertEquals(originalWsdl, wsClient.wsdlLocation()); assertEquals("originalTNS", wsClient.targetNamespace()); assertEquals("", wsClient.name()); WebServiceClient wsClientKeyed = dbcInServiceDesc.getWebServiceClientAnnot(serviceDelegate); assertNotSame(wsClient, wsClientKeyed); assertEquals(getWsdlLocation(overridenWsdl), wsClientKeyed.wsdlLocation()); assertEquals("overrideTNS", wsClientKeyed.targetNamespace()); assertEquals("", wsClientKeyed.name()); // WSDL override specified in the composite assertTrue("Wrong WSDL used", validatePort(service, overridenWsdl_portLocalPart)); } /** * Generated service constructor(URL, QName) with a composite that specifies a * Catalog Manager override. */ public void test2ArgGeneratedServiceOverrideCatalogManager() { DescriptionBuilderComposite composite = new DescriptionBuilderComposite(); OASISCatalogManager catalogManager = new OASISCatalogManager(); catalogManager.setCatalogFiles(getCatalogLocation(uniqueCatalog)); composite.setCatalogManager(catalogManager); ServiceDelegate.setServiceMetadata(composite); Service service = new ClientMetadataGeneratedService(getWsdlURL(otherWsdl), new QName(namespaceURI, svcLocalPart)); assertNotNull(service); assertNull(ServiceDelegate.getServiceMetadata()); ServiceDelegate serviceDelegate = DescriptionTestUtils2.getServiceDelegate(service); assertNotNull(serviceDelegate); ServiceDescription serviceDesc = serviceDelegate.getServiceDescription(); assertNotNull(serviceDesc); DescriptionBuilderComposite dbcInServiceDesc = DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc); assertSame(composite, dbcInServiceDesc.getSparseComposite(serviceDelegate)); assertEquals(ClientMetadataGeneratedService.class, dbcInServiceDesc.getCorrespondingClass()); // Verify that the CatalogManager for the Service uses the unique catalog file. String serviceCatalogFile = (String) dbcInServiceDesc.getSparseComposite(serviceDelegate).getCatalogManager().getCatalogFiles().get(0); assertEquals(serviceCatalogFile, getCatalogLocation(uniqueCatalog)); } /** * Generated service constructor(URL, QName) with a composite that specifies a wsdlLocation override * where the override is a fully specifed URL to a file. */ public void test2ArgGeneratedServiceOverrideWsdlLocationWithProtocol() { DescriptionBuilderComposite composite = new DescriptionBuilderComposite(); // If the wsdlLocation in the composite specifies a protocol (like file: or http:) then // it should be used as-is. Otherwise (as shown by the other tests), it is treated as // a path on the local filesystem. String wsdlLocation = getWsdlLocation(overridenWsdl); // This check is necessary because Unix/Linux file paths begin // with a '/'. When adding the prefix 'jar:file:/' we may end // up with '//' after the 'file:' part. This causes the URL // object to treat this like a remote resource if(wsdlLocation.indexOf("/") == 0) { wsdlLocation = wsdlLocation.substring(1, wsdlLocation.length()); } String fullWsdlLocation = "file:/" + wsdlLocation; WebServiceClientAnnot wsClientAnno = WebServiceClientAnnot.createWebServiceClientAnnotImpl(null, null, fullWsdlLocation); composite.setWebServiceClientAnnot(wsClientAnno); ServiceDelegate.setServiceMetadata(composite); Service service = new ClientMetadataGeneratedService(getWsdlURL(otherWsdl), new QName(namespaceURI, svcLocalPart)); assertNotNull(service); assertNull(ServiceDelegate.getServiceMetadata()); ServiceDelegate serviceDelegate = DescriptionTestUtils2.getServiceDelegate(service); assertNotNull(serviceDelegate); ServiceDescription serviceDesc = serviceDelegate.getServiceDescription(); assertNotNull(serviceDesc); DescriptionBuilderComposite dbcInServiceDesc = DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc); assertSame(composite, dbcInServiceDesc.getSparseComposite(serviceDelegate)); assertEquals(ClientMetadataGeneratedService.class, dbcInServiceDesc.getCorrespondingClass()); // There is WebServiceClient on the generated Service and it was overriden in the composite // for the key. The annotation with no key should be unchanged. WebServiceClient wsClient = dbcInServiceDesc.getWebServiceClientAnnot(); assertNotNull(wsClient); assertEquals(originalWsdl, wsClient.wsdlLocation()); assertEquals("originalTNS", wsClient.targetNamespace()); assertEquals("", wsClient.name()); WebServiceClient wsClientKeyed = dbcInServiceDesc.getWebServiceClientAnnot(serviceDelegate); assertNotSame(wsClient, wsClientKeyed); assertEquals(fullWsdlLocation, wsClientKeyed.wsdlLocation()); assertEquals("originalTNS", wsClientKeyed.targetNamespace()); assertEquals("", wsClientKeyed.name()); // WSDL override specified in the composite assertTrue("Wrong WSDL used", validatePort(service, overridenWsdl_portLocalPart)); } /** * Test override WSDL file that is full specified */ public void testInvalidWsdlLocationOverrideWithProtocol() { DescriptionBuilderComposite composite = new DescriptionBuilderComposite(); String wsdlLocation = getWsdlLocation("InvalidFileName.wsdl"); // This check is necessary because Unix/Linux file paths begin // with a '/'. When adding the prefix 'jar:file:/' we may end // up with '//' after the 'file:' part. This causes the URL // object to treat this like a remote resource if(wsdlLocation.indexOf("/") == 0) { wsdlLocation = wsdlLocation.substring(1, wsdlLocation.length()); } String fullWsdlLocation = "http:/" + wsdlLocation; WebServiceClientAnnot wsClientAnno = WebServiceClientAnnot.createWebServiceClientAnnotImpl(null, null, fullWsdlLocation); composite.setWebServiceClientAnnot(wsClientAnno); ServiceDelegate.setServiceMetadata(composite); try { Service service = new ClientMetadataGeneratedService(); fail("Should have caught exception for invalid WSDL file name in override"); } catch (WebServiceException ex) { // Expected path } } /** * The overide WSDL file doesn't exist; should catch an error */ public void testInvalidWsdlLocationOverride() { DescriptionBuilderComposite composite = new DescriptionBuilderComposite(); WebServiceClientAnnot wsClientAnno = WebServiceClientAnnot.createWebServiceClientAnnotImpl(null, null, getWsdlLocation("InvalidFileName.wsdl")); composite.setWebServiceClientAnnot(wsClientAnno); ServiceDelegate.setServiceMetadata(composite); try { Service service = new ClientMetadataGeneratedService(); fail("Should have caught exception for invalid WSDL file name in override"); } catch (WebServiceException ex) { // Expected path } } /** * Create multiple instances of the same service. Validate that the service delegates are * unique and the ServiceDescription is shared. Note we have to install a special factory * so that the ServiceDescriptions are cached; the default factory will not cause them to be * cached. */ public void testMultipleServices() { try { installCachingFactory(); QName serviceQName = new QName(namespaceURI, svcLocalPart); QName portQN = new QName(namespaceURI, otherWsdl_portLocalPart); URL wsdlUrl = ClientMetadataTest.getWsdlURL(otherWsdl); // Create the first service Service service1 = Service.create(wsdlUrl, serviceQName); ServiceDelegate serviceDelegate1 = DescriptionTestUtils2.getServiceDelegate(service1); assertNull(ServiceDelegate.getServiceMetadata()); ServiceDescription serviceDesc1 = serviceDelegate1.getServiceDescription(); validatePort(service1, otherWsdl_portLocalPart); // Create the second service Service service2 = Service.create(wsdlUrl, serviceQName); ServiceDelegate serviceDelegate2 = DescriptionTestUtils2.getServiceDelegate(service2); assertNull(ServiceDelegate.getServiceMetadata()); ServiceDescription serviceDesc2 = serviceDelegate2.getServiceDescription(); validatePort(service2, otherWsdl_portLocalPart); assertNotSame(serviceDelegate1, serviceDelegate2); // Since we installed a caching factory, the service descriptions WILL be cached. // Without that factory, they would not have been cached. The reason is that the // AxisConfiguration instance is part of the key. The default factory in this // environment always returns a new instance. The test factory does not. assertSame(serviceDesc1, serviceDesc2); } finally { restoreOriginalFactory(); } // Sanity check that the factory WAS restored. Do the same thing as above, but this time // the service descs should NOT be the same since they weren't cached. QName serviceQName = new QName(namespaceURI, svcLocalPart); QName portQN = new QName(namespaceURI, otherWsdl_portLocalPart); URL wsdlUrl = ClientMetadataTest.getWsdlURL(otherWsdl); // Create the first service Service service1 = Service.create(wsdlUrl, serviceQName); ServiceDelegate serviceDelegate1 = DescriptionTestUtils2.getServiceDelegate(service1); assertNull(ServiceDelegate.getServiceMetadata()); ServiceDescription serviceDesc1 = serviceDelegate1.getServiceDescription(); validatePort(service1, otherWsdl_portLocalPart); // Create the second service Service service2 = Service.create(wsdlUrl, serviceQName); ServiceDelegate serviceDelegate2 = DescriptionTestUtils2.getServiceDelegate(service2); assertNull(ServiceDelegate.getServiceMetadata()); ServiceDescription serviceDesc2 = serviceDelegate2.getServiceDescription(); validatePort(service2, otherWsdl_portLocalPart); assertNotSame(serviceDelegate1, serviceDelegate2); assertNotSame("Client Configuration factory NOT restored; subsequent tests may be affected!", serviceDesc1, serviceDesc2); } /** * Create two services such that the ServiceDescriptions should be cached and shared. * Create the first without a composite, the second with a composite, then validate the second * service's composite. Note that we have to use a special factory so that the service * descriptions are cached. */ public void testMultipleServicesMixedComposite() { try { installCachingFactory(); QName serviceQName = new QName(namespaceURI, svcLocalPart); URL wsdlUrl = ClientMetadataTest.getWsdlURL(otherWsdl); // Create the first service Service service1 = Service.create(wsdlUrl, serviceQName); ServiceDelegate serviceDelegate1 = DescriptionTestUtils2.getServiceDelegate(service1); assertNull(ServiceDelegate.getServiceMetadata()); ServiceDescription serviceDesc1 = serviceDelegate1.getServiceDescription(); validatePort(service1, otherWsdl_portLocalPart); // Create the second service specifiying a sparse composite DescriptionBuilderComposite sparseComposite = new DescriptionBuilderComposite(); ServiceDelegate.setServiceMetadata(sparseComposite); Service service2 = Service.create(wsdlUrl, serviceQName); ServiceDelegate serviceDelegate2 = DescriptionTestUtils2.getServiceDelegate(service2); assertNull(ServiceDelegate.getServiceMetadata()); ServiceDescription serviceDesc2 = serviceDelegate2.getServiceDescription(); validatePort(service2, otherWsdl_portLocalPart); assertNotSame(serviceDelegate1, serviceDelegate2); // Since we installed a caching factory, the service descriptions WILL be cached. // Without that factory, they would not have been cached. The reason is that the // AxisConfiguration instance is part of the key. The default factory in this // environment always returns a new instance. The test factory does not. assertSame(serviceDesc1, serviceDesc2); // There should not be a sparse composite for the first service delegate and there // should be one for the second service delegate assertNull(DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc2).getSparseComposite(serviceDelegate1)); assertSame(sparseComposite, DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc2).getSparseComposite(serviceDelegate2)); } finally { restoreOriginalFactory(); } } /** * Create two services such that the ServiceDescriptions should be cached and shared. * Create the first with a composite, the second with a composite, then validate both * composites. Note that we have to use a special factory so that the service * descriptions are cached. */ public void testMultipleServicesMultipleComposites() { try { installCachingFactory(); QName serviceQName = new QName(namespaceURI, svcLocalPart); URL wsdlUrl = ClientMetadataTest.getWsdlURL(otherWsdl); // Create the first service DescriptionBuilderComposite sparseComposite1 = new DescriptionBuilderComposite(); ServiceDelegate.setServiceMetadata(sparseComposite1); Service service1 = Service.create(wsdlUrl, serviceQName); ServiceDelegate serviceDelegate1 = DescriptionTestUtils2.getServiceDelegate(service1); assertNull(ServiceDelegate.getServiceMetadata()); ServiceDescription serviceDesc1 = serviceDelegate1.getServiceDescription(); validatePort(service1, otherWsdl_portLocalPart); // Create the second service specifiying a sparse composite DescriptionBuilderComposite sparseComposite2 = new DescriptionBuilderComposite(); ServiceDelegate.setServiceMetadata(sparseComposite2); Service service2 = Service.create(wsdlUrl, serviceQName); ServiceDelegate serviceDelegate2 = DescriptionTestUtils2.getServiceDelegate(service2); assertNull(ServiceDelegate.getServiceMetadata()); ServiceDescription serviceDesc2 = serviceDelegate2.getServiceDescription(); validatePort(service2, otherWsdl_portLocalPart); assertNotSame(serviceDelegate1, serviceDelegate2); // Since we installed a caching factory, the service descriptions WILL be cached. // Without that factory, they would not have been cached. The reason is that the // AxisConfiguration instance is part of the key. The default factory in this // environment always returns a new instance. The test factory does not. assertSame(serviceDesc1, serviceDesc2); // There should not be a sparse composite for the first service delegate and there // should be one for the second service delegate assertSame(sparseComposite1, DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc2).getSparseComposite(serviceDelegate1)); assertSame(sparseComposite2, DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc2).getSparseComposite(serviceDelegate2)); } finally { restoreOriginalFactory(); } } /** * Create two generated services such that the ServiceDescriptions should be cached and shared. * Create the first with a composite, the second with a composite, then validate both * composites. Note that we have to use a special factory so that the service * descriptions are cached. */ public void testMultipleGeneratedServiceWithMultipleComposite() { try { installCachingFactory(); // Create the first service with a sparse composite DescriptionBuilderComposite sparseComposite1 = new DescriptionBuilderComposite(); ServiceDelegate.setServiceMetadata(sparseComposite1); Service service1 = new ClientMetadataGeneratedService(getWsdlURL(otherWsdl), new QName(namespaceURI, svcLocalPart)); assertNotNull(service1); assertNull(ServiceDelegate.getServiceMetadata()); // Create the second service with a sparse composite DescriptionBuilderComposite sparseComposite2 = new DescriptionBuilderComposite(); ServiceDelegate.setServiceMetadata(sparseComposite2); Service service2 = new ClientMetadataGeneratedService(getWsdlURL(otherWsdl), new QName(namespaceURI, svcLocalPart)); assertNotNull(service2); assertNull(ServiceDelegate.getServiceMetadata()); // Verifiy the service delegates are different and the service descriptions are the same // since we installed a caching factory above. ServiceDelegate serviceDelegate1 = DescriptionTestUtils2.getServiceDelegate(service1); assertNotNull(serviceDelegate1); ServiceDescription serviceDesc1 = serviceDelegate1.getServiceDescription(); assertNotNull(serviceDesc1); ServiceDelegate serviceDelegate2 = DescriptionTestUtils2.getServiceDelegate(service2); assertNotNull(serviceDelegate2); ServiceDescription serviceDesc2 = serviceDelegate2.getServiceDescription(); assertNotNull(serviceDesc2); assertNotSame(serviceDelegate1, serviceDelegate2); assertSame(serviceDesc1, serviceDesc2); // There should be a sparse composite for the first service delegate and // one for the second service delegate assertSame(sparseComposite1, DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc2).getSparseComposite(serviceDelegate1)); assertSame(sparseComposite2, DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc2).getSparseComposite(serviceDelegate2)); DescriptionBuilderComposite dbcInServiceDesc = DescriptionTestUtils2.getServiceDescriptionComposite(serviceDesc1); assertEquals(ClientMetadataGeneratedService.class, dbcInServiceDesc.getCorrespondingClass()); // WSDL was specified on the generated Service constructor, and none in the composite // so should get the WSDL specified on the constructor assertTrue("Wrong WSDL used", validatePort(service1, otherWsdl_portLocalPart)); assertTrue("Wrong WSDL used", validatePort(service2, otherWsdl_portLocalPart)); } finally { restoreOriginalFactory(); } } // ============================================================================================= // Utility methods // ============================================================================================= /** * Prepends the base directory and the path where the test WSDL lives to a filename. * @param wsdlFileName * @return */ static String getWsdlLocation(String wsdlFileName) { String wsdlLocation = null; String baseDir = System.getProperty("basedir","."); wsdlLocation = baseDir + "/test-resources/wsdl/" + wsdlFileName; return wsdlLocation; } /** * Prepends the base directory and the path where the test Catalog lives to a filename. * @param catalogFileName * @return */ static String getCatalogLocation(String catalogFileName) { String wsdlLocation = null; String baseDir = System.getProperty("basedir","."); wsdlLocation = baseDir + "/test-resources/catalog/" + catalogFileName; return catalogFileName; } /** * Given a simple file name (with no base dictory or path), returns a URL to the WSDL file * with the base directory and path prepended. * * @param wsdlFileName * @return */ static URL getWsdlURL(String wsdlFileName) { URL url = null; String wsdlLocation = getWsdlLocation(wsdlFileName); try { File file = new File(wsdlLocation); url = file.toURL(); } catch (MalformedURLException e) { e.printStackTrace(); fail("Exception converting WSDL file to URL: " + e.toString()); } return url; } /** * Validate that the Service contains the expected port. If the portLocalPart is null then * no ports are expected to exist under the service. * @param service The service to check for the specified port * @param portLocalPart If null means no ports are expected; otherwise the localname of the * single port expected under the service * @return */ static boolean validatePort(Service service, String portLocalPart) { boolean isValid = false; if (service == null) { return false; } // Each service in the WSDLs for this test have a single port boolean portNameValid = false; int expectedNumberOfPorts = 1; int numberOfPorts = 0; Iterator<QName> portIterator = service.getPorts(); while (portIterator.hasNext()) { numberOfPorts++; QName checkPort = portIterator.next(); // If we haven't found a match for the port yet, see if this one matches if (!portNameValid) { portNameValid = portLocalPart.equals(checkPort.getLocalPart()); } } if (portLocalPart == null && numberOfPorts == 0) { // No ports expected (i.e. no WSDL should have been used) isValid = true; } else if ((expectedNumberOfPorts == numberOfPorts) && portNameValid) { isValid = true; } else { isValid = false; } return isValid; } /** * Methods to install a client configuration factory that will return the same AxisConfiguration * each time. This is used so that the ServiceDescriptions will be cached in the DescriptionFactory. * * IMPORTANT!!! * If you install a caching factory, you MUST restore the original factory before your test * exits, otherwise it will remain installed when subsequent tests run and cause REALLY STRANGE * failures. Use restoreOriginalFactory() INSIDE A finally() block to restore the factory. */ static private ClientConfigurationFactory originalFactory = null; public static void installCachingFactory() { // install caching factory if (originalFactory != null) { throw new UnsupportedOperationException("Attempt to install the caching factory when the original factory has already been overwritten"); } originalFactory = (ClientConfigurationFactory)MetadataFactoryRegistry.getFactory(ClientConfigurationFactory.class); MetadataTestCachingClientContextFactory newFactory = new MetadataTestCachingClientContextFactory(); MetadataFactoryRegistry.setFactory(ClientConfigurationFactory.class, newFactory); resetClientConfigFactory(); } public static void restoreOriginalFactory() { if (originalFactory == null) { throw new UnsupportedOperationException("Attempt to restore original factory to a null value"); } MetadataFactoryRegistry.setFactory(ClientConfigurationFactory.class, originalFactory); resetClientConfigFactory(); originalFactory = null; } static void resetClientConfigFactory() { // Field field; // try { // field = DescriptionFactoryImpl.class.getDeclaredField("clientConfigFactory"); // field.setAccessible(true); // field.set(null, null); // } catch (Exception e) { // throw new UnsupportedOperationException("Unable to reset client config factory; caught " + e); // } } } @WebServiceClient(targetNamespace="originalTNS", wsdlLocation=ClientMetadataTest.originalWsdl) class ClientMetadataGeneratedService extends javax.xml.ws.Service { public ClientMetadataGeneratedService() { super(ClientMetadataTest.getWsdlURL(ClientMetadataTest.originalWsdl), new QName(ClientMetadataTest.namespaceURI, ClientMetadataTest.svcLocalPart)); } public ClientMetadataGeneratedService(URL wsdlLocation, QName serviceName) { super(wsdlLocation, serviceName); } } class MetadataTestCachingClientContextFactory extends ClientConfigurationFactory { ConfigurationContext context; public ConfigurationContext getClientConfigurationContext() { if (context == null) { context = super.getClientConfigurationContext(); } // System.out.println("Test version of MetadataTestCachingClientContextFactory: " + context); return context; } public void reset() { context = null; } }