wsdl20toaxisservicebuilder.java
来自「开源的axis2框架的源码。用于开发WEBSERVER」· Java 代码 · 共 1,128 行 · 第 1/4 页
JAVA
1,128 行
/*
* 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 org.apache.axiom.soap.SOAP11Constants;
import org.apache.axiom.soap.SOAP12Constants;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.AxisFault;
import org.apache.axis2.namespace.Constants;
import org.apache.axis2.transport.http.util.RESTUtil;
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.woden.WSDLException;
import org.apache.woden.WSDLFactory;
import org.apache.woden.WSDLReader;
import org.apache.woden.WSDLSource;
import org.apache.woden.internal.DOMWSDLFactory;
import org.apache.woden.internal.wsdl20.extensions.InterfaceOperationExtensionsImpl;
import org.apache.woden.internal.wsdl20.extensions.http.HTTPBindingExtensionsImpl;
import org.apache.woden.internal.wsdl20.extensions.http.HTTPHeaderImpl;
import org.apache.woden.internal.wsdl20.extensions.soap.SOAPBindingExtensionsImpl;
import org.apache.woden.internal.wsdl20.BindingFaultImpl;
import org.apache.woden.internal.wsdl20.BindingOperationImpl;
import org.apache.woden.schema.Schema;
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.WSDLComponent;
import org.apache.woden.wsdl20.enumeration.MessageLabel;
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.HTTPHeader;
import org.apache.woden.wsdl20.extensions.http.HTTPLocation;
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.DescriptionElement;
import org.apache.woden.wsdl20.xml.TypesElement;
import org.apache.woden.wsdl20.xml.DocumentationElement;
import org.apache.woden.wsdl20.xml.DocumentableElement;
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 javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.Comparator;
import com.ibm.wsdl.util.xml.DOM2Writer;
public class WSDL20ToAxisServiceBuilder extends WSDLToAxisServiceBuilder {
protected Description description;
private String wsdlURI;
// FIXME @author Chathura THis shoud be a URI. Find whats used by
// woden.
private static String RPC = "rpc";
protected String interfaceName;
private String savedTargetNamespace;
private Map namespacemap;
private List operationNames = new ArrayList();
private NamespaceMap stringBasedNamespaceMap;
private boolean setupComplete = false;
private Service wsdlService;
// 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();
}
Description description = readInTheWSDLFile(fullPath);
DescriptionElement descriptionElement = description.toElement();
savedTargetNamespace = descriptionElement.getTargetNamespace()
.toString();
namespacemap = descriptionElement.getNamespaces();
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, QName serviceName) {
super(null, serviceName);
this.wsdlURI = wsdlUri;
}
public WSDL20ToAxisServiceBuilder(String wsdlUri, AxisService service) {
super(null, service);
this.wsdlURI = wsdlUri;
}
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 (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.setNameSpacesMap(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();
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);
}
}
}
processService();
return axisService;
} catch (Exception e) {
throw AxisFault.makeFault(e);
}
}
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 (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 {
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];
}
axisService.setEndpointName(endpoint.getName().toString());
axisService.setBindingName(endpoint.getBinding().getName().getLocalPart());
axisService.setEndpointURL(endpoint.getAddress().toString());
}
private void processService() throws AxisFault {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?