blob: 5f8b520ce7c0e49793a15bdcbd3063b486401367 [file] [log] [blame]
/*
* 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.description;
import com.ibm.wsdl.util.xml.DOM2Writer;
import org.apache.axiom.soap.SOAP11Constants;
import org.apache.axiom.soap.SOAP12Constants;
import org.apache.axis2.AxisFault;
import org.apache.axis2.namespace.Constants;
import org.apache.axis2.transport.http.HTTPConstants;
import org.apache.axis2.wsdl.HTTPHeaderMessage;
import org.apache.axis2.wsdl.SOAPHeaderMessage;
import org.apache.axis2.wsdl.SOAPModuleMessage;
import org.apache.axis2.wsdl.WSDLConstants;
import org.apache.axis2.wsdl.WSDLUtil;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.woden.WSDLException;
import org.apache.woden.WSDLFactory;
import org.apache.woden.WSDLReader;
import org.apache.woden.WSDLSource;
import org.apache.woden.XMLElement;
import org.apache.woden.resolver.URIResolver;
import org.apache.woden.schema.Schema;
import org.apache.woden.types.NamespaceDeclaration;
import org.apache.woden.types.QNameTokenUnion;
import org.apache.woden.wsdl20.Binding;
import org.apache.woden.wsdl20.BindingFault;
import org.apache.woden.wsdl20.BindingFaultReference;
import org.apache.woden.wsdl20.BindingMessageReference;
import org.apache.woden.wsdl20.BindingOperation;
import org.apache.woden.wsdl20.Description;
import org.apache.woden.wsdl20.ElementDeclaration;
import org.apache.woden.wsdl20.Endpoint;
import org.apache.woden.wsdl20.Interface;
import org.apache.woden.wsdl20.InterfaceFault;
import org.apache.woden.wsdl20.InterfaceFaultReference;
import org.apache.woden.wsdl20.InterfaceMessageReference;
import org.apache.woden.wsdl20.InterfaceOperation;
import org.apache.woden.wsdl20.Service;
import org.apache.woden.wsdl20.enumeration.MessageLabel;
import org.apache.woden.wsdl20.extensions.InterfaceOperationExtensions;
import org.apache.woden.wsdl20.extensions.http.HTTPBindingExtensions;
import org.apache.woden.wsdl20.extensions.http.HTTPBindingFaultExtensions;
import org.apache.woden.wsdl20.extensions.http.HTTPBindingMessageReferenceExtensions;
import org.apache.woden.wsdl20.extensions.http.HTTPBindingOperationExtensions;
import org.apache.woden.wsdl20.extensions.http.HTTPEndpointExtensions;
import org.apache.woden.wsdl20.extensions.http.HTTPHeader;
import org.apache.woden.wsdl20.extensions.http.HTTPHeaderElement;
import org.apache.woden.wsdl20.extensions.http.HTTPLocation;
import org.apache.woden.wsdl20.extensions.rpc.Argument;
import org.apache.woden.wsdl20.extensions.rpc.RPCInterfaceOperationExtensions;
import org.apache.woden.wsdl20.extensions.soap.SOAPBindingExtensions;
import org.apache.woden.wsdl20.extensions.soap.SOAPBindingFaultExtensions;
import org.apache.woden.wsdl20.extensions.soap.SOAPBindingFaultReferenceExtensions;
import org.apache.woden.wsdl20.extensions.soap.SOAPBindingMessageReferenceExtensions;
import org.apache.woden.wsdl20.extensions.soap.SOAPBindingOperationExtensions;
import org.apache.woden.wsdl20.extensions.soap.SOAPEndpointExtensions;
import org.apache.woden.wsdl20.extensions.soap.SOAPHeaderBlock;
import org.apache.woden.wsdl20.extensions.soap.SOAPModule;
import org.apache.woden.wsdl20.xml.BindingFaultElement;
import org.apache.woden.wsdl20.xml.BindingOperationElement;
import org.apache.woden.wsdl20.xml.DescriptionElement;
import org.apache.woden.wsdl20.xml.DocumentableElement;
import org.apache.woden.wsdl20.xml.DocumentationElement;
import org.apache.woden.wsdl20.xml.ImportElement;
import org.apache.woden.wsdl20.xml.InterfaceFaultElement;
import org.apache.woden.wsdl20.xml.InterfaceMessageReferenceElement;
import org.apache.woden.wsdl20.xml.TypesElement;
import org.apache.woden.xml.XMLAttr;
import org.apache.ws.commons.schema.XmlSchema;
import org.apache.ws.commons.schema.utils.NamespaceMap;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.InputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
public class WSDL20ToAxisServiceBuilder extends WSDLToAxisServiceBuilder {
protected static final Log log = LogFactory.getLog(WSDL20ToAxisServiceBuilder.class);
protected Description description;
private String wsdlURI;
protected String interfaceName;
private String savedTargetNamespace;
private NamespaceDeclaration[] namespacemap;
private List<QName> operationNames = new ArrayList<QName>();
private NamespaceMap stringBasedNamespaceMap;
private boolean setupComplete = false;
private Service wsdlService;
private boolean isAllPorts;
private URIResolver customWSDLResolver;
// As bindings are processed add it to this array so that we dont process the same binding twice
private Map processedBindings;
public WSDL20ToAxisServiceBuilder(InputStream in, QName serviceName,
String interfaceName) {
this.in = in;
this.serviceName = serviceName;
this.interfaceName = interfaceName;
this.axisService = new AxisService();
setPolicyRegistryFromService(axisService);
}
public WSDL20ToAxisServiceBuilder(String wsdlUri,
String name, String interfaceName) throws WSDLException {
String fullPath = wsdlUri;
if (!wsdlUri.startsWith("http://")) {
File file = new File(wsdlUri);
fullPath = file.getAbsolutePath();
}
setBaseUri(fullPath);
Description description;
try {
description = readInTheWSDLFile(fullPath);
} catch (AxisFault axisFault) {
throw new WSDLException("ERROR", "Exception occured while reading WSDL 2.0 doc", axisFault);
}
DescriptionElement descriptionElement = description.toElement();
savedTargetNamespace = descriptionElement.getTargetNamespace()
.toString();
namespacemap = descriptionElement.getDeclaredNamespaces();
this.description = description;
this.serviceName = null;
if (name != null) {
serviceName = new QName(descriptionElement.getTargetNamespace().toString(), name);
}
this.interfaceName = interfaceName;
this.axisService = new AxisService();
setPolicyRegistryFromService(axisService);
}
public WSDL20ToAxisServiceBuilder(String wsdlUri,
String name, String interfaceName, boolean isAllPorts) throws WSDLException {
this(wsdlUri, name, interfaceName);
this.isAllPorts = isAllPorts;
}
public WSDL20ToAxisServiceBuilder(String wsdlUri, QName serviceName) {
super(null, serviceName);
this.wsdlURI = wsdlUri;
}
public WSDL20ToAxisServiceBuilder(String wsdlUri, AxisService service) {
super(null, service);
this.wsdlURI = wsdlUri;
}
public WSDL20ToAxisServiceBuilder(Description descriptionComp, QName wsdlServiceName,
String interfaceName) {
DescriptionElement descriptionElement = descriptionComp.toElement();
savedTargetNamespace = descriptionElement.getTargetNamespace().toString();
namespacemap = descriptionElement.getDeclaredNamespaces();
this.description = descriptionElement.toComponent();
this.serviceName = null;
if (wsdlServiceName != null) {
serviceName = wsdlServiceName;
}
this.interfaceName = interfaceName;
this.axisService = new AxisService();
setPolicyRegistryFromService(axisService);
}
public boolean isAllPorts() {
return isAllPorts;
}
public void setAllPorts(boolean allPorts) {
isAllPorts = allPorts;
}
/**
* sets a custom WSDL locator
*
* @param customResolver - A custom Resolver that can resolve imports and includes
*/
public void setCustomWSDLResolver(URIResolver customResolver) {
this.customWSDLResolver = customResolver;
}
public AxisService populateService() throws AxisFault {
try {
setup();
// Setting wsdl4jdefintion to axisService , so if some one want
// to play with it he can do that by getting the parameter
Parameter wsdlDescriptionParamter = new Parameter();
wsdlDescriptionParamter.setName(WSDLConstants.WSDL_20_DESCRIPTION);
wsdlDescriptionParamter.setValue(description);
axisService.addParameter(wsdlDescriptionParamter);
if (isCodegen) {
axisService.addParameter("isCodegen", Boolean.TRUE);
}
if (description == null) {
return null;
}
// setting target name space
axisService.setTargetNamespace(savedTargetNamespace);
// if there are documentation elements in the root. Lets add them as the wsdlService description
// but since there can be multiple documentation elements, lets only add the first one
addDocumentation(axisService, description.toElement());
// DocumentationElement[] documentationElements = description.toElement().getDocumentationElements();
// if (documentationElements != null && documentationElements.length > 0) {
// axisService.setServiceDescription(documentationElements[0].getContent().toString());
// }
// adding ns in the original WSDL
// processPoliciesInDefintion(wsdl4jDefinition); TODO : Defering policy handling for now - Chinthaka
// policy support
// schema generation
// Create the namespacemap
axisService.setNamespaceMap(stringBasedNamespaceMap);
// TypeDefinition[] typeDefinitions =
// description.getTypeDefinitions();
// for(int i=0; i<typeDefinitions.length; i++){
// if("org.apache.ws.commons.schema".equals(typeDefinitions[i].getContentModel())){
// axisService.addSchema((XmlSchema)typeDefinitions[i].getContent());
// }else
// if("org.w3c.dom".equals(typeDefinitions[i].getContentModel())){
// axisService.addSchema(getXMLSchema((Element)typeDefinitions[i].getContent(),
// null));
// }
//
// }
DescriptionElement descriptionElement = description.toElement();
processTypes(descriptionElement);
processService();
return axisService;
} catch (Exception e) {
throw AxisFault.makeFault(e);
}
}
/**
* recursively drills down to find all type definitions
* (XSD schemas) in all imported WSDLs and XSDs
*
* @param descriptionElement - a description element from where import elements
* and types can be found
*/
private void processTypes(DescriptionElement descriptionElement) {
TypesElement typesElement = descriptionElement
.getTypesElement();
if (typesElement != null) {
Schema[] schemas = typesElement.getSchemas();
for (int i = 0; i < schemas.length; i++) {
XmlSchema schemaDefinition = schemas[i].getSchemaDefinition();
// WSDL 2.0 spec requires that even the built-in schema should be returned
// once asked for schema definitions. But for data binding purposes we can ignore that
if (schemaDefinition != null && !Constants.URI_2001_SCHEMA_XSD
.equals(schemaDefinition.getTargetNamespace())) {
axisService.addSchema(schemaDefinition);
}
}
}
ImportElement[] importElements = descriptionElement.getImportElements();
for (int i = 0; i < importElements.length; i++) {
DescriptionElement descElem = importElements[i].getDescriptionElement();
processTypes(descElem); // recursively drill down
}
}
private void processEndpoints(Interface serviceInterface) throws AxisFault {
Endpoint[] endpoints = wsdlService.getEndpoints();
if (endpoints.length == 0) {
throw new AxisFault("No endpoints found in the WSDL");
}
processedBindings = new HashMap();
Endpoint endpoint = null;
// If the interface name is not null thats means that this is a call from the codegen engine
// and we need to populate a single endpoint. Hence find the endpoint and populate it.
// If that was not the case then we need to check whether the call is from the codegen
// engine with thw allports check false. If its so no need to populate all endpoints, we
// select an enspoint accrding to the following criteria.
// 1. Find the first SOAP 1.2 endpoint
// 2. Find the first SOAP 1.1 endpoint
// 3. Use the first endpoint
if (this.interfaceName != null) {
for (int i = 0; i < endpoints.length; ++i) {
if (this.interfaceName.equals(endpoints[i].getName().toString())) {
endpoint = endpoints[i];
break; // found it. Stop looking
}
}
if (endpoint == null) {
throw new AxisFault("No endpoint found for the given name :"
+ this.interfaceName);
}
axisService
.addEndpoint(endpoint.getName().toString(),
processEndpoint(endpoint, serviceInterface));
} else if (this.isCodegen && !this.isAllPorts) {
Endpoint soap11Endpoint = null;
for (int i = 0; i < endpoints.length; ++i) {
Binding binding = endpoints[i].getBinding();
if (WSDL2Constants.URI_WSDL2_SOAP.equals(binding.getType().toString())) {
SOAPBindingExtensions soapBindingExtensions;
try {
soapBindingExtensions = (SOAPBindingExtensions) binding
.getComponentExtensionContext(
new URI(WSDL2Constants.URI_WSDL2_SOAP));
} catch (URISyntaxException e) {
throw new AxisFault("Soap Binding Extention not found");
}
if (!WSDL2Constants.SOAP_VERSION_1_1
.equals(soapBindingExtensions.getSoapVersion())) {
endpoint = endpoints[i];
break; // found it. Stop looking
} else if (soap11Endpoint == null){
soap11Endpoint = endpoints[i];
}
}
}
if (endpoint == null) {
endpoint = endpoints[0];
}
axisService
.addEndpoint(endpoint.getName().toString(),
processEndpoint(endpoint, serviceInterface));
} else {
for (int i = 0; i < endpoints.length; i++) {
axisService
.addEndpoint(endpoints[i].getName().toString(),
processEndpoint(endpoints[i], serviceInterface));
}
}
if (endpoint == null && endpoints.length > 0) {
endpoint = endpoints[0];
}
if (endpoint != null) {
axisService.setEndpointName(endpoint.getName().toString());
axisService.setBindingName(endpoint.getBinding().getName().getLocalPart());
axisService.setEndpointURL(endpoint.getAddress().toString());
}
}
private void processService() throws AxisFault {
Service[] services = description.getServices();
if (services.length == 0) {
throw new AxisFault("No wsdlService found in the WSDL");
}
if (serviceName != null) {
for (int i = 0; i < services.length; i++) {
if (serviceName.equals(services[i].getName())) {
wsdlService = services[i];
break; // found it. Stop looking.
}
}
if (wsdlService == null) {
throw new AxisFault("Service with the specified name not found in the WSDL : "
+ serviceName.getLocalPart());
}
} else {
wsdlService = services[0];
}
axisService.setName(wsdlService.getName().getLocalPart());
Interface serviceInterface = wsdlService.getInterface();
axisService.addParameter(new Parameter(WSDL2Constants.INTERFACE_LOCAL_NAME, serviceInterface.getName().getLocalPart()));
processInterface(serviceInterface);
if (isCodegen) {
axisService.setOperationsNameList(operationNames);
}
processEndpoints(serviceInterface);
}
private AxisEndpoint processEndpoint(Endpoint endpoint, Interface serviceInterface) throws AxisFault {
AxisEndpoint axisEndpoint = new AxisEndpoint();
axisEndpoint.setParent(axisService);
axisEndpoint.setName(endpoint.getName().toString());
setEndpointURL(axisEndpoint, endpoint.getAddress().toString());
Binding binding = endpoint.getBinding();
AxisBinding axisBinding;
if (processedBindings.containsKey(binding.getName())) {
axisBinding = (AxisBinding) processedBindings.get(binding.getName());
} else {
axisBinding = processBinding(binding, serviceInterface);
}
axisEndpoint.setBinding(axisBinding);
String bindingType = binding.getType().toString();
if (bindingType.equals(WSDL2Constants.URI_WSDL2_SOAP)) {
processSOAPBindingEndpointExtensions(endpoint, axisEndpoint);
} else if (bindingType.equals(WSDL2Constants.URI_WSDL2_HTTP)) {
processHTTPBindingEndpointExtensions(endpoint, axisEndpoint);
}
addDocumentation(axisEndpoint, endpoint.toElement());
return axisEndpoint;
}
private void processSOAPBindingEndpointExtensions(Endpoint endpoint, AxisEndpoint axisEndpoint) throws AxisFault {
SOAPEndpointExtensions soapEndpointExtensions;
try {
soapEndpointExtensions = (SOAPEndpointExtensions) endpoint
.getComponentExtensionContext(new URI(WSDL2Constants.URI_WSDL2_SOAP));
} catch (URISyntaxException e) {
throw new AxisFault("SOAP Binding Endpoint Extension not found");
}
if (soapEndpointExtensions != null) {
axisEndpoint.setProperty(WSDL2Constants.ATTR_WHTTP_AUTHENTICATION_TYPE,
soapEndpointExtensions.getHttpAuthenticationScheme());
axisEndpoint.setProperty(WSDL2Constants.ATTR_WHTTP_AUTHENTICATION_REALM,
soapEndpointExtensions.getHttpAuthenticationRealm());
}
}
private void processHTTPBindingEndpointExtensions(Endpoint endpoint, AxisEndpoint axisEndpoint) throws AxisFault {
HTTPEndpointExtensions httpEndpointExtensions;
try {
httpEndpointExtensions = (HTTPEndpointExtensions) endpoint
.getComponentExtensionContext(new URI(WSDL2Constants.URI_WSDL2_HTTP));
} catch (URISyntaxException e) {
throw new AxisFault("HTTP Binding Endpoint Extension not found");
}
if (httpEndpointExtensions != null) {
axisEndpoint.setProperty(WSDL2Constants.ATTR_WHTTP_AUTHENTICATION_TYPE,
httpEndpointExtensions.getHttpAuthenticationScheme());
axisEndpoint.setProperty(WSDL2Constants.ATTR_WHTTP_AUTHENTICATION_REALM,
httpEndpointExtensions.getHttpAuthenticationRealm());
}
}
/**
* contains all code which gathers non-wsdlService specific information from the
* wsdl.
* <p/>
* After all the setup completes successfully, the setupComplete field is
* set so that any subsequent calls to setup() will result in a no-op. Note
* that subclass WSDL20ToAllAxisServicesBuilder will call populateService
* for each endpoint in the WSDL. Separating the non-wsdlService specific
* information here allows WSDL20ToAllAxisServicesBuilder to only do this
* work 1 time per WSDL, instead of for each endpoint on each wsdlService.
*
* @throws AxisFault - Thrown in case the necessary resources are not available in the WSDL
* @throws WSDLException - Thrown in case Woden throws an exception
*/
protected void setup() throws AxisFault, WSDLException {
if (setupComplete) { // already setup, just do nothing and return
return;
}
try {
if (description == null) {
Description description;
DescriptionElement descriptionElement;
if (wsdlURI != null && !"".equals(wsdlURI)) {
description = readInTheWSDLFile(wsdlURI);
descriptionElement = description.toElement();
} else if (in != null) {
description = readInTheWSDLFile(in);
descriptionElement = description.toElement();
} else {
throw new AxisFault("No resources found to read the wsdl");
}
savedTargetNamespace = descriptionElement.getTargetNamespace().toString();
namespacemap = descriptionElement.getDeclaredNamespaces();
this.description = description;
}
// Create the namespacemap
stringBasedNamespaceMap = new NamespaceMap();
for (int i = 0; i < namespacemap.length; i++) {
NamespaceDeclaration namespaceDeclaration = namespacemap[i];
stringBasedNamespaceMap.put(namespaceDeclaration.getPrefix(),
namespaceDeclaration.getNamespaceURI().toString());
}
DescriptionElement descriptionElement = description.toElement();
createNamespaceMap(descriptionElement);
setupComplete = true;
} catch (AxisFault e) {
throw e; // just rethrow AxisFaults
} catch (WSDLException e) {
// Preserve the WSDLException
throw e;
} catch(Exception e) {
throw AxisFault.makeFault(e);
}
}
/**
* recursively drills down to get namespace pairs in nested imported elements
*
* @param descriptionElement - a description element from where import elements
* and types can be found
*/
private void createNamespaceMap(DescriptionElement descriptionElement) {
ImportElement[] importElements = descriptionElement.getImportElements();
for (int i = 0; i < importElements.length; i++) {
DescriptionElement descElem = importElements[i].getDescriptionElement();
NamespaceDeclaration[] namespaceDeclarations = descElem.getDeclaredNamespaces();
for (int j = 0; j < namespaceDeclarations.length; j++) {
NamespaceDeclaration importedNamespaceDeclaration = namespaceDeclarations[j];
if (!stringBasedNamespaceMap.containsKey(importedNamespaceDeclaration.getPrefix())) {
stringBasedNamespaceMap.put(importedNamespaceDeclaration.getPrefix(),
importedNamespaceDeclaration.getNamespaceURI().toString());
}
}
createNamespaceMap(descElem); // recursively drill down
}
}
private AxisBinding processBinding(Binding binding, Interface serviceInterface)
throws AxisFault {
AxisBinding axisBinding = new AxisBinding();
axisBinding.setName(binding.getName());
String bindingType = binding.getType().toString();
axisBinding.setType(bindingType);
if (bindingType.equals(WSDL2Constants.URI_WSDL2_SOAP)) {
processSOAPBindingExtention(binding, axisBinding, serviceInterface);
} else if (bindingType.equals(WSDL2Constants.URI_WSDL2_HTTP)) {
processHTTPBindingExtention(binding, axisBinding, serviceInterface);
}
// We should process the interface based on the service not on a binding
processedBindings.put(binding.getName(), axisBinding);
addDocumentation(axisBinding, binding.toElement());
return axisBinding;
}
private void processSOAPBindingExtention(Binding binding, AxisBinding axisBinding, Interface serviceInterface)
throws AxisFault {
// Capture all the binding specific properties
// Set a comparator so tha httpLocations are stored in decending order
Map httpLocationTable = new TreeMap(new Comparator(){
public int compare(Object o1, Object o2) {
return (-1 * ((Comparable)o1).compareTo(o2));
}
});
SOAPBindingExtensions soapBindingExtensions;
try {
soapBindingExtensions = (SOAPBindingExtensions) binding
.getComponentExtensionContext(new URI(WSDL2Constants.URI_WSDL2_SOAP));
} catch (URISyntaxException e) {
throw new AxisFault("Soap Binding Extention not found");
}
String soapVersion;
if ((soapVersion = soapBindingExtensions.getSoapVersion()) != null) {
if (soapVersion.equals(WSDL2Constants.SOAP_VERSION_1_1)) {
axisBinding.setProperty(WSDL2Constants.ATTR_WSOAP_VERSION,
SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
} else {
axisBinding.setProperty(WSDL2Constants.ATTR_WSOAP_VERSION,
SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);
}
} else {
// Set the default to soap 1.2
axisBinding.setProperty(WSDL2Constants.ATTR_WSOAP_VERSION,
WSDL20DefaultValueHolder.getDefaultValue(
WSDL2Constants.ATTR_WSOAP_VERSION));
}
URI soapUnderlyingProtocol = soapBindingExtensions.getSoapUnderlyingProtocol();
if (soapUnderlyingProtocol != null) {
axisBinding.setProperty(WSDL2Constants.ATTR_WSOAP_PROTOCOL,
soapUnderlyingProtocol.toString());
}
URI soapMepDefault = soapBindingExtensions.getSoapMepDefault();
if (soapMepDefault != null) {
axisBinding.setProperty(WSDL2Constants.ATTR_WSOAP_MEP,
soapMepDefault.toString());
}
axisBinding.setProperty(WSDL2Constants.ATTR_WHTTP_CONTENT_ENCODING,
soapBindingExtensions.getHttpContentEncodingDefault());
axisBinding.setProperty(WSDL2Constants.ATTR_WSOAP_MODULE,
createSoapModules(soapBindingExtensions.getSoapModules()));
axisBinding.setProperty(WSDL2Constants.ATTR_WHTTP_QUERY_PARAMETER_SEPARATOR,
soapBindingExtensions.getHttpQueryParameterSeparatorDefault());
// Capture all the fault specific properties
BindingFault[] bindingFaults = binding.getBindingFaults();
for (int i = 0; i < bindingFaults.length; i++) {
BindingFault bindingFault = bindingFaults[i];
InterfaceFault interfaceFault = serviceInterface.getFromAllInterfaceFaults(((BindingFaultElement)bindingFault).getRef());
AxisBindingMessage axisBindingFault = new AxisBindingMessage();
axisBindingFault.setFault(true);
axisBindingFault.setName(interfaceFault.getName().getLocalPart());
axisBindingFault.setParent(axisBinding);
addDocumentation(axisBindingFault, interfaceFault.toElement());
SOAPBindingFaultExtensions soapBindingFaultExtensions;
try {
soapBindingFaultExtensions = (SOAPBindingFaultExtensions) bindingFault
.getComponentExtensionContext(new URI(WSDL2Constants.URI_WSDL2_SOAP));
} catch (URISyntaxException e) {
throw new AxisFault("Soap Binding Extention not found");
}
axisBindingFault.setProperty(WSDL2Constants.ATTR_WHTTP_HEADER,
createHttpHeaders(
soapBindingFaultExtensions.getHttpHeaders()));
axisBindingFault.setProperty(WSDL2Constants.ATTR_WHTTP_CONTENT_ENCODING,
soapBindingFaultExtensions.getHttpContentEncoding());
axisBindingFault.setProperty(WSDL2Constants.ATTR_WSOAP_CODE,
soapBindingFaultExtensions.getSoapFaultCode());
axisBindingFault.setProperty(WSDL2Constants.ATTR_WSOAP_SUBCODES,
soapBindingFaultExtensions.getSoapFaultSubcodes());
axisBindingFault.setProperty(WSDL2Constants.ATTR_WSOAP_HEADER,
createSoapHeaders(
soapBindingFaultExtensions.getSoapHeaders()));
axisBindingFault.setProperty(WSDL2Constants.ATTR_WSOAP_MODULE,
createSoapModules(
soapBindingFaultExtensions.getSoapModules()));
axisBinding.addFault(axisBindingFault);
}
// Capture all the binding operation specific properties
BindingOperation[] bindingOperations = binding.getBindingOperations();
for (int i = 0; i < bindingOperations.length; i++) {
BindingOperation bindingOperation = bindingOperations[i];
AxisBindingOperation axisBindingOperation = new AxisBindingOperation();
InterfaceOperation interfaceOperation = serviceInterface.getFromAllInterfaceOperations(((BindingOperationElement)bindingOperation).getRef());
AxisOperation axisOperation =
axisService.getOperation(interfaceOperation.getName());
axisBindingOperation.setAxisOperation(axisOperation);
axisBindingOperation.setParent(axisBinding);
axisBindingOperation.setName(axisOperation.getName());
addDocumentation(axisBindingOperation, bindingOperation.toElement());
SOAPBindingOperationExtensions soapBindingOperationExtensions;
try {
soapBindingOperationExtensions = ((SOAPBindingOperationExtensions)
bindingOperation.getComponentExtensionContext(
new URI(WSDL2Constants.URI_WSDL2_SOAP)));
} catch (URISyntaxException e) {
throw new AxisFault("Soap Binding Extention not found");
}
URI soapAction = soapBindingOperationExtensions.getSoapAction();
if (soapAction != null && !"\"\"".equals(soapAction.toString())) {
axisBindingOperation.setProperty(WSDL2Constants.ATTR_WSOAP_ACTION,
soapAction.toString());
}
axisBindingOperation.setProperty(WSDL2Constants.ATTR_WSOAP_MODULE,
createSoapModules(
soapBindingOperationExtensions.getSoapModules()));
URI soapMep = soapBindingOperationExtensions.getSoapMep();
if (soapMep != null) {
axisBindingOperation.setProperty(WSDL2Constants.ATTR_WSOAP_MEP,
soapMep.toString());
}
HTTPLocation httpLocation = soapBindingOperationExtensions.getHttpLocation();
// If httpLocation is not null we should extract a constant part from it and add its value and the
// corresponding AxisOperation to a map in order to dispatch rest messages. If httpLocation is null we add
// the operation name into this map.
String httpLocationString = null;
if (httpLocation != null) {
String httpLocationTemplete = httpLocation.getOriginalLocation();
axisBindingOperation
.setProperty(WSDL2Constants.ATTR_WHTTP_LOCATION, httpLocationTemplete);
httpLocationString = WSDLUtil.getConstantFromHTTPLocation(httpLocationTemplete, HTTPConstants.HEADER_POST);
}
if (httpLocationString != null){
// this map is used to dispatch operation based on request URI , in the HTTPLocationBasedDispatcher
httpLocationTable.put(httpLocationString, axisOperation);
}
axisBindingOperation.setProperty(WSDL2Constants.ATTR_WHTTP_CONTENT_ENCODING,
soapBindingOperationExtensions.getHttpContentEncodingDefault());
axisBindingOperation.setProperty(WSDL2Constants.ATTR_WHTTP_QUERY_PARAMETER_SEPARATOR,
soapBindingOperationExtensions.getHttpQueryParameterSeparator());
BindingMessageReference[] bindingMessageReferences =
bindingOperation.getBindingMessageReferences();
for (int j = 0; j < bindingMessageReferences.length; j++) {
BindingMessageReference bindingMessageReference = bindingMessageReferences[j];
AxisBindingMessage axisBindingMessage = new AxisBindingMessage();
axisBindingMessage.setParent(axisBindingOperation);
addDocumentation(axisBindingMessage, bindingMessageReference.toElement());
AxisMessage axisMessage = axisOperation.getMessage(bindingMessageReference
.getInterfaceMessageReference().getMessageLabel().toString());
axisBindingMessage.setAxisMessage(axisMessage);
axisBindingMessage.setName(axisMessage.getName());
axisBindingMessage.setDirection(axisMessage.getDirection());
SOAPBindingMessageReferenceExtensions soapBindingMessageReferenceExtensions;
try {
soapBindingMessageReferenceExtensions =
(SOAPBindingMessageReferenceExtensions) bindingMessageReference
.getComponentExtensionContext(
new URI(WSDL2Constants.URI_WSDL2_SOAP));
} catch (URISyntaxException e) {
throw new AxisFault("Soap Binding Extention not found");
}
axisBindingMessage.setProperty(WSDL2Constants.ATTR_WHTTP_HEADER,
createHttpHeaders(
soapBindingMessageReferenceExtensions.getHttpHeaders()));
axisBindingMessage.setProperty(WSDL2Constants.ATTR_WHTTP_CONTENT_ENCODING,
soapBindingMessageReferenceExtensions.getHttpContentEncoding());
axisBindingMessage.setProperty(WSDL2Constants.ATTR_WSOAP_HEADER,
createSoapHeaders(
soapBindingMessageReferenceExtensions.getSoapHeaders()));
axisBindingMessage.setProperty(WSDL2Constants.ATTR_WSOAP_MODULE,
createSoapModules(
soapBindingMessageReferenceExtensions.getSoapModules()));
axisBindingOperation.addChild(axisMessage.getDirection(), axisBindingMessage);
}
BindingFaultReference [] bindingFaultReferences =
bindingOperation.getBindingFaultReferences();
for (int j = 0; j < bindingFaultReferences.length; j++) {
BindingFaultReference bindingFaultReference = bindingFaultReferences[j];
AxisBindingMessage axisBindingMessageFault = new AxisBindingMessage();
addDocumentation(axisBindingMessageFault, bindingFaultReference.toElement());
axisBindingMessageFault.setParent(axisBindingOperation);
axisBindingMessageFault.setFault(true);
axisBindingMessageFault.setName(bindingFaultReference.getInterfaceFaultReference()
.getInterfaceFault().getName().getLocalPart());
SOAPBindingFaultReferenceExtensions soapBindingFaultReferenceExtensions;
try {
soapBindingFaultReferenceExtensions =
(SOAPBindingFaultReferenceExtensions) bindingFaultReference
.getComponentExtensionContext(
new URI(WSDL2Constants.URI_WSDL2_SOAP));
} catch (URISyntaxException e) {
throw new AxisFault("Soap Binding Extention not found");
}
axisBindingMessageFault.setProperty(WSDL2Constants.ATTR_WSOAP_MODULE,
createSoapModules(
soapBindingFaultReferenceExtensions.getSoapModules()));
axisBindingOperation.addFault(axisBindingMessageFault);
}
axisBinding.setProperty(WSDL2Constants.HTTP_LOCATION_TABLE, httpLocationTable);
axisBinding.addChild(axisBindingOperation.getName(), axisBindingOperation);
}
}
private void processHTTPBindingExtention(Binding binding, AxisBinding axisBinding, Interface serviceInterface)
throws AxisFault {
Map<String, AxisOperation> httpLocationTable = createHttpLocationTable();
// Capture all the binding specific properties
HTTPBindingExtensions httpBindingExtensions;
try {
httpBindingExtensions = (HTTPBindingExtensions) binding
.getComponentExtensionContext(new URI(WSDL2Constants.URI_WSDL2_HTTP));
} catch (URISyntaxException e) {
throw new AxisFault("HTTP Binding Extention not found");
}
String httpMethodDefault = httpBindingExtensions.getHttpMethodDefault();
axisBinding.setProperty(WSDL2Constants.ATTR_WHTTP_METHOD,
httpMethodDefault);
axisBinding.setProperty(WSDL2Constants.ATTR_WHTTP_QUERY_PARAMETER_SEPARATOR,
httpBindingExtensions.getHttpQueryParameterSeparatorDefault());
axisBinding.setProperty(WSDL2Constants.ATTR_WHTTP_CONTENT_ENCODING,
httpBindingExtensions.getHttpContentEncodingDefault());
// Capture all the fault specific properties
BindingFault[] bindingFaults = binding.getBindingFaults();
for (int i = 0; i < bindingFaults.length; i++) {
BindingFault bindingFault = bindingFaults[i];
InterfaceFault interfaceFault =
serviceInterface.getFromAllInterfaceFaults(((BindingFaultElement)bindingFault).getRef());
AxisBindingMessage axisBindingFault = new AxisBindingMessage();
axisBindingFault.setFault(true);
axisBindingFault.setName(interfaceFault.getName().getLocalPart());
axisBindingFault.setParent(axisBinding);
addDocumentation(axisBindingFault, interfaceFault.toElement());
HTTPBindingFaultExtensions httpBindingFaultExtensions;
try {
httpBindingFaultExtensions = (HTTPBindingFaultExtensions) bindingFault
.getComponentExtensionContext(new URI(WSDL2Constants.URI_WSDL2_HTTP));
} catch (URISyntaxException e) {
throw new AxisFault("HTTP Binding Extention not found");
}
axisBindingFault.setProperty(WSDL2Constants.ATTR_WHTTP_CODE,
httpBindingFaultExtensions
.getHttpErrorStatusCode().getCode());
axisBindingFault.setProperty(WSDL2Constants.ATTR_WHTTP_HEADER,
createHttpHeaders(
httpBindingFaultExtensions.getHttpHeaders()));
axisBindingFault.setProperty(WSDL2Constants.ATTR_WHTTP_CONTENT_ENCODING,
httpBindingFaultExtensions.getHttpContentEncoding());
axisBinding.addFault(axisBindingFault);
}
// Capture all the binding operation specific properties
BindingOperation[] bindingOperations = binding.getBindingOperations();
for (int i = 0; i < bindingOperations.length; i++) {
BindingOperation bindingOperation = bindingOperations[i];
AxisBindingOperation axisBindingOperation = new AxisBindingOperation();
InterfaceOperation interfaceOperation = serviceInterface.getFromAllInterfaceOperations(((BindingOperationElement)bindingOperation).getRef());
AxisOperation axisOperation =
axisService.getOperation(interfaceOperation.getName());
axisBindingOperation.setAxisOperation(axisOperation);
axisBindingOperation.setParent(axisBinding);
axisBindingOperation.setName(axisOperation.getName());
addDocumentation(axisBindingOperation, bindingOperation.toElement());
HTTPBindingOperationExtensions httpBindingOperationExtensions;
try {
httpBindingOperationExtensions = ((HTTPBindingOperationExtensions)
bindingOperation.getComponentExtensionContext(
new URI(WSDL2Constants.URI_WSDL2_HTTP)));
} catch (URISyntaxException e) {
throw new AxisFault("HTTP Binding Extention not found");
}
axisBindingOperation.setProperty(WSDL2Constants.ATTR_WHTTP_FAULT_SERIALIZATION,
httpBindingOperationExtensions.getHttpFaultSerialization());
axisBindingOperation.setProperty(WSDL2Constants.ATTR_WHTTP_INPUT_SERIALIZATION,
httpBindingOperationExtensions.getHttpInputSerialization());
String httpMethod = httpBindingOperationExtensions.
getHttpMethod();
if (httpMethod == null) {
if (httpMethodDefault != null) {
httpMethod = httpMethodDefault;
} else {
Boolean safeParameter =
(Boolean) axisOperation.getParameterValue(WSDL2Constants.ATTR_WSDLX_SAFE);
if (safeParameter != null && safeParameter.booleanValue()){
httpMethod = HTTPConstants.HEADER_GET;
} else {
httpMethod = HTTPConstants.HEADER_POST;
}
}
}
axisBindingOperation
.setProperty(WSDL2Constants.ATTR_WHTTP_METHOD, httpMethod);
HTTPLocation httpLocation = httpBindingOperationExtensions.getHttpLocation();
// If httpLocation is not null we should extract a constant part from it and add its value and the
// corresponding AxisOperation to a map in order to dispatch rest messages. If httpLocation is null we add
// the operation name into this map.
String httpLocationString = "";
if (httpLocation != null) {
String httpLocationTemplete = httpLocation.getOriginalLocation();
axisBindingOperation
.setProperty(WSDL2Constants.ATTR_WHTTP_LOCATION, httpLocationTemplete);
httpLocationString = WSDLUtil.getConstantFromHTTPLocation(httpLocationTemplete, httpMethod);
}
httpLocationTable.put(httpLocationString, axisOperation);
axisBindingOperation.setProperty(WSDL2Constants.ATTR_WHTTP_IGNORE_UNCITED,
httpBindingOperationExtensions.
isHttpLocationIgnoreUncited());
axisBindingOperation.setProperty(WSDL2Constants.ATTR_WHTTP_OUTPUT_SERIALIZATION,
httpBindingOperationExtensions.getHttpOutputSerialization());
axisBindingOperation.setProperty(WSDL2Constants.ATTR_WHTTP_QUERY_PARAMETER_SEPARATOR,
httpBindingOperationExtensions.getHttpQueryParameterSeparator());
axisBindingOperation.setProperty(WSDL2Constants.ATTR_WHTTP_CONTENT_ENCODING,
httpBindingOperationExtensions.getHttpContentEncodingDefault());
BindingMessageReference[] bindingMessageReferences =
bindingOperation.getBindingMessageReferences();
for (int j = 0; j < bindingMessageReferences.length; j++) {
BindingMessageReference bindingMessageReference = bindingMessageReferences[j];
AxisBindingMessage axisBindingMessage = new AxisBindingMessage();
axisBindingMessage.setParent(axisBindingOperation);
AxisMessage axisMessage = axisOperation.getMessage(bindingMessageReference
.getInterfaceMessageReference().getMessageLabel().toString());
axisBindingMessage.setAxisMessage(axisMessage);
axisBindingMessage.setName(axisMessage.getName());
axisBindingMessage.setDirection(axisMessage.getDirection());
addDocumentation(axisBindingMessage, bindingMessageReference.toElement());
HTTPBindingMessageReferenceExtensions httpBindingMessageReferenceExtensions;
try {
httpBindingMessageReferenceExtensions =
(HTTPBindingMessageReferenceExtensions) bindingMessageReference
.getComponentExtensionContext(
new URI(WSDL2Constants.URI_WSDL2_HTTP));
} catch (URISyntaxException e) {
throw new AxisFault("HTTP Binding Extention not found");
}
axisBindingMessage.setProperty(WSDL2Constants.ATTR_WHTTP_HEADER,
createHttpHeaders(
httpBindingMessageReferenceExtensions.getHttpHeaders()));
axisBindingMessage.setProperty(WSDL2Constants.ATTR_WHTTP_CONTENT_ENCODING,
httpBindingMessageReferenceExtensions.getHttpContentEncoding());
axisBindingOperation.addChild(WSDLConstants.MESSAGE_LABEL_IN_VALUE, axisBindingMessage);
}
BindingFaultReference[] bindingFaultReferences =
bindingOperation.getBindingFaultReferences();
for (int j = 0; j < bindingFaultReferences.length; j++) {
BindingFaultReference bindingFaultReference = bindingFaultReferences[j];
AxisBindingMessage axisBindingMessageFault = new AxisBindingMessage();
axisBindingMessageFault.setFault(true);
axisBindingMessageFault.setName(bindingFaultReference.getInterfaceFaultReference()
.getInterfaceFault().getName().getLocalPart());
axisBindingMessageFault.setParent(axisBindingOperation);
axisBindingOperation.addFault(axisBindingMessageFault);
addDocumentation(axisBindingMessageFault, bindingFaultReference.toElement());
}
axisBinding.setProperty(WSDL2Constants.HTTP_LOCATION_TABLE, httpLocationTable);
axisBinding.addChild(axisBindingOperation.getName(), axisBindingOperation);
}
}
private void processInterface(Interface serviceInterface)
throws AxisFault {
// TODO copy the policy elements
// copyExtensionAttributes(wsdl4jPortType.getExtensionAttributes(),
// axisService, PORT_TYPE);
InterfaceOperation[] interfaceOperations = serviceInterface
.getInterfaceOperations();
for (int i = 0; i < interfaceOperations.length; i++) {
axisService.addOperation(populateOperations(interfaceOperations[i]));
operationNames.add(interfaceOperations[i].getName());
}
Interface[] extendedInterfaces = serviceInterface.getExtendedInterfaces();
for (int i = 0; i < extendedInterfaces.length; i++) {
Interface extendedInterface = extendedInterfaces[i];
processInterface(extendedInterface);
}
}
private AxisOperation populateOperations(InterfaceOperation operation) throws AxisFault {
QName opName = operation.getName();
// Copy Name Attribute
AxisOperation axisOperation = axisService.getOperation(opName);
if (axisOperation == null) {
URI pattern = operation.getMessageExchangePattern();
String MEP;
if (pattern == null) {
MEP = WSDL20DefaultValueHolder.getDefaultValue(WSDL2Constants.ATTR_WSOAP_MEP);
} else {
MEP = pattern.toString();
}
if(!isServerSide){
// If in the client, need to toggle in-out to out-in etc.
if(WSDL2Constants.MEP_URI_IN_OUT.equals(MEP)){
MEP = WSDL2Constants.MEP_URI_OUT_IN;
}
if(WSDL2Constants.MEP_URI_IN_ONLY.equals(MEP)){
MEP = WSDL2Constants.MEP_URI_OUT_ONLY;
}
if(WSDL2Constants.MEP_URI_IN_OPTIONAL_OUT.equals(MEP)){
MEP = WSDL2Constants.MEP_URI_OUT_OPTIONAL_IN;
}
}
axisOperation = AxisOperationFactory.getOperationDescription(MEP);
axisOperation.setName(opName);
}
URI[] operationStyle = operation.getStyle();
if (operationStyle != null && operationStyle.length > 0) {
Parameter opStyleParameter = new Parameter();
opStyleParameter.setName(WSDL2Constants.OPERATION_STYLE);
opStyleParameter.setValue(operationStyle);
axisOperation.addParameter(opStyleParameter);
}
addDocumentation(axisOperation, operation.toElement());
// assuming the style of the operations of WSDL 2.0 is always document, for the time being :)
// The following can be used to capture the wsdlx:safe attribute
InterfaceOperationExtensions interfaceOperationExtensions;
try {
interfaceOperationExtensions = (InterfaceOperationExtensions) operation
.getComponentExtensionContext(
new URI(WSDL2Constants.URI_WSDL2_EXTENSIONS));
} catch (URISyntaxException e) {
throw new AxisFault("WSDL2 extensions not defined for this operation");
}
if (interfaceOperationExtensions != null) {
Parameter parameter = new Parameter(WSDL2Constants.ATTR_WSDLX_SAFE, Boolean.valueOf(
interfaceOperationExtensions.isSafe()));
axisOperation.addParameter(parameter);
}
RPCInterfaceOperationExtensions rpcInterfaceOperationExtensions;
try {
rpcInterfaceOperationExtensions = (RPCInterfaceOperationExtensions) operation
.getComponentExtensionContext(
new URI(WSDL2Constants.URI_WSDL2_RPC));
} catch (URISyntaxException e) {
throw new AxisFault("WSDL2 extensions not defined for this operation");
}
if (rpcInterfaceOperationExtensions != null) {
String rpcsig = "";
Argument[] signatures = rpcInterfaceOperationExtensions.getRPCSignature();
for (int i = 0; i < signatures.length; i++) {
Argument sigArgument = signatures[i];
rpcsig = rpcsig + sigArgument.getName().getLocalPart() + " " + sigArgument.getDirection() + " ";
}
Parameter parameter = new Parameter(WSDL2Constants.ATTR_WRPC_SIGNATURE, rpcsig);
axisOperation.addParameter(parameter);
}
InterfaceMessageReference[] interfaceMessageReferences = operation
.getInterfaceMessageReferences();
for (int i = 0; i < interfaceMessageReferences.length; i++) {
InterfaceMessageReference messageReference = interfaceMessageReferences[i];
if (messageReference.getMessageLabel().equals(
MessageLabel.IN)) {
// Its an input message
if (isServerSide) {
createAxisMessage(axisOperation, messageReference,
WSDLConstants.MESSAGE_LABEL_IN_VALUE);
} else {
createAxisMessage(axisOperation, messageReference,
WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
}
} else if (messageReference.getMessageLabel().equals(
MessageLabel.OUT)) {
if (isServerSide) {
createAxisMessage(axisOperation, messageReference,
WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
} else {
createAxisMessage(axisOperation, messageReference,
WSDLConstants.MESSAGE_LABEL_IN_VALUE);
}
}
}
// add operation level faults
InterfaceFaultReference[] faults = operation.getInterfaceFaultReferences();
for (int i = 0; i < faults.length; i++) {
AxisMessage faultMessage = new AxisMessage();
InterfaceFaultReference interfaceFaultReference = faults[i];
faultMessage.setDirection(interfaceFaultReference.getDirection().toString());
InterfaceFault interfaceFault = interfaceFaultReference.getInterfaceFault();
if (interfaceFault == null) {
throw new AxisFault("Interface Fault reference defined in operation " + opName + " cannot be found in interface");
}
// retrieve interface fault element
InterfaceFaultElement interfaceFaultElement = interfaceFault.toElement();
// drill down to get actual interface fault element definition
QNameTokenUnion interfaceFaultElementDef = interfaceFaultElement.getElement();
QName qName = interfaceFaultElementDef.getQName();
String name = qName.getLocalPart();
faultMessage.setElementQName(qName);
faultMessage.setName(name);
axisOperation.setFaultMessages(faultMessage);
}
return axisOperation;
}
private void createAxisMessage(AxisOperation axisOperation,
InterfaceMessageReference messageReference, String messageLabel)
throws AxisFault {
AxisMessage message = axisOperation
.getMessage(messageLabel);
String messageContentModelName = messageReference.getMessageContentModel();
QName elementQName = null;
if (WSDL2Constants.NMTOKEN_ELEMENT.equals(messageContentModelName)) {
ElementDeclaration elementDeclaration = messageReference.getElementDeclaration();
if (elementDeclaration == null) {
InterfaceMessageReferenceElement messageReferenceElement =
messageReference.toElement();
QName qName = messageReferenceElement.getElement().getQName();
throw new AxisFault("Unable to find element " + qName.toString() + " reffered to by operation " + axisOperation.getName().getLocalPart());
}
elementQName = elementDeclaration.getName();
} else if (WSDL2Constants.NMTOKEN_ANY.equals(messageContentModelName)) {
elementQName = Constants.XSD_ANY;
} else
if (WSDL2Constants.NMTOKEN_NONE.equals(messageContentModelName)) {
// nothing to do here keep the message element as null
} else {
throw new AxisFault("Sorry we do not support " + messageContentModelName +
". We do only support #any, #none and #element as message content models.");
}
message.setElementQName(elementQName);
message.setName(elementQName != null ? elementQName.getLocalPart() : axisOperation.getName().getLocalPart());
axisOperation.addMessage(message, messageLabel);
if(WSDLConstants.MESSAGE_LABEL_IN_VALUE.equals(messageLabel)){
XMLAttr xa = messageReference.toElement().getExtensionAttribute(new QName("http://www.w3.org/2006/05/addressing/wsdl","Action"));
if(xa!=null){
String value = (String)xa.getContent();
if(value != null){
ArrayList<String> al = axisOperation.getWSAMappingList();
if(al == null){
al = new ArrayList<String>();
axisOperation.setWsamappingList(al);
}
al.add(value);
}
}
}else{
XMLAttr xa = messageReference.toElement().getExtensionAttribute(new QName("http://www.w3.org/2006/05/addressing/wsdl","Action"));
if(xa!=null){
String value = (String)xa.getContent();
if(value != null){
axisOperation.setOutputAction(value);
}
}
}
// populate this map so that this can be used in SOAPBody based dispatching
if (elementQName != null) {
axisService
.addMessageElementQNameToOperationMapping(elementQName, axisOperation);
}
}
private Description readInTheWSDLFile(String wsdlURI) throws WSDLException, AxisFault {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
.newInstance();
documentBuilderFactory.setNamespaceAware(true);
DocumentBuilder documentBuilder;
Document document;
try {
documentBuilder = documentBuilderFactory.newDocumentBuilder();
document = documentBuilder.parse(wsdlURI);
} catch (ParserConfigurationException e) {
throw AxisFault.makeFault(e);
} catch (IOException e) {
throw AxisFault.makeFault(e);
} catch (SAXException e) {
throw AxisFault.makeFault(e);
}
return readInTheWSDLFile(document);
}
private Description readInTheWSDLFile(InputStream inputStream) throws WSDLException, AxisFault {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
.newInstance();
documentBuilderFactory.setNamespaceAware(true);
DocumentBuilder documentBuilder;
Document document;
try {
documentBuilder = documentBuilderFactory.newDocumentBuilder();
document = documentBuilder.parse(inputStream);
} catch (ParserConfigurationException e) {
throw AxisFault.makeFault(e);
} catch (IOException e) {
throw AxisFault.makeFault(e);
} catch (SAXException e) {
throw AxisFault.makeFault(e);
}
return readInTheWSDLFile(document);
}
private Description readInTheWSDLFile(Document document) throws WSDLException {
WSDLFactory factory = WSDLFactory.newInstance();
WSDLReader reader = factory.newWSDLReader();
if (customWSDLResolver != null) {
reader.setURIResolver(customWSDLResolver);
}
// This turns on WSDL validation which is set off by default.
reader.setFeature(WSDLReader.FEATURE_VALIDATION, true);
WSDLSource wsdlSource = reader.createWSDLSource();
wsdlSource.setSource(document.getDocumentElement());
String uri = getBaseUri();
if (uri != null && !"".equals(uri)) {
try {
wsdlSource.setBaseURI(new URI(uri));
} catch (URISyntaxException e) {
File f = new File(uri);
if(f.exists()) {
wsdlSource.setBaseURI(f.toURI());
} else {
log.error(e.toString(), e);
}
}
}
if (log.isDebugEnabled()) {
log.debug("Reading 2.0 WSDL with wsdl uri = " + wsdlURI);
log.trace(" the stack at this point is: " + stackToString());
}
return reader.readWSDL(wsdlSource);
}
/**
* Convert woden dependent SOAPHeaderBlock objects to SOAPHeaderMessage objects
*
* @param soapHeaderBlocks - An array of SOAPHeaderBlock objects
* @return List<SOAPHeaderMessage - An List of SOAPHeaderMessage objects
*/
private List<SOAPHeaderMessage> createSoapHeaders(SOAPHeaderBlock soapHeaderBlocks[]) {
if (soapHeaderBlocks.length == 0) {
return null;
}
List<SOAPHeaderMessage> soapHeaderMessages = new ArrayList<SOAPHeaderMessage>();
for (int i = 0; i < soapHeaderBlocks.length; i++) {
SOAPHeaderBlock soapHeaderBlock = soapHeaderBlocks[i];
ElementDeclaration elementDeclaration = soapHeaderBlock.getElementDeclaration();
if (elementDeclaration != null) {
QName name = elementDeclaration.getName();
SOAPHeaderMessage soapHeaderMessage = new SOAPHeaderMessage();
soapHeaderMessage.setElement(name);
soapHeaderMessage.setRequired(soapHeaderBlock.isRequired().booleanValue());
soapHeaderMessage
.setMustUnderstand(soapHeaderBlock.mustUnderstand().booleanValue());
soapHeaderMessages.add(soapHeaderMessage);
}
}
return soapHeaderMessages;
}
/**
* Convert woden dependent SOAPHeaderBlock objects to SOAPHeaderMessage objects
*
* @param soapModules - An array of SOAPModule objects
* @return List<SOAPModuleMessage> - An List of SOAPHeaderMessage objects
*/
private List<SOAPModuleMessage> createSoapModules(SOAPModule soapModules[]) {
if (soapModules.length == 0) {
return null;
}
List<SOAPModuleMessage> soapModuleMessages = new ArrayList<SOAPModuleMessage>();
for (int i = 0; i < soapModules.length; i++) {
SOAPModule soapModule = soapModules[i];
SOAPModuleMessage soapModuleMessage = new SOAPModuleMessage();
soapModuleMessage.setUri(soapModule.getRef().toString());
soapModuleMessages.add(soapModuleMessage);
}
return soapModuleMessages;
}
/**
* Convert woden dependent HTTPHeader objects to Header objects
*
* @param httpHeaders - An array of HTTPHeader objects
* @return List<HTTPHeaderMessage> - An List of Header objects
*/
private List<HTTPHeaderMessage> createHttpHeaders(HTTPHeader httpHeaders[]) {
if (httpHeaders.length == 0) {
return null;
}
List<HTTPHeaderMessage> httpHeaderMessages = new ArrayList<HTTPHeaderMessage>();
for (int i = 0; i < httpHeaders.length; i++) {
HTTPHeader httpHeader = (HTTPHeader) httpHeaders[i];
HTTPHeaderMessage httpHeaderMessage = new HTTPHeaderMessage();
httpHeaderMessage.setqName(((HTTPHeaderElement)httpHeader).getTypeName());
httpHeaderMessage.setName(httpHeader.getName());
httpHeaderMessage.setRequired(httpHeader.isRequired().booleanValue());
httpHeaderMessages.add(httpHeaderMessage);
}
return httpHeaderMessages;
}
/**
* Adds documentation details to a given AxisDescription.
* The documentation details is extracted from the WSDL element given.
* @param axisDescription - The documentation will be added to this
* @param element - The element that the documentation is extracted from.
*/
private void addDocumentation(AxisDescription axisDescription, DocumentableElement element) {
DocumentationElement[] documentationElements = element.getDocumentationElements();
String documentation = "";
for (int i = 0; i < documentationElements.length; i++) {
DocumentationElement documentationElement = documentationElements[i];
XMLElement contentElement = documentationElement.getContent();
Element content = (Element)contentElement.getSource();
if (content != null) {
documentation = documentation + DOM2Writer.nodeToString(content.getFirstChild());
}
}
if (!"".equals(documentation)) {
axisDescription.setDocumentation(documentation);
}
}
private void setEndpointURL(AxisEndpoint axisEndpoint, String endpointURL) {
axisEndpoint.setEndpointURL(endpointURL);
try {
URL url = new URL(endpointURL);
axisEndpoint.setTransportInDescription(url.getProtocol());
} catch (Exception e) {
log.debug(e.getMessage(), e);
}
}
}