diff --git a/bvm/ballerina-core/src/main/java/org/ballerinalang/model/values/BXMLItem.java b/bvm/ballerina-core/src/main/java/org/ballerinalang/model/values/BXMLItem.java index a042dcfa2fa9..5e5322af6657 100644 --- a/bvm/ballerina-core/src/main/java/org/ballerinalang/model/values/BXMLItem.java +++ b/bvm/ballerina-core/src/main/java/org/ballerinalang/model/values/BXMLItem.java @@ -647,10 +647,6 @@ public BXML getItem(long index) { * {@inheritDoc} */ public long size() { - if (getNodeType() == XMLNodeType.TEXT) { - String textContent = ((OMText) this.omNode).getText(); - return textContent.codePointCount(0, textContent.length()); - } return this.omNode == null ? 0 : 1; } diff --git a/bvm/ballerina-runtime/src/main/java/org/ballerinalang/jvm/values/XMLItem.java b/bvm/ballerina-runtime/src/main/java/org/ballerinalang/jvm/values/XMLItem.java index f02bf067b5cf..da2253e9d8c8 100644 --- a/bvm/ballerina-runtime/src/main/java/org/ballerinalang/jvm/values/XMLItem.java +++ b/bvm/ballerina-runtime/src/main/java/org/ballerinalang/jvm/values/XMLItem.java @@ -296,7 +296,7 @@ public XMLValue children() { */ @Override public XMLValue children(String qname) { - return children.children(qname); + return children.elements(qname); } /** @@ -624,6 +624,7 @@ public XMLSequence getChildrenSeq() { @Override public IteratorValue getIterator() { + XMLItem that = this; return new IteratorValue() { boolean read = false; @@ -638,7 +639,7 @@ public Object next() { throw new NoSuchElementException(); } read = true; - return this; + return that; } }; } diff --git a/bvm/ballerina-runtime/src/main/java/org/ballerinalang/jvm/values/XMLNonElementItem.java b/bvm/ballerina-runtime/src/main/java/org/ballerinalang/jvm/values/XMLNonElementItem.java index 349777e9b809..cd31d8c7f7f8 100644 --- a/bvm/ballerina-runtime/src/main/java/org/ballerinalang/jvm/values/XMLNonElementItem.java +++ b/bvm/ballerina-runtime/src/main/java/org/ballerinalang/jvm/values/XMLNonElementItem.java @@ -101,7 +101,7 @@ public XMLValue children() { @Override public XMLValue children(String qname) { - return null; + return new XMLSequence(); } @Override diff --git a/bvm/ballerina-runtime/src/main/java/org/ballerinalang/jvm/values/XMLSequence.java b/bvm/ballerina-runtime/src/main/java/org/ballerinalang/jvm/values/XMLSequence.java index 98e4ed028d5a..cc332e12fffc 100644 --- a/bvm/ballerina-runtime/src/main/java/org/ballerinalang/jvm/values/XMLSequence.java +++ b/bvm/ballerina-runtime/src/main/java/org/ballerinalang/jvm/values/XMLSequence.java @@ -239,10 +239,49 @@ public XMLValue children() { @Override public XMLValue children(String qname) { List selected = new ArrayList<>(); + if (this.children.size() == 1) { + BXML bxml = this.children.get(0); + return (XMLValue) bxml.children(qname); + } + +// boolean prevChildIsText = false; for (BXML elem : this.children) { - if (elem.getElementName().equals(qname)) { - selected.add(elem); + XMLSequence elements = (XMLSequence) elem.children().elements(qname); + List childrenList = elements.getChildrenList(); + if (childrenList.size() == 1) { + selected.add(childrenList.get(0)); + } else if (childrenList.size() > 1) { + selected.addAll(childrenList); } + +// if (elem.getElementName().equals(qname)) { +// selected.add(elem); +// List childrenList = ((XMLItem) elem).getChildrenSeq().getChildrenList(); +// for (BXML child : childrenList) { +// if (child.getNodeType() == XMLNodeType.TEXT) { +// if (prevChildIsText) { +// int lastPos = selected.size() - 1; +// XMLText bxml = (XMLText) selected.get(lastPos); +// selected.set(lastPos, new XMLText(bxml.getTextValue() + child.getTextValue())); +// } else { +// selected.add(child); +// } +// prevChildIsText = true; +// } else { +// prevChildIsText = false; +// selected.add(child); +// } +// } +// } +// BXML children = elem.children(qname); +// if (children.getNodeType() == XMLNodeType.SEQUENCE) { +// List list = ((XMLSequence) children).children; +// if (!list.isEmpty()) { +// selected.addAll(list); +// } +// } else { +// selected.add(children); +// } } if (selected.size() == 1) { diff --git a/langlib/lang.xml/src/main/java/org/ballerinalang/langlib/xml/Concat.java b/langlib/lang.xml/src/main/java/org/ballerinalang/langlib/xml/Concat.java index 21bcde7461f7..8f82c7ec40d4 100644 --- a/langlib/lang.xml/src/main/java/org/ballerinalang/langlib/xml/Concat.java +++ b/langlib/lang.xml/src/main/java/org/ballerinalang/langlib/xml/Concat.java @@ -23,6 +23,7 @@ import org.ballerinalang.jvm.values.ArrayValue; import org.ballerinalang.jvm.values.XMLPi; import org.ballerinalang.jvm.values.XMLSequence; +import org.ballerinalang.jvm.values.XMLText; import org.ballerinalang.jvm.values.XMLValue; import org.ballerinalang.jvm.values.api.BXML; import org.ballerinalang.model.types.TypeKind; @@ -55,9 +56,9 @@ public static XMLValue concat(Strand strand, ArrayValue arrayValue) { if (refValue instanceof String) { if (lastItem != null && lastItem.getNodeType() == XMLNodeType.TEXT) { // If last added item is a string, then concat prev values with this values and replace prev value. - String concat = ((XMLPi) lastItem).getData() + refValue; + String concat = lastItem.getTextValue() + refValue; XMLValue xmlText = XMLFactory.createXMLText(concat); - backingArray.add(backingArray.size() - 1, xmlText); + backingArray.set(backingArray.size() - 1, xmlText); lastItem = xmlText; continue; } diff --git a/langlib/langlib-test/src/test/java/org/ballerinalang/langlib/test/LangLibXMLTest.java b/langlib/langlib-test/src/test/java/org/ballerinalang/langlib/test/LangLibXMLTest.java index 8c3cab8ef48d..91bbb285a554 100644 --- a/langlib/langlib-test/src/test/java/org/ballerinalang/langlib/test/LangLibXMLTest.java +++ b/langlib/langlib-test/src/test/java/org/ballerinalang/langlib/test/LangLibXMLTest.java @@ -65,7 +65,7 @@ public Object[][] getXML() { return new Object[][]{ {returns[0], 1}, {returns[1], 1}, - {returns[2], 12} + {returns[2], 1} }; } @@ -87,8 +87,8 @@ public void testEmptyConcatCall() { public void testConcat() { BValue[] returns = BRunUtil.invoke(compileResult, "testConcat"); assertTrue(((BXML) returns[0]).getNodeType() == XMLNodeType.SEQUENCE); - assertEquals(((BXML) returns[0]).size(), 21); - assertEquals(((BXML) returns[0]).stringValue(), + assertEquals(returns[0].size(), 5); + assertEquals(returns[0].stringValue(), "xml contentEmpire BurlesqueHide your heart" + "Greatest Hitshello from String"); } diff --git a/langlib/langlib-test/src/test/java/org/ballerinalang/langlib/test/statements/foreach/ForeachXMLTest.java b/langlib/langlib-test/src/test/java/org/ballerinalang/langlib/test/statements/foreach/ForeachXMLTest.java index 7ba379f12ffc..4f21e645546f 100644 --- a/langlib/langlib-test/src/test/java/org/ballerinalang/langlib/test/statements/foreach/ForeachXMLTest.java +++ b/langlib/langlib-test/src/test/java/org/ballerinalang/langlib/test/statements/foreach/ForeachXMLTest.java @@ -67,7 +67,7 @@ public void testXMLWithArityChildren() { "xmlns:q=\"bar\">\n" + " NY\n" + " US\n" + - " 2:1131313 "; + " 2:1131313 "; BValue[] returns = BRunUtil.invoke(program, "testXMLWithArityChildren"); Assert.assertEquals(returns.length, 1); Assert.assertEquals(returns[0].stringValue(), payload); diff --git a/langlib/langlib-test/src/test/java/org/ballerinalang/langlib/test/statements/foreach/ForeachXMLTypedBindingPatternsTests.java b/langlib/langlib-test/src/test/java/org/ballerinalang/langlib/test/statements/foreach/ForeachXMLTypedBindingPatternsTests.java index 772c07bfdc3c..c51cc351e3a5 100644 --- a/langlib/langlib-test/src/test/java/org/ballerinalang/langlib/test/statements/foreach/ForeachXMLTypedBindingPatternsTests.java +++ b/langlib/langlib-test/src/test/java/org/ballerinalang/langlib/test/statements/foreach/ForeachXMLTypedBindingPatternsTests.java @@ -45,7 +45,7 @@ public class ForeachXMLTypedBindingPatternsTests { "1:\n" + " NY\n" + " US\n" + - " 2:1131313 "; + " 2:1131313 "; @BeforeClass public void setup() { diff --git a/langlib/langlib-test/src/test/resources/test-src/statements/foreach/foreach-xml-typed-binding-patterns.bal b/langlib/langlib-test/src/test/resources/test-src/statements/foreach/foreach-xml-typed-binding-patterns.bal index eb031441552a..1f4552ee5c7b 100644 --- a/langlib/langlib-test/src/test/resources/test-src/statements/foreach/foreach-xml-typed-binding-patterns.bal +++ b/langlib/langlib-test/src/test/resources/test-src/statements/foreach/foreach-xml-typed-binding-patterns.bal @@ -47,7 +47,7 @@ function testXmlInnerElementsWithSimpleVariableWithoutType() returns string { output = ""; int i = 0; - foreach var v in xdata.* { + foreach var v in xdata.*.elements() { if v is xml { concatIntXml(i, v); i += 1; @@ -60,7 +60,7 @@ function testXmlInnerElementsWithSimpleVariableWithType() returns string { output = ""; int i = 0; - foreach xml|string v in xdata.* { + foreach xml|string v in xdata.*.elements() { if v is xml { concatIntXml(i, v); i += 1; diff --git a/langlib/langlib-test/src/test/resources/test-src/xmllib_test.bal b/langlib/langlib-test/src/test/resources/test-src/xmllib_test.bal index dc3fd419ce76..6f9f11634f6e 100644 --- a/langlib/langlib-test/src/test/resources/test-src/xmllib_test.bal +++ b/langlib/langlib-test/src/test/resources/test-src/xmllib_test.bal @@ -191,7 +191,9 @@ function testForEach() returns xml { xml r = xmllib:concat(); foreach var x in catalog.* { if (x is xml) { - r += x; + if (x.isElement()) { + r += x; + } } } return r; diff --git a/tests/ballerina-test-utils/src/main/java/org/ballerinalang/test/util/BRunUtil.java b/tests/ballerina-test-utils/src/main/java/org/ballerinalang/test/util/BRunUtil.java index 776e4b283a92..029ee0af3c00 100644 --- a/tests/ballerina-test-utils/src/main/java/org/ballerinalang/test/util/BRunUtil.java +++ b/tests/ballerina-test-utils/src/main/java/org/ballerinalang/test/util/BRunUtil.java @@ -538,18 +538,22 @@ private static Object getJVMValue(org.wso2.ballerinalang.compiler.semantics.mode return jvmObject; case TypeTags.XML_TAG: org.ballerinalang.model.values.BXML xml = (org.ballerinalang.model.values.BXML) value; + if (xml.getNodeType() == org.ballerinalang.model.util.XMLNodeType.TEXT) { + return XMLFactory.createXMLText(xml.stringValue()); + } if (xml.getNodeType() != org.ballerinalang.model.util.XMLNodeType.SEQUENCE) { return XMLFactory.parse(xml.stringValue()); - } - BValueArray elements = ((BXMLSequence) xml).value(); - ArrayValue arrayValue = (ArrayValue) getJVMValue(elements.getType(), elements); + } else { + BValueArray elements = ((BXMLSequence) xml).value(); + ArrayValue arrayValue = (ArrayValue) getJVMValue(elements.getType(), elements); - List list = new ArrayList<>(); - for (Object arrayValueValue : arrayValue.getValues()) { - list.add((BXML) arrayValueValue); - } + List list = new ArrayList<>(); + for (Object arrayValueValue : arrayValue.getValues()) { + list.add((BXML) arrayValueValue); + } - return new XMLSequence(list); + return new XMLSequence(list); + } case TypeTags.HANDLE_TAG: BHandleValue handleValue = (BHandleValue) value; return new HandleValue(handleValue.getValue());