You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hop.apache.org by ha...@apache.org on 2023/03/14 12:19:46 UTC

[hop] branch master updated: Fix Start Action can have conditional output #2545

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

hansva pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hop.git


The following commit(s) were added to refs/heads/master by this push:
     new 8f7c52da86 Fix Start Action can have conditional output #2545
     new 2debbb695f Merge pull request #2551 from nadment/2545
8f7c52da86 is described below

commit 8f7c52da86f96b8f00ca2f29ee8e2dfa3575fd05
Author: Nicolas Adment <39...@users.noreply.github.com>
AuthorDate: Fri Mar 10 22:06:00 2023 +0100

    Fix Start Action can have conditional output #2545
    
    - Cleanup hop serialization
---
 .../main/java/org/apache/hop/base/BaseHopMeta.java | 18 +++++++-
 .../org/apache/hop/pipeline/PipelineHopMeta.java   | 33 +++++---------
 .../org/apache/hop/workflow/WorkflowHopMeta.java   | 51 ++++++++--------------
 .../workflow/context/HopGuiWorkflowHopContext.java | 24 +++++++++-
 4 files changed, 66 insertions(+), 60 deletions(-)

diff --git a/engine/src/main/java/org/apache/hop/base/BaseHopMeta.java b/engine/src/main/java/org/apache/hop/base/BaseHopMeta.java
index 8572930e00..9307f949e2 100644
--- a/engine/src/main/java/org/apache/hop/base/BaseHopMeta.java
+++ b/engine/src/main/java/org/apache/hop/base/BaseHopMeta.java
@@ -16,12 +16,18 @@
  */
 package org.apache.hop.base;
 
+import org.apache.hop.core.xml.XmlHandler;
+import org.w3c.dom.Node;
+
 /**
  * This class defines a base hop from one action copy to another, or from one transform to another.
  */
 public abstract class BaseHopMeta<T> {
-  public static final String XML_TAG = "hop";
-
+  public static final String XML_HOP_TAG = "hop";
+  public static final String XML_FROM_TAG = "from";
+  public static final String XML_TO_TAG = "to";
+  public static final String XML_ENABLED_TAG = "enabled";
+  
   public boolean split = false;
   protected T from;
   protected T to;
@@ -89,4 +95,12 @@ public abstract class BaseHopMeta<T> {
   public void setSplit(boolean split) {
     this.split = split;
   }
+  
+  protected boolean getTagValueAsBoolean(final Node node, final String tag, final boolean defaultValue) {
+    String value = XmlHandler.getTagValue(node, tag);
+    if (value == null) {
+      return defaultValue;
+    }
+    return value.equalsIgnoreCase("Y");
+  }
 }
diff --git a/engine/src/main/java/org/apache/hop/pipeline/PipelineHopMeta.java b/engine/src/main/java/org/apache/hop/pipeline/PipelineHopMeta.java
index c24a6a8833..4692449689 100644
--- a/engine/src/main/java/org/apache/hop/pipeline/PipelineHopMeta.java
+++ b/engine/src/main/java/org/apache/hop/pipeline/PipelineHopMeta.java
@@ -33,20 +33,16 @@ public class PipelineHopMeta extends BaseHopMeta<TransformMeta>
     implements Comparable<PipelineHopMeta>, Cloneable {
   private static final Class<?> PKG = Pipeline.class; // For Translator
 
-  public static final String XML_HOP_TAG = "hop";
-  public static final String XML_FROM_TAG = "from";
-  public static final String XML_TO_TAG = "to";
-
   public PipelineHopMeta(TransformMeta from, TransformMeta to, boolean en) {
     this.from = from;
     this.to = to;
-    enabled = en;
+    this.enabled = en;
   }
 
   public PipelineHopMeta(TransformMeta from, TransformMeta to) {
     this.from = from;
     this.to = to;
-    enabled = true;
+    this.enabled = true;
   }
 
   public PipelineHopMeta() {
@@ -55,18 +51,11 @@ public class PipelineHopMeta extends BaseHopMeta<TransformMeta>
 
   public PipelineHopMeta(Node hopNode, List<TransformMeta> transforms) throws HopXmlException {
     try {
-      this.from =
-          searchTransform(
-              transforms, XmlHandler.getTagValue(hopNode, PipelineHopMeta.XML_FROM_TAG));
+      this.from = searchTransform(transforms,
+          XmlHandler.getTagValue(hopNode, XML_FROM_TAG));
       this.to =
-          searchTransform(transforms, XmlHandler.getTagValue(hopNode, PipelineHopMeta.XML_TO_TAG));
-      String en = XmlHandler.getTagValue(hopNode, "enabled");
-
-      if (en == null) {
-        enabled = true;
-      } else {
-        enabled = en.equalsIgnoreCase("Y");
-      }
+          searchTransform(transforms, XmlHandler.getTagValue(hopNode, XML_TO_TAG));
+      this.enabled = getTagValueAsBoolean(hopNode, XML_ENABLED_TAG, true);    
     } catch (Exception e) {
       throw new HopXmlException(
           BaseMessages.getString(PKG, "PipelineHopMeta.Exception.UnableToLoadHopInfo"), e);
@@ -148,13 +137,13 @@ public class PipelineHopMeta extends BaseHopMeta<TransformMeta>
     StringBuilder xml = new StringBuilder(200);
 
     if (this.from != null && this.to != null) {
-      xml.append("    ").append(XmlHandler.openTag(XML_TAG)).append(Const.CR);
+      xml.append("    ").append(XmlHandler.openTag(XML_HOP_TAG)).append(Const.CR);
       xml.append("      ")
-          .append(XmlHandler.addTagValue(PipelineHopMeta.XML_FROM_TAG, this.from.getName()));
+          .append(XmlHandler.addTagValue(XML_FROM_TAG, this.from.getName()));
       xml.append("      ")
-          .append(XmlHandler.addTagValue(PipelineHopMeta.XML_TO_TAG, this.to.getName()));
-      xml.append("      ").append(XmlHandler.addTagValue("enabled", enabled));
-      xml.append("    ").append(XmlHandler.closeTag(XML_TAG)).append(Const.CR);
+          .append(XmlHandler.addTagValue(XML_TO_TAG, this.to.getName()));
+      xml.append("      ").append(XmlHandler.addTagValue(XML_ENABLED_TAG, enabled));
+      xml.append("    ").append(XmlHandler.closeTag(XML_HOP_TAG)).append(Const.CR);
     }
 
     return xml.toString();
diff --git a/engine/src/main/java/org/apache/hop/workflow/WorkflowHopMeta.java b/engine/src/main/java/org/apache/hop/workflow/WorkflowHopMeta.java
index 7649a9dc03..9273f09ae6 100644
--- a/engine/src/main/java/org/apache/hop/workflow/WorkflowHopMeta.java
+++ b/engine/src/main/java/org/apache/hop/workflow/WorkflowHopMeta.java
@@ -31,9 +31,9 @@ import java.util.List;
 public class WorkflowHopMeta extends BaseHopMeta<ActionMeta> implements Cloneable {
   private static final Class<?> PKG = WorkflowHopMeta.class; // For Translator
 
-  public static final String XML_FROM_TAG = "from";
-  public static final String XML_TO_TAG = "to";
-
+  public static final String XML_EVALUATION_TAG = "evaluation";
+  public static final String XML_UNCONDITIONAL_TAG = "unconditional";
+  
   private boolean evaluation;
   private boolean unconditional;
 
@@ -68,16 +68,11 @@ public class WorkflowHopMeta extends BaseHopMeta<ActionMeta> implements Cloneabl
 
   public WorkflowHopMeta(Node hopNode, List<ActionMeta> actions) throws HopXmlException {
     try {
-      this.from =
-          searchAction(actions, XmlHandler.getTagValue(hopNode, WorkflowHopMeta.XML_FROM_TAG));
-      this.to = searchAction(actions, XmlHandler.getTagValue(hopNode, WorkflowHopMeta.XML_TO_TAG));
-      String en = XmlHandler.getTagValue(hopNode, "enabled");
-
-      if (en == null) {
-        enabled = true;
-      } else {
-        enabled = en.equalsIgnoreCase("Y");
-      }
+      this.from = searchAction(actions, XmlHandler.getTagValue(hopNode, XML_FROM_TAG));
+      this.to = searchAction(actions, XmlHandler.getTagValue(hopNode, XML_TO_TAG));
+      this.enabled = getTagValueAsBoolean(hopNode, XML_ENABLED_TAG, true);
+      this.evaluation = getTagValueAsBoolean(hopNode, XML_EVALUATION_TAG, true);
+      this.unconditional = getTagValueAsBoolean(hopNode, XML_UNCONDITIONAL_TAG, false);
     } catch (Exception e) {
       throw new HopXmlException(
           BaseMessages.getString(PKG, "WorkflowHopMeta.Exception.UnableToLoadHopInfo"), e);
@@ -111,24 +106,12 @@ public class WorkflowHopMeta extends BaseHopMeta<ActionMeta> implements Cloneabl
     try {
       String fromName = XmlHandler.getTagValue(hopNode, XML_FROM_TAG);
       String toName = XmlHandler.getTagValue(hopNode, XML_TO_TAG);
-      String sEnabled = XmlHandler.getTagValue(hopNode, "enabled");
-      String sEvaluation = XmlHandler.getTagValue(hopNode, "evaluation");
-      String sUnconditional = XmlHandler.getTagValue(hopNode, "unconditional");
-
+      
       this.from = workflow.findAction(fromName);
       this.to = workflow.findAction(toName);
-
-      if (sEnabled == null) {
-        enabled = true;
-      } else {
-        enabled = "Y".equalsIgnoreCase(sEnabled);
-      }
-      if (sEvaluation == null) {
-        evaluation = true;
-      } else {
-        evaluation = "Y".equalsIgnoreCase(sEvaluation);
-      }
-      unconditional = "Y".equalsIgnoreCase(sUnconditional);
+      this.enabled = getTagValueAsBoolean(hopNode, XML_ENABLED_TAG, true);
+      this.evaluation = getTagValueAsBoolean(hopNode, XML_EVALUATION_TAG, true);
+      this.unconditional = getTagValueAsBoolean(hopNode, XML_UNCONDITIONAL_TAG, false); 
     } catch (Exception e) {
       throw new HopXmlException(
           BaseMessages.getString(PKG, "WorkflowHopMeta.Exception.UnableToLoadHopInfoXML"), e);
@@ -138,13 +121,13 @@ public class WorkflowHopMeta extends BaseHopMeta<ActionMeta> implements Cloneabl
   public String getXml() {
     StringBuilder xml = new StringBuilder(200);
     if ((null != this.from) && (null != this.to)) {
-      xml.append("    ").append(XmlHandler.openTag(XML_TAG)).append(Const.CR);
+      xml.append("    ").append(XmlHandler.openTag(XML_HOP_TAG)).append(Const.CR);
       xml.append("      ").append(XmlHandler.addTagValue(XML_FROM_TAG, this.from.getName()));
       xml.append("      ").append(XmlHandler.addTagValue(XML_TO_TAG, this.to.getName()));
-      xml.append("      ").append(XmlHandler.addTagValue("enabled", enabled));
-      xml.append("      ").append(XmlHandler.addTagValue("evaluation", evaluation));
-      xml.append("      ").append(XmlHandler.addTagValue("unconditional", unconditional));
-      xml.append("    ").append(XmlHandler.closeTag(XML_TAG)).append(Const.CR);
+      xml.append("      ").append(XmlHandler.addTagValue(XML_ENABLED_TAG, this.enabled));
+      xml.append("      ").append(XmlHandler.addTagValue(XML_EVALUATION_TAG, this.evaluation));
+      xml.append("      ").append(XmlHandler.addTagValue(XML_UNCONDITIONAL_TAG, this.unconditional));
+      xml.append("    ").append(XmlHandler.closeTag(XML_HOP_TAG)).append(Const.CR);
     }
 
     return xml.toString();
diff --git a/ui/src/main/java/org/apache/hop/ui/hopgui/file/workflow/context/HopGuiWorkflowHopContext.java b/ui/src/main/java/org/apache/hop/ui/hopgui/file/workflow/context/HopGuiWorkflowHopContext.java
index 1a5bbce64c..b14f3bcf34 100644
--- a/ui/src/main/java/org/apache/hop/ui/hopgui/file/workflow/context/HopGuiWorkflowHopContext.java
+++ b/ui/src/main/java/org/apache/hop/ui/hopgui/file/workflow/context/HopGuiWorkflowHopContext.java
@@ -20,6 +20,7 @@ package org.apache.hop.ui.hopgui.file.workflow.context;
 import org.apache.hop.core.gui.Point;
 import org.apache.hop.core.gui.plugin.action.GuiAction;
 import org.apache.hop.core.gui.plugin.action.GuiActionLambdaBuilder;
+import org.apache.hop.core.util.TranslateUtil;
 import org.apache.hop.ui.hopgui.context.BaseGuiContextHandler;
 import org.apache.hop.ui.hopgui.context.IGuiContextHandler;
 import org.apache.hop.ui.hopgui.file.workflow.HopGuiWorkflowGraph;
@@ -33,6 +34,8 @@ public class HopGuiWorkflowHopContext extends BaseGuiContextHandler implements I
 
   public static final String CONTEXT_ID = "HopGuiWorkflowHopContext";
 
+  private static String ROUTING_CATEGORY = TranslateUtil.translate("i18n::HopGuiWorkflowGraph.ContextualAction.Category.Routing.Text", HopGuiWorkflowGraph.class);
+  
   private WorkflowMeta workflowMeta;
   private WorkflowHopMeta hopMeta;
   private HopGuiWorkflowGraph workflowGraph;
@@ -70,14 +73,31 @@ public class HopGuiWorkflowHopContext extends BaseGuiContextHandler implements I
     //
     List<GuiAction> pluginActions = getPluginActions(true);
     if (pluginActions != null) {
-      for (GuiAction pluginAction : pluginActions) {
-        actions.add(lambdaBuilder.createLambda(pluginAction, this, workflowGraph));
+      for (GuiAction pluginAction : pluginActions) {              
+        if ( isGuiActionAvailable(pluginAction)  ) {
+          actions.add(lambdaBuilder.createLambda(pluginAction, this, workflowGraph));
+        }
       }
     }
 
     return actions;
   }
 
+  protected boolean isGuiActionAvailable(final GuiAction guiAction) {
+    if (hopMeta==null) {
+      return false;
+    }
+    
+    // Filter routing action on the first hop after Start
+    //
+    // TODO: Find a more robust way to detect routing actions 
+    if ( hopMeta.getFromAction().isStart() && guiAction.getCategory().equals(ROUTING_CATEGORY) ) {
+      return false;
+    }
+    
+    return true;
+  }
+  
   /**
    * Gets workflowMeta
    *