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 6a0eb0079e Refactor Map initialization patterns and migrate string 
concatenations to text blocks (#7025)
6a0eb0079e is described below

commit 6a0eb0079e7185bac46c9c59ec417c054812f02b
Author: Lance <[email protected]>
AuthorDate: Mon May 4 15:34:17 2026 +0800

    Refactor Map initialization patterns and migrate string concatenations to 
text blocks (#7025)
    
    Signed-off-by: lance <[email protected]>
---
 core/src/main/java/org/apache/hop/core/Const.java  |  3 +
 .../hop/core/injection/bean/BeanInjectionInfo.java | 14 ++--
 .../metadata/refactor/MetadataReferenceFinder.java | 27 ++++----
 .../hop/pipeline/transform/TransformMeta.java      |  2 +-
 .../copy/DefaultTransformMetaCopyFactory.java      |  2 +-
 .../hop/www/GetPipelineImageServletTest.java       |  3 +-
 .../org/apache/hop/www/GetRootServletTest.java     |  3 +-
 .../hop/www/GetWorkflowImageServletTest.java       |  3 +-
 .../org/apache/hop/www/HopServerServletTest.java   |  9 +--
 .../apache/hop/workflow/actions/ftp/ActionFtp.java |  9 +--
 .../shell/WorkflowActionShellLoadSaveTest.java     |  3 +-
 .../apache/hop/imports/kettle/KettleImport.java    |  5 +-
 .../org/apache/hop/vfs/azure/AzureFileObject.java  | 14 ++--
 .../googlesheets/GoogleSheetsCredentials.java      | 29 ++++-----
 .../combinationlookup/CombinationLookup.java       |  2 +-
 .../transforms/databaselookup/DefaultCache.java    |  6 +-
 .../dimensionlookup/DimensionLookupMeta.java       |  4 +-
 .../getsubfolders/GetSubFoldersMetaTest.java       |  3 +-
 .../UserDefinedJavaClassMetaTest.java              | 70 +++++++++++++-------
 .../UserDefinedJavaClassTest.java                  | 29 ++++++---
 .../jsonoutputenhanced/JsonEOutputMetaTest.java    | 74 +++++++++++-----------
 .../transforms/ldapoutput/LdapOutputMeta.java      | 45 ++-----------
 .../transforms/memgroupby/MemoryGroupBy.java       |  2 +-
 .../transforms/metainject/MetaInjectDialog.java    |  6 --
 .../mongodbinput/MongoDbInputDialog.java           |  2 +-
 .../pipelineexecutor/PipelineExecutorTest.java     | 19 +++---
 .../transforms/textfileoutput/TextFileOutput.java  | 12 ++--
 .../hop/ui/core/dialog/PreviewRowsDialog.java      |  9 +--
 .../hopgui/file/pipeline/HopGuiPipelineGraph.java  | 11 +---
 .../file/pipeline/PipelineMetricDisplayUtil.java   | 43 ++++++-------
 .../delegates/HopGuiPipelineRunDelegate.java       |  8 +--
 .../perspective/explorer/ExplorerPerspective.java  | 46 ++++++--------
 .../perspective/metadata/MetadataPerspective.java  | 24 +++----
 33 files changed, 244 insertions(+), 297 deletions(-)

diff --git a/core/src/main/java/org/apache/hop/core/Const.java 
b/core/src/main/java/org/apache/hop/core/Const.java
index 77c7fe9c22..80809b9e72 100644
--- a/core/src/main/java/org/apache/hop/core/Const.java
+++ b/core/src/main/java/org/apache/hop/core/Const.java
@@ -304,6 +304,9 @@ public class Const {
   /** Default we store our information in Unicode UTF-8 character set. */
   public static final String UTF_8 = "UTF-8";
 
+  /** Placeholder for the project home directory. */
+  public static final String VAR_PROJECT_HOME = "${PROJECT_HOME}";
+
   /** Allow or disallow doctype declarations in XML. " */
   @Variable(value = "N", description = "A variable allow or disallow doctype 
declarations in XML")
   public static final String XML_ALLOW_DOCTYPE_DECL = "XML_ALLOW_DOCTYPE_DECL";
diff --git 
a/engine/src/main/java/org/apache/hop/core/injection/bean/BeanInjectionInfo.java
 
b/engine/src/main/java/org/apache/hop/core/injection/bean/BeanInjectionInfo.java
index bcfc6f26ab..b75628223a 100644
--- 
a/engine/src/main/java/org/apache/hop/core/injection/bean/BeanInjectionInfo.java
+++ 
b/engine/src/main/java/org/apache/hop/core/injection/bean/BeanInjectionInfo.java
@@ -171,12 +171,14 @@ public class BeanInjectionInfo<Meta extends Object> {
 
       Group group = null;
       if (StringUtils.isNotEmpty(injectionGroupKey)) {
-        group = groupsMap.get(injectionGroupKey);
-        if (group == null) {
-          group = new Group(injectionGroupKey, injectionGroupDescription);
-          groupsMap.put(injectionGroupKey, group);
-          groupsList.add(group);
-        }
+        group =
+            groupsMap.computeIfAbsent(
+                injectionGroupKey,
+                key -> {
+                  Group newGroup = new Group(key, injectionGroupDescription);
+                  groupsList.add(newGroup);
+                  return newGroup;
+                });
       }
 
       if (StringUtils.isNotEmpty(injectionGroupKey)) {
diff --git 
a/engine/src/main/java/org/apache/hop/metadata/refactor/MetadataReferenceFinder.java
 
b/engine/src/main/java/org/apache/hop/metadata/refactor/MetadataReferenceFinder.java
index a9b0034028..3b56905ea7 100644
--- 
a/engine/src/main/java/org/apache/hop/metadata/refactor/MetadataReferenceFinder.java
+++ 
b/engine/src/main/java/org/apache/hop/metadata/refactor/MetadataReferenceFinder.java
@@ -24,7 +24,7 @@ import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.HashMap;
+import java.util.EnumMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -34,6 +34,7 @@ import org.apache.commons.vfs2.FileObject;
 import org.apache.commons.vfs2.FileSelectInfo;
 import org.apache.commons.vfs2.FileSelector;
 import org.apache.commons.vfs2.FileType;
+import org.apache.hop.core.Const;
 import org.apache.hop.core.exception.HopException;
 import org.apache.hop.core.exception.HopXmlException;
 import org.apache.hop.core.plugins.ActionPluginType;
@@ -176,7 +177,8 @@ public class MetadataReferenceFinder {
    */
   private Map<HopMetadataPropertyType, List<MetadataClassField>>
       buildPropertyTypeToMetadataFields() {
-    Map<HopMetadataPropertyType, List<MetadataClassField>> map = new 
HashMap<>();
+    Map<HopMetadataPropertyType, List<MetadataClassField>> map =
+        new EnumMap<>(HopMetadataPropertyType.class);
     try {
       // Layer 1: direct fields on top-level metadata classes
       for (Class<? extends IHopMetadata> metadataClass : 
metadataProvider.getMetadataClasses()) {
@@ -352,14 +354,14 @@ public class MetadataReferenceFinder {
    * returned value preserves the variable style (e.g. {@code 
${PROJECT_HOME}/new.hpl}).
    */
   private static String computeNewFilePath(String stored, String newPath, 
IVariables variables) {
-    if (variables != null && stored != null && 
stored.contains("${PROJECT_HOME}")) {
-      String projectHome = variables.resolve("${PROJECT_HOME}");
+    if (variables != null && stored != null && 
stored.contains(Const.VAR_PROJECT_HOME)) {
+      String projectHome = variables.resolve(Const.VAR_PROJECT_HOME);
       if (projectHome != null && !projectHome.isEmpty() && 
newPath.startsWith(projectHome)) {
         String rel = newPath.substring(projectHome.length());
         if (!rel.startsWith("/")) {
           rel = "/" + rel;
         }
-        return "${PROJECT_HOME}" + rel;
+        return Const.VAR_PROJECT_HOME + rel;
       }
     }
     return newPath;
@@ -367,10 +369,10 @@ public class MetadataReferenceFinder {
 
   /**
    * Builds a map from each HopMetadataPropertyType to the set of XML tag 
names that store a
-   * reference of that type (from @HopMetadataProperty on transform and action 
meta classes).
+   * reference of that type (from @HopMetadataProperty on transform and action 
metaclasses).
    */
   private static Map<HopMetadataPropertyType, Set<String>> 
buildPropertyTypeToTagNames() {
-    Map<HopMetadataPropertyType, Set<String>> map = new HashMap<>();
+    Map<HopMetadataPropertyType, Set<String>> map = new 
EnumMap<>(HopMetadataPropertyType.class);
     PluginRegistry registry = PluginRegistry.getInstance();
 
     for (HopMetadataPropertyType type : HopMetadataPropertyType.values()) {
@@ -415,11 +417,7 @@ public class MetadataReferenceFinder {
           continue;
         }
         collectTagsFromClass(metaClass, tags, targetType, new HashSet<>());
-      } catch (NoClassDefFoundError e) {
-        // Skip plugin if a dependency is missing (e.g. Saxon in plugin 
classloader)
-      } catch (ClassNotFoundException e) {
-        // Skip plugin if we can't load it
-      } catch (Exception e) {
+      } catch (Exception ignore) {
         // Skip plugin if we can't load or reflect
       }
     }
@@ -1203,9 +1201,8 @@ public class MetadataReferenceFinder {
           }
           if (matches) {
             count[0]++;
-            if (replace && node instanceof Element && newNameForReplace != 
null) {
-              ((Element) node)
-                  .setTextContent(computeNewFilePath(trimmed, 
newNameForReplace, variables));
+            if (replace && node instanceof Element el && newNameForReplace != 
null) {
+              el.setTextContent(computeNewFilePath(trimmed, newNameForReplace, 
variables));
             }
           }
         }
diff --git 
a/engine/src/main/java/org/apache/hop/pipeline/transform/TransformMeta.java 
b/engine/src/main/java/org/apache/hop/pipeline/transform/TransformMeta.java
index ae47ce9dea..4da23e3749 100644
--- a/engine/src/main/java/org/apache/hop/pipeline/transform/TransformMeta.java
+++ b/engine/src/main/java/org/apache/hop/pipeline/transform/TransformMeta.java
@@ -468,7 +468,7 @@ public class TransformMeta
       return new HashMap<>();
     }
 
-    Map<String, Map<String, String>> result = new HashMap<>(map.size());
+    Map<String, Map<String, String>> result = HashMap.newHashMap(map.size());
     for (Map.Entry<String, Map<String, String>> entry : map.entrySet()) {
       Map<String, String> value = entry.getValue();
       HashMap<String, String> copy = (value == null) ? null : new 
HashMap<>(value);
diff --git 
a/engine/src/main/java/org/apache/hop/pipeline/transform/copy/DefaultTransformMetaCopyFactory.java
 
b/engine/src/main/java/org/apache/hop/pipeline/transform/copy/DefaultTransformMetaCopyFactory.java
index 8e43e918e2..0e8a051469 100644
--- 
a/engine/src/main/java/org/apache/hop/pipeline/transform/copy/DefaultTransformMetaCopyFactory.java
+++ 
b/engine/src/main/java/org/apache/hop/pipeline/transform/copy/DefaultTransformMetaCopyFactory.java
@@ -199,7 +199,7 @@ public class DefaultTransformMetaCopyFactory implements 
ITransformMetaCopyFactor
       return new HashMap<>();
     }
 
-    Map<String, Map<String, String>> copy = new HashMap<>(source.size());
+    Map<String, Map<String, String>> copy = HashMap.newHashMap(source.size());
     for (Map.Entry<String, Map<String, String>> entry : source.entrySet()) {
       Map<String, String> value = entry.getValue();
       HashMap<String, String> valueCopy = (value == null) ? null : new 
HashMap<>(value);
diff --git 
a/engine/src/test/java/org/apache/hop/www/GetPipelineImageServletTest.java 
b/engine/src/test/java/org/apache/hop/www/GetPipelineImageServletTest.java
index f4efaea99d..2ab4ae0246 100644
--- a/engine/src/test/java/org/apache/hop/www/GetPipelineImageServletTest.java
+++ b/engine/src/test/java/org/apache/hop/www/GetPipelineImageServletTest.java
@@ -17,7 +17,6 @@
 
 package org.apache.hop.www;
 
-import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoInteractions;
@@ -67,6 +66,6 @@ class GetPipelineImageServletTest {
 
     servlet.doGet(request, response);
 
-    verify(response).setStatus(eq(HttpServletResponse.SC_NO_CONTENT));
+    verify(response).setStatus(HttpServletResponse.SC_NO_CONTENT);
   }
 }
diff --git a/engine/src/test/java/org/apache/hop/www/GetRootServletTest.java 
b/engine/src/test/java/org/apache/hop/www/GetRootServletTest.java
index 3e9c5c5995..9093aa93d6 100644
--- a/engine/src/test/java/org/apache/hop/www/GetRootServletTest.java
+++ b/engine/src/test/java/org/apache/hop/www/GetRootServletTest.java
@@ -18,7 +18,6 @@
 package org.apache.hop.www;
 
 import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -62,6 +61,6 @@ class GetRootServletTest {
         
when(mock(HttpServletRequest.class).getRequestURI()).thenReturn("/wrong_path").getMock();
     HttpServletResponse response = mock(HttpServletResponse.class);
     servlet.doGet(request, response);
-    verify(response).sendError(eq(HttpServletResponse.SC_NOT_FOUND), eq("Not 
found."));
+    verify(response).sendError(HttpServletResponse.SC_NOT_FOUND, "Not found.");
   }
 }
diff --git 
a/engine/src/test/java/org/apache/hop/www/GetWorkflowImageServletTest.java 
b/engine/src/test/java/org/apache/hop/www/GetWorkflowImageServletTest.java
index c4af0d13c0..178b422c95 100644
--- a/engine/src/test/java/org/apache/hop/www/GetWorkflowImageServletTest.java
+++ b/engine/src/test/java/org/apache/hop/www/GetWorkflowImageServletTest.java
@@ -17,7 +17,6 @@
 
 package org.apache.hop.www;
 
-import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoInteractions;
@@ -67,6 +66,6 @@ class GetWorkflowImageServletTest {
 
     servlet.doGet(request, response);
 
-    verify(response).setStatus(eq(HttpServletResponse.SC_NO_CONTENT));
+    verify(response).setStatus(HttpServletResponse.SC_NO_CONTENT);
   }
 }
diff --git a/engine/src/test/java/org/apache/hop/www/HopServerServletTest.java 
b/engine/src/test/java/org/apache/hop/www/HopServerServletTest.java
index 076e6e3d21..af1d99a909 100644
--- a/engine/src/test/java/org/apache/hop/www/HopServerServletTest.java
+++ b/engine/src/test/java/org/apache/hop/www/HopServerServletTest.java
@@ -18,7 +18,6 @@
 package org.apache.hop.www;
 
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
@@ -72,7 +71,7 @@ class HopServerServletTest {
 
     servlet.doGet(req, resp);
 
-    verify(resp).sendError(eq(HttpServletResponse.SC_NOT_FOUND), eq("Not 
found."));
+    verify(resp).sendError(HttpServletResponse.SC_NOT_FOUND, "Not found.");
   }
 
   @Test
@@ -102,8 +101,7 @@ class HopServerServletTest {
 
     servlet.doGet(req, resp);
 
-    verify(resp)
-        .sendError(eq(HttpServletResponse.SC_INTERNAL_SERVER_ERROR), 
eq("Plugin request failed."));
+    verify(resp).sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, 
"Plugin request failed.");
   }
 
   @Test
@@ -118,7 +116,6 @@ class HopServerServletTest {
 
     verify(resp)
         .sendError(
-            eq(HttpServletResponse.SC_INTERNAL_SERVER_ERROR),
-            eq("Unable to process server request."));
+            HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Unable to process 
server request.");
   }
 }
diff --git 
a/plugins/actions/ftp/src/main/java/org/apache/hop/workflow/actions/ftp/ActionFtp.java
 
b/plugins/actions/ftp/src/main/java/org/apache/hop/workflow/actions/ftp/ActionFtp.java
index 27737cb7dd..bdd6f4cf31 100644
--- 
a/plugins/actions/ftp/src/main/java/org/apache/hop/workflow/actions/ftp/ActionFtp.java
+++ 
b/plugins/actions/ftp/src/main/java/org/apache/hop/workflow/actions/ftp/ActionFtp.java
@@ -83,10 +83,6 @@ public class ActionFtp extends ActionBase implements 
Cloneable, IAction, IFtpCon
   /** Default encoding when making a new ftp action instance. */
   private static final String DEFAULT_CONTROL_ENCODING = "ISO-8859-1";
 
-  /*
-  IfFileExists.add();
-    wIfFileExists.add();
-    wIfFileExists.add();*/
   @Getter
   public enum IfFileExistsOperation implements IEnumHasCodeAndDescription {
     SKIP("ifFileExistsSkip", BaseMessages.getString(PKG, 
"ActionFtp.Skip.Label")),
@@ -677,9 +673,8 @@ public class ActionFtp extends ActionBase implements 
Cloneable, IAction, IFtpCon
           logError(BaseMessages.getString(PKG, CONST_LOCAL_FILE_EXISTS), 
filename);
           updateErrors();
         }
-        case SKIP -> {
-          logDebug(toString(), BaseMessages.getString(PKG, 
CONST_LOCAL_FILE_EXISTS), filename);
-        }
+        case SKIP ->
+            logDebug(toString(), BaseMessages.getString(PKG, 
CONST_LOCAL_FILE_EXISTS), filename);
       }
     }
 
diff --git 
a/plugins/actions/shell/src/test/java/org/apache/hop/workflow/actions/shell/WorkflowActionShellLoadSaveTest.java
 
b/plugins/actions/shell/src/test/java/org/apache/hop/workflow/actions/shell/WorkflowActionShellLoadSaveTest.java
index f3a543d345..f91171b14d 100644
--- 
a/plugins/actions/shell/src/test/java/org/apache/hop/workflow/actions/shell/WorkflowActionShellLoadSaveTest.java
+++ 
b/plugins/actions/shell/src/test/java/org/apache/hop/workflow/actions/shell/WorkflowActionShellLoadSaveTest.java
@@ -19,6 +19,7 @@ package org.apache.hop.workflow.actions.shell;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
+import org.apache.hop.core.Const;
 import org.apache.hop.workflow.action.ActionSerializationTestUtil;
 import org.junit.jupiter.api.Test;
 
@@ -29,7 +30,7 @@ class WorkflowActionShellLoadSaveTest {
         ActionSerializationTestUtil.testSerialization("/shell-action.xml", 
ActionShell.class);
 
     assertEquals("${PROJECT_HOME}/0002-shell-test.sh", meta.getFilename());
-    assertEquals("${PROJECT_HOME}", meta.getWorkDirectory());
+    assertEquals(Const.VAR_PROJECT_HOME, meta.getWorkDirectory());
     assertEquals(1, meta.getArguments().size());
   }
 
diff --git 
a/plugins/misc/import/src/main/java/org/apache/hop/imports/kettle/KettleImport.java
 
b/plugins/misc/import/src/main/java/org/apache/hop/imports/kettle/KettleImport.java
index 5249cb4730..09a1246981 100644
--- 
a/plugins/misc/import/src/main/java/org/apache/hop/imports/kettle/KettleImport.java
+++ 
b/plugins/misc/import/src/main/java/org/apache/hop/imports/kettle/KettleImport.java
@@ -727,7 +727,8 @@ public class KettleImport extends HopImportBase implements 
IHopImport {
         // pipeline
         // filename.
         if (!StringUtils.isEmpty(transName) && 
!StringUtils.isEmpty(directoryPath)) {
-          filenameNode.setTextContent("${PROJECT_HOME}" + directoryPath + '/' 
+ transName + ".hpl");
+          filenameNode.setTextContent(
+              Const.VAR_PROJECT_HOME + directoryPath + '/' + transName + 
".hpl");
         }
 
         // add the default pipeline run configuration.
@@ -817,7 +818,7 @@ public class KettleImport extends HopImportBase implements 
IHopImport {
   private Node processRepositoryNode(Node repositoryNode) {
 
     String filename = "";
-    String directory = "${PROJECT_HOME}";
+    String directory = Const.VAR_PROJECT_HOME;
     String type = "";
     Node filenameNode = null;
 
diff --git 
a/plugins/tech/azure/src/main/java/org/apache/hop/vfs/azure/AzureFileObject.java
 
b/plugins/tech/azure/src/main/java/org/apache/hop/vfs/azure/AzureFileObject.java
index 4aee4499d3..63b29d1d42 100644
--- 
a/plugins/tech/azure/src/main/java/org/apache/hop/vfs/azure/AzureFileObject.java
+++ 
b/plugins/tech/azure/src/main/java/org/apache/hop/vfs/azure/AzureFileObject.java
@@ -80,11 +80,6 @@ public class AzureFileObject extends 
AbstractFileObject<AzureFileSystem> {
       written(len);
     }
 
-    @Override
-    public void flush() throws IOException {
-      super.flush();
-    }
-
     @Override
     public void close() throws IOException {
       outputStream.close();
@@ -101,7 +96,7 @@ public class AzureFileObject extends 
AbstractFileObject<AzureFileSystem> {
   private String currentFilePath;
   private PathItem pathItem;
   private PathItem dirPathItem;
-  private final String markerFileName = ".cvfs.temp";
+  private static final String MARKER_FILE_NAME = ".cvfs.temp";
   private OutputStream blobOutputStream;
   private String containerName;
 
@@ -365,7 +360,7 @@ public class AzureFileObject extends 
AbstractFileObject<AzureFileSystem> {
 
   @Override
   protected boolean doIsHidden() throws Exception {
-    return getName().getBaseName().equals(markerFileName);
+    return getName().getBaseName().equals(MARKER_FILE_NAME);
   }
 
   /**
@@ -413,7 +408,7 @@ public class AzureFileObject extends 
AbstractFileObject<AzureFileSystem> {
           // If this was the last file in the create, we create a new
           // marker file to keep the directory open
           if (lastFile) {
-            FileObject marker = parent.resolveFile(markerFileName);
+            FileObject marker = parent.resolveFile(MARKER_FILE_NAME);
             marker.createFile();
           }
         }
@@ -465,7 +460,7 @@ public class AzureFileObject extends 
AbstractFileObject<AzureFileSystem> {
   @Override
   protected void doCreateFolder() {
     
service.getFileSystemClient(containerName).createDirectory(currentFilePath.substring(1));
-    if (containerName != null && currentFilePath != null) {
+    if (containerName != null) {
       getAbstractFileSystem()
           .invalidateListCacheForParentOf(
               containerName, StringUtils.removeStart(currentFilePath, "/"));
@@ -548,7 +543,6 @@ public class AzureFileObject extends 
AbstractFileObject<AzureFileSystem> {
       return true;
     } catch (Exception e) {
       return false;
-      // TODO log an error
     }
   }
 
diff --git 
a/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsCredentials.java
 
b/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsCredentials.java
index 77550277e2..2ecf8a9075 100644
--- 
a/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsCredentials.java
+++ 
b/plugins/tech/google/src/main/java/org/apache/hop/pipeline/transforms/googlesheets/GoogleSheetsCredentials.java
@@ -36,6 +36,7 @@ import org.apache.hop.core.vfs.HopVfs;
 
 /** Describe your transform plugin. */
 public class GoogleSheetsCredentials {
+  private GoogleSheetsCredentials() {}
 
   public static final String APPLICATION_NAME = "Apache-Hop-Google-Sheets";
 
@@ -63,22 +64,12 @@ public class GoogleSheetsCredentials {
     credential = GoogleCredentials.fromStream(in);
 
     if (httpTransport != null) {
-      HttpTransportFactory proxyTransportFactory =
-          new HttpTransportFactory() {
-            @Override
-            public HttpTransport create() {
-              return httpTransport;
-            }
-          };
+      HttpTransportFactory proxyTransportFactory = () -> httpTransport;
 
-      if (credential instanceof ServiceAccountCredentials) {
-        credential =
-            ((ServiceAccountCredentials) credential)
-                
.toBuilder().setHttpTransportFactory(proxyTransportFactory).build();
-      } else if (credential instanceof UserCredentials) {
-        credential =
-            ((UserCredentials) credential)
-                
.toBuilder().setHttpTransportFactory(proxyTransportFactory).build();
+      if (credential instanceof ServiceAccountCredentials sc) {
+        credential = 
sc.toBuilder().setHttpTransportFactory(proxyTransportFactory).build();
+      } else if (credential instanceof UserCredentials uc) {
+        credential = 
uc.toBuilder().setHttpTransportFactory(proxyTransportFactory).build();
       }
     }
 
@@ -97,10 +88,12 @@ public class GoogleSheetsCredentials {
   public static HttpRequestInitializer setHttpTimeout(
       final HttpRequestInitializer requestInitializer, final String timeout) {
     return httpRequest -> {
-      Integer TO = Integer.parseInt(timeout);
+      int t0 = Integer.parseInt(timeout);
       requestInitializer.initialize(httpRequest);
-      httpRequest.setConnectTimeout(TO * 60000); // 10 minutes connect timeout
-      httpRequest.setReadTimeout(TO * 60000); // 10 minutes read timeout
+      // 10 minutes connect timeout
+      httpRequest.setConnectTimeout(t0 * 60000);
+      // 10 minutes read timeout
+      httpRequest.setReadTimeout(t0 * 60000);
     };
   }
 }
diff --git 
a/plugins/transforms/combinationlookup/src/main/java/org/apache/hop/pipeline/transforms/combinationlookup/CombinationLookup.java
 
b/plugins/transforms/combinationlookup/src/main/java/org/apache/hop/pipeline/transforms/combinationlookup/CombinationLookup.java
index cb6928be61..ab69d416a1 100644
--- 
a/plugins/transforms/combinationlookup/src/main/java/org/apache/hop/pipeline/transforms/combinationlookup/CombinationLookup.java
+++ 
b/plugins/transforms/combinationlookup/src/main/java/org/apache/hop/pipeline/transforms/combinationlookup/CombinationLookup.java
@@ -700,7 +700,7 @@ public class CombinationLookup extends 
BaseTransform<CombinationLookupMeta, Comb
       data.realTableName = resolve(meta.getTableName());
 
       if (meta.getCacheSize() > 0) {
-        data.cache = new HashMap<>((int) (meta.getCacheSize() * 1.5));
+        data.cache = HashMap.newHashMap((int) (meta.getCacheSize() * 1.5));
       } else {
         data.cache = new HashMap<>();
       }
diff --git 
a/plugins/transforms/databaselookup/src/main/java/org/apache/hop/pipeline/transforms/databaselookup/DefaultCache.java
 
b/plugins/transforms/databaselookup/src/main/java/org/apache/hop/pipeline/transforms/databaselookup/DefaultCache.java
index 6adffd2c50..922db176cb 100644
--- 
a/plugins/transforms/databaselookup/src/main/java/org/apache/hop/pipeline/transforms/databaselookup/DefaultCache.java
+++ 
b/plugins/transforms/databaselookup/src/main/java/org/apache/hop/pipeline/transforms/databaselookup/DefaultCache.java
@@ -45,7 +45,7 @@ public class DefaultCache implements 
DatabaseLookupData.ICache {
 
   DefaultCache(DatabaseLookupData data, int capacity) {
     this.data = data;
-    map = new LinkedHashMap<>(capacity);
+    map = LinkedHashMap.newLinkedHashMap(capacity);
   }
 
   @Override
@@ -59,7 +59,7 @@ public class DefaultCache implements 
DatabaseLookupData.ICache {
       }
     } else { // special handling of conditions <,>, <> etc.
       if (!data.hasDBCondition) { // e.g. LIKE not handled by this routine, yet
-        // TODO: find an alternative way to look up the data based on the 
condition.
+        //  find an alternative way to look up the data based on the condition.
         // Not all conditions are "=" so we are going to have to evaluate row 
by row
         // A sorted list or index might be a good solution here...
         //
@@ -109,7 +109,7 @@ public class DefaultCache implements 
DatabaseLookupData.ICache {
                 }
                 lookupIndex++;
                 break;
-                // TODO: add LIKE operator (think of changing the 
hasDBCondition logic then)
+                //  add LIKE operator (think of changing the hasDBCondition 
logic then)
               default:
                 match = false;
                 data.hasDBCondition =
diff --git 
a/plugins/transforms/dimensionlookup/src/main/java/org/apache/hop/pipeline/transforms/dimensionlookup/DimensionLookupMeta.java
 
b/plugins/transforms/dimensionlookup/src/main/java/org/apache/hop/pipeline/transforms/dimensionlookup/DimensionLookupMeta.java
index fc7025b983..2fb8d2a8f1 100644
--- 
a/plugins/transforms/dimensionlookup/src/main/java/org/apache/hop/pipeline/transforms/dimensionlookup/DimensionLookupMeta.java
+++ 
b/plugins/transforms/dimensionlookup/src/main/java/org/apache/hop/pipeline/transforms/dimensionlookup/DimensionLookupMeta.java
@@ -342,9 +342,7 @@ public class DimensionLookupMeta extends 
BaseTransformMeta<DimensionLookup, Dime
       throws HopTransformException {
     IValueMeta tkValueMeta;
     switch (fields.returns.creationMethod) {
-      case SEQUENCE:
-      case TABLE_MAXIMUM:
-      case AUTO_INCREMENT:
+      case SEQUENCE, TABLE_MAXIMUM, AUTO_INCREMENT:
         tkValueMeta = new ValueMetaInteger(name, 9, 0);
         break;
       case UUID:
diff --git 
a/plugins/transforms/getsubfolders/src/test/java/org/apache/hop/pipeline/transforms/getsubfolders/GetSubFoldersMetaTest.java
 
b/plugins/transforms/getsubfolders/src/test/java/org/apache/hop/pipeline/transforms/getsubfolders/GetSubFoldersMetaTest.java
index 30f0ab9674..d732435db7 100644
--- 
a/plugins/transforms/getsubfolders/src/test/java/org/apache/hop/pipeline/transforms/getsubfolders/GetSubFoldersMetaTest.java
+++ 
b/plugins/transforms/getsubfolders/src/test/java/org/apache/hop/pipeline/transforms/getsubfolders/GetSubFoldersMetaTest.java
@@ -20,6 +20,7 @@ package org.apache.hop.pipeline.transforms.getsubfolders;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+import org.apache.hop.core.Const;
 import org.apache.hop.pipeline.transform.TransformSerializationTestUtil;
 import org.junit.jupiter.api.Test;
 
@@ -32,7 +33,7 @@ class GetSubFoldersMetaTest {
 
     assertTrue(meta.isIncludeRowNumber());
     assertEquals(1, meta.getFiles().size());
-    assertEquals("${PROJECT_HOME}", meta.getFiles().get(0).getName());
+    assertEquals(Const.VAR_PROJECT_HOME, meta.getFiles().get(0).getName());
     assertTrue(meta.getFiles().get(0).isRequired());
     assertEquals("rowNumber", meta.getRowNumberField());
     assertEquals(123L, meta.getRowLimit());
diff --git 
a/plugins/transforms/janino/src/test/java/org/apache/hop/pipeline/transforms/userdefinedjavaclass/UserDefinedJavaClassMetaTest.java
 
b/plugins/transforms/janino/src/test/java/org/apache/hop/pipeline/transforms/userdefinedjavaclass/UserDefinedJavaClassMetaTest.java
index 9a307d333d..ba9f738957 100644
--- 
a/plugins/transforms/janino/src/test/java/org/apache/hop/pipeline/transforms/userdefinedjavaclass/UserDefinedJavaClassMetaTest.java
+++ 
b/plugins/transforms/janino/src/test/java/org/apache/hop/pipeline/transforms/userdefinedjavaclass/UserDefinedJavaClassMetaTest.java
@@ -57,13 +57,15 @@ class UserDefinedJavaClassMetaTest {
   @Test
   void cookClassErrorCompilationTest() {
     String wrongCode =
-        "public boolean processRow() {\n"
-            + "   return true;\n"
-            + "}\n"
-            + "\n"
-            + "public boolean processRow() {\n"
-            + "   return true;\n"
-            + "}\n";
+        """
+        public boolean processRow() {
+           return true;
+        }
+
+        public boolean processRow() {
+           return true;
+        }
+        """;
 
     UserDefinedJavaClassMeta userDefinedJavaClassMeta = new 
UserDefinedJavaClassMeta();
 
@@ -91,12 +93,20 @@ class UserDefinedJavaClassMetaTest {
 
   @Test
   void cookClassesCachingTest() throws Exception {
-    String codeBlock1 = "public boolean processRow() {\n" + "    return 
true;\n" + "}\n\n";
+    String codeBlock1 =
+        """
+        public boolean processRow() {
+            return true;
+        }
+        """;
+
     String codeBlock2 =
-        "public boolean processRow() {\n"
-            + "    // Random comment\n"
-            + "    return true;\n"
-            + "}\n\n";
+        """
+        public boolean processRow() {
+            // Random comment
+            return true;
+        }
+        """;
     UserDefinedJavaClassMeta userDefinedJavaClassMeta1 = new 
UserDefinedJavaClassMeta();
 
     UserDefinedJavaClassDef userDefinedJavaClassDef1 =
@@ -133,7 +143,13 @@ class UserDefinedJavaClassMetaTest {
 
   @Test
   void oderDefinitionTest() {
-    String codeBlock1 = "public boolean processRow() {\n" + "    return 
true;\n" + "}\n\n";
+    String codeBlock1 =
+        """
+        public boolean processRow() {
+            return true;
+        }
+
+        """;
     UserDefinedJavaClassMeta userDefinedJavaClassMeta = new 
UserDefinedJavaClassMeta();
     UserDefinedJavaClassDef processClassDef =
         new UserDefinedJavaClassDef(
@@ -363,9 +379,11 @@ class UserDefinedJavaClassMetaTest {
   @Test
   void cookClass_target8_staticInterfaceMethod_succeeds() throws Exception {
     String code =
-        "public int cmp() {\n"
-            + "  return 
java.util.Comparator.naturalOrder().compare(Integer.valueOf(3), 
Integer.valueOf(5));\n"
-            + "}\n";
+        """
+        public int cmp() {
+          return 
java.util.Comparator.naturalOrder().compare(Integer.valueOf(3), 
Integer.valueOf(5));
+        }
+        """;
     UserDefinedJavaClassMeta meta = new UserDefinedJavaClassMeta();
     meta.setJavaTargetVersion(8);
     UserDefinedJavaClassDef def =
@@ -380,9 +398,11 @@ class UserDefinedJavaClassMetaTest {
   @Test
   void cookClass_target17_staticInterfaceMethod_succeeds() throws Exception {
     String code =
-        "public int cmp() {\n"
-            + "  return 
java.util.Comparator.naturalOrder().compare(Integer.valueOf(3), 
Integer.valueOf(5));\n"
-            + "}\n";
+        """
+        public int cmp() {
+          return 
java.util.Comparator.naturalOrder().compare(Integer.valueOf(3), 
Integer.valueOf(5));
+        }
+        """;
     UserDefinedJavaClassMeta meta = new UserDefinedJavaClassMeta();
     meta.setJavaTargetVersion(17);
     UserDefinedJavaClassDef def =
@@ -396,9 +416,11 @@ class UserDefinedJavaClassMetaTest {
   @Test
   void cookClass_target6_staticInterfaceMethod_throwsCompileException() {
     String code =
-        "public int cmp() {\n"
-            + "  return 
java.util.Comparator.naturalOrder().compare(Integer.valueOf(3), 
Integer.valueOf(5));\n"
-            + "}\n";
+        """
+        public int cmp() {
+          return 
java.util.Comparator.naturalOrder().compare(Integer.valueOf(3), 
Integer.valueOf(5));
+        }
+        """;
     UserDefinedJavaClassMeta meta = new UserDefinedJavaClassMeta();
     meta.setJavaTargetVersion(6);
     UserDefinedJavaClassDef def =
@@ -531,7 +553,7 @@ class UserDefinedJavaClassMetaTest {
     newFields.add(new UserDefinedJavaClassMeta.FieldInfo("a", 
IValueMeta.TYPE_STRING, 10, -1));
     meta.replaceFields(newFields);
     assertEquals(1, meta.getFields().size());
-    assertEquals("a", meta.getFields().get(0).getName());
+    assertEquals("a", meta.getFields().getFirst().getName());
   }
 
   @Test
@@ -541,7 +563,7 @@ class UserDefinedJavaClassMetaTest {
     fields.add(new UserDefinedJavaClassMeta.FieldInfo("b", 
IValueMeta.TYPE_INTEGER, 9, 0));
     meta.setFieldInfo(fields);
     assertEquals(1, meta.getFields().size());
-    assertEquals("b", meta.getFields().get(0).getName());
+    assertEquals("b", meta.getFields().getFirst().getName());
   }
 
   // ------------------------------------------------------------------ 
replaceDefinitions
diff --git 
a/plugins/transforms/janino/src/test/java/org/apache/hop/pipeline/transforms/userdefinedjavaclass/UserDefinedJavaClassTest.java
 
b/plugins/transforms/janino/src/test/java/org/apache/hop/pipeline/transforms/userdefinedjavaclass/UserDefinedJavaClassTest.java
index 396457f25a..77028c883e 100644
--- 
a/plugins/transforms/janino/src/test/java/org/apache/hop/pipeline/transforms/userdefinedjavaclass/UserDefinedJavaClassTest.java
+++ 
b/plugins/transforms/janino/src/test/java/org/apache/hop/pipeline/transforms/userdefinedjavaclass/UserDefinedJavaClassTest.java
@@ -17,6 +17,7 @@
 package org.apache.hop.pipeline.transforms.userdefinedjavaclass;
 
 import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
@@ -116,8 +117,10 @@ class UserDefinedJavaClassTest {
     UserDefinedJavaClassMeta meta = new UserDefinedJavaClassMeta();
     // Duplicate method → compilation error
     String badSource =
-        "public boolean processRow() { return true; }\n"
-            + "public boolean processRow() { return true; }\n";
+        """
+        public boolean processRow() { return true; }
+        public boolean processRow() { return true; }
+        """;
     meta.getDefinitions()
         .add(new UserDefinedJavaClassDef(ClassType.NORMAL_CLASS, "BadClass", 
badSource));
 
@@ -132,9 +135,13 @@ class UserDefinedJavaClassTest {
 
   @Test
   void constructor_copyNrNonZero_constructsWithoutThrowingAndNoCookErrors() {
-    // copyNr=1: explicit cookClasses() call in the constructor body is 
skipped;
-    // cooking happens lazily inside newChildInstance() via checkClassCooked().
-    // For a clean meta with no definitions, no cook errors occur.
+    /*
+     * Note:
+     * For copyNr=1, the explicit cookClasses() call in the constructor body 
is skipped.
+     * Cooking is performed lazily inside newChildInstance() via 
checkClassCooked().
+     *
+     * For a clean meta with no definitions, no cook errors will occur.
+     */
     UserDefinedJavaClassMeta meta = new UserDefinedJavaClassMeta();
 
     new UserDefinedJavaClass(
@@ -156,10 +163,12 @@ class UserDefinedJavaClassTest {
     // (child instantiation fails in tests because 
pipelineMeta.getPrevTransformFields returns
     // null).
     String source =
-        "public boolean processRow() throws 
org.apache.hop.core.exception.HopException {\n"
-            + "  setOutputDone();\n"
-            + "  return false;\n"
-            + "}\n";
+        """
+        public boolean processRow() throws 
org.apache.hop.core.exception.HopException {
+          setOutputDone();
+          return false;
+        }
+        """;
 
     UserDefinedJavaClassMeta meta = new UserDefinedJavaClassMeta();
     meta.getDefinitions()
@@ -168,7 +177,7 @@ class UserDefinedJavaClassTest {
     meta.cookClasses();
 
     assertTrue(meta.getCookErrors().isEmpty(), "Expected no cook errors");
-    assertFalse(meta.getCookedTransformClass() == null, "Expected 
cookedTransformClass to be set");
+    assertNotNull(meta.getCookedTransformClass(), "Expected 
cookedTransformClass to be set");
   }
 
   // ------------------------------------------------------------------ 
getDefinitions / hasChanged
diff --git 
a/plugins/transforms/json/src/test/java/org/apache/hop/pipeline/transforms/jsonoutputenhanced/JsonEOutputMetaTest.java
 
b/plugins/transforms/json/src/test/java/org/apache/hop/pipeline/transforms/jsonoutputenhanced/JsonEOutputMetaTest.java
index 23b1dfa2d8..9f0391fd2d 100644
--- 
a/plugins/transforms/json/src/test/java/org/apache/hop/pipeline/transforms/jsonoutputenhanced/JsonEOutputMetaTest.java
+++ 
b/plugins/transforms/json/src/test/java/org/apache/hop/pipeline/transforms/jsonoutputenhanced/JsonEOutputMetaTest.java
@@ -45,41 +45,43 @@ class JsonEOutputMetaTest {
   @Test
   void deserializeSelfClosingJsonBloc_overridesConstructor() throws Exception {
     String xml =
-        "<transform>\n"
-            + "  <outputValue>prompt</outputValue>\n"
-            + "  <jsonBloc/>\n"
-            + "  <operation_type>outputvalue</operation_type>\n"
-            + "  
<use_arrays_with_single_instance>N</use_arrays_with_single_instance>\n"
-            + "  <use_single_item_per_group>N</use_single_item_per_group>\n"
-            + "  <json_prittified>N</json_prittified>\n"
-            + "  <encoding>UTF-8</encoding>\n"
-            + "  <addtoresult>N</addtoresult>\n"
-            + "  <file>\n"
-            + "    <name/>\n"
-            + "    <split_output_after>0</split_output_after>\n"
-            + "    <extention>json</extention>\n"
-            + "    <append>N</append>\n"
-            + "    <split>N</split>\n"
-            + "    <haspartno>N</haspartno>\n"
-            + "    <add_date>N</add_date>\n"
-            + "    <add_time>N</add_time>\n"
-            + "    <create_parent_folder>N</create_parent_folder>\n"
-            + "    <doNotOpenNewFileInit>N</doNotOpenNewFileInit>\n"
-            + "  </file>\n"
-            + "  <additional_fields>\n"
-            + "    <json_size_field/>\n"
-            + "  </additional_fields>\n"
-            + "  <key_fields/>\n"
-            + "  <fields>\n"
-            + "    <field>\n"
-            + "      <name>role</name>\n"
-            + "      <element>role</element>\n"
-            + "      <json_fragment>N</json_fragment>\n"
-            + "      <is_without_enclosing>N</is_without_enclosing>\n"
-            + "      <remove_if_blank>Y</remove_if_blank>\n"
-            + "    </field>\n"
-            + "  </fields>\n"
-            + "</transform>\n";
+        """
+        <transform>
+          <outputValue>prompt</outputValue>
+          <jsonBloc/>
+          <operation_type>outputvalue</operation_type>
+          <use_arrays_with_single_instance>N</use_arrays_with_single_instance>
+          <use_single_item_per_group>N</use_single_item_per_group>
+          <json_prittified>N</json_prittified>
+          <encoding>UTF-8</encoding>
+          <addtoresult>N</addtoresult>
+          <file>
+            <name/>
+            <split_output_after>0</split_output_after>
+            <extention>json</extention>
+            <append>N</append>
+            <split>N</split>
+            <haspartno>N</haspartno>
+            <add_date>N</add_date>
+            <add_time>N</add_time>
+            <create_parent_folder>N</create_parent_folder>
+            <doNotOpenNewFileInit>N</doNotOpenNewFileInit>
+          </file>
+          <additional_fields>
+            <json_size_field/>
+          </additional_fields>
+          <key_fields/>
+          <fields>
+            <field>
+              <name>role</name>
+              <element>role</element>
+              <json_fragment>N</json_fragment>
+              <is_without_enclosing>N</is_without_enclosing>
+              <remove_if_blank>Y</remove_if_blank>
+            </field>
+          </fields>
+        </transform>
+        """;
     JsonEOutputMeta meta = new JsonEOutputMeta();
     XmlMetadataUtil.deSerializeFromXml(
         XmlHandler.loadXmlString(xml, TransformMeta.XML_TAG),
@@ -136,7 +138,7 @@ class JsonEOutputMetaTest {
 
     assertNotNull(meta.getOutputFields());
     assertEquals(3, meta.getOutputFields().size());
-    JsonEOutputField f1 = meta.getOutputFields().get(0);
+    JsonEOutputField f1 = meta.getOutputFields().getFirst();
     assertEquals("f1", f1.getFieldName());
     assertEquals("element1", f1.getElementName());
 
diff --git 
a/plugins/transforms/ldap/src/main/java/org/apache/hop/pipeline/transforms/ldapoutput/LdapOutputMeta.java
 
b/plugins/transforms/ldap/src/main/java/org/apache/hop/pipeline/transforms/ldapoutput/LdapOutputMeta.java
index 22a262055d..25acdd4a1a 100644
--- 
a/plugins/transforms/ldap/src/main/java/org/apache/hop/pipeline/transforms/ldapoutput/LdapOutputMeta.java
+++ 
b/plugins/transforms/ldap/src/main/java/org/apache/hop/pipeline/transforms/ldapoutput/LdapOutputMeta.java
@@ -48,8 +48,6 @@ import 
org.apache.hop.pipeline.transforms.ldapinput.LdapProtocolFactory;
 public class LdapOutputMeta extends BaseTransformMeta<LdapOutput, 
LdapOutputData>
     implements ILdapMeta {
   private static final Class<?> PKG = LdapOutputMeta.class;
-  public static final String CONST_SPACES = "        ";
-  public static final String CONST_FIELD = "field";
 
   /**
    * Flag indicating that we use authentication for connection -- GETTER --
@@ -98,10 +96,13 @@ public class LdapOutputMeta extends 
BaseTransformMeta<LdapOutput, LdapOutputData
    * @param port The port to set.
    */
   @HopMetadataProperty(key = "port")
+  @Getter
   private String port;
 
   /** The name of DN field */
   @HopMetadataProperty(key = "dnFieldName")
+  @Getter
+  @Setter
   private String dnFieldName;
 
   /**
@@ -257,17 +258,7 @@ public class LdapOutputMeta extends 
BaseTransformMeta<LdapOutput, LdapOutputData
 
   public static final int DEREFALIASES_TYPE_ALWAYS = 0;
 
-  public static final int DEREFALIASES_TYPE_NEVER = 1;
-
-  public static final int DEREFALIASES_TYPE_SEARCHING = 2;
-
-  public static final int DEREFALIASES_TYPE_FINDING = 3;
-
-  /**
-   * Protocol -- SETTER --
-   *
-   * @param value the protocol to set.
-   */
+  /** Protocol -- SETTER -- */
   @HopMetadataProperty(key = "protocol")
   private String protocol;
 
@@ -529,32 +520,6 @@ public class LdapOutputMeta extends 
BaseTransformMeta<LdapOutput, LdapOutputData
     return this.dnFieldName;
   }
 
-  /**
-   * Setter for metadata serialization - matches field name dnFieldName
-   *
-   * @param value The DN field name to set
-   */
-  public void setDnFieldName(String value) {
-    this.dnFieldName = value;
-  }
-
-  /**
-   * Getter for metadata serialization - matches field name dnFieldName
-   *
-   * @return The DN field name
-   */
-  public String getDnFieldName() {
-    return this.dnFieldName;
-  }
-
-  /**
-   * @return Returns the Port.
-   */
-  @Override
-  public String getPort() {
-    return port;
-  }
-
   @Override
   public Object clone() {
     LdapOutputMeta retval = (LdapOutputMeta) super.clone();
@@ -678,12 +643,14 @@ public class LdapOutputMeta extends 
BaseTransformMeta<LdapOutput, LdapOutputData
               ICheckResult.TYPE_RESULT_ERROR,
               BaseMessages.getString(PKG, 
"LdapOutputUpdateMeta.CheckResult.NoFields"),
               transformMeta);
+      remarks.add(cr);
     } else {
       cr =
           new CheckResult(
               ICheckResult.TYPE_RESULT_OK,
               BaseMessages.getString(PKG, 
"LdapOutputUpdateMeta.CheckResult.FieldsOk"),
               transformMeta);
+      remarks.add(cr);
     }
   }
 
diff --git 
a/plugins/transforms/memgroupby/src/main/java/org/apache/hop/pipeline/transforms/memgroupby/MemoryGroupBy.java
 
b/plugins/transforms/memgroupby/src/main/java/org/apache/hop/pipeline/transforms/memgroupby/MemoryGroupBy.java
index 2485360668..a11ecca4d6 100644
--- 
a/plugins/transforms/memgroupby/src/main/java/org/apache/hop/pipeline/transforms/memgroupby/MemoryGroupBy.java
+++ 
b/plugins/transforms/memgroupby/src/main/java/org/apache/hop/pipeline/transforms/memgroupby/MemoryGroupBy.java
@@ -554,7 +554,7 @@ public class MemoryGroupBy extends 
BaseTransform<MemoryGroupByMeta, MemoryGroupB
   public boolean init() {
 
     if (super.init()) {
-      data.map = new HashMap<>(5000);
+      data.map = HashMap.newHashMap(5000);
       return true;
     }
     return false;
diff --git 
a/plugins/transforms/metainject/src/main/java/org/apache/hop/pipeline/transforms/metainject/MetaInjectDialog.java
 
b/plugins/transforms/metainject/src/main/java/org/apache/hop/pipeline/transforms/metainject/MetaInjectDialog.java
index db14e428df..024cb1dade 100644
--- 
a/plugins/transforms/metainject/src/main/java/org/apache/hop/pipeline/transforms/metainject/MetaInjectDialog.java
+++ 
b/plugins/transforms/metainject/src/main/java/org/apache/hop/pipeline/transforms/metainject/MetaInjectDialog.java
@@ -927,12 +927,6 @@ public class MetaInjectDialog extends BaseTransformDialog {
     }
   }
 
-  /**
-   * @param transformMeta The transform meta
-   * @param transformItem The TreeItem
-   * @param metaInterface The transform ITransformMeta
-   * @return true if there was at least one used key
-   */
   /**
    * Match a tree row to a saved mapping by target transform and injection key 
only. {@link
    * MetaInjectMapping#equals} also compares {@code targetDetail}; older 
pipelines may store {@code
diff --git 
a/plugins/transforms/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputDialog.java
 
b/plugins/transforms/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputDialog.java
index 44ea014201..bd5a5d1f63 100644
--- 
a/plugins/transforms/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputDialog.java
+++ 
b/plugins/transforms/mongodb/src/main/java/org/apache/hop/pipeline/transforms/mongodbinput/MongoDbInputDialog.java
@@ -552,7 +552,7 @@ public class MongoDbInputDialog extends BaseTransformDialog 
{
   }
 
   public void updateFieldTableFields(List<MongoField> fields) {
-    Map<String, MongoField> fieldMap = new HashMap<>(fields.size());
+    Map<String, MongoField> fieldMap = HashMap.newHashMap(fields.size());
     for (MongoField field : fields) {
       fieldMap.put(field.fieldName, field);
     }
diff --git 
a/plugins/transforms/pipelineexecutor/src/test/java/org/apache/hop/pipeline/transforms/pipelineexecutor/PipelineExecutorTest.java
 
b/plugins/transforms/pipelineexecutor/src/test/java/org/apache/hop/pipeline/transforms/pipelineexecutor/PipelineExecutorTest.java
index aed02e600b..88cc9755aa 100644
--- 
a/plugins/transforms/pipelineexecutor/src/test/java/org/apache/hop/pipeline/transforms/pipelineexecutor/PipelineExecutorTest.java
+++ 
b/plugins/transforms/pipelineexecutor/src/test/java/org/apache/hop/pipeline/transforms/pipelineexecutor/PipelineExecutorTest.java
@@ -24,7 +24,6 @@ import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
@@ -120,6 +119,7 @@ class PipelineExecutorTest {
     data.setExecutorPipeline(null);
     PipelineExecutor executor = newExecutor(meta, data);
 
+    assertNotNull(executor);
     executor.discardLogLines(data);
   }
 
@@ -149,7 +149,7 @@ class PipelineExecutorTest {
     PipelineExecutor executor = newExecutor(meta, data);
     executor.passParametersToPipeline(Arrays.asList("1", "from-row"));
 
-    verify(child, atLeastOnce()).setParameterValue(eq("MYPARAM"), 
eq("from-row"));
+    verify(child, atLeastOnce()).setParameterValue("MYPARAM", "from-row");
   }
 
   @Test
@@ -177,7 +177,7 @@ class PipelineExecutorTest {
     PipelineExecutor executor = newExecutor(meta, data);
     executor.passParametersToPipeline(Collections.singletonList("row-id"));
 
-    verify(child, atLeastOnce()).setParameterValue(eq("P"), 
eq("static-value"));
+    verify(child, atLeastOnce()).setParameterValue("P", "static-value");
   }
 
   @Test
@@ -205,7 +205,7 @@ class PipelineExecutorTest {
     PipelineExecutor executor = newExecutor(meta, data);
     executor.passParametersToPipeline(null);
 
-    verify(child, atLeastOnce()).setParameterValue(eq("P"), eq("fallback"));
+    verify(child, atLeastOnce()).setParameterValue("P", "fallback");
   }
 
   @Test
@@ -235,11 +235,12 @@ class PipelineExecutorTest {
     data.setExecutorPipeline(null);
     PipelineExecutor executor = newExecutor(meta, data);
 
+    assertNotNull(executor);
     executor.stopRunning();
   }
 
   @Test
-  void stopAllDelegatesToExecutorWhenPresent() throws HopException {
+  void stopAllDelegatesToExecutorWhenPresent() {
     PipelineExecutorMeta meta = new PipelineExecutorMeta();
     meta.setDefault();
     PipelineExecutorData data = new PipelineExecutorData();
@@ -269,7 +270,7 @@ class PipelineExecutorTest {
   }
 
   @Test
-  void disposeClearsGroupBuffer() throws HopException {
+  void disposeClearsGroupBuffer() {
     PipelineExecutorMeta meta = new PipelineExecutorMeta();
     meta.setDefault();
     PipelineExecutorData data = new PipelineExecutorData();
@@ -283,7 +284,7 @@ class PipelineExecutorTest {
   }
 
   @Test
-  void initFailsWhenStaticFilenameMissing() throws HopException {
+  void initFailsWhenStaticFilenameMissing() {
     PipelineExecutorMeta meta = new PipelineExecutorMeta();
     meta.setDefault();
     meta.setFilenameInField(false);
@@ -295,7 +296,7 @@ class PipelineExecutorTest {
   }
 
   @Test
-  void initSucceedsWhenFilenameComesFromField() throws HopException {
+  void initSucceedsWhenFilenameComesFromField() {
     PipelineExecutorMeta meta = new PipelineExecutorMeta();
     meta.setDefault();
     meta.setFilenameInField(true);
@@ -308,7 +309,7 @@ class PipelineExecutorTest {
   }
 
   @Test
-  void initLoadsChildPipelineFromFilesystemPath() throws HopException, 
URISyntaxException {
+  void initLoadsChildPipelineFromFilesystemPath() throws URISyntaxException {
     String path =
         Paths.get(
                 Objects.requireNonNull(
diff --git 
a/plugins/transforms/textfile/src/main/java/org/apache/hop/pipeline/transforms/textfileoutput/TextFileOutput.java
 
b/plugins/transforms/textfile/src/main/java/org/apache/hop/pipeline/transforms/textfileoutput/TextFileOutput.java
index fbc86f8053..4b2e1b0255 100644
--- 
a/plugins/transforms/textfile/src/main/java/org/apache/hop/pipeline/transforms/textfileoutput/TextFileOutput.java
+++ 
b/plugins/transforms/textfile/src/main/java/org/apache/hop/pipeline/transforms/textfileoutput/TextFileOutput.java
@@ -284,11 +284,11 @@ public class TextFileOutput extends 
BaseTransform<TextFileOutputMeta, TextFileOu
   }
 
   public int getFlushInterval() {
-    String var = variables.getVariable("HOP_FILE_OUTPUT_MAX_STREAM_LIFE");
+    String maxStreamLife = 
variables.getVariable("HOP_FILE_OUTPUT_MAX_STREAM_LIFE");
     int flushInterval = 0;
-    if (var != null) {
+    if (maxStreamLife != null) {
       try {
-        flushInterval = Integer.parseInt(var);
+        flushInterval = Integer.parseInt(maxStreamLife);
       } catch (Exception ex) {
         // Do nothing
       }
@@ -297,11 +297,11 @@ public class TextFileOutput extends 
BaseTransform<TextFileOutputMeta, TextFileOu
   }
 
   public int getMaxOpenFiles() {
-    String var = variables.getVariable("HOP_FILE_OUTPUT_MAX_STREAM_COUNT");
+    String maxStreamCountVar = 
variables.getVariable("HOP_FILE_OUTPUT_MAX_STREAM_COUNT");
     int maxStreamCount = 0;
-    if (var != null) {
+    if (maxStreamCountVar != null) {
       try {
-        maxStreamCount = Integer.parseInt(var);
+        maxStreamCount = Integer.parseInt(maxStreamCountVar);
       } catch (Exception ex) {
         // Do nothing
       }
diff --git 
a/ui/src/main/java/org/apache/hop/ui/core/dialog/PreviewRowsDialog.java 
b/ui/src/main/java/org/apache/hop/ui/core/dialog/PreviewRowsDialog.java
index 6f9fdbd6f2..b5acda619c 100644
--- a/ui/src/main/java/org/apache/hop/ui/core/dialog/PreviewRowsDialog.java
+++ b/ui/src/main/java/org/apache/hop/ui/core/dialog/PreviewRowsDialog.java
@@ -173,8 +173,6 @@ public class PreviewRowsDialog {
     }
 
     shell = new Shell(parentShell, style);
-    PropsUi props = PropsUi.getInstance();
-
     PropsUi.setLook(shell);
     shell.setImage(GuiResource.getInstance().getImageHopUi());
 
@@ -230,15 +228,10 @@ public class PreviewRowsDialog {
     }
 
     // Position the buttons...
-    //
-    bottomButton = buttons.get(0);
+    bottomButton = buttons.getFirst();
     BaseTransformDialog.positionBottomButtons(
         shell, buttons.toArray(new Button[buttons.size()]), 
PropsUi.getMargin(), null);
 
-    if (addFields()) {
-      return;
-    }
-
     KeyListener escapeListener =
         new KeyAdapter() {
           @Override
diff --git 
a/ui/src/main/java/org/apache/hop/ui/hopgui/file/pipeline/HopGuiPipelineGraph.java
 
b/ui/src/main/java/org/apache/hop/ui/hopgui/file/pipeline/HopGuiPipelineGraph.java
index 7eb6d01d05..a34eb405c6 100644
--- 
a/ui/src/main/java/org/apache/hop/ui/hopgui/file/pipeline/HopGuiPipelineGraph.java
+++ 
b/ui/src/main/java/org/apache/hop/ui/hopgui/file/pipeline/HopGuiPipelineGraph.java
@@ -1853,15 +1853,11 @@ public class HopGuiPipelineGraph extends 
HopGuiAbstractGraph
 
   @Override
   public void mouseHover(MouseEvent event) {
-    boolean tip = true;
-
     toolTip.setVisible(false);
     Point real = screen2real(event.x, event.y);
 
     // Show a tool tip upon mouse-over of an object on the canvas
-    if (tip) {
-      setToolTip(real.x, real.y, event.x, event.y);
-    }
+    setToolTip(real.x, real.y, event.x, event.y);
   }
 
   protected void moveSelected(int dx, int dy) {
@@ -3721,9 +3717,6 @@ public class HopGuiPipelineGraph extends 
HopGuiAbstractGraph
   }
 
   public void drawPipelineImage(GC swtGc, int width, int height) {
-
-    if (EnvironmentUtils.getInstance().isWeb()) {}
-
     IGc gc = new SwtGc(swtGc, width, height, iconSize);
     try {
       PropsUi propsUi = PropsUi.getInstance();
@@ -4094,7 +4087,7 @@ public class HopGuiPipelineGraph extends 
HopGuiAbstractGraph
             log, variables, HopExtensionPoint.PipelineAfterSave.id, 
pipelineMeta);
 
         // If we create a new file, refresh the explorer perspective tree
-        // TODO: find a better way to refresh only a partial tree item
+        //  find a better way to refresh only a partial tree item
         if (!fileExist) {
           perspective.refresh();
         }
diff --git 
a/ui/src/main/java/org/apache/hop/ui/hopgui/file/pipeline/PipelineMetricDisplayUtil.java
 
b/ui/src/main/java/org/apache/hop/ui/hopgui/file/pipeline/PipelineMetricDisplayUtil.java
index 128e9df0f7..db2cc6a1a4 100644
--- 
a/ui/src/main/java/org/apache/hop/ui/hopgui/file/pipeline/PipelineMetricDisplayUtil.java
+++ 
b/ui/src/main/java/org/apache/hop/ui/hopgui/file/pipeline/PipelineMetricDisplayUtil.java
@@ -68,29 +68,28 @@ public final class PipelineMetricDisplayUtil {
     if (code == null) {
       return null;
     }
-    switch (code) {
+
+    return switch (code) {
       case Pipeline.METRIC_NAME_INPUT,
-          Pipeline.METRIC_NAME_READ,
-          Pipeline.METRIC_NAME_WRITTEN,
-          Pipeline.METRIC_NAME_OUTPUT,
-          Pipeline.METRIC_NAME_UPDATED,
-          Pipeline.METRIC_NAME_REJECTED,
-          Pipeline.METRIC_NAME_ERROR,
-          Pipeline.METRIC_NAME_BUFFER_IN,
-          Pipeline.METRIC_NAME_BUFFER_OUT:
-        return "rows";
-      case Pipeline.METRIC_NAME_INIT:
-        return "runs";
-      case Pipeline.METRIC_NAME_FLUSH_BUFFER:
-        return "flushes";
-      case Pipeline.METRIC_NAME_DATA_VOLUME:
-        return null; // Cell shows scaled unit (B/KB/MB/GB) via 
formatDataVolume()
-      case Pipeline.METRIC_NAME_DATA_VOLUME_IN:
-      case Pipeline.METRIC_NAME_DATA_VOLUME_OUT:
-        return null; // Cell shows scaled unit (B/KB/MB/GB) via 
formatDataVolume()
-      default:
-        return null;
-    }
+              Pipeline.METRIC_NAME_READ,
+              Pipeline.METRIC_NAME_WRITTEN,
+              Pipeline.METRIC_NAME_OUTPUT,
+              Pipeline.METRIC_NAME_UPDATED,
+              Pipeline.METRIC_NAME_REJECTED,
+              Pipeline.METRIC_NAME_ERROR,
+              Pipeline.METRIC_NAME_BUFFER_IN,
+              Pipeline.METRIC_NAME_BUFFER_OUT ->
+          "rows";
+      case Pipeline.METRIC_NAME_INIT -> "runs";
+      case Pipeline.METRIC_NAME_FLUSH_BUFFER -> "flushes";
+      case Pipeline.METRIC_NAME_DATA_VOLUME ->
+          // Cell shows scaled unit (B/KB/MB/GB) via formatDataVolume()
+          null;
+      case Pipeline.METRIC_NAME_DATA_VOLUME_IN, 
Pipeline.METRIC_NAME_DATA_VOLUME_OUT ->
+          // Cell shows scaled unit (B/KB/MB/GB) via formatDataVolume()
+          null;
+      default -> null;
+    };
   }
 
   /**
diff --git 
a/ui/src/main/java/org/apache/hop/ui/hopgui/file/pipeline/delegates/HopGuiPipelineRunDelegate.java
 
b/ui/src/main/java/org/apache/hop/ui/hopgui/file/pipeline/delegates/HopGuiPipelineRunDelegate.java
index bf65e73937..0543d20514 100644
--- 
a/ui/src/main/java/org/apache/hop/ui/hopgui/file/pipeline/delegates/HopGuiPipelineRunDelegate.java
+++ 
b/ui/src/main/java/org/apache/hop/ui/hopgui/file/pipeline/delegates/HopGuiPipelineRunDelegate.java
@@ -103,11 +103,9 @@ public class HopGuiPipelineRunDelegate {
     if (previewDebug) {
       // Collect the first N rows from selected transforms; 
pause-on-breakpoint is configured per
       // transform in the dialog (TransformDebugMeta#setPausingOnBreakPoint).
-      pipelineDebugMeta = pipelinePreviewDebugMetaMap.get(pipelineMeta);
-      if (pipelineDebugMeta == null) {
-        pipelineDebugMeta = new PipelineDebugMeta(pipelineMeta);
-        pipelinePreviewDebugMetaMap.put(pipelineMeta, pipelineDebugMeta);
-      }
+      pipelineDebugMeta =
+          pipelinePreviewDebugMetaMap.computeIfAbsent(pipelineMeta, 
PipelineDebugMeta::new);
+
       // Reset execution-state flag from any previous run so the finished 
listener
       // is not silently skipped when the same PipelineDebugMeta object is 
reused.
       pipelineDebugMeta.setStopClosePressed(false);
diff --git 
a/ui/src/main/java/org/apache/hop/ui/hopgui/perspective/explorer/ExplorerPerspective.java
 
b/ui/src/main/java/org/apache/hop/ui/hopgui/perspective/explorer/ExplorerPerspective.java
index 85dbd270d4..faaf434e03 100644
--- 
a/ui/src/main/java/org/apache/hop/ui/hopgui/perspective/explorer/ExplorerPerspective.java
+++ 
b/ui/src/main/java/org/apache/hop/ui/hopgui/perspective/explorer/ExplorerPerspective.java
@@ -1035,7 +1035,7 @@ public class ExplorerPerspective implements 
IHopPerspective, TabClosable, IFileD
   private static String toDisplayPath(String path, String projectHome) {
     if (!StringUtils.isEmpty(projectHome) && path.startsWith(projectHome)) {
       String rel = path.substring(projectHome.length());
-      return "${PROJECT_HOME}" + (rel.startsWith("/") ? rel : "/" + rel);
+      return Const.VAR_PROJECT_HOME + (rel.startsWith("/") ? rel : "/" + rel);
     }
     return path;
   }
@@ -1047,9 +1047,9 @@ public class ExplorerPerspective implements 
IHopPerspective, TabClosable, IFileD
    */
   private boolean confirmDeleteWithReferenceCheck(List<String> filePaths, 
String displayName)
       throws HopException {
-    String projectHome = hopGui.getVariables().resolve("${PROJECT_HOME}");
+    String projectHome = hopGui.getVariables().resolve(Const.VAR_PROJECT_HOME);
     List<String> searchRoots =
-        (!Utils.isEmpty(projectHome) && !"${PROJECT_HOME}".equals(projectHome))
+        (!Utils.isEmpty(projectHome) && 
!Const.VAR_PROJECT_HOME.equals(projectHome))
             ? List.of(projectHome)
             : Collections.emptyList();
 
@@ -1146,21 +1146,20 @@ public class ExplorerPerspective implements 
IHopPerspective, TabClosable, IFileD
             PKG, 
"ExplorerPerspective.DeleteFile.WithReferences.Button.Details"));
     wDetails.addListener(
         SWT.Selection,
-        e -> {
-          new DetailsDialog(
-                  shell,
-                  BaseMessages.getString(
-                      PKG,
-                      
"ExplorerPerspective.DeleteFile.WithReferences.Details.Title",
-                      displayName),
-                  GuiResource.getInstance().getImageHop(),
-                  BaseMessages.getString(
-                      PKG,
-                      
"ExplorerPerspective.DeleteFile.WithReferences.Details.Message",
-                      displayName),
-                  String.join(Const.CR, detailLines))
-              .open();
-        });
+        e ->
+            new DetailsDialog(
+                    shell,
+                    BaseMessages.getString(
+                        PKG,
+                        
"ExplorerPerspective.DeleteFile.WithReferences.Details.Title",
+                        displayName),
+                    GuiResource.getInstance().getImageHop(),
+                    BaseMessages.getString(
+                        PKG,
+                        
"ExplorerPerspective.DeleteFile.WithReferences.Details.Message",
+                        displayName),
+                    String.join(Const.CR, detailLines))
+                .open());
     Button wNo = new Button(shell, SWT.PUSH);
     PropsUi.setLook(wNo);
     wNo.setText(BaseMessages.getString("System.Button.No"));
@@ -1518,8 +1517,8 @@ public class ExplorerPerspective implements 
IHopPerspective, TabClosable, IFileD
     if (oldPaths == null || newPaths == null || oldPaths.size() != 
newPaths.size()) {
       return;
     }
-    String projectHome = hopGui.getVariables().resolve("${PROJECT_HOME}");
-    if (Utils.isEmpty(projectHome) || "${PROJECT_HOME}".equals(projectHome)) {
+    String projectHome = hopGui.getVariables().resolve(Const.VAR_PROJECT_HOME);
+    if (Utils.isEmpty(projectHome) || 
Const.VAR_PROJECT_HOME.equals(projectHome)) {
       return;
     }
     List<String> searchRoots = 
java.util.Collections.singletonList(projectHome);
@@ -1528,7 +1527,6 @@ public class ExplorerPerspective implements 
IHopPerspective, TabClosable, IFileD
       Map<String, String> oldToNew = new HashMap<>();
 
       // File references (pipeline/workflow files referencing the renamed file)
-      List<MetadataReferenceResult> allFileRefs = new ArrayList<>();
       java.util.Set<String> allFilePaths = new java.util.HashSet<>();
       int totalFileRefCount = 0;
 
@@ -1550,9 +1548,7 @@ public class ExplorerPerspective implements 
IHopPerspective, TabClosable, IFileD
             finder.findFileReferences(searchRoots, oldPath, 
hopGui.getVariables());
         for (MetadataReferenceResult r : refs) {
           totalFileRefCount += r.getReferenceCount();
-          if (allFilePaths.add(r.getFilePath())) {
-            allFileRefs.add(r);
-          }
+          allFilePaths.add(r.getFilePath());
         }
 
         // Find references in metadata objects (resolve variables so 
${PROJECT_HOME}/... matches)
@@ -2853,7 +2849,7 @@ public class ExplorerPerspective implements 
IHopPerspective, TabClosable, IFileD
 
   public IHopFileType getFileType(String path) throws HopException {
 
-    // TODO: get this list from the plugin registry...
+    // get this list from the plugin registry...
     //
     for (IHopFileType hopFileType : fileTypes) {
       // Only look at the extension of the file
diff --git 
a/ui/src/main/java/org/apache/hop/ui/hopgui/perspective/metadata/MetadataPerspective.java
 
b/ui/src/main/java/org/apache/hop/ui/hopgui/perspective/metadata/MetadataPerspective.java
index de3ec739e8..39f77b52a4 100644
--- 
a/ui/src/main/java/org/apache/hop/ui/hopgui/perspective/metadata/MetadataPerspective.java
+++ 
b/ui/src/main/java/org/apache/hop/ui/hopgui/perspective/metadata/MetadataPerspective.java
@@ -924,21 +924,15 @@ public class MetadataPerspective implements 
IHopPerspective, TabClosable, IMetad
     }
   }
 
-  /**
-   * If the metadata type supports global replace, finds references to oldName 
in pipeline/workflow
-   * files, optionally shows the update dialog, and replaces references with 
newName. Reloads open
-   * tabs for modified files. Call this when a metadata element is renamed 
(from tree or from
-   * editor).
-   *
-   * @param objectKey metadata type key (e.g. "rdbms", "restconnection")
-   * @param oldName the name before rename
-   * @param newName the name after rename
-   */
   /**
    * Finds references to {@code oldName} in pipelines/workflows and other 
metadata, asks the user to
    * update them, and performs the replacement. Returns {@code true} if the 
operation completed (or
    * there was nothing to do), {@code false} if the user cancelled a 
save-changes dialog and the
    * caller should abort its own operation too.
+   *
+   * @param objectKey metadata type key (e.g. "rdbms", "reconnection")
+   * @param oldName the name before rename
+   * @param newName the name after rename
    */
   public boolean performGlobalReplaceIfSupported(String objectKey, String 
oldName, String newName)
       throws HopException {
@@ -962,8 +956,8 @@ public class MetadataPerspective implements 
IHopPerspective, TabClosable, IMetad
       return true;
     }
     List<String> searchRoots = new ArrayList<>();
-    String projectHome = hopGui.getVariables().resolve("${PROJECT_HOME}");
-    if (Utils.isEmpty(projectHome) || "${PROJECT_HOME}".equals(projectHome)) {
+    String projectHome = hopGui.getVariables().resolve(Const.VAR_PROJECT_HOME);
+    if (Utils.isEmpty(projectHome) || 
Const.VAR_PROJECT_HOME.equals(projectHome)) {
       return true;
     }
     searchRoots.add(projectHome);
@@ -1378,10 +1372,10 @@ public class MetadataPerspective implements 
IHopPerspective, TabClosable, IMetad
     try {
       // Check for references in pipelines/workflows and other metadata objects
       MetadataReferenceFinder finder = new 
MetadataReferenceFinder(hopGui.getMetadataProvider());
-      String projectHome = hopGui.getVariables().resolve("${PROJECT_HOME}");
+      String projectHome = 
hopGui.getVariables().resolve(Const.VAR_PROJECT_HOME);
       List<MetadataReferenceResult> fileRefs = Collections.emptyList();
       if 
(MetadataRefactorUtil.supportsGlobalReplace(hopGui.getMetadataProvider(), 
objectKey)) {
-        if (!Utils.isEmpty(projectHome) && 
!"${PROJECT_HOME}".equals(projectHome)) {
+        if (!Utils.isEmpty(projectHome) && 
!Const.VAR_PROJECT_HOME.equals(projectHome)) {
           fileRefs = finder.findReferences(objectKey, objectName, 
List.of(projectHome));
         }
       }
@@ -1440,7 +1434,7 @@ public class MetadataPerspective implements 
IHopPerspective, TabClosable, IMetad
   private static String toDisplayPath(String path, String projectHome) {
     if (!Utils.isEmpty(projectHome) && path.startsWith(projectHome)) {
       String rel = path.substring(projectHome.length());
-      return "${PROJECT_HOME}" + (rel.startsWith("/") ? rel : "/" + rel);
+      return Const.VAR_PROJECT_HOME + (rel.startsWith("/") ? rel : "/" + rel);
     }
     return path;
   }

Reply via email to