You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hop.apache.org by mc...@apache.org on 2026/04/08 08:40:22 UTC

(hop) branch main updated: Fix Sonar warning in IRowSet implementation and improve DataStream i18n messages (#6970)

This is an automated email from the ASF dual-hosted git repository.

mcasters 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 38484305d4 Fix Sonar warning in IRowSet implementation and improve DataStream i18n messages (#6970)
38484305d4 is described below

commit 38484305d4160d9b2fbf84960e77ea89dba73911
Author: Lance <le...@gmail.com>
AuthorDate: Wed Apr 8 16:40:16 2026 +0800

    Fix Sonar warning in IRowSet implementation and improve DataStream i18n messages (#6970)
    
    * Fix Sonar warning in IRowSet implementation and improve DataStream i18n messages
    
    Signed-off-by: lance <le...@gmail.com>
    
    * Fix Sonar warning in IRowSet implementation and improve DataStream i18n messages
    
    Signed-off-by: lance <le...@gmail.com>
    
    ---------
    
    Signed-off-by: lance <le...@gmail.com>
---
 core/pom.xml                                       |   4 +
 .../main/java/org/apache/hop/core/BaseRowSet.java  | 145 +++--------------
 .../apache/hop/core/database/BaseDatabaseMeta.java |   7 +-
 .../java/org/apache/hop/core/BaseRowSetTests.java  | 177 +++++++++++++++++++++
 .../file/messages/messages_en_US.properties        |   2 +-
 ..._en_US.properties => messages_zh_CN.properties} |   9 +-
 .../flight/messages/messages_zh_CN.properties      |  28 ++++
 .../messages/messages_zh_CN.properties}            |   6 -
 .../messages/messages_zh_CN.properties}            |   9 +-
 .../streaminput/DataStreamInputMeta.java           |   5 +-
 .../streamoutput/DataStreamOutputMeta.java         |   4 +-
 .../messages/messages_zh_CN.properties}            |  10 +-
 .../messages/messages_zh_CN.properties}            |  10 +-
 .../apache/hop/ui/hopgui/file/HopFileTypeBase.java |  13 +-
 14 files changed, 261 insertions(+), 168 deletions(-)

diff --git a/core/pom.xml b/core/pom.xml
index c2a126e90b..fb80755901 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -430,6 +430,10 @@
                 </exclusion>
             </exclusions>
         </dependency>
+        <dependency>
+            <groupId>org.jspecify</groupId>
+            <artifactId>jspecify</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.owasp.encoder</groupId>
             <artifactId>encoder</artifactId>
diff --git a/core/src/main/java/org/apache/hop/core/BaseRowSet.java b/core/src/main/java/org/apache/hop/core/BaseRowSet.java
index 520eec0cee..45b3905c07 100644
--- a/core/src/main/java/org/apache/hop/core/BaseRowSet.java
+++ b/core/src/main/java/org/apache/hop/core/BaseRowSet.java
@@ -17,28 +17,30 @@
 
 package org.apache.hop.core;
 
-import java.util.concurrent.TimeUnit;
+import java.util.Objects;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
+import lombok.Getter;
+import lombok.Setter;
 import org.apache.hop.core.row.IRowMeta;
 import org.apache.hop.core.util.Utils;
+import org.jspecify.annotations.NonNull;
 
 /** Contains the base IRowSet class to help implement IRowSet variants. */
 abstract class BaseRowSet implements Comparable<IRowSet>, IRowSet {
-  protected IRowMeta rowMeta;
+  @Getter @Setter protected IRowMeta rowMeta;
 
   protected AtomicBoolean done;
-  protected volatile String originTransformName;
+  @Getter protected volatile String originTransformName;
   protected AtomicInteger originTransformCopy;
-  protected volatile String destinationTransformName;
+  @Getter protected volatile String destinationTransformName;
   protected AtomicInteger destinationTransformCopy;
+  @Getter @Setter protected volatile String remoteHopServerName;
+  private final ReadWriteLock lock;
 
-  protected volatile String remoteHopServerName;
-  private ReadWriteLock lock;
-
-  public BaseRowSet() {
+  protected BaseRowSet() {
     // not done putting data into this IRowSet
     done = new AtomicBoolean(false);
 
@@ -52,7 +54,7 @@ abstract class BaseRowSet implements Comparable<IRowSet>, IRowSet {
    * always done in the same way.
    */
   @Override
-  public int compareTo(IRowSet rowSet) {
+  public int compareTo(@NonNull IRowSet rowSet) {
     lock.readLock().lock();
     String target;
 
@@ -77,52 +79,23 @@ abstract class BaseRowSet implements Comparable<IRowSet>, IRowSet {
     return target.compareTo(comp);
   }
 
-  public boolean equals(BaseRowSet rowSet) {
-    return compareTo(rowSet) == 0;
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.hop.core.RowSetInterface#putRow(org.apache.hop.core.row.IRowMeta, java.lang.Object[])
-   */
-  @Override
-  public abstract boolean putRow(IRowMeta rowMeta, Object[] rowData);
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.hop.core.RowSetInterface#putRowWait(org.apache.hop.core.row.IRowMeta, java.lang.Object[],
-   * long, java.util.concurrent.TimeUnit)
-   */
-  @Override
-  public abstract boolean putRowWait(IRowMeta rowMeta, Object[] rowData, long time, TimeUnit tu);
-
-  // default getRow with wait time = 100ms
-  //
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.hop.core.RowSetInterface#getRow()
-   */
   @Override
-  public abstract Object[] getRow();
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof IRowSet other)) {
+      return false;
+    }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.hop.core.RowSetInterface#getRowImmediate()
-   */
-  @Override
-  public abstract Object[] getRowImmediate();
+    return compareTo(other) == 0;
+  }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.hop.core.RowSetInterface#getRowWait(long, java.util.concurrent.TimeUnit)
-   */
   @Override
-  public abstract Object[] getRowWait(long timeout, TimeUnit tu);
+  public int hashCode() {
+    return Objects.hash(
+        remoteHopServerName, destinationTransformName, destinationTransformCopy.get());
+  }
 
   /*
    * (non-Javadoc)
@@ -144,16 +117,6 @@ abstract class BaseRowSet implements Comparable<IRowSet>, IRowSet {
     return done.get();
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.hop.core.RowSetInterface#getOriginTransformName()
-   */
-  @Override
-  public String getOriginTransformName() {
-    return originTransformName;
-  }
-
   /*
    * (non-Javadoc)
    *
@@ -164,16 +127,6 @@ abstract class BaseRowSet implements Comparable<IRowSet>, IRowSet {
     return originTransformCopy.get();
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.hop.core.RowSetInterface#getDestinationTransformName()
-   */
-  @Override
-  public String getDestinationTransformName() {
-    return destinationTransformName;
-  }
-
   /*
    * (non-Javadoc)
    *
@@ -194,14 +147,6 @@ abstract class BaseRowSet implements Comparable<IRowSet>, IRowSet {
     return toString();
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.hop.core.RowSetInterface#size()
-   */
-  @Override
-  public abstract int size();
-
   /*
    * (non-Javadoc)
    *
@@ -247,48 +192,8 @@ abstract class BaseRowSet implements Comparable<IRowSet>, IRowSet {
     return str.toString();
   }
 
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.hop.core.RowSetInterface#getRowMeta()
-   */
-  @Override
-  public IRowMeta getRowMeta() {
-    return rowMeta;
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.hop.core.RowSetInterface#setRowMeta(org.apache.hop.core.row.IRowMeta)
-   */
-  @Override
-  public void setRowMeta(IRowMeta rowMeta) {
-    this.rowMeta = rowMeta;
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.hop.core.RowSetInterface#getRemoteHopServerName()
-   */
-  @Override
-  public String getRemoteHopServerName() {
-    return remoteHopServerName;
-  }
-
-  /*
-   * (non-Javadoc)
-   *
-   * @see org.apache.hop.core.RowSetInterface#setRemoteHopServerName(java.lang.String)
-   */
-  @Override
-  public void setRemoteHopServerName(String remoteHopServerName) {
-    this.remoteHopServerName = remoteHopServerName;
-  }
-
   /**
-   * By default we don't report blocking, only for monitored pipelines.
+   * By default, we don't report blocking, only for monitored pipelines.
    *
    * @return true if this row set is blocking on reading or writing.
    */
diff --git a/core/src/main/java/org/apache/hop/core/database/BaseDatabaseMeta.java b/core/src/main/java/org/apache/hop/core/database/BaseDatabaseMeta.java
index 0fed4b43d2..d44a0e4ea6 100644
--- a/core/src/main/java/org/apache/hop/core/database/BaseDatabaseMeta.java
+++ b/core/src/main/java/org/apache/hop/core/database/BaseDatabaseMeta.java
@@ -120,8 +120,8 @@ public abstract class BaseDatabaseMeta implements Cloneable, IDatabase {
   public static final String ELEMENT_ID_PASSWORD = "password";
 
   /**
-   * Boolean to indicate if savepoints can be released Most databases do, so we set it to true.
-   * Child classes can overwrite with false if need be.
+   * Boolean to indicate if savepoint can be released Most databases do, so we set it to true. Child
+   * classes can overwrite with false if need be.
    */
   protected boolean releaseSavepoint = true;
 
@@ -240,9 +240,6 @@ public abstract class BaseDatabaseMeta implements Cloneable, IDatabase {
     this.pluginName = pluginName;
   }
 
-  @Override
-  public abstract int[] getAccessTypeList();
-
   /**
    * @return Returns the accessType.
    */
diff --git a/core/src/test/java/org/apache/hop/core/BaseRowSetTests.java b/core/src/test/java/org/apache/hop/core/BaseRowSetTests.java
new file mode 100644
index 0000000000..4f0f4bff10
--- /dev/null
+++ b/core/src/test/java/org/apache/hop/core/BaseRowSetTests.java
@@ -0,0 +1,177 @@
+/*
+ * 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 static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.hop.core.row.IRowMeta;
+import org.apache.hop.junit.rules.RestoreHopEnvironmentExtension;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+/** Unit test for {@link BaseRowSet} */
+@ExtendWith(RestoreHopEnvironmentExtension.class)
+class BaseRowSetTests {
+
+  @Test
+  void testCompareToEqualsHashCode() {
+    TestRowSet r1 = new TestRowSet();
+    TestRowSet r2 = new TestRowSet();
+
+    r1.setRemoteHopServerName("server");
+    r2.setRemoteHopServerName("server");
+
+    r1.setThreadNameFromToCopy("A", 1, "B", 2);
+    r2.setThreadNameFromToCopy("X", 9, "B", 2);
+
+    assertEquals(0, r1.compareTo(r2));
+    assertEquals(r1, r2);
+    assertEquals(r1.hashCode(), r2.hashCode());
+  }
+
+  @Test
+  void testCompareToNotEqual() {
+    TestRowSet r1 = new TestRowSet();
+    TestRowSet r2 = new TestRowSet();
+
+    r1.setRemoteHopServerName("server");
+    r2.setRemoteHopServerName("server");
+
+    r1.setThreadNameFromToCopy("A", 1, "B", 2);
+    r2.setThreadNameFromToCopy("A", 1, "C", 2);
+
+    assertNotEquals(0, r1.compareTo(r2));
+    assertNotEquals(r1, r2);
+  }
+
+  @Test
+  void testDoneFlag() {
+    TestRowSet rowSet = new TestRowSet();
+    assertFalse(rowSet.isDone());
+
+    rowSet.setDone();
+    assertTrue(rowSet.isDone());
+  }
+
+  @Test
+  void testSetThreadName() {
+    TestRowSet rowSet = new TestRowSet();
+    rowSet.setThreadNameFromToCopy("from", 1, "to", 2);
+
+    assertEquals("from", rowSet.getOriginTransformName());
+    assertEquals(1, rowSet.getOriginTransformCopy());
+    assertEquals("to", rowSet.getDestinationTransformName());
+    assertEquals(2, rowSet.getDestinationTransformCopy());
+  }
+
+  @Test
+  void testToString() {
+    TestRowSet rowSet = new TestRowSet();
+    rowSet.setThreadNameFromToCopy("A", 1, "B", 2);
+    rowSet.setRemoteHopServerName("server");
+
+    String result = rowSet.toString();
+
+    assertTrue(result.contains("A"));
+    assertTrue(result.contains("B"));
+    assertTrue(result.contains("server"));
+  }
+
+  @Test
+  void testConcurrentReadWrite() throws Exception {
+    TestRowSet rowSet = new TestRowSet();
+
+    try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
+      Runnable writer =
+          () -> {
+            for (int i = 0; i < 1000; i++) {
+              rowSet.setThreadNameFromToCopy("A" + i, i, "B" + i, i);
+            }
+          };
+
+      Callable<Boolean> reader =
+          () -> {
+            for (int i = 0; i < 1000; i++) {
+              String string = rowSet.toString();
+              assertNotNull(string);
+
+              String dest = rowSet.getDestinationTransformName();
+              if (StringUtils.isNotBlank(dest)) {
+                assertTrue(dest.startsWith("B"));
+              }
+            }
+            return true;
+          };
+
+      Future<?> w = executor.submit(writer);
+      Future<Boolean> r = executor.submit(reader);
+
+      w.get();
+      assertTrue(r.get());
+    }
+  }
+
+  static class TestRowSet extends BaseRowSet {
+    @Override
+    public boolean putRow(IRowMeta rowMeta, Object[] rowData) {
+      this.rowMeta = rowMeta;
+      return false;
+    }
+
+    @Override
+    public boolean putRowWait(IRowMeta rowMeta, Object[] rowData, long time, TimeUnit tu) {
+      this.rowMeta = rowMeta;
+      return false;
+    }
+
+    @Override
+    public Object[] getRow() {
+      return new Object[0];
+    }
+
+    @Override
+    public Object[] getRowImmediate() {
+      return new Object[0];
+    }
+
+    @Override
+    public Object[] getRowWait(long timeout, TimeUnit tu) {
+      return new Object[0];
+    }
+
+    @Override
+    public int size() {
+      return 0;
+    }
+
+    @Override
+    public void clear() {
+      // ignore code
+    }
+  }
+}
diff --git a/plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/file/messages/messages_en_US.properties b/plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/file/messages/messages_en_US.properties
index 2db865b545..21c4e2fb18 100644
--- a/plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/file/messages/messages_en_US.properties
+++ b/plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/file/messages/messages_en_US.properties
@@ -16,7 +16,7 @@
 #
 #
 
-ArrowFileDataStream.Filename.LabelArrowBaseDataStream.Filename.Label=File name
+ArrowFileDataStream.Filename.Label=File name
 ArrowFileDataStream.Filename.Tooltip=The file to which Arrow will stream data to. IMPORTANT: This needs to be a local file. VFS is not supported.
 ArrowFileDataStream.BufferSize.Label=Buffer size
 ArrowFileDataStream.BufferSize.Tooltip=The number of rows to read or write at once
diff --git a/plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/file/messages/messages_en_US.properties b/plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/file/messages/messages_zh_CN.properties
similarity index 65%
copy from plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/file/messages/messages_en_US.properties
copy to plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/file/messages/messages_zh_CN.properties
index 2db865b545..711b26ea85 100644
--- a/plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/file/messages/messages_en_US.properties
+++ b/plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/file/messages/messages_zh_CN.properties
@@ -16,8 +16,7 @@
 #
 #
 
-ArrowFileDataStream.Filename.LabelArrowBaseDataStream.Filename.Label=File name
-ArrowFileDataStream.Filename.Tooltip=The file to which Arrow will stream data to. IMPORTANT: This needs to be a local file. VFS is not supported.
-ArrowFileDataStream.BufferSize.Label=Buffer size
-ArrowFileDataStream.BufferSize.Tooltip=The number of rows to read or write at once
-
+ArrowFileDataStream.Filename.Label=\u6587\u4EF6\u540D
+ArrowFileDataStream.Filename.Tooltip=Arrow \u5C06\u6570\u636E\u6D41\u5199\u5165\u7684\u6587\u4EF6\u3002\u91CD\u8981\uFF1A\u5FC5\u987B\u662F\u672C\u5730\u6587\u4EF6\uFF0C\u4E0D\u652F\u6301 VFS\u3002
+ArrowFileDataStream.BufferSize.Label=\u7F13\u51B2\u533A\u5927\u5C0F
+ArrowFileDataStream.BufferSize.Tooltip=\u6BCF\u6B21\u8BFB\u53D6\u6216\u5199\u5165\u7684\u884C\u6570
diff --git a/plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/flight/messages/messages_zh_CN.properties b/plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/flight/messages/messages_zh_CN.properties
new file mode 100644
index 0000000000..3d3e088552
--- /dev/null
+++ b/plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/flight/messages/messages_zh_CN.properties
@@ -0,0 +1,28 @@
+#
+# 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.
+#
+#
+
+ArrowFlightDataStream.BufferSize.Label=\u6D41\u6700\u5927\u7F13\u51B2\u533A\u5927\u5C0F
+ArrowFlightDataStream.BufferSize.Tooltip=\u5728\u629B\u51FA\u9519\u8BEF\u4EE5\u9632\u6B62\u670D\u52A1\u5668\u5185\u5B58\u8017\u5C3D\u4E4B\u524D\uFF0C\u670D\u52A1\u5668\u7AEF\u53EF\u7F13\u51B2\u7684\u6700\u5927\u884C\u6570
+ArrowFlightDataStream.BatchSize.Label=\u6279\u5904\u7406\u5927\u5C0F
+ArrowFlightDataStream.BatchSize.Tooltip=\u4ECE\u670D\u52A1\u5668\u8BFB\u53D6\u6D41\u65F6\u4F7F\u7528\u7684 Apache Arrow \u6279\u5904\u7406\u5927\u5C0F
+ArrowFlightDataStream.SchemaDefinition.Label=\u6A21\u5F0F\u5B9A\u4E49
+ArrowFlightDataStream.SchemaDefinition.Tooltip=\u670D\u52A1\u5668\u7AEF\u4F20\u5165\u6570\u636E\u6D41\u7684\u9884\u671F\u6A21\u5F0F\u5B9A\u4E49
+ArrowFlightDataStream.Hostname.Label=Hop Flight \u4E3B\u673A\u540D
+ArrowFlightDataStream.Hostname.Tooltip=\u7528\u4E8E\u8BBF\u95EE Hop Apache Arrow Flight \u670D\u52A1\u5668\u7684\u4E3B\u673A\u540D
+ArrowFlightDataStream.Port.Label=Hop Flight \u7AEF\u53E3
+ArrowFlightDataStream.Port.Tooltip=\u7528\u4E8E\u8BBF\u95EE Hop Apache Arrow Flight \u670D\u52A1\u5668\u7684\u7AEF\u53E3
diff --git a/plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/file/messages/messages_en_US.properties b/plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/shared/messages/messages_zh_CN.properties
similarity index 68%
copy from plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/file/messages/messages_en_US.properties
copy to plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/shared/messages/messages_zh_CN.properties
index 2db865b545..4ce52bac9d 100644
--- a/plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/file/messages/messages_en_US.properties
+++ b/plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/shared/messages/messages_zh_CN.properties
@@ -15,9 +15,3 @@
 # limitations under the License.
 #
 #
-
-ArrowFileDataStream.Filename.LabelArrowBaseDataStream.Filename.Label=File name
-ArrowFileDataStream.Filename.Tooltip=The file to which Arrow will stream data to. IMPORTANT: This needs to be a local file. VFS is not supported.
-ArrowFileDataStream.BufferSize.Label=Buffer size
-ArrowFileDataStream.BufferSize.Tooltip=The number of rows to read or write at once
-
diff --git a/plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/file/messages/messages_en_US.properties b/plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/streamfile/messages/messages_zh_CN.properties
similarity index 64%
copy from plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/file/messages/messages_en_US.properties
copy to plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/streamfile/messages/messages_zh_CN.properties
index 2db865b545..954c8c0d73 100644
--- a/plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/file/messages/messages_en_US.properties
+++ b/plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/streamfile/messages/messages_zh_CN.properties
@@ -16,8 +16,7 @@
 #
 #
 
-ArrowFileDataStream.Filename.LabelArrowBaseDataStream.Filename.Label=File name
-ArrowFileDataStream.Filename.Tooltip=The file to which Arrow will stream data to. IMPORTANT: This needs to be a local file. VFS is not supported.
-ArrowFileDataStream.BufferSize.Label=Buffer size
-ArrowFileDataStream.BufferSize.Tooltip=The number of rows to read or write at once
-
+ArrowFileStreamDataStream.Filename.Label=\u6587\u4EF6\u540D
+ArrowFileStreamDataStream.Filename.Tooltip=Arrow \u5C06\u6570\u636E\u6D41\u5199\u5165\u7684\u6587\u4EF6\u3002\u91CD\u8981\uFF1A\u5FC5\u987B\u662F\u672C\u5730\u6587\u4EF6\uFF0C\u4E0D\u652F\u6301 VFS
+ArrowFileStreamDataStream.BufferSize.Label=\u7F13\u51B2\u533A\u5927\u5C0F
+ArrowFileStreamDataStream.BufferSize.Tooltip=\u6BCF\u6B21\u8BFB\u53D6\u6216\u5199\u5165\u7684\u884C\u6570
diff --git a/plugins/transforms/datastream/src/main/java/org/apache/hop/pipeline/transforms/streaminput/DataStreamInputMeta.java b/plugins/transforms/datastream/src/main/java/org/apache/hop/pipeline/transforms/streaminput/DataStreamInputMeta.java
index f21f341cd9..f26560d848 100644
--- a/plugins/transforms/datastream/src/main/java/org/apache/hop/pipeline/transforms/streaminput/DataStreamInputMeta.java
+++ b/plugins/transforms/datastream/src/main/java/org/apache/hop/pipeline/transforms/streaminput/DataStreamInputMeta.java
@@ -41,9 +41,8 @@ import org.jspecify.annotations.NonNull;
 @Setter
 @Transform(
     id = "DataStreamInput",
-    name = "i18:org.apache.hop.pipeline.transforms.streaminput:DataStreamInputMeta.Name",
-    description =
-        "i18:org.apache.hop.pipeline.transforms.streaminput:DataStreamInputMeta.Description",
+    name = "i18n::DataStreamInputMeta.Name",
+    description = "i18n::DataStreamInputMeta.Description",
     image = "stream-input.svg",
     categoryDescription = "i18n:org.apache.hop.pipeline.transform:BaseTransform.Category.Input",
     keywords = "i18n::DataStreamInputMeta.keyword",
diff --git a/plugins/transforms/datastream/src/main/java/org/apache/hop/pipeline/transforms/streamoutput/DataStreamOutputMeta.java b/plugins/transforms/datastream/src/main/java/org/apache/hop/pipeline/transforms/streamoutput/DataStreamOutputMeta.java
index d5cbb11eeb..e0daf5e497 100644
--- a/plugins/transforms/datastream/src/main/java/org/apache/hop/pipeline/transforms/streamoutput/DataStreamOutputMeta.java
+++ b/plugins/transforms/datastream/src/main/java/org/apache/hop/pipeline/transforms/streamoutput/DataStreamOutputMeta.java
@@ -33,8 +33,8 @@ import org.apache.hop.pipeline.transform.ITransformMeta;
 @Setter
 @Transform(
     id = "DataStreamOutput",
-    name = "i18::DataStreamOutputMeta.Name",
-    description = "i18::DataStreamOutputMeta.Description",
+    name = "i18n::DataStreamOutputMeta.Name",
+    description = "i18n::DataStreamOutputMeta.Description",
     image = "stream-output.svg",
     categoryDescription = "i18n:org.apache.hop.pipeline.transform:BaseTransform.Category.Output",
     keywords = "i18n::DataStreamOutputMeta.keyword",
diff --git a/plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/file/messages/messages_en_US.properties b/plugins/transforms/datastream/src/main/resources/org/apache/hop/pipeline/transforms/streaminput/messages/messages_zh_CN.properties
similarity index 66%
copy from plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/file/messages/messages_en_US.properties
copy to plugins/transforms/datastream/src/main/resources/org/apache/hop/pipeline/transforms/streaminput/messages/messages_zh_CN.properties
index 2db865b545..97b0befca8 100644
--- a/plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/file/messages/messages_en_US.properties
+++ b/plugins/transforms/datastream/src/main/resources/org/apache/hop/pipeline/transforms/streaminput/messages/messages_zh_CN.properties
@@ -16,8 +16,8 @@
 #
 #
 
-ArrowFileDataStream.Filename.LabelArrowBaseDataStream.Filename.Label=File name
-ArrowFileDataStream.Filename.Tooltip=The file to which Arrow will stream data to. IMPORTANT: This needs to be a local file. VFS is not supported.
-ArrowFileDataStream.BufferSize.Label=Buffer size
-ArrowFileDataStream.BufferSize.Tooltip=The number of rows to read or write at once
-
+DataStreamInputMeta.Name=\u6570\u636E\u6D41\u8F93\u5165
+DataStreamInputMeta.Description=\u4ECE\u6570\u636E\u6D41\u4E2D\u8BFB\u53D6\u6570\u636E\u884C
+DataStreamInputMeta.keyword=\u6570\u636E\u6D41,\u6570\u636E,\u6D41,Arrow,IPC
+DataStreamInputMeta.DataStreamName.Label=\u6570\u636E\u6D41\u540D\u79F0
+DataStreamInputMeta.DataStreamName.Tooltip=\u8981\u8BFB\u53D6\u7684\u6570\u636E\u6D41\u540D\u79F0
diff --git a/plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/file/messages/messages_en_US.properties b/plugins/transforms/datastream/src/main/resources/org/apache/hop/pipeline/transforms/streamoutput/messages/messages_zh_CN.properties
similarity index 66%
copy from plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/file/messages/messages_en_US.properties
copy to plugins/transforms/datastream/src/main/resources/org/apache/hop/pipeline/transforms/streamoutput/messages/messages_zh_CN.properties
index 2db865b545..c0fbf9beed 100644
--- a/plugins/tech/arrow/src/main/resources/org/apache/hop/arrow/datastream/file/messages/messages_en_US.properties
+++ b/plugins/transforms/datastream/src/main/resources/org/apache/hop/pipeline/transforms/streamoutput/messages/messages_zh_CN.properties
@@ -16,8 +16,8 @@
 #
 #
 
-ArrowFileDataStream.Filename.LabelArrowBaseDataStream.Filename.Label=File name
-ArrowFileDataStream.Filename.Tooltip=The file to which Arrow will stream data to. IMPORTANT: This needs to be a local file. VFS is not supported.
-ArrowFileDataStream.BufferSize.Label=Buffer size
-ArrowFileDataStream.BufferSize.Tooltip=The number of rows to read or write at once
-
+DataStreamOutputMeta.Name=\u6570\u636E\u6D41\u8F93\u51FA
+DataStreamOutputMeta.Description=\u5C06\u6570\u636E\u884C\u5199\u5165\u6570\u636E\u6D41
+DataStreamOutputMeta.keyword=\u6570\u636E\u6D41,\u6570\u636E,\u6D41,Arrow,IPC
+DataStreamOutputMeta.DataStreamName.Label=\u6570\u636E\u6D41\u540D\u79F0
+DataStreamOutputMeta.DataStreamName.Tooltip=\u8981\u5199\u5165\u7684\u6570\u636E\u6D41\u540D\u79F0
diff --git a/ui/src/main/java/org/apache/hop/ui/hopgui/file/HopFileTypeBase.java b/ui/src/main/java/org/apache/hop/ui/hopgui/file/HopFileTypeBase.java
index 56a055c2a8..b5d2a6ab36 100644
--- a/ui/src/main/java/org/apache/hop/ui/hopgui/file/HopFileTypeBase.java
+++ b/ui/src/main/java/org/apache/hop/ui/hopgui/file/HopFileTypeBase.java
@@ -17,7 +17,6 @@
 
 package org.apache.hop.ui.hopgui.file;
 
-import java.util.Properties;
 import org.apache.commons.vfs2.FileName;
 import org.apache.commons.vfs2.FileObject;
 import org.apache.hop.core.exception.HopException;
@@ -26,21 +25,13 @@ import org.apache.hop.core.vfs.HopVfs;
 
 public abstract class HopFileTypeBase implements IHopFileType {
 
-  @Override
-  public abstract String getName();
-
-  @Override
-  public abstract Properties getCapabilities();
-
-  @Override
-  public abstract String[] getFilterExtensions();
-
   @Override
   public boolean equals(Object obj) {
     if (obj == this) {
       return true;
     }
-    return obj.getClass().equals(this.getClass()); // same class is enough
+    // same class is enough
+    return obj.getClass().equals(this.getClass());
   }
 
   @Override