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 2022/09/14 12:34:14 UTC

[hop] branch master updated: HOP-4182 MDI support to Number range transform - Store metadata for bounds as String instead of double - Indirectly fix HOP-3598 Adds zero decimal after any whole number input - Move bounds validation to check function - Fix some translation

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 7cb567670b HOP-4182 MDI support to Number range transform - Store metadata for bounds as String instead of double - Indirectly fix HOP-3598 Adds zero decimal after any whole number input - Move bounds validation to check function - Fix some translation
     new 939c7f081f Merge pull request #1672 from nadment/HOP-4182
7cb567670b is described below

commit 7cb567670b7a0a5137aef497312c5c08c69a71ad
Author: Nicolas Adment <39...@users.noreply.github.com>
AuthorDate: Sun Sep 4 15:10:14 2022 +0200

    HOP-4182 MDI support to Number range transform
    - Store metadata for bounds as String instead of double
    - Indirectly fix HOP-3598 Adds zero decimal after any whole number input
    - Move bounds validation to check function
    - Fix some translation
---
 .../normaliser/messages/messages_fr_FR.properties  |   4 +-
 .../transforms/numberrange/NumberRange.java        |   5 +
 .../transforms/numberrange/NumberRangeDialog.java  |  79 +++++---------
 .../transforms/numberrange/NumberRangeMeta.java    | 116 ++++++++-------------
 .../transforms/numberrange/NumberRangeRule.java    |  59 +++++++++--
 .../transforms/numberrange/NumberRangeSet.java     |  13 ---
 .../numberrange/messages/messages_en_US.properties |  37 ++++---
 .../numberrange/messages/messages_es_AR.properties |  19 ++--
 .../numberrange/messages/messages_fr_FR.properties |  39 ++++---
 .../numberrange/messages/messages_it_IT.properties |  19 ++--
 .../numberrange/messages/messages_ja_JP.properties |  21 ++--
 .../numberrange/messages/messages_ko_KR.properties |  21 ++--
 .../numberrange/messages/messages_zh_CN.properties |  22 ++--
 .../numberrange/NumberRangeMetaTest.java           |   2 +-
 14 files changed, 230 insertions(+), 226 deletions(-)

diff --git a/plugins/transforms/normaliser/src/main/resources/org/apache/hop/pipeline/transforms/normaliser/messages/messages_fr_FR.properties b/plugins/transforms/normaliser/src/main/resources/org/apache/hop/pipeline/transforms/normaliser/messages/messages_fr_FR.properties
index dbb09ec40f..e2716d56d4 100644
--- a/plugins/transforms/normaliser/src/main/resources/org/apache/hop/pipeline/transforms/normaliser/messages/messages_fr_FR.properties
+++ b/plugins/transforms/normaliser/src/main/resources/org/apache/hop/pipeline/transforms/normaliser/messages/messages_fr_FR.properties
@@ -32,9 +32,9 @@ NormaliserDialog.FailedToGetFields.DialogMessage=Impossible de r\u00E9cup\u00E9r
 Normaliser.Log.CouldNotFindFieldInRow=Impossible de trouver le champ [{0} dans la ligne!
 Normaliser.Log.LineNumber=N\u00B0Ligne 
 NormaliserMeta.Exception.UnableToLoadTransformMetaFromXML=Impossible de charger la transformation depuis le fichier XML
-NormaliserMeta.CheckResult.TransformReceivingFieldsOK=La transformation est connect\u00E9 aux transformations pr\u00E9c\u00E9dentes er r\u00E9cup\u00E800E8re {0} champs
+NormaliserMeta.CheckResult.TransformReceivingFieldsOK=La transformation est connect\u00E9 aux transformations pr\u00E9c\u00E9dentes et r\u00E9cup\u00E8re {0} champs
 NormaliserMeta.CheckResult.FieldsNotFound=Les champs \u00E0 normaliser sont introuvables dans le flux d''entr\u00E9e:
 NormaliserMeta.CheckResult.AllFieldsFound=Tous les champs \u00E0 normaliser ont \u00E9t\u00E9 trouv\u00E9s dans le flux d''entr\u00E9e.
 NormaliserMeta.CheckResult.CouldNotReadFieldsFromPreviousTransform=Impossible de lire les champs depuis la transformation pr\u00E9c\u00E9dente.
-NormaliserMeta.CheckResult.TransformReceivingInfoOK=La transformation re\u00E7oit des informations des aures transformations.
+NormaliserMeta.CheckResult.TransformReceivingInfoOK=La transformation re\u00E7oit des informations des autres transformations.
 NormaliserMeta.CheckResult.NoInputReceivedError=Aucun flux d''entr\u00E9e en provenance des autres transformations\!
diff --git a/plugins/transforms/numberrange/src/main/java/org/apache/hop/pipeline/transforms/numberrange/NumberRange.java b/plugins/transforms/numberrange/src/main/java/org/apache/hop/pipeline/transforms/numberrange/NumberRange.java
index 2211e3bb10..1fad115c93 100644
--- a/plugins/transforms/numberrange/src/main/java/org/apache/hop/pipeline/transforms/numberrange/NumberRange.java
+++ b/plugins/transforms/numberrange/src/main/java/org/apache/hop/pipeline/transforms/numberrange/NumberRange.java
@@ -53,6 +53,11 @@ public class NumberRange extends BaseTransform<NumberRangeMeta, NumberRangeData>
     if (first) {
       first = false;
 
+      // Prepare lower and upper bound 
+      for (NumberRangeRule rule : meta.getRules()) {
+        rule.init();
+      }
+      
       numberRange = new NumberRangeSet(meta.getRules(), meta.getFallBackValue());
       data.outputRowMeta = getInputRowMeta().clone();
       // Prepare output fields
diff --git a/plugins/transforms/numberrange/src/main/java/org/apache/hop/pipeline/transforms/numberrange/NumberRangeDialog.java b/plugins/transforms/numberrange/src/main/java/org/apache/hop/pipeline/transforms/numberrange/NumberRangeDialog.java
index 70b6ece593..14fe97b327 100644
--- a/plugins/transforms/numberrange/src/main/java/org/apache/hop/pipeline/transforms/numberrange/NumberRangeDialog.java
+++ b/plugins/transforms/numberrange/src/main/java/org/apache/hop/pipeline/transforms/numberrange/NumberRangeDialog.java
@@ -74,27 +74,27 @@ public class NumberRangeDialog extends BaseTransformDialog implements ITransform
     formLayout.marginHeight = Const.FORM_MARGIN;
 
     shell.setLayout(formLayout);
-    shell.setText(BaseMessages.getString(PKG, "NumberRange.TypeLongDesc"));
+    shell.setText(BaseMessages.getString(PKG, "NumberRangeDialog.Title"));
 
     // Some buttons at the bottom
     wOk = new Button(shell, SWT.PUSH);
-    wOk.setText("OK");
+    wOk.setText(BaseMessages.getString(PKG, "System.Button.OK"));
     wOk.addListener(SWT.Selection, e -> ok());
     wCancel = new Button(shell, SWT.PUSH);
-    wCancel.setText("Cancel");
+    wCancel.setText(BaseMessages.getString(PKG, "System.Button.Cancel"));
     wCancel.addListener(SWT.Selection, e -> cancel());
     BaseTransformDialog.positionBottomButtons(
         shell, new Button[] {wOk, wCancel}, props.getMargin(), null);
 
     // Create controls
     wTransformName =
-        createLine(lsMod, BaseMessages.getString(PKG, "NumberRange.TransformName"), null);
+        createLine(lsMod, BaseMessages.getString(PKG, "NumberRangeDialog.TransformName"), null);
     inputFieldControl =
         createLineCombo(
-            lsMod, BaseMessages.getString(PKG, "NumberRange.InputField"), wTransformName);
+            lsMod, BaseMessages.getString(PKG, "NumberRangeDialog.InputField"), wTransformName);
     outputFieldControl =
         createLine(
-            lsMod, BaseMessages.getString(PKG, "NumberRange.OutputField"), inputFieldControl);
+            lsMod, BaseMessages.getString(PKG, "NumberRangeDialog.OutputField"), inputFieldControl);
 
     inputFieldControl.addFocusListener(
         new FocusListener() {
@@ -112,7 +112,7 @@ public class NumberRangeDialog extends BaseTransformDialog implements ITransform
         });
     fallBackValueControl =
         createLine(
-            lsMod, BaseMessages.getString(PKG, "NumberRange.DefaultValue"), outputFieldControl);
+            lsMod, BaseMessages.getString(PKG, "NumberRangeDialog.DefaultValue"), outputFieldControl);
 
     createRulesTable(lsMod);
 
@@ -127,7 +127,7 @@ public class NumberRangeDialog extends BaseTransformDialog implements ITransform
   /** Creates the table of rules */
   private void createRulesTable(ModifyListener lsMod) {
     Label rulesLable = new Label(shell, SWT.NONE);
-    rulesLable.setText(BaseMessages.getString(PKG, "NumberRange.Ranges"));
+    rulesLable.setText(BaseMessages.getString(PKG, "NumberRangeDialog.Ranges"));
     props.setLook(rulesLable);
     FormData lableFormData = new FormData();
     lableFormData.left = new FormAttachment(0, 0);
@@ -140,17 +140,17 @@ public class NumberRangeDialog extends BaseTransformDialog implements ITransform
     ColumnInfo[] colinf = new ColumnInfo[3];
     colinf[0] =
         new ColumnInfo(
-            BaseMessages.getString(PKG, "NumberRange.LowerBound"),
+            BaseMessages.getString(PKG, "NumberRangeDialog.LowerBound"),
             ColumnInfo.COLUMN_TYPE_TEXT,
             false);
     colinf[1] =
         new ColumnInfo(
-            BaseMessages.getString(PKG, "NumberRange.UpperBound"),
+            BaseMessages.getString(PKG, "NumberRangeDialog.UpperBound"),
             ColumnInfo.COLUMN_TYPE_TEXT,
             false);
     colinf[2] =
         new ColumnInfo(
-            BaseMessages.getString(PKG, "NumberRange.Value"), ColumnInfo.COLUMN_TYPE_TEXT, false);
+            BaseMessages.getString(PKG, "NumberRangeDialog.Value"), ColumnInfo.COLUMN_TYPE_TEXT, false);
 
     rulesControl =
         new TableView(
@@ -260,20 +260,9 @@ public class NumberRangeDialog extends BaseTransformDialog implements ITransform
     for (int i = 0; i < input.getRules().size(); i++) {
       NumberRangeRule rule = input.getRules().get(i);
       TableItem item = rulesControl.table.getItem(i);
-
-      // Empty value is equal to minimal possible value
-      if (rule.getLowerBound() > -Double.MAX_VALUE) {
-        String lowerBoundStr = String.valueOf(rule.getLowerBound());
-        item.setText(1, lowerBoundStr);
-      }
-
-      // Empty value is equal to maximal possible value
-      if (rule.getUpperBound() < Double.MAX_VALUE) {
-        String upperBoundStr = String.valueOf(rule.getUpperBound());
-        item.setText(2, upperBoundStr);
-      }
-
-      item.setText(3, rule.getValue());
+      item.setText(1, Const.NVL(rule.getLowerBound(),""));
+      item.setText(2, Const.NVL(rule.getUpperBound(),""));
+      item.setText(3, Const.NVL(rule.getValue(),""));
     }
     rulesControl.setRowNums();
     rulesControl.optWidth(true);
@@ -292,40 +281,20 @@ public class NumberRangeDialog extends BaseTransformDialog implements ITransform
 
     transformName = wTransformName.getText(); // return value
 
-    String inputField = inputFieldControl.getText();
-    input.setInputField(inputField);
+    input.setInputField(inputFieldControl.getText());
+    input.setOutputField(outputFieldControl.getText());   
+    input.setFallBackValue(fallBackValueControl.getText());
 
     input.emptyRules();
 
-    String fallBackValue = fallBackValueControl.getText();
-    input.setFallBackValue(fallBackValue);
-
-    input.setOutputField(outputFieldControl.getText());
-
     int count = rulesControl.nrNonEmpty();
     for (int i = 0; i < count; i++) {
       TableItem item = rulesControl.getNonEmpty(i);
-      String lowerBoundStr =
-          Utils.isEmpty(item.getText(1)) ? String.valueOf(-Double.MAX_VALUE) : item.getText(1);
-      String upperBoundStr =
-          Utils.isEmpty(item.getText(2)) ? String.valueOf(Double.MAX_VALUE) : item.getText(2);
+      String lowerBoundStr = item.getText(1);
+      String upperBoundStr = item.getText(2);
       String value = item.getText(3);
-
-      try {
-        double lowerBound = Double.parseDouble(lowerBoundStr);
-        double upperBound = Double.parseDouble(upperBoundStr);
-
-        input.addRule(lowerBound, upperBound, value);
-      } catch (NumberFormatException e) {
-        throw new IllegalArgumentException(
-            "Bounds of this rule are not numeric: lowerBound="
-                + lowerBoundStr
-                + ", upperBound="
-                + upperBoundStr
-                + ", value="
-                + value,
-            e);
-      }
+      
+      input.addRule(lowerBoundStr, upperBoundStr, value);
     }
 
     dispose();
@@ -347,7 +316,11 @@ public class NumberRangeDialog extends BaseTransformDialog implements ITransform
 
     } catch (HopException ke) {
       new ErrorDialog(
-          shell, BaseMessages.getString(PKG, "NumberRange.TypeLongDesc"), "Can't get fields", ke);
+          shell, 
+          BaseMessages.getString(PKG, "NumberRangeDialog.Title"), 
+          BaseMessages.getString(PKG, "NumberRangeDialog.FailedToGetFields.DialogMessage"),
+          ke);
     }
   }
 }
+
diff --git a/plugins/transforms/numberrange/src/main/java/org/apache/hop/pipeline/transforms/numberrange/NumberRangeMeta.java b/plugins/transforms/numberrange/src/main/java/org/apache/hop/pipeline/transforms/numberrange/NumberRangeMeta.java
index 2b6ccd635d..46c4b269f2 100644
--- a/plugins/transforms/numberrange/src/main/java/org/apache/hop/pipeline/transforms/numberrange/NumberRangeMeta.java
+++ b/plugins/transforms/numberrange/src/main/java/org/apache/hop/pipeline/transforms/numberrange/NumberRangeMeta.java
@@ -18,77 +18,56 @@
 package org.apache.hop.pipeline.transforms.numberrange;
 
 import org.apache.hop.core.CheckResult;
-import org.apache.hop.core.Const;
 import org.apache.hop.core.ICheckResult;
 import org.apache.hop.core.annotations.Transform;
 import org.apache.hop.core.exception.HopTransformException;
-import org.apache.hop.core.exception.HopXmlException;
 import org.apache.hop.core.row.IRowMeta;
 import org.apache.hop.core.row.IValueMeta;
 import org.apache.hop.core.row.value.ValueMetaString;
+import org.apache.hop.core.util.Utils;
 import org.apache.hop.core.variables.IVariables;
-import org.apache.hop.core.xml.XmlHandler;
+import org.apache.hop.i18n.BaseMessages;
+import org.apache.hop.metadata.api.HopMetadataProperty;
 import org.apache.hop.metadata.api.IHopMetadataProvider;
 import org.apache.hop.pipeline.PipelineMeta;
 import org.apache.hop.pipeline.transform.BaseTransformMeta;
 import org.apache.hop.pipeline.transform.TransformMeta;
-import org.w3c.dom.Node;
-
 import java.util.LinkedList;
 import java.util.List;
 
 @Transform(
     id = "NumberRange",
     image = "numberrange.svg",
-    name = "i18n::BaseTransform.TypeLongDesc.NumberRange",
-    description = "i18n::BaseTransform.TypeTooltipDesc.NumberRange",
+    name = "i18n::NumberRange.Name",
+    description = "i18n::NumberRange.Description",
     categoryDescription = "i18n:org.apache.hop.pipeline.transform:BaseTransform.Category.Transform",
-    keywords = "i18n::NumberRangeMeta.keyword",
+    keywords = "i18n::NumberRange.Keyword",
     documentationUrl = "/pipeline/transforms/numberrange.html")
 public class NumberRangeMeta extends BaseTransformMeta<NumberRange, NumberRangeData> {
 
+  private static final Class<?> PKG = NumberRangeMeta.class; // For Translator
+  
+  @HopMetadataProperty(key ="inputField", injectionKey = "INPUT_FIELD", injectionKeyDescription = "NumberRangeMeta.Injection.INPUT_FIELD")
   private String inputField;
 
+  @HopMetadataProperty(key ="outputField", injectionKey = "OUTPUT_FIELD", injectionKeyDescription = "NumberRangeMeta.Injection.OUTPUT_FIELD")
   private String outputField;
 
+  @HopMetadataProperty(key ="fallBackValue", injectionKey = "FALL_BACK_VALUE", injectionKeyDescription = "NumberRangeMeta.Injection.FALL_BACK_VALUE")
   private String fallBackValue;
 
+  @HopMetadataProperty(groupKey = "rules", key = "rule", injectionGroupKey = "RULES", injectionGroupDescription = "NumberRangeMeta.Injection.RULES")
   private List<NumberRangeRule> rules;
 
   public NumberRangeMeta() {
     super();
+    rules = new LinkedList<>();
   }
 
   public void emptyRules() {
     rules = new LinkedList<>();
   }
 
-  public NumberRangeMeta(Node transformNode, IHopMetadataProvider metadataProvider)
-      throws HopXmlException {
-    loadXml(transformNode, metadataProvider);
-  }
-
-  @Override
-  public String getXml() {
-    StringBuilder retval = new StringBuilder();
-
-    retval.append("    ").append(XmlHandler.addTagValue("inputField", inputField));
-    retval.append("    ").append(XmlHandler.addTagValue("outputField", outputField));
-    retval.append("    ").append(XmlHandler.addTagValue("fallBackValue", getFallBackValue()));
-
-    retval.append("    <rules>").append(Const.CR);
-    for (NumberRangeRule rule : rules) {
-      retval.append("      <rule>").append(Const.CR);
-      retval.append("        ").append(XmlHandler.addTagValue("lower_bound", rule.getLowerBound()));
-      retval.append("        ").append(XmlHandler.addTagValue("upper_bound", rule.getUpperBound()));
-      retval.append("        ").append(XmlHandler.addTagValue("value", rule.getValue()));
-      retval.append("      </rule>").append(Const.CR);
-    }
-    retval.append("    </rules>").append(Const.CR);
-
-    return retval.toString();
-  }
-
   @Override
   public void getFields(
       IRowMeta row,
@@ -110,44 +89,13 @@ public class NumberRangeMeta extends BaseTransformMeta<NumberRange, NumberRangeD
     return retval;
   }
 
-  @Override
-  public void loadXml(Node transformNode, IHopMetadataProvider metadataProvider)
-      throws HopXmlException {
-    try {
-      inputField = XmlHandler.getTagValue(transformNode, "inputField");
-      outputField = XmlHandler.getTagValue(transformNode, "outputField");
-
-      emptyRules();
-      String fallBackValue = XmlHandler.getTagValue(transformNode, "fallBackValue");
-      setFallBackValue(fallBackValue);
-
-      Node fields = XmlHandler.getSubNode(transformNode, "rules");
-      int count = XmlHandler.countNodes(fields, "rule");
-      for (int i = 0; i < count; i++) {
-
-        Node fnode = XmlHandler.getSubNodeByNr(fields, "rule", i);
-
-        String lowerBoundStr = XmlHandler.getTagValue(fnode, "lower_bound");
-        String upperBoundStr = XmlHandler.getTagValue(fnode, "upper_bound");
-        String value = XmlHandler.getTagValue(fnode, "value");
-
-        double lowerBound = Double.parseDouble(lowerBoundStr);
-        double upperBound = Double.parseDouble(upperBoundStr);
-        addRule(lowerBound, upperBound, value);
-      }
-
-    } catch (Exception e) {
-      throw new HopXmlException("Unable to read transform info from XML node", e);
-    }
-  }
-
   @Override
   public void setDefault() {
     emptyRules();
     setFallBackValue("unknown");
-    addRule(-Double.MAX_VALUE, 5, "Less than 5");
-    addRule(5, 10, "5-10");
-    addRule(10, Double.MAX_VALUE, "More than 10");
+    addRule("", "5", "Less than 5");
+    addRule("5", "10", "5-10");
+    addRule("10", "", "More than 10");
     inputField = "";
     outputField = "range";
   }
@@ -168,14 +116,16 @@ public class NumberRangeMeta extends BaseTransformMeta<NumberRange, NumberRangeD
       cr =
           new CheckResult(
               CheckResult.TYPE_RESULT_WARNING,
-              "Not receiving any fields from previous transforms!",
+              BaseMessages.getString(
+                  PKG, "NumberRangeMeta.CheckResult.CouldNotReadFieldsFromPreviousTransform"),
               transforminfo);
       remarks.add(cr);
     } else {
       cr =
           new CheckResult(
               ICheckResult.TYPE_RESULT_OK,
-              "Transform is connected to previous one, receiving " + prev.size() + " fields",
+              BaseMessages.getString(
+                  PKG, "NumberRangeMeta.CheckResult.TransformReceivingFieldsOK", prev.size() + ""),
               transforminfo);
       remarks.add(cr);
     }
@@ -185,17 +135,36 @@ public class NumberRangeMeta extends BaseTransformMeta<NumberRange, NumberRangeD
       cr =
           new CheckResult(
               ICheckResult.TYPE_RESULT_OK,
-              "Transform is receiving info from other transforms.",
+              BaseMessages.getString(PKG, "NumberRangeMeta.CheckResult.TransformReceivingInfoOK"),
               transforminfo);
       remarks.add(cr);
     } else {
       cr =
           new CheckResult(
               ICheckResult.TYPE_RESULT_ERROR,
-              "No input received from other transforms!",
+              BaseMessages.getString(PKG, "NumberRangeMeta.CheckResult.NoInputReceivedError"),
               transforminfo);
       remarks.add(cr);
     }
+    
+    // Check that the lower and upper bounds are numerics    
+    for (NumberRangeRule rule : this.rules) {
+      try {
+        if (!Utils.isEmpty(rule.getLowerBound())) {
+          Double.valueOf(rule.getLowerBound());
+        }
+        if (!Utils.isEmpty(rule.getUpperBound())) {
+          Double.valueOf(rule.getUpperBound());
+        }
+      } catch (NumberFormatException e) {
+        cr = new CheckResult(
+                ICheckResult.TYPE_RESULT_ERROR,                
+                BaseMessages.getString(
+                    PKG, "NumberRangeMeta.CheckResult.NotNumericRule", rule.getLowerBound(), rule.getUpperBound(), rule.getValue()),
+                transforminfo);
+        remarks.add(cr);
+      }
+    }
   }
 
   public String getInputField() {
@@ -226,9 +195,10 @@ public class NumberRangeMeta extends BaseTransformMeta<NumberRange, NumberRangeD
     this.fallBackValue = fallBackValue;
   }
 
-  public void addRule(double lowerBound, double upperBound, String value) {
+  public NumberRangeRule addRule(String lowerBound, String upperBound, String value) {
     NumberRangeRule rule = new NumberRangeRule(lowerBound, upperBound, value);
     rules.add(rule);
+    return rule;
   }
 
   public void setRules(List<NumberRangeRule> rules) {
diff --git a/plugins/transforms/numberrange/src/main/java/org/apache/hop/pipeline/transforms/numberrange/NumberRangeRule.java b/plugins/transforms/numberrange/src/main/java/org/apache/hop/pipeline/transforms/numberrange/NumberRangeRule.java
index afa22cd585..af116986f9 100644
--- a/plugins/transforms/numberrange/src/main/java/org/apache/hop/pipeline/transforms/numberrange/NumberRangeRule.java
+++ b/plugins/transforms/numberrange/src/main/java/org/apache/hop/pipeline/transforms/numberrange/NumberRangeRule.java
@@ -17,33 +17,64 @@
 
 package org.apache.hop.pipeline.transforms.numberrange;
 
+import org.apache.hop.core.util.Utils;
+import org.apache.hop.metadata.api.HopMetadataProperty;
 import java.util.Objects;
 
 /** Contains one rule for a number range */
 public class NumberRangeRule {
 
   /** Lower bound for which the rule matches (lowerBound <= x) */
-  private double lowerBound;
+  @HopMetadataProperty(key ="lower_bound", injectionKey = "LOWER_BOUND", injectionKeyDescription = "NumberRangeMeta.Injection.LOWER_BOUND")
+  private String lowerBound;
 
   /** Upper bound for which the rule matches (x < upperBound) */
-  private double upperBound;
+  @HopMetadataProperty(key ="upper_bound", injectionKey = "UPPER_BOUND", injectionKeyDescription = "NumberRangeMeta.Injection.UPPER_BOUND")
+  private String upperBound;
 
   /** Value that is returned if the number to be tested is within the range */
+  @HopMetadataProperty(key ="value", injectionKey = "VALUE", injectionKeyDescription = "NumberRangeMeta.Injection.VALUE")
   private String value;
+  
+  private double lowerBoundValue;
+  private double upperBoundValue;
 
-  public NumberRangeRule(double lowerBound, double upperBound, String value) {
+  public NumberRangeRule() {
+
+  }
+  
+  public NumberRangeRule(String lowerBound, String upperBound, String value) {
     this.lowerBound = lowerBound;
     this.upperBound = upperBound;
     this.value = value;
   }
+  
+  public void init() {
+    try {
+      // Empty value is equal to minimal possible value
+      if (Utils.isEmpty(this.lowerBound))
+        this.lowerBoundValue = -Double.MAX_VALUE;
+      else
+        this.lowerBoundValue = Double.valueOf(lowerBound);
 
+      // Empty value is equal to maximal possible value
+      if (Utils.isEmpty(this.upperBound))
+        this.upperBoundValue = Double.MAX_VALUE;
+      else
+        this.upperBoundValue = Double.valueOf(upperBound);
+    } catch (NumberFormatException e) {
+      throw new IllegalArgumentException("Bounds of this rule are not numeric: lowerBound="
+          + lowerBound + ", upperBound=" + upperBound + ", value=" + value, e);
+    }
+  }
+  
   /**
    * Evaluates if the current value is within the range. If so, it returns the value. Otherwise it
    * returns null.
    */
   public String evaluate(double compareValue) {
     // Check if the value is within the range
-    if ((compareValue >= lowerBound) && (compareValue < upperBound)) {
+    if ((compareValue >= lowerBoundValue) && (compareValue < upperBoundValue)) {
       return value;
     }
 
@@ -51,14 +82,26 @@ public class NumberRangeRule {
     return null;
   }
 
-  public double getLowerBound() {
+  public void setLowerBound(String value) {
+    this.lowerBound = value;
+  }
+  
+  public String getLowerBound() {
     return lowerBound;
   }
 
-  public double getUpperBound() {
+  public void setUpperBound(String value) {
+    this.upperBound = value;;
+  }
+  
+  public String getUpperBound() {
     return upperBound;
   }
 
+  public void setValue(String value) {
+    this.value = value;
+  }
+  
   public String getValue() {
     return value;
   }
@@ -69,8 +112,8 @@ public class NumberRangeRule {
       return false;
     } else {
       NumberRangeRule target = (NumberRangeRule) obj;
-      return getLowerBound() == target.getLowerBound()
-          && getUpperBound() == target.getUpperBound()
+      return getLowerBound().equals(target.getLowerBound())
+          && getUpperBound().equals(target.getUpperBound())
           && getValue().equals(target.getValue());
     }
   }
diff --git a/plugins/transforms/numberrange/src/main/java/org/apache/hop/pipeline/transforms/numberrange/NumberRangeSet.java b/plugins/transforms/numberrange/src/main/java/org/apache/hop/pipeline/transforms/numberrange/NumberRangeSet.java
index 09f72f5d68..1453dfa488 100644
--- a/plugins/transforms/numberrange/src/main/java/org/apache/hop/pipeline/transforms/numberrange/NumberRangeSet.java
+++ b/plugins/transforms/numberrange/src/main/java/org/apache/hop/pipeline/transforms/numberrange/NumberRangeSet.java
@@ -64,19 +64,6 @@ public class NumberRangeSet {
     return MULTI_VALUE_SEPARATOR;
   }
 
-  /** Evaluates a value against all rules. Return empty value if input is not numeric. */
-  public String evaluate(String strValue) throws HopException {
-    if (strValue != null) {
-      // Try to parse value to double
-      try {
-        double doubleValue = Double.parseDouble(strValue);
-        return evaluate(doubleValue);
-      } catch (Exception e) {
-        throw new HopException(e);
-      }
-    }
-    return fallBackValue;
-  }
 
   /** Evaluates a value against all rules. Return empty value if input is not numeric. */
   public String evaluate(Double value) throws HopException {
diff --git a/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_en_US.properties b/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_en_US.properties
index cbd3ecbb91..bbfce12d25 100644
--- a/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_en_US.properties
+++ b/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_en_US.properties
@@ -14,17 +14,30 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-BaseTransform.TypeLongDesc.NumberRange=Number range
-BaseTransform.TypeTooltipDesc.NumberRange=Create ranges based on numeric field
-NumberRange.TypeLongDesc=Number range
-NumberRange.TransformName=Transform name:
-NumberRange.InputField=Input field:
-NumberRange.OutputField=Output field:
-NumberRange.DefaultValue=Default value(if no range matches):
-NumberRange.Ranges=Ranges (min <= x< max):
-NumberRange.LowerBound=Lower Bound
-NumberRange.UpperBound=Upper Bound
-NumberRange.Value=Value
+NumberRange.Name=Number range
+NumberRange.Description=Create ranges based on numeric field
+NumberRange.Keyword=number,range
+NumberRangeDialog.Title=Number range
+NumberRangeDialog.TransformName=Transform name:
+NumberRangeDialog.InputField=Input field:
+NumberRangeDialog.OutputField=Output field:
+NumberRangeDialog.DefaultValue=Default value (if no range matches):
+NumberRangeDialog.Ranges=Ranges (min <= x< max):
+NumberRangeDialog.LowerBound=Lower bound
+NumberRangeDialog.UpperBound=Upper bound
+NumberRangeDialog.Value=Value
+NumberRangeDialog.FailedToGetFields.DialogMessage=Unable to get fields from previous transforms because of an error
 NumberRange.Log.LineNumber=linenr 
 NumberRange.Log.ErrorInTransformRunning=Because of an error, this transform can''t continue: 
-NumberRangeMeta.keyword=number,range
\ No newline at end of file
+NumberRangeMeta.Injection.INPUT_FIELD=Input field
+NumberRangeMeta.Injection.OUTPUT_FIELD=Output field
+NumberRangeMeta.Injection.FALL_BACK_VALUE=Default value (if no range matches)
+NumberRangeMeta.Injection.RULES=Rules
+NumberRangeMeta.Injection.LOWER_BOUND=Lower bound
+NumberRangeMeta.Injection.UPPER_BOUND=Upper bound
+NumberRangeMeta.Injection.VALUE=Value
+NumberRangeMeta.CheckResult.TransformReceivingFieldsOK=Transform is connected to previous one, receiving {0} fields
+NumberRangeMeta.CheckResult.CouldNotReadFieldsFromPreviousTransform=Couldn''t read fields from the previous transform
+NumberRangeMeta.CheckResult.TransformReceivingInfoOK=Transform is receiving info from other transforms
+NumberRangeMeta.CheckResult.NoInputReceivedError=No input received from other transforms
+NumberRangeMeta.CheckResult.NotNumericRule=Bounds of this rule are not numeric: lowerBound={0}, upperBound={1}, value={2}
\ No newline at end of file
diff --git a/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_es_AR.properties b/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_es_AR.properties
index a7f2582067..7ee8892af2 100644
--- a/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_es_AR.properties
+++ b/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_es_AR.properties
@@ -17,14 +17,15 @@
 #
 #
 #
-NumberRange.UpperBound=L\u00EDmite superior
+NumberRange.Name=Rangos de n\u00FAmeros
+NumberRangeDialog.UpperBound=L\u00EDmite superior
 NumberRange.Log.LineNumber=Nro. de \u013A\u00EDnea\:
-NumberRange.OutputField=Campo de salida
-NumberRange.Ranges=RAngos (min <\= x < max)
+NumberRangeDialog.OutputField=Campo de salida
+NumberRangeDialog.Ranges=RAngos (min <\= x < max)
 NumberRange.Log.ErrorInTransformRunning=Este paso no puede continuar debido a un error\:
-NumberRange.Value=Valor
-NumberRange.LowerBound=L\u00EDmite inferior
-NumberRange.DefaultValue=Valor por defecto (si no hay coincidencia)\:
-NumberRange.InputField=Campo de entrada\:
-NumberRange.TransformName=Nombre del paso\:
-NumberRange.TypeLongDesc=Rangos de n\u00FAmeros
+NumberRangeDialog.Value=Valor
+NumberRangeDialog.LowerBound=L\u00EDmite inferior
+NumberRangeDialog.DefaultValue=Valor por defecto (si no hay coincidencia)\:
+NumberRangeDialog.InputField=Campo de entrada\:
+NumberRangeDialog.TransformName=Nombre del paso\:
+
diff --git a/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_fr_FR.properties b/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_fr_FR.properties
index 3108882d79..55c89c9635 100644
--- a/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_fr_FR.properties
+++ b/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_fr_FR.properties
@@ -17,16 +17,29 @@
 #
 #
 #
-BaseTransform.TypeLongDesc.NumberRange=Cr\u00E9ation plages de nombres
-BaseTransform.TypeTooltipDesc.NumberRange=Cr\u00E9ation de plages de nombres
-NumberRange.TypeLongDesc=Cr\u00E9ation plages de nombres
-NumberRange.TransformName=Nom de la transformation
-NumberRange.InputField=Champ source
-NumberRange.OutputField=Champ retour
-NumberRange.DefaultValue=VValeur par d\u00E9faut
-NumberRange.Ranges=Borne inf. <= x< Borne sup.
-NumberRange.LowerBound=Borne inf\u00E9rieure
-NumberRange.UpperBound=Borne sup\u00E9rieure
-NumberRange.Value=Valeur
-NumberRange.Log.LineNumber=N°Ligne 
-NumberRange.Log.ErrorInTransformRunning=Cette \u00E9tape ne peut \u00EAtre ex\u00E9cut\u00E9e: 
\ No newline at end of file
+NumberRange.Name=Cr\u00E9ation plages de nombres
+NumberRange.Description=Cr\u00E9ation de plages de nombres
+NumberRange.Keyword=plage, interval, nombre
+NumberRangeDialog.Title=Cr\u00E9ation plages de nombres
+NumberRangeDialog.TransformName=Nom de la transformation
+NumberRangeDialog.InputField=Champ source
+NumberRangeDialog.OutputField=Champ retour
+NumberRangeDialog.DefaultValue=Valeur par d\u00E9faut
+NumberRangeDialog.Ranges=Borne inf. <= x< Borne sup.
+NumberRangeDialog.LowerBound=Borne inf\u00E9rieure
+NumberRangeDialog.UpperBound=Borne sup\u00E9rieure
+NumberRangeDialog.Value=Valeur
+NumberRange.Log.LineNumber=N\u00B0Ligne 
+NumberRange.Log.ErrorInTransformRunning=Cette transformation ne peut \u00EAtre ex\u00E9cut\u00E9e:
+NumberRangeMeta.Injection.INPUT_FIELD=Champ source
+NumberRangeMeta.Injection.OUTPUT_FIELD=Champ retour
+NumberRangeMeta.Injection.FALL_BACK_VALUE=Valeur par d\u00E9faut
+NumberRangeMeta.Injection.RULES=R\u00E8gles
+NumberRangeMeta.Injection.LOWER_BOUND=Borne inf\u00E9rieure
+NumberRangeMeta.Injection.UPPER_BOUND=Borne sup\u00E9rieure
+NumberRangeMeta.Injection.VALUE=Valeur
+NumberRangeMeta.CheckResult.TransformReceivingFieldsOK=La transformation est connect\u00E9 aux transformations pr\u00E9c\u00E9dentes et r\u00E9cup\u00E8re {0} champs
+NumberRangeMeta.CheckResult.CouldNotReadFieldsFromPreviousTransform=Impossible de lire les champs depuis la transformation pr\u00E9c\u00E9dente
+NumberRangeMeta.CheckResult.TransformReceivingInfoOK=La transformation re\u00E7oit des informations des autres transformations
+NumberRangeMeta.CheckResult.NoInputReceivedError=Aucun flux d''entr\u00E9e en provenance des autres transformations
+NumberRangeMeta.CheckResult.NotNumericRule=Les plages de cette r\u00E8gle ne sont pas num\u00E9riques: inf\u00E9rieure={0}, sup\u00E9rieure={1}, valeur={2}
\ No newline at end of file
diff --git a/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_it_IT.properties b/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_it_IT.properties
index 5e10507a78..a5e65d563d 100644
--- a/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_it_IT.properties
+++ b/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_it_IT.properties
@@ -17,14 +17,15 @@
 #
 #
 #
-NumberRange.UpperBound=Limite superiore
+NumberRange.Name=Range numerici
+NumberRangeDialog.Title=Range numerici
+NumberRangeDialog.UpperBound=Limite superiore
 NumberRange.Log.LineNumber=linea n\u00B0 
-NumberRange.OutputField=Campo d''output\: 
-NumberRange.Ranges=Range (min <\= x< max)\:
+NumberRangeDialog.OutputField=Campo d''output\: 
+NumberRangeDialog.Ranges=Range (min <\= x< max)\:
 NumberRange.Log.ErrorInTransformRunning=A causa di un errore, questo transform non pu\u00F2 continuare\: 
-NumberRange.Value=Valore
-NumberRange.LowerBound=Limite inferiore
-NumberRange.DefaultValue=Valore di default (se nessun range corrisponde)\: 
-NumberRange.InputField=Campo d''input\: 
-NumberRange.TypeLongDesc=Range numerici
-NumberRange.TransformName=Nome transform\: 
+NumberRangeDialog.Value=Valore
+NumberRangeDialog.LowerBound=Limite inferiore
+NumberRangeDialog.DefaultValue=Valore di default (se nessun range corrisponde)\: 
+NumberRangeDialog.InputField=Campo d''input\: 
+NumberRangeDialog.TransformName=Nome transform\: 
diff --git a/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_ja_JP.properties b/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_ja_JP.properties
index cb7cc84275..1aef6e698f 100644
--- a/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_ja_JP.properties
+++ b/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_ja_JP.properties
@@ -17,16 +17,15 @@
 #
 #
 #
-BaseTransform.TypeLongDesc.NumberRange=\u6570\u5024\u7BC4\u56F2
-BaseTransform.TypeTooltipDesc.NumberRange=Number range\n\u7BC4\u56F2\u3092\u6307\u5B9A\u3057\u305F\u6570\u5024\u30D5\u30A3\u30FC\u30EB\u30C9\u3092\u4F5C\u6210\u3057\u307E\u3059\u3002
-NumberRange.TypeLongDesc=Number range
-NumberRange.TransformName=\u30b9\u30c6\u30c3\u30d7\u540d 
-NumberRange.InputField=\u30d5\u30a3\u30fc\u30eb\u30c9\uff08\u5165\u529b\uff09
-NumberRange.OutputField=\u30d5\u30a3\u30fc\u30eb\u30c9\uff08\u51fa\u529b\uff09
-NumberRange.DefaultValue=\u30c7\u30d5\u30a9\u30eb\u30c8
-NumberRange.Ranges=\u7bc4\u56f2
-NumberRange.LowerBound=\u4e0b\u9650\u5024
-NumberRange.UpperBound=\u4e0a\u9650\u5024
-NumberRange.Value=\u5024
+NumberRange.Name=\u6570\u5024\u7BC4\u56F2
+NumberRange.Description=Number range\n\u7BC4\u56F2\u3092\u6307\u5B9A\u3057\u305F\u6570\u5024\u30D5\u30A3\u30FC\u30EB\u30C9\u3092\u4F5C\u6210\u3057\u307E\u3059\u3002
+NumberRangeDialog.TransformName=\u30b9\u30c6\u30c3\u30d7\u540d 
+NumberRangeDialog.InputField=\u30d5\u30a3\u30fc\u30eb\u30c9\uff08\u5165\u529b\uff09
+NumberRangeDialog.OutputField=\u30d5\u30a3\u30fc\u30eb\u30c9\uff08\u51fa\u529b\uff09
+NumberRangeDialog.DefaultValue=\u30c7\u30d5\u30a9\u30eb\u30c8
+NumberRangeDialog.Ranges=\u7bc4\u56f2
+NumberRangeDialog.LowerBound=\u4e0b\u9650\u5024
+NumberRangeDialog.UpperBound=\u4e0a\u9650\u5024
+NumberRangeDialog.Value=\u5024
 NumberRange.Log.LineNumber=linenr 
 NumberRange.Log.ErrorInTransformRunning=Because of an error, this transform can''t continue: 
diff --git a/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_ko_KR.properties b/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_ko_KR.properties
index 7ccc39a138..ca4d45d0a7 100644
--- a/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_ko_KR.properties
+++ b/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_ko_KR.properties
@@ -17,14 +17,15 @@
 #
 #
 #
-NumberRange.UpperBound=\uC0C1\uD55C
-NumberRange.Log.LineNumber=\uC904\uBC88\uD638
-NumberRange.OutputField=\uCD9C\uB825 \uD544\uB4DC\:
-NumberRange.Ranges=\uBC94\uC704 (\uCD5C\uC18C\uAC12 <\= x < \uCD5C\uB300\uAC12)\:
+NumberRange.Name=Number range
+NumberRangeDialog.UpperBound=\uC0C1\uD55C
+NumberRangeDialog.Log.LineNumber=\uC904\uBC88\uD638
+NumberRangeDialog.OutputField=\uCD9C\uB825 \uD544\uB4DC\:
+NumberRangeDialog.Ranges=\uBC94\uC704 (\uCD5C\uC18C\uAC12 <\= x < \uCD5C\uB300\uAC12)\:
 NumberRange.Log.ErrorInTransformRunning=\uC624\uB958\uB85C \uC778\uD574 transform\uC744 \uC9C4\uD589\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4\:
-NumberRange.Value=\uAC12
-NumberRange.LowerBound=\uD558\uD55C
-NumberRange.DefaultValue=\uAE30\uBCF8\uAC12(\uBC94\uC704 \uB9E4\uCE6D\uC774 \uC5C6\uB294 \uACBD\uC6B0)\:
-NumberRange.InputField=\uC785\uB825 \uD544\uB4DC\:
-NumberRange.TransformName=transform \uC774\uB984\: 
-NumberRange.TypeLongDesc=Number range
+NumberRangeDialog.Value=\uAC12
+NumberRangeDialog.LowerBound=\uD558\uD55C
+NumberRangeDialog.DefaultValue=\uAE30\uBCF8\uAC12(\uBC94\uC704 \uB9E4\uCE6D\uC774 \uC5C6\uB294 \uACBD\uC6B0)\:
+NumberRangeDialog.InputField=\uC785\uB825 \uD544\uB4DC\:
+NumberRangeDialog.TransformName=transform \uC774\uB984\: 
+
diff --git a/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_zh_CN.properties b/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_zh_CN.properties
index 46c5ccec82..af2484a328 100644
--- a/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_zh_CN.properties
+++ b/plugins/transforms/numberrange/src/main/resources/org/apache/hop/pipeline/transforms/numberrange/messages/messages_zh_CN.properties
@@ -16,17 +16,15 @@
 # limitations under the License.
 #
 #
-BaseTransform.TypeLongDesc.NumberRange=\u6570\u503C\u8303\u56F4
-BaseTransform.TypeTooltipDesc.NumberRange=\u57FA\u4E8E\u6570\u5B57\u7C7B\u578B\u5B57\u6BB5\u521B\u5EFA\u533A\u95F4
-NumberRange.DefaultValue=\u7F3A\u7701\u503C(\u5982\u679C\u6CA1\u6709\u5339\u914D\u5230\u8303\u56F4)\:
-NumberRange.InputField=\u8F93\u5165\u5B57\u6BB5\:
+NumberRange.Name=\u6570\u503C\u8303\u56F4
+NumberRange.Description=\u57FA\u4E8E\u6570\u5B57\u7C7B\u578B\u5B57\u6BB5\u521B\u5EFA\u533A\u95F4
+NumberRangeDialog.DefaultValue=\u7F3A\u7701\u503C(\u5982\u679C\u6CA1\u6709\u5339\u914D\u5230\u8303\u56F4)\:
+NumberRangeDialog.InputField=\u8F93\u5165\u5B57\u6BB5\:
 NumberRange.Log.ErrorInTransformRunning=\u7531\u4E8E\u9519\u8BEF,  Transform \u4E0D\u80FD\u7EE7\u7EED\:
 NumberRange.Log.LineNumber=\u884C\u53F7
-NumberRange.LowerBound=\u4E0B\u9650
-NumberRange.OutputField=\u8F93\u51FA\u5B57\u6BB5\:
-NumberRange.Ranges=\u8303\u56F4 (\u6700\u5C0F <\= x< \u6700\u5927)\:
-NumberRange.TransformName=Transform \u540D\u79F0
-NumberRange.TypeLongDesc=\u6570\u503C\u8303\u56F4
-NumberRange.UpperBound=\u4E0A\u754C
-NumberRange.Value=\u503C
-NumberRangeMeta.keyword=number,range
+NumberRangeDialog.LowerBound=\u4E0B\u9650
+NumberRangeDialog.OutputField=\u8F93\u51FA\u5B57\u6BB5\:
+NumberRangeDialog.Ranges=\u8303\u56F4 (\u6700\u5C0F <\= x< \u6700\u5927)\:
+NumberRangeDialog.TransformName=Transform \u540D\u79F0
+NumberRangeDialog.UpperBound=\u4E0A\u754C
+NumberRangeDialog.Value=\u503C
diff --git a/plugins/transforms/numberrange/src/test/java/org/apache/hop/pipeline/transforms/numberrange/NumberRangeMetaTest.java b/plugins/transforms/numberrange/src/test/java/org/apache/hop/pipeline/transforms/numberrange/NumberRangeMetaTest.java
index 95edda1f98..4281d87124 100644
--- a/plugins/transforms/numberrange/src/test/java/org/apache/hop/pipeline/transforms/numberrange/NumberRangeMetaTest.java
+++ b/plugins/transforms/numberrange/src/test/java/org/apache/hop/pipeline/transforms/numberrange/NumberRangeMetaTest.java
@@ -66,7 +66,7 @@ public class NumberRangeMetaTest {
     @Override
     public NumberRangeRule getTestObject() {
       return new NumberRangeRule(
-          new Random().nextDouble(), new Random().nextDouble(), UUID.randomUUID().toString());
+          String.valueOf(new Random().nextDouble()), String.valueOf(new Random().nextDouble()), UUID.randomUUID().toString());
     }
 
     @Override