Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
org.gradle.caching=true
group=io.ballerina
version=1.0.5-SNAPSHOT
version=1.1.0-SNAPSHOT

# Dependencies
ballerinaLangVersion=2201.11.0
Expand All @@ -13,7 +13,7 @@ ballerinaGradlePluginVersion=2.3.0

wsdl4jVersion=1.6.3
apacheXmlSchemaVersion=1.4.7
xsdCoreVersion=1.0.7
xsdCoreVersion=1.1.0
picocliVersion=4.0.1
junitVersion=4.13.1
junitEngineVersion=5.8.2
Expand Down
6 changes: 3 additions & 3 deletions module-ballerina-wsdl/BalTool.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@
id = "wsdl"

[[dependency]]
path = "../wsdl-cli/build/libs/wsdl-cli-1.0.4.jar"
path = "../wsdl-cli/build/libs/wsdl-cli-1.1.0-SNAPSHOT.jar"

[[dependency]]
path = "../wsdl-core/build/libs/wsdl-core-1.0.4.jar"
path = "../wsdl-core/build/libs/wsdl-core-1.1.0-SNAPSHOT.jar"

[[dependency]]
path = "lib/xsd-core-1.0.7.jar"
path = "lib/xsd-core-1.1.0.jar"

[[dependency]]
path = "lib/wsdl4j-1.6.3.jar"
Expand Down
6 changes: 3 additions & 3 deletions module-ballerina-wsdl/Ballerina.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
distribution = "2201.11.0"
org = "ballerina"
name = "wsdltool"
version = "1.0.4"
version = "1.1.0"
authors = ["Ballerina"]
keywords = ["wsdl"]
repository = "https://github.com/ballerina-platform/wsdl-tools"
Expand All @@ -14,5 +14,5 @@ observabilityIncluded = false
[[platform.java21.dependency]]
groupId = "io.ballerina"
artifactId = "xsd-core"
version = "1.0.7"
path = "lib/xsd-core-1.0.7.jar"
version = "1.1.0"
path = "lib/xsd-core-1.1.0.jar"
2 changes: 1 addition & 1 deletion module-ballerina-wsdl/Dependencies.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ distribution-version = "2201.11.0"
[[package]]
org = "ballerina"
name = "wsdltool"
version = "1.0.4"
version = "1.1.0"
modules = [
{org = "ballerina", packageName = "wsdltool", moduleName = "wsdltool"}
]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import io.ballerina.wsdl.core.handler.SchemaHandler;
import io.ballerina.wsdl.core.handler.model.SoapVersion;
import io.ballerina.wsdl.core.handler.model.WsdlOperation;
import io.ballerina.xsd.core.node.MemberNode;
import io.ballerina.xsd.core.visitor.XSDVisitor;
import io.ballerina.xsd.core.visitor.XSDVisitorImpl;
import org.apache.ws.commons.schema.XmlSchema;
Expand Down Expand Up @@ -74,11 +75,11 @@
import static io.ballerina.xsd.core.XSDToRecord.XMLDATA_NAME_ANNOTATION;
import static io.ballerina.xsd.core.XSDToRecord.generateNodes;
import static io.ballerina.xsd.core.XSDToRecord.generateResidualNodes;
import static io.ballerina.xsd.core.visitor.VisitorUtils.UNDERSCORE;
import static io.ballerina.xsd.core.visitor.VisitorUtils.URI;
import static io.ballerina.xsd.core.visitor.VisitorUtils.XMLDATA_NAMESPACE;
import static io.ballerina.xsd.core.visitor.VisitorUtils.convertToCamelCase;
import static io.ballerina.xsd.core.visitor.VisitorUtils.isSimpleType;
import static io.ballerina.xsd.core.visitor.Utils.UNDERSCORE;
import static io.ballerina.xsd.core.visitor.Utils.URI;
import static io.ballerina.xsd.core.visitor.Utils.XMLDATA_NAMESPACE;
import static io.ballerina.xsd.core.visitor.Utils.convertToCamelCase;
import static io.ballerina.xsd.core.visitor.Utils.isSimpleType;
import static io.ballerina.xsd.core.visitor.XSDVisitorImpl.EMPTY_STRING;
import static io.ballerina.xsd.core.visitor.XSDVisitorImpl.QUESTION_MARK;
import static io.ballerina.xsd.core.visitor.XSDVisitorImpl.RECORD;
Expand Down Expand Up @@ -200,14 +201,15 @@ public void generateFromWSDL(WsdlToBallerinaResponse response, Definition wsdlDe
DiagnosticUtils.getDiagnosticResponse(diagnosticMessages, response);
return;
}
Types types = wsdlDefinition.getTypes();
Objects.requireNonNull(types, "Could not find <wsdl:types> in the file");
generateTypes(response, types, outputDirectory);
for (SoapPort port: soapPorts) {
setSoapVersion(port.soapVersion());
setServiceUrl(port.serviceUrl());
setSoapNamespace(getSoapVersion().equals(SoapVersion.SOAP12) ? SOAP12_NAMESPACE : SOAP11_NAMESPACE);
initializeSchemas(wsdlDefinition);
Map<String, WsdlOperation> wsdlOperations = getWSDLOperations(port.soapPort());
Types types = wsdlDefinition.getTypes();
Objects.requireNonNull(types, "Could not find <wsdl:types> in the file");
ArrayList<WsdlOperation> operations = new ArrayList<>();
if (filteredWSDLOperations.length == 0) {
for (Map.Entry<String, WsdlOperation> entry : wsdlOperations.entrySet()) {
Expand All @@ -222,8 +224,6 @@ public void generateFromWSDL(WsdlToBallerinaResponse response, Definition wsdlDe
generateClient(response, outputDirectory, port, operations,
soapPorts.size() > 1 ? port.soapPort().getName() + UNDERSCORE : EMPTY_STRING);
}
Types types = wsdlDefinition.getTypes();
generateTypes(response, types, outputDirectory);
} catch (WSDLException e) {
DiagnosticMessage message = DiagnosticMessage.wsdlToBallerinaError(null);
diagnosticMessages.add(message);
Expand All @@ -248,7 +248,7 @@ public static Header extractHeader(Definition wsdlDefinition, QName headerName,

private void generateClient(WsdlToBallerinaResponse response, String outputDirectory, SoapPort port,
ArrayList<WsdlOperation> operation, String filePrefix) throws FormatterException {
ModulePartNode clientModule = generateClientModule(operation, port.soapPort());
ModulePartNode clientModule = generateClientModule(operation, port.soapPort(), response);
String prefix = filePrefix.replaceAll("([a-z])([A-Z])", "$1_$2").toLowerCase(Locale.ROOT);
String clientFileName = outputDirectory.equals(EMPTY_STRING)
? prefix + CLIENT_FILE_NAME : outputDirectory + SLASH + prefix + CLIENT_FILE_NAME;
Expand All @@ -258,15 +258,17 @@ private void generateClient(WsdlToBallerinaResponse response, String outputDirec
private void generateTypes(WsdlToBallerinaResponse response, Types types,
String outputDirectory) throws Exception {
XSDVisitor xsdVisitor = new XSDVisitorImpl();
Map<String, ModuleMemberDeclarationNode> nodes = generateTypeNodes(types, xsdVisitor);
Map<String, MemberNode> nodes = generateTypeNodes(types, xsdVisitor);
ModulePartNode typeNodes = generateModulePartNode(nodes, xsdVisitor);
String typesFileName = outputDirectory.equals(EMPTY_STRING)
? TYPES_FILE_NAME : outputDirectory + SLASH + TYPES_FILE_NAME;
response.setTypesSource(new GeneratedSource(typesFileName, Utils.formatModuleParts(typeNodes)));
response.setResolvedNameMeta(xsdVisitor.getResolvedNameMeta());
}

private OperationContext generateEnvelopeTypes(WsdlOperation operation,
Map<String, ModuleMemberDeclarationNode> nodes, Port port) {
Map<String, ModuleMemberDeclarationNode> nodes, Port port,
Map<String, String> resolvedNameMeta) {
String requestType = getElementType(operation.getOperationInput(), getWsdlDefinition(), nodes);
String requestFieldName = isSimpleType(requestType)
? getElementName(operation.getOperationInput(), getWsdlDefinition()) : requestType;
Expand All @@ -277,13 +279,14 @@ private OperationContext generateEnvelopeTypes(WsdlOperation operation,
OperationContext operationContext = new OperationContext(operation.getOperationName(), suffix);
Utils.generateTypeDefinitions(getSoapNamespace(), nodes, requestType, requestFieldName, responseType,
responseFieldName, operationContext);
ModuleMemberDeclarationNode headerNode = generateHeaderNode(operation, operationContext);
ModuleMemberDeclarationNode headerNode = generateHeaderNode(operation, operationContext, resolvedNameMeta);
nodes.put(operation.getOperationName() + HEADER, headerNode);
return operationContext;
}

private ModuleMemberDeclarationNode generateHeaderNode(WsdlOperation operation,
OperationContext operationContext) {
OperationContext operationContext,
Map<String, String> resolvedNameMeta) {
Map<String, Header> headers = new HashMap<>();
Map<String, HeaderPart> elementNames = operation.getHeaderElements();
String localPart = operation.getInputHeaderName();
Expand All @@ -302,16 +305,17 @@ private ModuleMemberDeclarationNode generateHeaderNode(WsdlOperation operation,
Header header = entry.getValue();
String elementName = header.getElementName();
String namespace = header.getElementNamespace();
if (!elementName.equals(key)) {
String resolvedName = resolvedNameMeta.getOrDefault(namespace + elementName, elementName);
if (!resolvedName.equals(key)) {
stringBuilder.append(String.format(XMLDATA_NAME_ANNOTATION, elementName))
.append(XMLDATA_NAMESPACE + WHITESPACE + OPEN_BRACES + PREFIX + COLON + QUOTATION_MARK)
.append(key).append(QUOTATION_MARK).append(COMMA).append(URI).append(COLON)
.append(QUOTATION_MARK).append(namespace).append(QUOTATION_MARK).append(CLOSE_BRACES)
.append(key).append(WHITESPACE).append(key).append(QUESTION_MARK).append(SEMICOLON);
.append(resolvedName).append(WHITESPACE).append(key).append(QUESTION_MARK).append(SEMICOLON);
} else {
String field = String.format(XMLDATA_NAMESPACE_URI, namespace);
stringBuilder.append(field).append(key).append(WHITESPACE)
.append(elementName).append(QUESTION_MARK).append(SEMICOLON);
stringBuilder.append(field).append(resolvedName).append(WHITESPACE)
.append(key).append(QUESTION_MARK).append(SEMICOLON);
}
}
stringBuilder.append(CLOSE_BRACES).append(SEMICOLON);
Expand All @@ -325,17 +329,19 @@ private WsdlOperation validateAndRetrieveOperation(String operationName,
return operation;
}

private ModulePartNode generateClientModule(ArrayList<WsdlOperation> operations, Port port) {
private ModulePartNode generateClientModule(ArrayList<WsdlOperation> operations, Port port,
WsdlToBallerinaResponse response) {
StringBuilder clientContext = Utils.generateClientContext(getSoapVersion().toString(), getServiceUrl(),
port, soapPorts.size() > 1);
return getClientModulePartNode(clientContext, operations, getSoapVersion().toString(), port);
return getClientModulePartNode(clientContext, operations, getSoapVersion().toString(), port, response);
}

private ModulePartNode getClientModulePartNode(StringBuilder stringBuilder, ArrayList<WsdlOperation> operations,
String soapVersion, Port port) {
String soapVersion, Port port, WsdlToBallerinaResponse response) {
Map<String, ModuleMemberDeclarationNode> nodes = new LinkedHashMap<>();
for (WsdlOperation operation: operations) {
OperationContext operationContext = generateEnvelopeTypes(operation, nodes, port);
OperationContext operationContext = generateEnvelopeTypes(operation, nodes, port,
response.getResolvedNameMeta());
String functionCode = buildRemoteFunctionCode(operationContext, operation.getOperationName(),
operation.getOperationAction());
stringBuilder.append(functionCode);
Expand Down Expand Up @@ -387,10 +393,9 @@ private static NodeList<ImportDeclarationNode> createImportNodes(String... impor
return AbstractNodeFactory.createNodeList(importNodes);
}

private Map<String, ModuleMemberDeclarationNode> generateTypeNodes(Types types,
XSDVisitor xsdVisitor) throws Exception {
private Map<String, MemberNode> generateTypeNodes(Types types, XSDVisitor xsdVisitor) throws Exception {
List<?> extElements = types.getExtensibilityElements();
Map<String, ModuleMemberDeclarationNode> nodes = new LinkedHashMap<>();
Map<String, MemberNode> nodes = new LinkedHashMap<>();
for (Object extElement : extElements) {
if (!(extElement instanceof Schema)) {
continue;
Expand All @@ -403,7 +408,7 @@ private Map<String, ModuleMemberDeclarationNode> generateTypeNodes(Types types,
}

private static void generateTypeNode(XSDVisitor xsdVisitor, Schema schema,
Map<String, ModuleMemberDeclarationNode> nodes) throws Exception {
Map<String, MemberNode> nodes) throws Exception {
Element schemaElement = schema.getElement();
xsdVisitor.setTargetNamespace(schemaElement.getAttribute(TARGET_NAMESPACE));
generateNodes(schemaElement, nodes, xsdVisitor);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@
import io.ballerina.wsdl.core.generator.GeneratedSource;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* Represents the response from converting a WSDL description into Ballerina client and type definitions.
Expand All @@ -32,6 +34,7 @@
public class WsdlToBallerinaResponse {
private ArrayList<GeneratedSource> clientSources = new ArrayList<>();
private GeneratedSource typesSource;
private Map<String, String> resolvedNameMeta = new HashMap<>();
private List<WsdlToBallerinaDiagnostic> diagnostics = new ArrayList<>();

public ArrayList<GeneratedSource> getClientSources() {
Expand All @@ -54,6 +57,14 @@ public List<WsdlToBallerinaDiagnostic> getDiagnostics() {
return diagnostics;
}

public void setResolvedNameMeta(Map<String, String> resolvedNameMeta) {
this.resolvedNameMeta = resolvedNameMeta;
}

public Map<String, String> getResolvedNameMeta() {
return resolvedNameMeta;
}

public void setDiagnostics(List<WsdlToBallerinaDiagnostic> diagnostics) {
this.diagnostics = diagnostics;
}
Expand Down