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());
+  }
 }

Reply via email to