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 6a15ebdd75 issue #2753 : make default run configuration flag exclusive 
(#7732)
6a15ebdd75 is described below

commit 6a15ebdd75884be1b3c7b63f98d5007a4c9b43d9
Author: Matt Casters <[email protected]>
AuthorDate: Mon Aug 3 08:56:07 2026 +0200

    issue #2753 : make default run configuration flag exclusive (#7732)
    
    When a pipeline or workflow run configuration is saved as default,
    clear the default flag on all other configurations of the same type
    so only one default remains. No user warning is shown.
---
 .../pipeline/config/PipelineRunConfiguration.java  | 24 +++++++
 .../workflow/config/WorkflowRunConfiguration.java  | 24 +++++++
 .../PipelineRunConfigurationDefaultTest.java       | 81 ++++++++++++++++++++++
 .../WorkflowRunConfigurationDefaultTest.java       | 81 ++++++++++++++++++++++
 .../config/PipelineRunConfigurationEditor.java     |  7 ++
 .../config/WorkflowRunConfigurationEditor.java     |  7 ++
 6 files changed, 224 insertions(+)

diff --git 
a/engine/src/main/java/org/apache/hop/pipeline/config/PipelineRunConfiguration.java
 
b/engine/src/main/java/org/apache/hop/pipeline/config/PipelineRunConfiguration.java
index 992b85b712..0592bad915 100644
--- 
a/engine/src/main/java/org/apache/hop/pipeline/config/PipelineRunConfiguration.java
+++ 
b/engine/src/main/java/org/apache/hop/pipeline/config/PipelineRunConfiguration.java
@@ -19,6 +19,7 @@ package org.apache.hop.pipeline.config;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.hop.core.exception.HopException;
 import org.apache.hop.core.variables.DescribedVariable;
@@ -31,6 +32,7 @@ import org.apache.hop.metadata.api.HopMetadataProperty;
 import org.apache.hop.metadata.api.HopMetadataPropertyType;
 import org.apache.hop.metadata.api.IHopMetadata;
 import org.apache.hop.metadata.api.IHopMetadataProvider;
+import org.apache.hop.metadata.api.IHopMetadataSerializer;
 
 @HopMetadata(
     key = "pipeline-run-configuration",
@@ -233,4 +235,26 @@ public class PipelineRunConfiguration extends 
HopMetadataBase implements Cloneab
 
     return null;
   }
+
+  /**
+   * Clear the default flag on every pipeline run configuration except the one 
named {@code
+   * keepName}, and save those updates. Ensures at most one default after the 
named configuration is
+   * saved as default.
+   *
+   * @param metadataProvider the metadata provider
+   * @param keepName name of the run configuration that should remain (or 
become) the default
+   * @throws HopException if metadata cannot be loaded or saved
+   */
+  public static void clearDefaultFlagFromOthers(
+      IHopMetadataProvider metadataProvider, String keepName) throws 
HopException {
+    IHopMetadataSerializer<PipelineRunConfiguration> serializer =
+        metadataProvider.getSerializer(PipelineRunConfiguration.class);
+    for (PipelineRunConfiguration runConfiguration : serializer.loadAll()) {
+      if (runConfiguration.isDefaultSelection()
+          && !Objects.equals(runConfiguration.getName(), keepName)) {
+        runConfiguration.setDefaultSelection(false);
+        serializer.save(runConfiguration);
+      }
+    }
+  }
 }
diff --git 
a/engine/src/main/java/org/apache/hop/workflow/config/WorkflowRunConfiguration.java
 
b/engine/src/main/java/org/apache/hop/workflow/config/WorkflowRunConfiguration.java
index c6a45bcd85..f1c69dec49 100644
--- 
a/engine/src/main/java/org/apache/hop/workflow/config/WorkflowRunConfiguration.java
+++ 
b/engine/src/main/java/org/apache/hop/workflow/config/WorkflowRunConfiguration.java
@@ -17,6 +17,7 @@
 
 package org.apache.hop.workflow.config;
 
+import java.util.Objects;
 import org.apache.hop.core.exception.HopException;
 import org.apache.hop.metadata.api.HopMetadata;
 import org.apache.hop.metadata.api.HopMetadataBase;
@@ -25,6 +26,7 @@ import org.apache.hop.metadata.api.HopMetadataProperty;
 import org.apache.hop.metadata.api.HopMetadataPropertyType;
 import org.apache.hop.metadata.api.IHopMetadata;
 import org.apache.hop.metadata.api.IHopMetadataProvider;
+import org.apache.hop.metadata.api.IHopMetadataSerializer;
 
 @HopMetadata(
     key = "workflow-run-configuration",
@@ -168,4 +170,26 @@ public class WorkflowRunConfiguration extends 
HopMetadataBase implements Cloneab
 
     return null;
   }
+
+  /**
+   * Clear the default flag on every workflow run configuration except the one 
named {@code
+   * keepName}, and save those updates. Ensures at most one default after the 
named configuration is
+   * saved as default.
+   *
+   * @param metadataProvider the metadata provider
+   * @param keepName name of the run configuration that should remain (or 
become) the default
+   * @throws HopException if metadata cannot be loaded or saved
+   */
+  public static void clearDefaultFlagFromOthers(
+      IHopMetadataProvider metadataProvider, String keepName) throws 
HopException {
+    IHopMetadataSerializer<WorkflowRunConfiguration> serializer =
+        metadataProvider.getSerializer(WorkflowRunConfiguration.class);
+    for (WorkflowRunConfiguration runConfiguration : serializer.loadAll()) {
+      if (runConfiguration.isDefaultSelection()
+          && !Objects.equals(runConfiguration.getName(), keepName)) {
+        runConfiguration.setDefaultSelection(false);
+        serializer.save(runConfiguration);
+      }
+    }
+  }
 }
diff --git 
a/engine/src/test/java/org/apache/hop/pipeline/config/PipelineRunConfigurationDefaultTest.java
 
b/engine/src/test/java/org/apache/hop/pipeline/config/PipelineRunConfigurationDefaultTest.java
new file mode 100644
index 0000000000..08f6583d18
--- /dev/null
+++ 
b/engine/src/test/java/org/apache/hop/pipeline/config/PipelineRunConfigurationDefaultTest.java
@@ -0,0 +1,81 @@
+/*
+ * 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.pipeline.config;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.apache.hop.metadata.api.IHopMetadataSerializer;
+import org.apache.hop.metadata.serializer.memory.MemoryMetadataProvider;
+import org.junit.jupiter.api.Test;
+
+/** Ensures at most one pipeline run configuration keeps the default flag 
(issue #2753). */
+class PipelineRunConfigurationDefaultTest {
+
+  @Test
+  void clearDefaultFlagFromOthersClearsOtherDefaults() throws Exception {
+    MemoryMetadataProvider metadataProvider = new MemoryMetadataProvider();
+    IHopMetadataSerializer<PipelineRunConfiguration> serializer =
+        metadataProvider.getSerializer(PipelineRunConfiguration.class);
+
+    serializer.save(config("A", true));
+    serializer.save(config("B", true));
+    serializer.save(config("C", false));
+
+    PipelineRunConfiguration.clearDefaultFlagFromOthers(metadataProvider, "B");
+
+    assertFalse(serializer.load("A").isDefaultSelection());
+    assertTrue(serializer.load("B").isDefaultSelection());
+    assertFalse(serializer.load("C").isDefaultSelection());
+  }
+
+  @Test
+  void clearDefaultFlagFromOthersLeavesMatchingDefault() throws Exception {
+    MemoryMetadataProvider metadataProvider = new MemoryMetadataProvider();
+    IHopMetadataSerializer<PipelineRunConfiguration> serializer =
+        metadataProvider.getSerializer(PipelineRunConfiguration.class);
+
+    serializer.save(config("only-default", true));
+
+    PipelineRunConfiguration.clearDefaultFlagFromOthers(metadataProvider, 
"only-default");
+
+    assertTrue(serializer.load("only-default").isDefaultSelection());
+  }
+
+  @Test
+  void clearDefaultFlagFromOthersDoesNotTouchNonDefaults() throws Exception {
+    MemoryMetadataProvider metadataProvider = new MemoryMetadataProvider();
+    IHopMetadataSerializer<PipelineRunConfiguration> serializer =
+        metadataProvider.getSerializer(PipelineRunConfiguration.class);
+
+    serializer.save(config("A", false));
+    serializer.save(config("B", false));
+
+    PipelineRunConfiguration.clearDefaultFlagFromOthers(metadataProvider, "B");
+
+    assertFalse(serializer.load("A").isDefaultSelection());
+    assertFalse(serializer.load("B").isDefaultSelection());
+  }
+
+  private static PipelineRunConfiguration config(String name, boolean 
defaultSelection) {
+    PipelineRunConfiguration configuration = new PipelineRunConfiguration();
+    configuration.setName(name);
+    configuration.setDefaultSelection(defaultSelection);
+    return configuration;
+  }
+}
diff --git 
a/engine/src/test/java/org/apache/hop/workflow/config/WorkflowRunConfigurationDefaultTest.java
 
b/engine/src/test/java/org/apache/hop/workflow/config/WorkflowRunConfigurationDefaultTest.java
new file mode 100644
index 0000000000..b228038256
--- /dev/null
+++ 
b/engine/src/test/java/org/apache/hop/workflow/config/WorkflowRunConfigurationDefaultTest.java
@@ -0,0 +1,81 @@
+/*
+ * 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.workflow.config;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.apache.hop.metadata.api.IHopMetadataSerializer;
+import org.apache.hop.metadata.serializer.memory.MemoryMetadataProvider;
+import org.junit.jupiter.api.Test;
+
+/** Ensures at most one workflow run configuration keeps the default flag 
(issue #2753). */
+class WorkflowRunConfigurationDefaultTest {
+
+  @Test
+  void clearDefaultFlagFromOthersClearsOtherDefaults() throws Exception {
+    MemoryMetadataProvider metadataProvider = new MemoryMetadataProvider();
+    IHopMetadataSerializer<WorkflowRunConfiguration> serializer =
+        metadataProvider.getSerializer(WorkflowRunConfiguration.class);
+
+    serializer.save(config("A", true));
+    serializer.save(config("B", true));
+    serializer.save(config("C", false));
+
+    WorkflowRunConfiguration.clearDefaultFlagFromOthers(metadataProvider, "B");
+
+    assertFalse(serializer.load("A").isDefaultSelection());
+    assertTrue(serializer.load("B").isDefaultSelection());
+    assertFalse(serializer.load("C").isDefaultSelection());
+  }
+
+  @Test
+  void clearDefaultFlagFromOthersLeavesMatchingDefault() throws Exception {
+    MemoryMetadataProvider metadataProvider = new MemoryMetadataProvider();
+    IHopMetadataSerializer<WorkflowRunConfiguration> serializer =
+        metadataProvider.getSerializer(WorkflowRunConfiguration.class);
+
+    serializer.save(config("only-default", true));
+
+    WorkflowRunConfiguration.clearDefaultFlagFromOthers(metadataProvider, 
"only-default");
+
+    assertTrue(serializer.load("only-default").isDefaultSelection());
+  }
+
+  @Test
+  void clearDefaultFlagFromOthersDoesNotTouchNonDefaults() throws Exception {
+    MemoryMetadataProvider metadataProvider = new MemoryMetadataProvider();
+    IHopMetadataSerializer<WorkflowRunConfiguration> serializer =
+        metadataProvider.getSerializer(WorkflowRunConfiguration.class);
+
+    serializer.save(config("A", false));
+    serializer.save(config("B", false));
+
+    WorkflowRunConfiguration.clearDefaultFlagFromOthers(metadataProvider, "B");
+
+    assertFalse(serializer.load("A").isDefaultSelection());
+    assertFalse(serializer.load("B").isDefaultSelection());
+  }
+
+  private static WorkflowRunConfiguration config(String name, boolean 
defaultSelection) {
+    WorkflowRunConfiguration configuration = new WorkflowRunConfiguration();
+    configuration.setName(name);
+    configuration.setDefaultSelection(defaultSelection);
+    return configuration;
+  }
+}
diff --git 
a/ui/src/main/java/org/apache/hop/ui/pipeline/config/PipelineRunConfigurationEditor.java
 
b/ui/src/main/java/org/apache/hop/ui/pipeline/config/PipelineRunConfigurationEditor.java
index bdbffb1fbe..815c91c69e 100644
--- 
a/ui/src/main/java/org/apache/hop/ui/pipeline/config/PipelineRunConfigurationEditor.java
+++ 
b/ui/src/main/java/org/apache/hop/ui/pipeline/config/PipelineRunConfigurationEditor.java
@@ -530,6 +530,13 @@ public class PipelineRunConfigurationEditor extends 
MetadataEditor<PipelineRunCo
   public void save() throws HopException {
     changeWorkingEngineConfiguration(runConfiguration);
 
+    // Make this the exclusive default when the default flag is set (issue 
#2753).
+    getWidgetsContent(getMetadata());
+    if (getMetadata().isDefaultSelection()) {
+      PipelineRunConfiguration.clearDefaultFlagFromOthers(
+          manager.getMetadataProvider(), getMetadata().getName());
+    }
+
     super.save();
   }
 
diff --git 
a/ui/src/main/java/org/apache/hop/ui/workflow/config/WorkflowRunConfigurationEditor.java
 
b/ui/src/main/java/org/apache/hop/ui/workflow/config/WorkflowRunConfigurationEditor.java
index 7414e9ade3..1b765ef2bb 100644
--- 
a/ui/src/main/java/org/apache/hop/ui/workflow/config/WorkflowRunConfigurationEditor.java
+++ 
b/ui/src/main/java/org/apache/hop/ui/workflow/config/WorkflowRunConfigurationEditor.java
@@ -334,6 +334,13 @@ public class WorkflowRunConfigurationEditor extends 
MetadataEditor<WorkflowRunCo
   public void save() throws HopException {
     changeWorkingEngineConfiguration(runConfiguration);
 
+    // Make this the exclusive default when the default flag is set (issue 
#2753).
+    getWidgetsContent(getMetadata());
+    if (getMetadata().isDefaultSelection()) {
+      WorkflowRunConfiguration.clearDefaultFlagFromOthers(
+          manager.getMetadataProvider(), getMetadata().getName());
+    }
+
     super.save();
   }
 

Reply via email to