/** * 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.wsdl11; import java.io.File; import java.io.FileOutputStream; import java.net.URI; import java.net.URL; import java.net.URLDecoder; import java.net.URLEncoder; import java.util.Collection; import java.util.List; import java.util.logging.Logger; import javax.wsdl.Definition; import javax.wsdl.Service; import javax.wsdl.extensions.UnknownExtensibilityElement; import javax.wsdl.factory.WSDLFactory; import javax.wsdl.xml.WSDLReader; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.validation.Schema; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.apache.cxf.Bus; import org.apache.cxf.binding.BindingFactoryManager; import org.apache.cxf.common.logging.LogUtils; import org.apache.cxf.common.xmlschema.SchemaCollection; import org.apache.cxf.helpers.CastUtils; import org.apache.cxf.helpers.DOMUtils; import org.apache.cxf.service.model.BindingFaultInfo; import org.apache.cxf.service.model.BindingInfo; import org.apache.cxf.service.model.BindingMessageInfo; import org.apache.cxf.service.model.BindingOperationInfo; import org.apache.cxf.service.model.EndpointInfo; import org.apache.cxf.service.model.FaultInfo; import org.apache.cxf.service.model.InterfaceInfo; import org.apache.cxf.service.model.MessageInfo; import org.apache.cxf.service.model.MessagePartInfo; import org.apache.cxf.service.model.OperationInfo; import org.apache.cxf.service.model.SchemaInfo; import org.apache.cxf.service.model.ServiceInfo; import org.apache.cxf.staxutils.StaxUtils; import org.apache.cxf.transport.DestinationFactory; import org.apache.cxf.transport.DestinationFactoryManager; import org.apache.cxf.ws.addressing.EndpointReferenceUtils; import org.apache.ws.commons.schema.XmlSchemaElement; import org.easymock.EasyMock; import org.easymock.IMocksControl; import org.junit.Assert; import org.junit.Test; public class WSDLServiceBuilderTest extends Assert { // TODO: reuse the wsdl in testutils and add the parameter order into one of the wsdl private static final Logger LOG = LogUtils.getLogger(WSDLServiceBuilderTest.class); private static final String WSDL_PATH = "hello_world.wsdl"; private static final String BARE_WSDL_PATH = "hello_world_bare.wsdl"; private static final String IMPORT_WSDL_PATH = "hello_world_schema_import.wsdl"; private static final String MULTIPORT_WSDL_PATH = "hello_world_multiporttype.wsdl"; private static final String NO_BODY_PARTS_WSDL_PATH = "no_body_parts.wsdl"; private static final String EXTENSION_NAMESPACE = "http://cxf.apache.org/extension/ns"; private static final QName EXTENSION_ATTR_BOOLEAN = new QName(EXTENSION_NAMESPACE, "booleanAttr"); private static final QName EXTENSION_ATTR_STRING = new QName(EXTENSION_NAMESPACE, "stringAttr"); private static final QName EXTENSION_ELEM = new QName(EXTENSION_NAMESPACE, "stringElem"); private Definition def; private Service service; private ServiceInfo serviceInfo; private List<ServiceInfo> serviceInfos; private IMocksControl control; private Bus bus; private BindingFactoryManager bindingFactoryManager; private DestinationFactoryManager destinationFactoryManager; public void setUpBasic() throws Exception { setUpWSDL(WSDL_PATH, 0); } private void setUpWSDL(String wsdl, int serviceSeq) throws Exception { setUpDefinition(wsdl, serviceSeq); buildService(); } private void setUpDefinition(String wsdl, int serviceSeq) throws Exception { URL url = getClass().getResource(wsdl); assertNotNull("could not find wsdl " + wsdl, url); String wsdlUrl = url.toString(); LOG.info("the path of wsdl file is " + wsdlUrl); WSDLFactory wsdlFactory = WSDLFactory.newInstance(); WSDLReader wsdlReader = wsdlFactory.newWSDLReader(); wsdlReader.setFeature("javax.wsdl.verbose", false); def = wsdlReader.readWSDL(new CatalogWSDLLocator(wsdlUrl)); int seq = 0; for (Service serv : CastUtils.cast(def.getServices().values(), Service.class)) { if (serv != null) { service = serv; if (seq == serviceSeq) { break; } else { seq++; } } } } private void buildService() throws Exception { buildService(null); } private void buildService(QName endpointName) throws Exception { control = EasyMock.createNiceControl(); bus = control.createMock(Bus.class); bindingFactoryManager = control.createMock(BindingFactoryManager.class); destinationFactoryManager = control.createMock(DestinationFactoryManager.class); DestinationFactory destinationFactory = control.createMock(DestinationFactory.class); WSDLServiceBuilder wsdlServiceBuilder = new WSDLServiceBuilder(bus); EasyMock.expect(bus.getExtension(BindingFactoryManager.class)) .andReturn(bindingFactoryManager).anyTimes(); EasyMock.expect(bus.getExtension(DestinationFactoryManager.class)) .andReturn(destinationFactoryManager).atLeastOnce(); EasyMock.expect(destinationFactoryManager .getDestinationFactory("http://schemas.xmlsoap.org/wsdl/soap/")) .andReturn(destinationFactory).anyTimes(); control.replay(); serviceInfos = wsdlServiceBuilder.buildServices(def, service, endpointName); if (!serviceInfos.isEmpty()) { serviceInfo = serviceInfos.get(0); } else { serviceInfo = null; } } @Test public void testBuildServiceWithWrongEndpointName() throws Exception { setUpWSDL(WSDL_PATH, 0); buildService(new QName("http://apache.org/hello_world_soap_http", "NoExitSoapPort")); assertEquals("Should not build any serviceInfo.", 0, serviceInfos.size()); assertEquals("Should not build any serviceInfo.", null, serviceInfo); } @Test public void testMultiPorttype() throws Exception { setUpWSDL(MULTIPORT_WSDL_PATH, 0); assertEquals(2, serviceInfos.size()); control.verify(); } @Test public void testServiceInfo() throws Exception { setUpBasic(); assertEquals("SOAPService", serviceInfo.getName().getLocalPart()); assertEquals("http://apache.org/hello_world_soap_http", serviceInfo.getName().getNamespaceURI()); assertEquals("http://apache.org/hello_world_soap_http", serviceInfo.getTargetNamespace()); assertTrue(serviceInfo.getProperty(WSDLServiceBuilder.WSDL_DEFINITION) == def); assertTrue(serviceInfo.getProperty(WSDLServiceBuilder.WSDL_SERVICE) == service); assertEquals("Incorrect number of endpoints", 1, serviceInfo.getEndpoints().size()); EndpointInfo ei = serviceInfo.getEndpoint(new QName("http://apache.org/hello_world_soap_http", "SoapPort")); assertNotNull(ei); assertEquals("http://schemas.xmlsoap.org/wsdl/soap/", ei.getTransportId()); assertNotNull(ei.getBinding()); control.verify(); } @Test public void testInterfaceInfo() throws Exception { setUpBasic(); assertEquals("Greeter", serviceInfo.getInterface().getName().getLocalPart()); control.verify(); } @Test public void testOperationInfo() throws Exception { setUpBasic(); QName name = new QName(serviceInfo.getName().getNamespaceURI(), "sayHi"); assertEquals(4, serviceInfo.getInterface().getOperations().size()); OperationInfo sayHi = serviceInfo.getInterface().getOperation( new QName(serviceInfo.getName().getNamespaceURI(), "sayHi")); assertNotNull(sayHi); assertEquals(sayHi.getName(), name); assertFalse(sayHi.isOneWay()); assertTrue(sayHi.hasInput()); assertTrue(sayHi.hasOutput()); assertNull(sayHi.getParameterOrdering()); name = new QName(serviceInfo.getName().getNamespaceURI(), "greetMe"); OperationInfo greetMe = serviceInfo.getInterface().getOperation(name); assertNotNull(greetMe); assertEquals(greetMe.getName(), name); assertFalse(greetMe.isOneWay()); assertTrue(greetMe.hasInput()); assertTrue(greetMe.hasOutput()); List<MessagePartInfo> inParts = greetMe.getInput().getMessageParts(); assertEquals(1, inParts.size()); MessagePartInfo part = inParts.get(0); assertNotNull(part.getXmlSchema()); assertTrue(part.getXmlSchema() instanceof XmlSchemaElement); List<MessagePartInfo> outParts = greetMe.getOutput().getMessageParts(); assertEquals(1, outParts.size()); part = outParts.get(0); assertNotNull(part.getXmlSchema()); assertTrue(part.getXmlSchema() instanceof XmlSchemaElement); assertTrue("greatMe should be wrapped", greetMe.isUnwrappedCapable()); OperationInfo greetMeUnwrapped = greetMe.getUnwrappedOperation(); assertNotNull(greetMeUnwrapped.getInput()); assertNotNull(greetMeUnwrapped.getOutput()); assertEquals("wrapped part not set", 1, greetMeUnwrapped.getInput().size()); assertEquals("wrapped part not set", 1, greetMeUnwrapped.getOutput().size()); assertEquals("wrapper part name wrong", "requestType", greetMeUnwrapped.getInput() .getMessagePartByIndex(0).getName().getLocalPart()); assertEquals("wrapper part type name wrong", "MyStringType", greetMeUnwrapped.getInput() .getMessagePartByIndex(0).getTypeQName().getLocalPart()); assertEquals("wrapper part name wrong", "responseType", greetMeUnwrapped.getOutput() .getMessagePartByIndex(0).getName().getLocalPart()); assertEquals("wrapper part type name wrong", "string", greetMeUnwrapped.getOutput() .getMessagePartByIndex(0).getTypeQName().getLocalPart()); name = new QName(serviceInfo.getName().getNamespaceURI(), "greetMeOneWay"); OperationInfo greetMeOneWay = serviceInfo.getInterface().getOperation(name); assertNotNull(greetMeOneWay); assertEquals(greetMeOneWay.getName(), name); assertTrue(greetMeOneWay.isOneWay()); assertTrue(greetMeOneWay.hasInput()); assertFalse(greetMeOneWay.hasOutput()); OperationInfo greetMeOneWayUnwrapped = greetMeOneWay.getUnwrappedOperation(); assertNotNull(greetMeOneWayUnwrapped); assertNotNull(greetMeOneWayUnwrapped.getInput()); assertNull(greetMeOneWayUnwrapped.getOutput()); assertEquals("wrapped part not set", 1, greetMeOneWayUnwrapped.getInput().size()); assertEquals(new QName("http://apache.org/hello_world_soap_http/types", "requestType"), greetMeOneWayUnwrapped.getInput().getMessagePartByIndex(0).getConcreteName()); name = new QName(serviceInfo.getName().getNamespaceURI(), "pingMe"); OperationInfo pingMe = serviceInfo.getInterface().getOperation(name); assertNotNull(pingMe); assertEquals(pingMe.getName(), name); assertFalse(pingMe.isOneWay()); assertTrue(pingMe.hasInput()); assertTrue(pingMe.hasOutput()); assertNull(serviceInfo.getInterface().getOperation(new QName("what ever"))); control.verify(); } @Test public void testBindingInfo() throws Exception { setUpBasic(); BindingInfo bindingInfo = null; assertEquals(1, serviceInfo.getBindings().size()); bindingInfo = serviceInfo.getBindings().iterator().next(); assertNotNull(bindingInfo); assertEquals(bindingInfo.getInterface().getName().getLocalPart(), "Greeter"); assertEquals(bindingInfo.getName().getLocalPart(), "Greeter_SOAPBinding"); assertEquals(bindingInfo.getName().getNamespaceURI(), "http://apache.org/hello_world_soap_http"); control.verify(); } @Test public void testBindingOperationInfo() throws Exception { setUpBasic(); BindingInfo bindingInfo = null; bindingInfo = serviceInfo.getBindings().iterator().next(); Collection<BindingOperationInfo> bindingOperationInfos = bindingInfo.getOperations(); assertNotNull(bindingOperationInfos); assertEquals(bindingOperationInfos.size(), 4); LOG.info("the binding operation is " + bindingOperationInfos.iterator().next().getName()); QName name = new QName(serviceInfo.getName().getNamespaceURI(), "sayHi"); BindingOperationInfo sayHi = bindingInfo.getOperation(name); assertNotNull(sayHi); assertEquals(sayHi.getName(), name); name = new QName(serviceInfo.getName().getNamespaceURI(), "greetMe"); BindingOperationInfo greetMe = bindingInfo.getOperation(name); assertNotNull(greetMe); assertEquals(greetMe.getName(), name); name = new QName(serviceInfo.getName().getNamespaceURI(), "greetMeOneWay"); BindingOperationInfo greetMeOneWay = bindingInfo.getOperation(name); assertNotNull(greetMeOneWay); assertEquals(greetMeOneWay.getName(), name); name = new QName(serviceInfo.getName().getNamespaceURI(), "pingMe"); BindingOperationInfo pingMe = bindingInfo.getOperation(name); assertNotNull(pingMe); assertEquals(pingMe.getName(), name); control.verify(); } @Test public void testBindingMessageInfo() throws Exception { setUpBasic(); BindingInfo bindingInfo = null; bindingInfo = serviceInfo.getBindings().iterator().next(); QName name = new QName(serviceInfo.getName().getNamespaceURI(), "sayHi"); BindingOperationInfo sayHi = bindingInfo.getOperation(name); BindingMessageInfo input = sayHi.getInput(); assertNotNull(input); assertEquals(input.getMessageInfo().getName().getLocalPart(), "sayHiRequest"); assertEquals(input.getMessageInfo().getName().getNamespaceURI(), "http://apache.org/hello_world_soap_http"); assertEquals(input.getMessageInfo().getMessageParts().size(), 1); assertEquals(input.getMessageInfo().getMessageParts().get(0).getName().getLocalPart(), "in"); assertEquals(input.getMessageInfo().getMessageParts().get(0).getName().getNamespaceURI(), "http://apache.org/hello_world_soap_http"); assertTrue(input.getMessageInfo().getMessageParts().get(0).isElement()); QName elementName = input.getMessageInfo().getMessageParts().get(0).getElementQName(); assertEquals(elementName.getLocalPart(), "sayHi"); assertEquals(elementName.getNamespaceURI(), "http://apache.org/hello_world_soap_http/types"); BindingMessageInfo output = sayHi.getOutput(); assertNotNull(output); assertEquals(output.getMessageInfo().getName().getLocalPart(), "sayHiResponse"); assertEquals(output.getMessageInfo().getName().getNamespaceURI(), "http://apache.org/hello_world_soap_http"); assertEquals(output.getMessageInfo().getMessageParts().size(), 1); assertEquals(output.getMessageInfo().getMessageParts().get(0).getName().getLocalPart(), "out"); assertEquals(output.getMessageInfo().getMessageParts().get(0).getName().getNamespaceURI(), "http://apache.org/hello_world_soap_http"); assertTrue(output.getMessageInfo().getMessageParts().get(0).isElement()); elementName = output.getMessageInfo().getMessageParts().get(0).getElementQName(); assertEquals(elementName.getLocalPart(), "sayHiResponse"); assertEquals(elementName.getNamespaceURI(), "http://apache.org/hello_world_soap_http/types"); assertTrue(sayHi.getFaults().size() == 0); name = new QName(serviceInfo.getName().getNamespaceURI(), "pingMe"); BindingOperationInfo pingMe = bindingInfo.getOperation(name); assertNotNull(pingMe); assertEquals(1, pingMe.getFaults().size()); BindingFaultInfo fault = pingMe.getFaults().iterator().next(); assertNotNull(fault); assertEquals(fault.getFaultInfo().getName().getLocalPart(), "pingMeFault"); assertEquals(fault.getFaultInfo().getName().getNamespaceURI(), "http://apache.org/hello_world_soap_http"); assertEquals(fault.getFaultInfo().getMessageParts().size(), 1); assertEquals(fault.getFaultInfo().getMessageParts().get(0).getName().getLocalPart(), "faultDetail"); assertEquals(fault.getFaultInfo().getMessageParts().get(0).getName().getNamespaceURI(), "http://apache.org/hello_world_soap_http"); assertTrue(fault.getFaultInfo().getMessageParts().get(0).isElement()); elementName = fault.getFaultInfo().getMessageParts().get(0).getElementQName(); assertEquals(elementName.getLocalPart(), "faultDetail"); assertEquals(elementName.getNamespaceURI(), "http://apache.org/hello_world_soap_http/types"); control.verify(); } @Test public void testSchema() throws Exception { setUpBasic(); SchemaCollection schemas = serviceInfo.getXmlSchemaCollection(); assertNotNull(schemas); assertEquals(1, serviceInfo.getSchemas().size()); SchemaInfo schemaInfo = serviceInfo.getSchemas().iterator().next(); assertNotNull(schemaInfo); assertEquals(schemaInfo.getNamespaceURI(), "http://apache.org/hello_world_soap_http/types"); assertEquals(schemas.read(schemaInfo.getElement()).getTargetNamespace(), "http://apache.org/hello_world_soap_http/types"); // add below code to test the creation of javax.xml.validation.Schema // with schema in serviceInfo Schema schema = EndpointReferenceUtils.getSchema(serviceInfo); assertNotNull(schema); control.verify(); } @Test public void testNoBodyParts() throws Exception { setUpWSDL(NO_BODY_PARTS_WSDL_PATH, 0); QName messageName = new QName("urn:org:apache:cxf:no_body_parts/wsdl", "operation1Request"); MessageInfo mi = serviceInfo.getMessage(messageName); QName partName = new QName("urn:org:apache:cxf:no_body_parts/wsdl", "mimeAttachment"); MessagePartInfo pi = mi.getMessagePart(partName); QName typeName = new QName("http://www.w3.org/2001/XMLSchema", "base64Binary"); assertEquals(typeName, pi.getTypeQName()); assertNull(pi.getElementQName()); } @Test public void testBare() throws Exception { setUpWSDL(BARE_WSDL_PATH, 0); BindingInfo bindingInfo = null; bindingInfo = serviceInfo.getBindings().iterator().next(); Collection<BindingOperationInfo> bindingOperationInfos = bindingInfo.getOperations(); assertNotNull(bindingOperationInfos); assertEquals(bindingOperationInfos.size(), 1); LOG.info("the binding operation is " + bindingOperationInfos.iterator().next().getName()); QName name = new QName(serviceInfo.getName().getNamespaceURI(), "greetMe"); BindingOperationInfo greetMe = bindingInfo.getOperation(name); assertNotNull(greetMe); assertEquals("greetMe OperationInfo name error", greetMe.getName(), name); assertFalse("greetMe should be a Unwrapped operation ", greetMe.isUnwrappedCapable()); assertNotNull(serviceInfo.getXmlSchemaCollection()); control.verify(); } @Test public void testImport() throws Exception { // rewrite the schema1.xsd to import schema2.xsd with absolute path. DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document doc = db.parse(this.getClass().getResourceAsStream("./s1/s2/schema2.xsd")); Element schemaImport = null; Node node = doc.getFirstChild(); while (node != null) { if (node instanceof Element) { schemaImport = DOMUtils.getFirstElement(node); } node = node.getNextSibling(); } if (schemaImport == null) { fail("Can't find import element"); } String filePath = this.getClass().getResource("./s1/s2/s4/schema4.xsd").toURI().getPath(); String importPath = schemaImport.getAttributeNode("schemaLocation").getValue(); if (!new URI(URLEncoder.encode(importPath, "utf-8")).isAbsolute()) { schemaImport.getAttributeNode("schemaLocation").setNodeValue("file:" + filePath); String fileStr = this.getClass().getResource("./s1/s2/schema2.xsd").toURI().getPath(); fileStr = URLDecoder.decode(fileStr, "utf-8"); File file = new File(fileStr); if (file.exists()) { file.delete(); } FileOutputStream fout = new FileOutputStream(file); StaxUtils.writeTo(doc, fout); fout.flush(); fout.close(); } setUpWSDL(IMPORT_WSDL_PATH, 0); assertNotNull(serviceInfo.getSchemas()); Element ele = serviceInfo.getSchemas().iterator().next().getElement(); assertNotNull(ele); Schema schema = EndpointReferenceUtils.getSchema(serviceInfo, null); assertNotNull(schema); control.verify(); } @Test public void testDiffPortTypeNsImport() throws Exception { setUpWSDL("/DiffPortTypeNs.wsdl", 0); doDiffPortTypeNsImport(); setUpWSDL("/DiffPortTypeNs.wsdl", 1); doDiffPortTypeNsImport(); control.verify(); } private void doDiffPortTypeNsImport() { if (serviceInfo.getName().getLocalPart().endsWith("Rpc")) { String ns = serviceInfo.getInterface().getName().getNamespaceURI(); OperationInfo oi = serviceInfo.getInterface().getOperation(new QName(ns, "NewOperationRpc")); assertNotNull(oi); ns = oi.getInput().getName().getNamespaceURI(); MessagePartInfo mpi = oi.getInput().getMessagePart(new QName(ns, "NewOperationRequestRpc")); assertNotNull(mpi); } else { String ns = serviceInfo.getInterface().getName().getNamespaceURI(); OperationInfo oi = serviceInfo.getInterface().getOperation(new QName(ns, "NewOperation")); assertNotNull(oi); ns = oi.getInput().getName().getNamespaceURI(); MessagePartInfo mpi = oi.getInput().getMessagePart(new QName(ns, "NewOperationRequest")); assertNotNull(mpi); } } @Test public void testParameterOrder() throws Exception { String ns = "http://apache.org/hello_world_xml_http/bare"; setUpWSDL("hello_world_xml_bare.wsdl", 0); OperationInfo operation = serviceInfo.getInterface().getOperation(new QName(ns, "testTriPart")); assertNotNull(operation); List<MessagePartInfo> parts = operation.getInput().getMessageParts(); assertNotNull(parts); assertEquals(3, parts.size()); assertEquals("in3", parts.get(0).getName().getLocalPart()); assertEquals("in1", parts.get(1).getName().getLocalPart()); assertEquals("in2", parts.get(2).getName().getLocalPart()); List<String> order = operation.getParameterOrdering(); assertNotNull(order); assertEquals(3, order.size()); assertEquals("in1", order.get(0)); assertEquals("in3", order.get(1)); assertEquals("in2", order.get(2)); parts = operation.getInput().getOrderedParts(order); assertNotNull(parts); assertEquals(3, parts.size()); assertEquals("in1", parts.get(0).getName().getLocalPart()); assertEquals("in3", parts.get(1).getName().getLocalPart()); assertEquals("in2", parts.get(2).getName().getLocalPart()); operation = serviceInfo.getInterface().getOperation(new QName(ns, "testTriPartNoOrder")); assertNotNull(operation); parts = operation.getInput().getMessageParts(); assertNotNull(parts); assertEquals(3, parts.size()); assertEquals("in3", parts.get(0).getName().getLocalPart()); assertEquals("in1", parts.get(1).getName().getLocalPart()); assertEquals("in2", parts.get(2).getName().getLocalPart()); control.verify(); } @Test public void testParameterOrder2() throws Exception { setUpWSDL("header2.wsdl", 0); String ns = "http://apache.org/header2"; OperationInfo operation = serviceInfo.getInterface().getOperation(new QName(ns, "headerMethod")); assertNotNull(operation); List<MessagePartInfo> parts = operation.getInput().getMessageParts(); assertNotNull(parts); assertEquals(2, parts.size()); assertEquals("header_info", parts.get(0).getName().getLocalPart()); assertEquals("the_request", parts.get(1).getName().getLocalPart()); control.verify(); } @Test public void testExtensions() throws Exception { setUpWSDL("hello_world_ext.wsdl", 0); String ns = "http://apache.org/hello_world_soap_http"; QName pingMeOpName = new QName(ns, "pingMe"); QName greetMeOpName = new QName(ns, "greetMe"); QName faultName = new QName(ns, "pingMeFault"); // portType extensions InterfaceInfo ii = serviceInfo.getInterface(); assertEquals(2, ii.getExtensionAttributes().size()); assertNotNull(ii.getExtensionAttribute(EXTENSION_ATTR_BOOLEAN)); assertNotNull(ii.getExtensionAttribute(EXTENSION_ATTR_STRING)); assertEquals(1, ii.getExtensors(UnknownExtensibilityElement.class).size()); assertEquals(EXTENSION_ELEM, ii.getExtensor(UnknownExtensibilityElement.class).getElementType()); // portType/operation extensions OperationInfo oi = ii.getOperation(pingMeOpName); assertPortTypeOperationExtensions(oi, true); assertPortTypeOperationExtensions(ii.getOperation(greetMeOpName), false); // portType/operation/[input|output|fault] extensions assertPortTypeOperationMessageExtensions(oi, true, true, faultName); assertPortTypeOperationMessageExtensions(ii.getOperation(greetMeOpName), false, true, null); // service extensions assertEquals(1, serviceInfo.getExtensionAttributes().size()); assertNotNull(serviceInfo.getExtensionAttribute(EXTENSION_ATTR_STRING)); assertEquals(1, serviceInfo.getExtensors(UnknownExtensibilityElement.class).size()); assertEquals(EXTENSION_ELEM, serviceInfo.getExtensor(UnknownExtensibilityElement.class).getElementType()); // service/port extensions EndpointInfo ei = serviceInfo.getEndpoints().iterator().next(); assertEquals(1, ei.getExtensionAttributes().size()); assertNotNull(ei.getExtensionAttribute(EXTENSION_ATTR_STRING)); assertEquals(1, ei.getExtensors(UnknownExtensibilityElement.class).size()); assertEquals(EXTENSION_ELEM, ei.getExtensor(UnknownExtensibilityElement.class).getElementType()); // binding extensions BindingInfo bi = ei.getBinding(); // REVISIT: bug in wsdl4j? // getExtensionAttributes on binding element returns an empty map // assertEquals(1, bi.getExtensionAttributes().size()); // assertNotNull(bi.getExtensionAttribute(EXTENSION_ATTR_STRING)); assertEquals(1, bi.getExtensors(UnknownExtensibilityElement.class).size()); assertEquals(EXTENSION_ELEM, bi.getExtensor(UnknownExtensibilityElement.class).getElementType()); // binding/operation extensions BindingOperationInfo boi = bi.getOperation(pingMeOpName); assertBindingOperationExtensions(boi, true); assertBindingOperationExtensions(bi.getOperation(greetMeOpName), false); // binding/operation/[input|output|fault] extensions assertBindingOperationMessageExtensions(boi, true, true, faultName); assertBindingOperationMessageExtensions(bi.getOperation(greetMeOpName), false, true, null); control.verify(); } private void assertPortTypeOperationExtensions(OperationInfo oi, boolean expectExtensions) { if (expectExtensions) { assertEquals(1, oi.getExtensionAttributes().size()); assertNotNull(oi.getExtensionAttribute(EXTENSION_ATTR_STRING)); assertEquals(1, oi.getExtensors(UnknownExtensibilityElement.class).size()); assertEquals(EXTENSION_ELEM, oi.getExtensor(UnknownExtensibilityElement.class).getElementType()); } else { assertNull(oi.getExtensionAttributes()); assertNull(oi.getExtensionAttribute(EXTENSION_ATTR_STRING)); assertNull(oi.getExtensors(UnknownExtensibilityElement.class)); assertNull(oi.getExtensor(UnknownExtensibilityElement.class)); } } private void assertBindingOperationExtensions(BindingOperationInfo boi, boolean expectExtensions) { if (expectExtensions) { assertEquals(1, boi.getExtensionAttributes().size()); assertNotNull(boi.getExtensionAttribute(EXTENSION_ATTR_STRING)); assertEquals(1, boi.getExtensors(UnknownExtensibilityElement.class).size()); assertEquals(EXTENSION_ELEM, boi.getExtensor(UnknownExtensibilityElement.class).getElementType()); } else { assertNull(boi.getExtensionAttributes()); assertNull(boi.getExtensionAttribute(EXTENSION_ATTR_STRING)); assertEquals(0, boi.getExtensors(UnknownExtensibilityElement.class).size()); assertNull(boi.getExtensor(UnknownExtensibilityElement.class)); } } private void assertPortTypeOperationMessageExtensions(OperationInfo oi, boolean expectExtensions, boolean hasOutput, QName fault) { MessageInfo mi = oi.getInput(); if (expectExtensions) { assertEquals(1, mi.getExtensionAttributes().size()); assertNotNull(mi.getExtensionAttribute(EXTENSION_ATTR_STRING)); assertEquals(1, mi.getExtensors(UnknownExtensibilityElement.class).size()); assertEquals(EXTENSION_ELEM, mi.getExtensor(UnknownExtensibilityElement.class).getElementType()); } else { assertNull(mi.getExtensionAttributes()); assertNull(mi.getExtensionAttribute(EXTENSION_ATTR_STRING)); assertNull(mi.getExtensors(UnknownExtensibilityElement.class)); assertNull(mi.getExtensor(UnknownExtensibilityElement.class)); } if (hasOutput) { mi = oi.getOutput(); if (expectExtensions) { assertEquals(1, mi.getExtensionAttributes().size()); assertNotNull(mi.getExtensionAttribute(EXTENSION_ATTR_STRING)); assertEquals(1, mi.getExtensors(UnknownExtensibilityElement.class).size()); assertEquals(EXTENSION_ELEM, mi.getExtensor(UnknownExtensibilityElement.class).getElementType()); } else { assertNull(mi.getExtensionAttributes()); assertNull(mi.getExtensionAttribute(EXTENSION_ATTR_STRING)); assertNull(mi.getExtensors(UnknownExtensibilityElement.class)); assertNull(mi.getExtensor(UnknownExtensibilityElement.class)); } } if (null != fault) { FaultInfo fi = oi.getFault(fault); if (expectExtensions) { assertEquals(1, fi.getExtensionAttributes().size()); assertNotNull(fi.getExtensionAttribute(EXTENSION_ATTR_STRING)); assertEquals(1, fi.getExtensors(UnknownExtensibilityElement.class).size()); assertEquals(EXTENSION_ELEM, fi.getExtensor(UnknownExtensibilityElement.class).getElementType()); } else { assertNull(fi.getExtensionAttributes()); assertNull(fi.getExtensionAttribute(EXTENSION_ATTR_STRING)); assertNull(fi.getExtensors(UnknownExtensibilityElement.class)); assertNull(fi.getExtensor(UnknownExtensibilityElement.class)); } } } private void assertBindingOperationMessageExtensions(BindingOperationInfo boi, boolean expectExtensions, boolean hasOutput, QName fault) { BindingMessageInfo bmi = boi.getInput(); if (expectExtensions) { // REVISIT: bug in wsdl4j? // getExtensionAttributes on binding/operation/input element returns an empty map // assertEquals(1, bmi.getExtensionAttributes().size()); // assertNotNull(bmi.getExtensionAttribute(EXTENSION_ATTR_STRING)); assertEquals(1, bmi.getExtensors(UnknownExtensibilityElement.class).size()); assertEquals(EXTENSION_ELEM, bmi.getExtensor(UnknownExtensibilityElement.class).getElementType()); } else { assertNull(bmi.getExtensionAttributes()); assertNull(bmi.getExtensionAttribute(EXTENSION_ATTR_STRING)); assertEquals(0, bmi.getExtensors(UnknownExtensibilityElement.class).size()); assertNull(bmi.getExtensor(UnknownExtensibilityElement.class)); } if (hasOutput) { bmi = boi.getOutput(); if (expectExtensions) { // REVISIT: bug in wsdl4j? // getExtensionAttributes on binding/operation/output element returns an empty map // assertEquals(1, bmi.getExtensionAttributes().size()); // assertNotNull(bmi.getExtensionAttribute(EXTENSION_ATTR_STRING)); assertEquals(1, bmi.getExtensors(UnknownExtensibilityElement.class).size()); assertEquals(EXTENSION_ELEM, bmi.getExtensor(UnknownExtensibilityElement.class).getElementType()); } else { assertNull(bmi.getExtensionAttributes()); assertNull(bmi.getExtensionAttribute(EXTENSION_ATTR_STRING)); assertEquals(0, bmi.getExtensors(UnknownExtensibilityElement.class).size()); assertNull(bmi.getExtensor(UnknownExtensibilityElement.class)); } } if (null != fault) { BindingFaultInfo bfi = boi.getFault(fault); if (expectExtensions) { assertEquals(1, bfi.getExtensionAttributes().size()); assertNotNull(bfi.getExtensionAttribute(EXTENSION_ATTR_STRING)); assertEquals(1, bfi.getExtensors(UnknownExtensibilityElement.class).size()); assertEquals(EXTENSION_ELEM, bfi.getExtensor(UnknownExtensibilityElement.class).getElementType()); } else { assertNull(bfi.getExtensionAttributes()); assertNull(bfi.getExtensionAttribute(EXTENSION_ATTR_STRING)); assertNull(bfi.getExtensors(UnknownExtensibilityElement.class)); assertNull(bfi.getExtensor(UnknownExtensibilityElement.class)); } } } }