This is an automated email from the ASF dual-hosted git repository.
hansva pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/hop.git
The following commit(s) were added to refs/heads/main by this push:
new 1cb208c653 Clean up core XML serializers (#7225)
1cb208c653 is described below
commit 1cb208c65340851e015d626445e5d8ba0c6cf81a
Author: BharatDeva <[email protected]>
AuthorDate: Mon Jun 15 06:38:13 2026 -0500
Clean up core XML serializers (#7225)
Co-authored-by: BharatDeva <[email protected]>
---
core/src/main/java/org/apache/hop/core/Result.java | 28 ++++++++------
.../main/java/org/apache/hop/core/ResultFile.java | 19 ++++++----
.../org/apache/hop/core/row/ValueMetaAndData.java | 24 ++++++------
.../java/org/apache/hop/core/ResultFileTest.java | 24 ++++++++++++
.../test/java/org/apache/hop/core/ResultTest.java | 43 ++++++++++++++++++++++
.../apache/hop/core/row/ValueMetaAndDataTests.java | 23 ++++++++++++
6 files changed, 129 insertions(+), 32 deletions(-)
diff --git a/core/src/main/java/org/apache/hop/core/Result.java
b/core/src/main/java/org/apache/hop/core/Result.java
index 40ee69ce2b..6f245b9927 100644
--- a/core/src/main/java/org/apache/hop/core/Result.java
+++ b/core/src/main/java/org/apache/hop/core/Result.java
@@ -343,25 +343,29 @@ public class Result implements Cloneable {
// Export the result files
//
xml.append(XmlHandler.openTag(XML_FILES_TAG));
- for (ResultFile resultFile : resultFiles.values()) {
- xml.append(resultFile.getXml());
+ if (resultFiles != null) {
+ for (ResultFile resultFile : resultFiles.values()) {
+ xml.append(resultFile.getXml());
+ }
}
xml.append(XmlHandler.closeTag(XML_FILES_TAG));
xml.append(XmlHandler.openTag(XML_ROWS_TAG));
- boolean firstRow = true;
- IRowMeta rowMeta = null;
- for (RowMetaAndData row : rows) {
- if (firstRow) {
- firstRow = false;
- rowMeta = row.getRowMeta();
+ if (rows != null) {
+ boolean firstRow = true;
+ IRowMeta rowMeta = null;
+ for (RowMetaAndData row : rows) {
+ if (firstRow) {
+ firstRow = false;
+ rowMeta = row.getRowMeta();
+ if (rowMeta != null) {
+ xml.append(rowMeta.getMetaXml());
+ }
+ }
if (rowMeta != null) {
- xml.append(rowMeta.getMetaXml());
+ xml.append(rowMeta.getDataXml(row.getData()));
}
}
- if (rowMeta != null) {
- xml.append(rowMeta.getDataXml(row.getData()));
- }
}
xml.append(XmlHandler.closeTag(XML_ROWS_TAG));
diff --git a/core/src/main/java/org/apache/hop/core/ResultFile.java
b/core/src/main/java/org/apache/hop/core/ResultFile.java
index 3a92a3ec3a..8975d11bf6 100644
--- a/core/src/main/java/org/apache/hop/core/ResultFile.java
+++ b/core/src/main/java/org/apache/hop/core/ResultFile.java
@@ -271,14 +271,17 @@ public class ResultFile implements Cloneable {
@JsonIgnore
public String getXml() {
- return XmlHandler.openTag(XML_TAG)
- + XmlHandler.addTagValue("type", getTypeCode())
- + XmlHandler.addTagValue("file", file.getName().toString())
- + XmlHandler.addTagValue(CONST_PARENT_ORIGIN, originParent)
- + XmlHandler.addTagValue(CONST_ORIGIN, origin)
- + XmlHandler.addTagValue(CONST_COMMENT, comment)
- + XmlHandler.addTagValue(CONST_TIMESTAMP, timestamp)
- + XmlHandler.closeTag(XML_TAG);
+ StringBuilder xml = new StringBuilder(256);
+ xml.append(XmlHandler.openTag(XML_TAG));
+ xml.append(XmlHandler.addTagValue("type", getTypeCode()));
+ xml.append(XmlHandler.addTagValue("file", file.getName().toString()));
+ xml.append(XmlHandler.addTagValue(CONST_PARENT_ORIGIN, originParent));
+ xml.append(XmlHandler.addTagValue(CONST_ORIGIN, origin));
+ xml.append(XmlHandler.addTagValue(CONST_COMMENT, comment));
+ xml.append(XmlHandler.addTagValue(CONST_TIMESTAMP, timestamp));
+ xml.append(XmlHandler.closeTag(XML_TAG));
+
+ return xml.toString();
}
public ResultFile(Node node) throws HopFileException {
diff --git a/core/src/main/java/org/apache/hop/core/row/ValueMetaAndData.java
b/core/src/main/java/org/apache/hop/core/row/ValueMetaAndData.java
index fc00d40bfa..c27ec85dad 100644
--- a/core/src/main/java/org/apache/hop/core/row/ValueMetaAndData.java
+++ b/core/src/main/java/org/apache/hop/core/row/ValueMetaAndData.java
@@ -119,24 +119,24 @@ public class ValueMetaAndData {
meta.setGroupingSymbol(null);
meta.setCurrencySymbol(null);
- StringBuilder retval = new StringBuilder(128);
- retval.append("<" + XML_TAG + ">");
- retval.append(XmlHandler.addTagValue("name", meta.getName(), false));
- retval.append(XmlHandler.addTagValue("type", meta.getTypeDesc(), false));
+ StringBuilder xml = new StringBuilder(128);
+ xml.append(XmlHandler.openTag(XML_TAG));
+ xml.append(XmlHandler.addTagValue("name", meta.getName(), false));
+ xml.append(XmlHandler.addTagValue("type", meta.getTypeDesc(), false));
- retval.append(XmlHandler.addTagValue("length", meta.getLength(), false));
- retval.append(XmlHandler.addTagValue("precision", meta.getPrecision(),
false));
- retval.append(XmlHandler.addTagValue("mask", meta.getConversionMask(),
false));
+ xml.append(XmlHandler.addTagValue("length", meta.getLength(), false));
+ xml.append(XmlHandler.addTagValue("precision", meta.getPrecision(),
false));
+ xml.append(XmlHandler.addTagValue("mask", meta.getConversionMask(),
false));
try {
- retval.append(XmlHandler.addTagValue("text",
meta.getCompatibleString(valueData), false));
+ xml.append(XmlHandler.addTagValue("text",
meta.getCompatibleString(valueData), false));
} catch (HopValueException e) {
- retval.append(XmlHandler.addTagValue("text", "", false));
+ xml.append(XmlHandler.addTagValue("text", "", false));
}
- retval.append(XmlHandler.addTagValue("isnull", meta.isNull(valueData),
false));
- retval.append("</" + XML_TAG + ">");
+ xml.append(XmlHandler.addTagValue("isnull", meta.isNull(valueData),
false));
+ xml.append(XmlHandler.closeTag(XML_TAG));
- return retval.toString();
+ return xml.toString();
}
/**
diff --git a/core/src/test/java/org/apache/hop/core/ResultFileTest.java
b/core/src/test/java/org/apache/hop/core/ResultFileTest.java
index 243c9863ca..def577f36b 100644
--- a/core/src/test/java/org/apache/hop/core/ResultFileTest.java
+++ b/core/src/test/java/org/apache/hop/core/ResultFileTest.java
@@ -31,11 +31,13 @@ import org.apache.hop.core.exception.HopFileException;
import org.apache.hop.core.row.IRowMeta;
import org.apache.hop.core.row.IValueMeta;
import org.apache.hop.core.vfs.HopVfs;
+import org.apache.hop.core.xml.XmlHandler;
import org.apache.hop.junit.rules.RestoreHopEnvironmentExtension;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.io.TempDir;
+import org.w3c.dom.Node;
@ExtendWith(RestoreHopEnvironmentExtension.class)
class ResultFileTest {
@@ -77,4 +79,26 @@ class ResultFileTest {
tempFile.delete();
}
+
+ @Test
+ void testGetXmlRoundTrip() throws Exception {
+ File tempDir = tempDirPath.toFile();
+ FileObject tempFile = HopVfs.createTempFile("prefix", "suffix",
tempDir.getAbsolutePath());
+ ResultFile resultFile =
+ new ResultFile(ResultFile.FILE_TYPE_WARNING, tempFile, "parent & one",
"origin <two>");
+ resultFile.setComment("comment & <tag>");
+
+ String xml = resultFile.getXml();
+ Node node = XmlHandler.loadXmlString(xml, "result-file");
+ ResultFile copy = new ResultFile(node);
+
+ assertEquals(resultFile.getType(), copy.getType());
+ assertEquals(resultFile.getFile().getName().toString(),
copy.getFile().getName().toString());
+ assertEquals(resultFile.getOriginParent(), copy.getOriginParent());
+ assertEquals(resultFile.getOrigin(), copy.getOrigin());
+ assertEquals(resultFile.getComment(), copy.getComment());
+ assertEquals(resultFile.getTimestamp(), copy.getTimestamp());
+
+ tempFile.delete();
+ }
}
diff --git a/core/src/test/java/org/apache/hop/core/ResultTest.java
b/core/src/test/java/org/apache/hop/core/ResultTest.java
new file mode 100644
index 0000000000..6f430b3186
--- /dev/null
+++ b/core/src/test/java/org/apache/hop/core/ResultTest.java
@@ -0,0 +1,43 @@
+/*
+ * 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.hop.core;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.apache.hop.core.xml.XmlHandler;
+import org.junit.jupiter.api.Test;
+import org.w3c.dom.Node;
+
+class ResultTest {
+
+ @Test
+ void getXmlHandlesLightCloneWithoutRows() throws Exception {
+ Result result = new Result();
+ result.setNrErrors(2);
+ result.setLogText("log text");
+
+ String xml = result.lightClone().getXml();
+ Node node = XmlHandler.loadXmlString(xml, Result.XML_TAG);
+ Result copy = new Result(node);
+
+ assertEquals(2, copy.getNrErrors());
+ assertEquals("log text", copy.getLogText());
+ assertEquals(0, copy.getRows().size());
+ assertEquals(0, copy.getResultFiles().size());
+ }
+}
diff --git
a/core/src/test/java/org/apache/hop/core/row/ValueMetaAndDataTests.java
b/core/src/test/java/org/apache/hop/core/row/ValueMetaAndDataTests.java
index ffa4d3e68b..9e1d0e4a36 100644
--- a/core/src/test/java/org/apache/hop/core/row/ValueMetaAndDataTests.java
+++ b/core/src/test/java/org/apache/hop/core/row/ValueMetaAndDataTests.java
@@ -23,6 +23,8 @@ import static
org.junit.jupiter.api.Assertions.assertInstanceOf;
import java.math.BigDecimal;
import java.util.Date;
+import org.apache.hop.core.HopClientEnvironment;
+import org.apache.hop.core.exception.HopException;
import org.apache.hop.core.row.value.ValueMetaBigNumber;
import org.apache.hop.core.row.value.ValueMetaBinary;
import org.apache.hop.core.row.value.ValueMetaBoolean;
@@ -31,11 +33,19 @@ import org.apache.hop.core.row.value.ValueMetaInteger;
import org.apache.hop.core.row.value.ValueMetaNumber;
import org.apache.hop.core.row.value.ValueMetaSerializable;
import org.apache.hop.core.row.value.ValueMetaString;
+import org.apache.hop.core.xml.XmlHandler;
+import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
+import org.w3c.dom.Node;
/** Unit test for {@link ValueMetaAndData} */
class ValueMetaAndDataTests {
+ @BeforeAll
+ static void beforeClassSetUp() throws HopException {
+ HopClientEnvironment.init();
+ }
+
@Test
void testStringType() {
ValueMetaAndData vm = new ValueMetaAndData("f1", "hello");
@@ -103,4 +113,17 @@ class ValueMetaAndDataTests {
assertInstanceOf(ValueMetaSerializable.class, vm.getValueMeta());
assertEquals(obj, vm.getValueData());
}
+
+ @Test
+ void testGetXmlRoundTrip() throws Exception {
+ ValueMetaAndData vm = new ValueMetaAndData(new ValueMetaString("field"),
"value & <tag>");
+
+ String xml = vm.getXml();
+ Node node = XmlHandler.loadXmlString(xml, ValueMetaAndData.XML_TAG);
+ ValueMetaAndData copy = new ValueMetaAndData(node);
+
+ assertInstanceOf(ValueMetaString.class, copy.getValueMeta());
+ assertEquals("field", copy.getValueMeta().getName());
+ assertEquals("value & <tag>", copy.getValueData());
+ }
}