Skip to content

Commit

Permalink
Merge pull request #518 from kalaiyarasiganeshalingam/2.6.1
Browse files Browse the repository at this point in the history
Fix mismatch error
  • Loading branch information
kalaiyarasiganeshalingam authored Aug 10, 2023
2 parents 7854b72 + 6b1e159 commit 77af8c2
Show file tree
Hide file tree
Showing 19 changed files with 716 additions and 171 deletions.
6 changes: 3 additions & 3 deletions ballerina/Ballerina.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
org = "ballerina"
name = "xmldata"
version = "2.6.0"
version = "2.6.1"
authors = ["Ballerina"]
keywords = ["xml", "json"]
repository = "https://github.com/ballerina-platform/module-ballerina-xmldata"
Expand All @@ -15,5 +15,5 @@ graalvmCompatible = true
[[platform.java11.dependency]]
groupId = "io.ballerina.stdlib"
artifactId = "xmldata-native"
version = "2.6.0"
path = "../native/build/libs/xmldata-native-2.6.0.jar"
version = "2.6.1"
path = "../native/build/libs/xmldata-native-2.6.1-SNAPSHOT.jar"
2 changes: 1 addition & 1 deletion ballerina/CompilerPlugin.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ id = "xmldata-compiler-plugin"
class = "io.ballerina.stdlib.xmldata.compiler.XmldataCompilerPlugin"

[[dependency]]
path = "../compiler-plugin/build/libs/xmldata-compiler-plugin-2.6.0.jar"
path = "../compiler-plugin/build/libs/xmldata-compiler-plugin-2.6.1-SNAPSHOT.jar"
2 changes: 1 addition & 1 deletion ballerina/Dependencies.toml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ modules = [
[[package]]
org = "ballerina"
name = "xmldata"
version = "2.6.0"
version = "2.6.1"
dependencies = [
{org = "ballerina", name = "jballerina.java"},
{org = "ballerina", name = "test"}
Expand Down
189 changes: 189 additions & 0 deletions ballerina/tests/from_xml_test.bal
Original file line number Diff line number Diff line change
Expand Up @@ -1109,3 +1109,192 @@ isolated function testFromXmlWithBackSlash1() returns error? {
Book_Store actual = check fromXml(payload);
test:assertEquals(actual, expected, msg = "testToRecordWithNamespaces result incorrect");
}


type BookStore7 record {
string storeName;
int postalCode;
@Name {
value: "isOpen"
}
boolean open;
Address7 address;
Codes7 codes;
@Attribute
string status;
@Attribute
string 'xmlns\:ns0;
};

type Address7 record {
string street;
string city;
string country;
};

type Codes7 record {
int[] item;
};

@test:Config {
groups: ["fromXml"]
}
isolated function testRecordToXml7() returns error? {
xml payload = xml `<BookStore7 status="online" xmlns:ns0="http://sample.com/test">
<storeName>foo</storeName>
<postalCode>94</postalCode>
<isOpen>true</isOpen>
<address>
<street>Galle Road</street>
<city>Colombo</city>
<country>Sri Lanka</country>
</address>
<codes>
<item>4</item>
<item>8</item>
<item>9</item>
</codes>
</BookStore7>
<!-- some comment -->
<?doc document="book.doc"?>`;
BookStore7 expected = {
storeName: "foo",
postalCode: 94,
open: true,
address: {
street: "Galle Road",
city: "Colombo",
country: "Sri Lanka"
},
codes: {
item: [4, 8, 9]
},
'xmlns\:ns0: "http://sample.com/test",
status: "online"
};
BookStore7 actual = check fromXml(payload);
test:assertEquals(actual, expected, msg = "testToRecordWithNamespaces result incorrect");
}

@Name {
value: "BookStore8"
}
type BookStore9 record {
string storeName;
int postalCode;
boolean isOpen;
@Name {
value: "address"
}
Address8 addr;
@Name {
value: "codes"
}
Codes8 code;
@Attribute
string status;
@Attribute
string 'xmlns\:ns0;
};

type Address8 record {
string street;
string city;
string country;
};

type Codes8 record {
int[] item;
};

@test:Config {
groups: ["fromXml"]
}
isolated function testRecordToXml8() returns error? {
xml payload = xml `<BookStore8 status="online" xmlns:ns0="http://sample.com/test">
<storeName>foo</storeName>
<postalCode>94</postalCode>
<isOpen>true</isOpen>
<address>
<street>Galle Road</street>
<city>Colombo</city>
<country>Sri Lanka</country>
</address>
<codes>
<item>4</item>
<item>8</item>
<item>9</item>
</codes>
</BookStore8>
<!-- some comment -->
<?doc document="book.doc"?>`;
BookStore9 expected = {
storeName: "foo",
postalCode: 94,
isOpen: true,
addr: {
street: "Galle Road",
city: "Colombo",
country: "Sri Lanka"
},
code: {
item: [4, 8, 9]
},
'xmlns\:ns0: "http://sample.com/test",
status: "online"
};
BookStore9 actual = check fromXml(payload);
test:assertEquals(actual, expected, msg = "testToRecordWithNamespaces result incorrect");
}

type Appointment record {
string firstName;
string lastName;
string email;
string age;
};

@Name {
value: "appointments"
}
type Appointments record {
Appointment[] appointment;
};

@test:Config {
groups: ["fromXml"]
}
isolated function testFromXmlWithNameAnnotation() returns error? {
Appointments expected = {
"appointment": [
{
"firstName":"John",
"lastName":"Doe",
"email":"john.doe@gmail.com",
"age":"28"
},
{
"firstName":"John",
"lastName":"Doe",
"email":"john.doe@gmail.com",
"age":"28"
}
]
};
xml xmlPayload = xml `<appointments>
<appointment>
<firstName>John</firstName>
<lastName>Doe</lastName>
<email>john.doe@gmail.com</email>
<age>28</age>
</appointment>
<appointment>
<firstName>John</firstName>
<lastName>Doe</lastName>
<email>john.doe@gmail.com</email>
<age>28</age>
</appointment>
</appointments>`;
Appointments result = check fromXml(xmlPayload);
test:assertEquals(result, expected, msg = "testFromXmlWithNameAnnotation result incorrect");
}
5 changes: 5 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Fixed
[Fix the mismatch error by `fromXml` API while the field has the name annotation](https://github.com/ballerina-platform/ballerina-standard-library/issues/3802)

## [2.4.3] - 2023-05-12

### Fixed
- [Fix the bug from fromXml API when xml elements have different namespaces](https://github.com/ballerina-platform/ballerina-standard-library/issues/4434)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ public void testInvalidType5() {
List<Diagnostic> errorDiagnosticsList = diagnosticResult.diagnostics().stream()
.filter(r -> r.diagnosticInfo().severity().equals(DiagnosticSeverity.ERROR))
.collect(Collectors.toList());
Assert.assertEquals(errorDiagnosticsList.size(), 5);
Assert.assertEquals(errorDiagnosticsList.size(), 6);
}

@Test
Expand All @@ -116,7 +116,7 @@ public void testInvalidType6() {
List<Diagnostic> errorDiagnosticsList = diagnosticResult.diagnostics().stream()
.filter(r -> r.diagnosticInfo().severity().equals(DiagnosticSeverity.ERROR))
.collect(Collectors.toList());
Assert.assertEquals(errorDiagnosticsList.size(), 3);
Assert.assertEquals(errorDiagnosticsList.size(), 4);
}

@Test
Expand All @@ -125,7 +125,7 @@ public void testInvalidType7() {
List<Diagnostic> errorDiagnosticsList = diagnosticResult.diagnostics().stream()
.filter(r -> r.diagnosticInfo().severity().equals(DiagnosticSeverity.ERROR))
.collect(Collectors.toList());
Assert.assertEquals(errorDiagnosticsList.size(), 2);
Assert.assertEquals(errorDiagnosticsList.size(), 3);
}

@Test
Expand All @@ -134,7 +134,7 @@ public void testInvalidType8() {
List<Diagnostic> errorDiagnosticsList = diagnosticResult.diagnostics().stream()
.filter(r -> r.diagnosticInfo().severity().equals(DiagnosticSeverity.ERROR))
.collect(Collectors.toList());
Assert.assertEquals(errorDiagnosticsList.size(), 4);
Assert.assertEquals(errorDiagnosticsList.size(), 5);
}

@Test
Expand All @@ -153,9 +153,20 @@ public void testInvalidUnionType1() {
.filter(r -> r.diagnosticInfo().severity().equals(DiagnosticSeverity.ERROR))
.collect(Collectors.toList());
Assert.assertEquals(errorDiagnosticsList.size(), 2);
Assert.assertEquals(errorDiagnosticsList.get(0).diagnosticInfo().messageFormat(),
"invalid field type: the record field does not support the optional value type");
Assert.assertEquals(errorDiagnosticsList.get(1).diagnosticInfo().messageFormat(),
"invalid field type: the record field does not support the optional value type");
Assert.assertEquals(errorDiagnosticsList.get(0).diagnosticInfo().messageFormat(),
"invalid union type: union type does not support multiple non-primitive record types");
}

@Test
public void testInvalidChildAnnotation() {
DiagnosticResult diagnosticResult = loadPackage("sample11").getCompilation().diagnosticResult();
List<Diagnostic> errorDiagnosticsList = diagnosticResult.diagnostics().stream()
.filter(r -> r.diagnosticInfo().severity().equals(DiagnosticSeverity.ERROR))
.collect(Collectors.toList());
Assert.assertEquals(errorDiagnosticsList.size(), 1);
Assert.assertEquals(errorDiagnosticsList.get(0).diagnosticInfo().messageFormat(),
"invalid annotation attachment: child record does not allow name annotation");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ type Foo record {
};

type Bar record {
int? bar;
int? bar = 2;
string car;
};

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[package]
org = "xmldata_test"
name = "sample9"
name = "sample10"
version = "0.1.0"
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
[package]
org = "xmldata_test"
name = "sample11"
version = "0.1.0"
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
//
// WSO2 LLC. 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.

import ballerina/xmldata;

@xmldata:Name {
value: "Foo1"
}
type Foo record {
Bar foo;
};

@xmldata:Name {
value: "Bar1"
}
type Bar record {
int bar;
Bar2 bar2;
};

@xmldata:Name {
value: "Bar4"
}
@xmldata:Namespace {
prefix: "ns",
uri: "http://sdf.com"
}
type Bar2 record {
int bar;
string car;
};

public function main() returns error? {
xml x1 = xml `<foo><bar>2</bar><car></car></foo>`;
Foo actual = check xmldata:fromXml(x1);
Bar result = check xmldata:fromXml(x1);
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,9 @@ public enum DiagnosticsCodes {
XMLDATA_101("XMLDATA_101",
"invalid field type: the record field does not support the optional value type", ERROR),
XMLDATA_102("XMLDATA_102",
"invalid union type: union type does not support multiple non-primitive record types", ERROR);

"invalid union type: union type does not support multiple non-primitive record types", ERROR),
XMLDATA_103("XMLDATA_103",
"invalid annotation attachment: child record does not allow name annotation", ERROR);
private final String code;
private final String message;
private final DiagnosticSeverity severity;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,6 @@ public class XmldataCodeAnalyzer extends CodeAnalyzer {
@Override
public void init(CodeAnalysisContext codeAnalysisContext) {
codeAnalysisContext.addSyntaxNodeAnalysisTask(new XmldataRecordFieldValidator(),
List.of(SyntaxKind.LOCAL_VAR_DECL, SyntaxKind.MODULE_VAR_DECL, SyntaxKind.RECORD_FIELD));
List.of(SyntaxKind.MODULE_PART));
}
}
Loading

0 comments on commit 77af8c2

Please sign in to comment.