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

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

commit 0bc8108bc5dff9dcfde7661daa52e412e2d2c124
Author: Nicolas Adment <[email protected]>
AuthorDate: Sat Jul 20 16:58:47 2024 +0200

    Cleanup XML of transform WriteToLog #4145
---
 .../ROOT/pages/pipeline/metadata-injection.adoc    |   2 +-
 .../{WriteToLogData.java => LogField.java}         |  45 +++--
 .../pipeline/transforms/writetolog/WriteToLog.java |  56 ++----
 .../transforms/writetolog/WriteToLogData.java      |   4 +-
 .../transforms/writetolog/WriteToLogDialog.java    |  83 ++++-----
 .../transforms/writetolog/WriteToLogMeta.java      | 199 +++++++--------------
 .../writetolog/messages/messages_en_US.properties  |   8 +
 .../writetolog/WriteToLogMetaSymmetric.java        |  48 -----
 .../transforms/writetolog/WriteToLogMetaTest.java  |  99 +++++-----
 9 files changed, 211 insertions(+), 333 deletions(-)

diff --git 
a/docs/hop-user-manual/modules/ROOT/pages/pipeline/metadata-injection.adoc 
b/docs/hop-user-manual/modules/ROOT/pages/pipeline/metadata-injection.adoc
index 5023357164..b1626e7b8a 100644
--- a/docs/hop-user-manual/modules/ROOT/pages/pipeline/metadata-injection.adoc
+++ b/docs/hop-user-manual/modules/ROOT/pages/pipeline/metadata-injection.adoc
@@ -295,7 +295,7 @@ The goal is to add Metadata Injection support to all 
transforms, The current sta
 |Web services lookup|N
 |Workflow executor|N
 |Workflow Logging|Y
-|Write to log|N
+|Write to log|Y
 |XML input stream (StAX)|N
 |XML join|Y
 |XML output|Y
diff --git 
a/plugins/transforms/writetolog/src/main/java/org/apache/hop/pipeline/transforms/writetolog/WriteToLogData.java
 
b/plugins/transforms/writetolog/src/main/java/org/apache/hop/pipeline/transforms/writetolog/LogField.java
similarity index 52%
copy from 
plugins/transforms/writetolog/src/main/java/org/apache/hop/pipeline/transforms/writetolog/WriteToLogData.java
copy to 
plugins/transforms/writetolog/src/main/java/org/apache/hop/pipeline/transforms/writetolog/LogField.java
index 9225e4e57e..54dc0c6212 100644
--- 
a/plugins/transforms/writetolog/src/main/java/org/apache/hop/pipeline/transforms/writetolog/WriteToLogData.java
+++ 
b/plugins/transforms/writetolog/src/main/java/org/apache/hop/pipeline/transforms/writetolog/LogField.java
@@ -17,19 +17,42 @@
 
 package org.apache.hop.pipeline.transforms.writetolog;
 
-import org.apache.hop.core.logging.LogLevel;
-import org.apache.hop.pipeline.transform.BaseTransformData;
-import org.apache.hop.pipeline.transform.ITransformData;
+import java.util.Objects;
+import org.apache.hop.metadata.api.HopMetadataProperty;
 
-@SuppressWarnings("java:S1104")
-public class WriteToLogData extends BaseTransformData implements 
ITransformData {
+public class LogField {
 
-  public int[] fieldnrs;
-  public int fieldnr;
-  public LogLevel loglevel;
-  public String logmessage;
+  public LogField() {}
 
-  public WriteToLogData() {
-    super();
+  public LogField(String name) {
+    this.name = name;
+  }
+
+  @HopMetadataProperty(
+      key = "name",
+      injectionKey = "NAME",
+      injectionKeyDescription = "WriteToLogMeta.Injection.field.Name")
+  private String name;
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(name);
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (this == obj) return true;
+    if (obj == null) return false;
+    if (getClass() != obj.getClass()) return false;
+    LogField other = (LogField) obj;
+    return Objects.equals(name, other.name);
   }
 }
diff --git 
a/plugins/transforms/writetolog/src/main/java/org/apache/hop/pipeline/transforms/writetolog/WriteToLog.java
 
b/plugins/transforms/writetolog/src/main/java/org/apache/hop/pipeline/transforms/writetolog/WriteToLog.java
index 061c924d60..1ed18756a6 100644
--- 
a/plugins/transforms/writetolog/src/main/java/org/apache/hop/pipeline/transforms/writetolog/WriteToLog.java
+++ 
b/plugins/transforms/writetolog/src/main/java/org/apache/hop/pipeline/transforms/writetolog/WriteToLog.java
@@ -48,8 +48,8 @@ public class WriteToLog extends BaseTransform<WriteToLogMeta, 
WriteToLogData> {
   @Override
   public boolean processRow() throws HopException {
 
-    Object[] r = getRow(); // get row, set busy!
-    if (r == null) { // no more input to be expected...
+    Object[] row = getRow(); // get row, set busy!
+    if (row == null) { // no more input to be expected...
 
       setOutputDone();
       return false;
@@ -57,25 +57,23 @@ public class WriteToLog extends 
BaseTransform<WriteToLogMeta, WriteToLogData> {
 
     // Limit hit? skip
     if (rowCounterLimitHit) {
-      putRow(getInputRowMeta(), r); // copy row to output
+      putRow(getInputRowMeta(), row); // copy row to output
       return true;
     }
 
     if (first) {
       first = false;
 
-      if (meta.getFieldName() != null && meta.getFieldName().length > 0) {
-        data.fieldnrs = new int[meta.getFieldName().length];
-
+      if (meta.getLogFields() != null && !meta.getLogFields().isEmpty()) {
+        data.fieldnrs = new int[meta.getLogFields().size()];
         for (int i = 0; i < data.fieldnrs.length; i++) {
-          data.fieldnrs[i] = 
getInputRowMeta().indexOfValue(meta.getFieldName()[i]);
+          LogField field = meta.getLogFields().get(i);
+          data.fieldnrs[i] = getInputRowMeta().indexOfValue(field.getName());
           if (data.fieldnrs[i] < 0) {
             logError(
-                BaseMessages.getString(
-                    PKG, "WriteToLog.Log.CanNotFindField", 
meta.getFieldName()[i]));
+                BaseMessages.getString(PKG, "WriteToLog.Log.CanNotFindField", 
field.getName()));
             throw new HopException(
-                BaseMessages.getString(
-                    PKG, "WriteToLog.Log.CanNotFindField", 
meta.getFieldName()[i]));
+                BaseMessages.getString(PKG, "WriteToLog.Log.CanNotFindField", 
field.getName()));
           }
         }
       } else {
@@ -85,10 +83,10 @@ public class WriteToLog extends 
BaseTransform<WriteToLogMeta, WriteToLogData> {
         }
       }
       data.fieldnr = data.fieldnrs.length;
-      data.loglevel = meta.getLogLevelByDesc();
-      data.logmessage = Const.NVL(this.resolve(meta.getLogMessage()), "");
-      if (!Utils.isEmpty(data.logmessage)) {
-        data.logmessage += Const.CR + Const.CR;
+      data.logLevel = meta.getLogLevel();
+      data.logMessage = Const.NVL(this.resolve(meta.getLogMessage()), "");
+      if (!Utils.isEmpty(data.logMessage)) {
+        data.logMessage += Const.CR + Const.CR;
       }
     } // end if first
 
@@ -104,7 +102,7 @@ public class WriteToLog extends 
BaseTransform<WriteToLogMeta, WriteToLogData> {
 
     // Loop through fields
     for (int i = 0; i < data.fieldnr; i++) {
-      String fieldvalue = getInputRowMeta().getString(r, data.fieldnrs[i]);
+      String fieldvalue = getInputRowMeta().getString(row, data.fieldnrs[i]);
 
       if (meta.isDisplayHeader()) {
         String fieldname = getInputRowMeta().getFieldNames()[data.fieldnrs[i]];
@@ -115,52 +113,46 @@ public class WriteToLog extends 
BaseTransform<WriteToLogMeta, WriteToLogData> {
     }
     out.append(Const.CR + "====================");
 
-    setLog(data.loglevel, out);
+    setLog(data.logLevel, out);
 
     // Increment counter
     if (meta.isLimitRows() && ++rowCounter >= meta.getLimitRowsNumber()) {
       rowCounterLimitHit = true;
     }
 
-    putRow(getInputRowMeta(), r); // copy row to output
+    putRow(getInputRowMeta(), row); // copy row to output
 
     return true;
   }
 
-  private void setLog(LogLevel loglevel, StringBuilder msg) {
+  /** Output message to log */
+  private void setLog(final LogLevel loglevel, final StringBuilder msg) {
     switch (loglevel) {
       case ERROR:
-        // Output message to log
         // Log level = ERREUR
         logError(msg.toString());
         break;
       case MINIMAL:
-        // Output message to log
         // Log level = MINIMAL
         logMinimal(msg.toString());
         break;
       case BASIC:
-        // Output message to log
         // Log level = BASIC
         logBasic(msg.toString());
         break;
       case DETAILED:
-        // Output message to log
         // Log level = DETAILED
         logDetailed(msg.toString());
         break;
       case DEBUG:
-        // Output message to log
         // Log level = DEBUG
         logDebug(msg.toString());
         break;
       case ROWLEVEL:
-        // Output message to log
         // Log level = ROW LEVEL
         logRowlevel(msg.toString());
         break;
       case NOTHING:
-        // Output nothing to log
         // Log level = NOTHING
         break;
       default:
@@ -169,16 +161,6 @@ public class WriteToLog extends 
BaseTransform<WriteToLogMeta, WriteToLogData> {
   }
 
   public String getRealLogMessage() {
-    return data.logmessage;
-  }
-
-  @Override
-  public boolean init() {
-
-    if (super.init()) {
-      // Add init code here.
-      return true;
-    }
-    return false;
+    return data.logMessage;
   }
 }
diff --git 
a/plugins/transforms/writetolog/src/main/java/org/apache/hop/pipeline/transforms/writetolog/WriteToLogData.java
 
b/plugins/transforms/writetolog/src/main/java/org/apache/hop/pipeline/transforms/writetolog/WriteToLogData.java
index 9225e4e57e..086b669bd1 100644
--- 
a/plugins/transforms/writetolog/src/main/java/org/apache/hop/pipeline/transforms/writetolog/WriteToLogData.java
+++ 
b/plugins/transforms/writetolog/src/main/java/org/apache/hop/pipeline/transforms/writetolog/WriteToLogData.java
@@ -26,8 +26,8 @@ public class WriteToLogData extends BaseTransformData 
implements ITransformData
 
   public int[] fieldnrs;
   public int fieldnr;
-  public LogLevel loglevel;
-  public String logmessage;
+  public LogLevel logLevel;
+  public String logMessage;
 
   public WriteToLogData() {
     super();
diff --git 
a/plugins/transforms/writetolog/src/main/java/org/apache/hop/pipeline/transforms/writetolog/WriteToLogDialog.java
 
b/plugins/transforms/writetolog/src/main/java/org/apache/hop/pipeline/transforms/writetolog/WriteToLogDialog.java
index 7d99537e7a..3f5d33d984 100644
--- 
a/plugins/transforms/writetolog/src/main/java/org/apache/hop/pipeline/transforms/writetolog/WriteToLogDialog.java
+++ 
b/plugins/transforms/writetolog/src/main/java/org/apache/hop/pipeline/transforms/writetolog/WriteToLogDialog.java
@@ -40,14 +40,12 @@ import 
org.apache.hop.ui.pipeline.transform.BaseTransformDialog;
 import org.apache.hop.ui.pipeline.transform.ITableItemInsertListener;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.layout.FormAttachment;
 import org.eclipse.swt.layout.FormData;
 import org.eclipse.swt.layout.FormLayout;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Table;
 import org.eclipse.swt.widgets.TableItem;
@@ -59,16 +57,11 @@ public class WriteToLogDialog extends BaseTransformDialog {
   private final WriteToLogMeta input;
 
   private CCombo wLoglevel;
-
   private Button wPrintHeader;
-
   private StyledTextComp wLogMessage;
-
   private TableView wFields;
-
   private Button wLimitRows;
-
-  Label wlLimitRowsNumber;
+  private Label wlLimitRowsNumber;
   private Text wLimitRowsNumber;
 
   private final List<String> inputFields = new ArrayList<>();
@@ -89,24 +82,7 @@ public class WriteToLogDialog extends BaseTransformDialog {
     PropsUi.setLook(shell);
     setShellImage(shell, input);
 
-    ModifyListener lsMod = modifyEvent -> input.setChanged();
-
-    SelectionAdapter lsSelMod =
-        new SelectionAdapter() {
-          @Override
-          public void widgetSelected(SelectionEvent e) {
-            input.setChanged();
-          }
-        };
-
-    SelectionAdapter lsLimitRows =
-        new SelectionAdapter() {
-          @Override
-          public void widgetSelected(SelectionEvent e) {
-            input.setChanged();
-            enableFields();
-          }
-        };
+    Listener lsModify = event -> input.setChanged();
 
     changed = input.hasChanged();
 
@@ -132,7 +108,7 @@ public class WriteToLogDialog extends BaseTransformDialog {
     wTransformName = new Text(shell, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
     wTransformName.setText(transformName);
     PropsUi.setLook(wTransformName);
-    wTransformName.addModifyListener(lsMod);
+    wTransformName.addListener(SWT.Modify, lsModify);
     fdTransformName = new FormData();
     fdTransformName.left = new FormAttachment(middle, 0);
     fdTransformName.top = new FormAttachment(0, margin);
@@ -156,7 +132,7 @@ public class WriteToLogDialog extends BaseTransformDialog {
     fdLoglevel.top = new FormAttachment(wTransformName, margin);
     fdLoglevel.right = new FormAttachment(100, 0);
     wLoglevel.setLayoutData(fdLoglevel);
-    wLoglevel.addSelectionListener(lsSelMod);
+    wLoglevel.addListener(SWT.Selection, lsModify);
 
     // print header?
     Label wlPrintHeader = new Label(shell, SWT.RIGHT);
@@ -176,7 +152,7 @@ public class WriteToLogDialog extends BaseTransformDialog {
     fdPrintHeader.top = new FormAttachment(wlPrintHeader, 0, SWT.CENTER);
     fdPrintHeader.right = new FormAttachment(100, 0);
     wPrintHeader.setLayoutData(fdPrintHeader);
-    wPrintHeader.addSelectionListener(lsSelMod);
+    wPrintHeader.addListener(SWT.Selection, lsModify);
 
     // Limit output?
     // ICache?
@@ -194,7 +170,8 @@ public class WriteToLogDialog extends BaseTransformDialog {
     fdLimitRows.left = new FormAttachment(middle, 0);
     fdLimitRows.top = new FormAttachment(wlLimitRows, 0, SWT.CENTER);
     wLimitRows.setLayoutData(fdLimitRows);
-    wLimitRows.addSelectionListener(lsLimitRows);
+    wLimitRows.addListener(SWT.Selection, lsModify);
+    wLimitRows.addListener(SWT.Selection, e -> enableFields());
 
     // LimitRows size line
     wlLimitRowsNumber = new Label(shell, SWT.RIGHT);
@@ -210,7 +187,7 @@ public class WriteToLogDialog extends BaseTransformDialog {
     wLimitRowsNumber = new Text(shell, SWT.SINGLE | SWT.LEFT | SWT.BORDER);
     PropsUi.setLook(wLimitRowsNumber);
     wLimitRowsNumber.setEnabled(input.isLimitRows());
-    wLimitRowsNumber.addModifyListener(lsMod);
+    wLimitRowsNumber.addListener(SWT.Modify, lsModify);
     FormData fdLimitRowsNumber = new FormData();
     fdLimitRowsNumber.left = new FormAttachment(middle, 0);
     fdLimitRowsNumber.right = new FormAttachment(100, 0);
@@ -231,13 +208,13 @@ public class WriteToLogDialog extends BaseTransformDialog 
{
         new StyledTextComp(
             variables, shell, SWT.MULTI | SWT.LEFT | SWT.BORDER | SWT.H_SCROLL 
| SWT.V_SCROLL);
     PropsUi.setLook(wLogMessage, Props.WIDGET_STYLE_FIXED);
-    wLogMessage.addModifyListener(lsMod);
     FormData fdLogMessage = new FormData();
     fdLogMessage.left = new FormAttachment(middle, 0);
     fdLogMessage.top = new FormAttachment(wLimitRowsNumber, margin);
     fdLogMessage.right = new FormAttachment(100, -2 * margin);
     fdLogMessage.height = (int) (125 * props.getZoomFactor());
     wLogMessage.setLayoutData(fdLogMessage);
+    wLogMessage.addListener(SWT.Modify, lsModify);
 
     wOk = new Button(shell, SWT.PUSH);
     wOk.setText(BaseMessages.getString(PKG, "System.Button.OK"));
@@ -257,10 +234,10 @@ public class WriteToLogDialog extends BaseTransformDialog 
{
     fdlFields.top = new FormAttachment(wLogMessage, margin);
     wlFields.setLayoutData(fdlFields);
 
-    final int FieldsCols = 1;
-    final int FieldsRows = input.getFieldName().length;
+    final int fieldsCols = 1;
+    final int fieldsRows = input.getLogFields().size();
 
-    colinf = new ColumnInfo[FieldsCols];
+    colinf = new ColumnInfo[fieldsCols];
     colinf[0] =
         new ColumnInfo(
             BaseMessages.getString(PKG, "WriteToLogDialog.Fieldname.Column"),
@@ -273,8 +250,8 @@ public class WriteToLogDialog extends BaseTransformDialog {
             shell,
             SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI,
             colinf,
-            FieldsRows,
-            lsMod,
+            fieldsRows,
+            event -> input.setChanged(),
             props);
 
     FormData fdFields = new FormData();
@@ -284,9 +261,8 @@ public class WriteToLogDialog extends BaseTransformDialog {
     fdFields.bottom = new FormAttachment(wOk, -2 * margin);
     wFields.setLayoutData(fdFields);
 
-    //
     // Search the fields in the background
-
+    //
     final Runnable runnable =
         () -> {
           TransformMeta transformMeta = 
pipelineMeta.findTransform(transformName);
@@ -347,24 +323,25 @@ public class WriteToLogDialog extends BaseTransformDialog 
{
 
   /** Copy information from the meta-data input to the dialog fields. */
   public void getData() {
-    wLoglevel.select(input.getLogLevelByDesc().getLevel());
 
     wPrintHeader.setSelection(input.isDisplayHeader());
     wLimitRows.setSelection(input.isLimitRows());
     wLimitRowsNumber.setText("" + input.getLimitRowsNumber());
 
+    if (input.getLogLevel() != null) {
+      wLoglevel.select(input.getLogLevel().getLevel());
+    }
+
     if (input.getLogMessage() != null) {
       wLogMessage.setText(input.getLogMessage());
     }
 
     Table table = wFields.table;
-    if (input.getFieldName().length > 0) {
-      table.removeAll();
-    }
-    for (int i = 0; i < input.getFieldName().length; i++) {
+    for (int i = 0; i < input.getLogFields().size(); i++) {
+      LogField field = input.getLogFields().get(i);
       TableItem ti = new TableItem(table, SWT.NONE);
       ti.setText(0, "" + (i + 1));
-      ti.setText(1, input.getFieldName()[i]);
+      ti.setText(1, field.getName());
     }
 
     wFields.setRowNums();
@@ -391,9 +368,9 @@ public class WriteToLogDialog extends BaseTransformDialog {
     input.setLimitRowsNumber(Const.toInt(wLimitRowsNumber.getText(), 0));
 
     if (wLoglevel.getSelectionIndex() < 0) {
-      input.setLogLevel(3); // Basic
+      input.setLogLevel(LogLevel.BASIC);
     } else {
-      input.setLogLevel(wLoglevel.getSelectionIndex());
+      input.setLogLevel(LogLevel.lookupCode(wLoglevel.getText()));
     }
 
     if (wLogMessage.getText() != null && wLogMessage.getText().length() > 0) {
@@ -403,12 +380,14 @@ public class WriteToLogDialog extends BaseTransformDialog 
{
     }
 
     int nrFields = wFields.nrNonEmpty();
-    input.allocate(nrFields);
+    List<LogField> fields = new ArrayList<>(nrFields);
     for (int i = 0; i < nrFields; i++) {
-      TableItem ti = wFields.getNonEmpty(i);
-
-      input.getFieldName()[i] = ti.getText(1);
+      TableItem item = wFields.getNonEmpty(i);
+      LogField field = new LogField();
+      field.setName(item.getText(1));
     }
+    input.setLogFields(fields);
+
     dispose();
   }
 
diff --git 
a/plugins/transforms/writetolog/src/main/java/org/apache/hop/pipeline/transforms/writetolog/WriteToLogMeta.java
 
b/plugins/transforms/writetolog/src/main/java/org/apache/hop/pipeline/transforms/writetolog/WriteToLogMeta.java
index e9933b68ec..640c8260b0 100644
--- 
a/plugins/transforms/writetolog/src/main/java/org/apache/hop/pipeline/transforms/writetolog/WriteToLogMeta.java
+++ 
b/plugins/transforms/writetolog/src/main/java/org/apache/hop/pipeline/transforms/writetolog/WriteToLogMeta.java
@@ -17,23 +17,21 @@
 
 package org.apache.hop.pipeline.transforms.writetolog;
 
-import java.util.Arrays;
+import java.util.ArrayList;
 import java.util.List;
 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.HopXmlException;
 import org.apache.hop.core.logging.LogLevel;
 import org.apache.hop.core.row.IRowMeta;
 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;
 
 @Transform(
     id = "WriteToLog",
@@ -46,99 +44,76 @@ import org.w3c.dom.Node;
 public class WriteToLogMeta extends BaseTransformMeta<WriteToLog, 
WriteToLogData> {
   private static final Class<?> PKG = WriteToLogMeta.class; // For Translator
 
-  /** by which fields to display? */
-  private String[] fieldName;
-
-  public static String[] logLevelCodes = {
-    "log_level_nothing",
-    "log_level_error",
-    "log_level_minimal",
-    "log_level_basic",
-    "log_level_detailed",
-    "log_level_debug",
-    "log_level_rowlevel"
-  };
-
+  @HopMetadataProperty(
+      key = "displayHeader",
+      injectionKey = "DISPLAY_HEADER",
+      injectionKeyDescription = "WriteToLogMeta.Injection.DisplayHeader")
   private boolean displayHeader;
 
+  @HopMetadataProperty(
+      key = "limitRows",
+      injectionKey = "LIMIT_ROWS",
+      injectionKeyDescription = "WriteToLogMeta.Injection.LimitRows")
   private boolean limitRows;
 
+  @HopMetadataProperty(
+      key = "limitRowsNumber",
+      injectionKey = "LIMIT_ROWS_NUMBER",
+      injectionKeyDescription = "WriteToLogMeta.Injection.LimitRowsNumber")
   private int limitRowsNumber;
 
-  private String logmessage;
-
-  private String loglevel;
+  @HopMetadataProperty(
+      key = "logmessage",
+      injectionKey = "LOG_MESSAGE",
+      injectionKeyDescription = "WriteToLogMeta.Injection.LogMessage")
+  private String logMessage;
+
+  /** The log level with which the message should be logged. */
+  @HopMetadataProperty(
+      key = "loglevel",
+      storeWithCode = true,
+      injectionKeyDescription = "WriteToLogMeta.Injection.LogLevel")
+  private LogLevel logLevel;
+
+  /** The fields which should be to logged. */
+  @HopMetadataProperty(
+      key = "field",
+      groupKey = "fields",
+      injectionGroupDescription = "WriteToLogMeta.Injection.Fields",
+      injectionKeyDescription = "WriteToLogMeta.Injection.Field")
+  private List<LogField> logFields = new ArrayList<>();
 
   public WriteToLogMeta() {
-    super(); // allocate BaseTransformMeta
+    super();
   }
 
-  // For testing purposes only
-  public int getLogLevel() {
-    return Arrays.asList(logLevelCodes).indexOf(loglevel);
-  }
-
-  public void setLogLevel(int i) {
-    loglevel = logLevelCodes[i];
-  }
-
-  public LogLevel getLogLevelByDesc() {
-    if (loglevel == null) {
-      return LogLevel.BASIC;
-    }
-    LogLevel retval;
-    if (loglevel.equals(logLevelCodes[0])) {
-      retval = LogLevel.NOTHING;
-    } else if (loglevel.equals(logLevelCodes[1])) {
-      retval = LogLevel.ERROR;
-    } else if (loglevel.equals(logLevelCodes[2])) {
-      retval = LogLevel.MINIMAL;
-    } else if (loglevel.equals(logLevelCodes[3])) {
-      retval = LogLevel.BASIC;
-    } else if (loglevel.equals(logLevelCodes[4])) {
-      retval = LogLevel.DETAILED;
-    } else if (loglevel.equals(logLevelCodes[5])) {
-      retval = LogLevel.DEBUG;
-    } else {
-      retval = LogLevel.ROWLEVEL;
-    }
-    return retval;
+  public LogLevel getLogLevel() {
+    return this.logLevel;
   }
 
-  @Override
-  public void loadXml(Node transformNode, IHopMetadataProvider 
metadataProvider)
-      throws HopXmlException {
-    readData(transformNode);
+  public void setLogLevel(LogLevel logLevel) {
+    this.logLevel = logLevel;
   }
 
   @Override
   public Object clone() {
     WriteToLogMeta retval = (WriteToLogMeta) super.clone();
 
-    int nrFields = fieldName.length;
-
-    retval.allocate(nrFields);
-    System.arraycopy(fieldName, 0, retval.fieldName, 0, nrFields);
-
     return retval;
   }
 
-  public void allocate(int nrFields) {
-    fieldName = new String[nrFields];
-  }
-
   /**
    * @return Returns the fieldName.
    */
-  public String[] getFieldName() {
-    return fieldName;
+  public List<LogField> getLogFields() {
+    return logFields;
   }
 
   /**
    * @param fieldName The fieldName to set.
    */
-  public void setFieldName(String[] fieldName) {
-    this.fieldName = fieldName;
+  public void setLogFields(List<LogField> fields) {
+    this.logFields = fields;
   }
 
   public boolean isDisplayHeader() {
@@ -166,75 +141,22 @@ public class WriteToLogMeta extends 
BaseTransformMeta<WriteToLog, WriteToLogData
   }
 
   public String getLogMessage() {
-    if (logmessage == null) {
-      logmessage = "";
-    }
-    return logmessage;
-  }
-
-  public void setLogMessage(String s) {
-    logmessage = s;
-  }
-
-  private void readData(Node transformNode) throws HopXmlException {
-    try {
-      loglevel = XmlHandler.getTagValue(transformNode, "loglevel");
-      displayHeader = 
"Y".equalsIgnoreCase(XmlHandler.getTagValue(transformNode, "displayHeader"));
-
-      limitRows = "Y".equalsIgnoreCase(XmlHandler.getTagValue(transformNode, 
"limitRows"));
-      String limitRowsNumberString = XmlHandler.getTagValue(transformNode, 
"limitRowsNumber");
-      limitRowsNumber = Const.toInt(limitRowsNumberString, 5);
-
-      logmessage = XmlHandler.getTagValue(transformNode, "logmessage");
-
-      Node fields = XmlHandler.getSubNode(transformNode, "fields");
-      int nrFields = XmlHandler.countNodes(fields, "field");
-
-      allocate(nrFields);
-
-      for (int i = 0; i < nrFields; i++) {
-        Node fnode = XmlHandler.getSubNodeByNr(fields, "field", i);
-        fieldName[i] = XmlHandler.getTagValue(fnode, "name");
-      }
-    } catch (Exception e) {
-      throw new HopXmlException("Unable to load transform info from XML", e);
+    if (logMessage == null) {
+      logMessage = "";
     }
+    return logMessage;
   }
 
-  @Override
-  public String getXml() {
-    StringBuilder retval = new StringBuilder();
-    retval.append("      " + XmlHandler.addTagValue("loglevel", loglevel));
-    retval.append("      " + XmlHandler.addTagValue("displayHeader", 
displayHeader));
-    retval.append("      " + XmlHandler.addTagValue("limitRows", limitRows));
-    retval.append("      " + XmlHandler.addTagValue("limitRowsNumber", 
limitRowsNumber));
-
-    retval.append("      " + XmlHandler.addTagValue("logmessage", logmessage));
-
-    retval.append("    <fields>" + Const.CR);
-    for (int i = 0; i < fieldName.length; i++) {
-      retval.append("      <field>" + Const.CR);
-      retval.append("        " + XmlHandler.addTagValue("name", fieldName[i]));
-      retval.append("        </field>" + Const.CR);
-    }
-    retval.append("      </fields>" + Const.CR);
-
-    return retval.toString();
+  public void setLogMessage(String message) {
+    logMessage = message;
   }
 
   @Override
   public void setDefault() {
-    loglevel = logLevelCodes[3];
     displayHeader = true;
-    logmessage = "";
-
-    int nrFields = 0;
-
-    allocate(nrFields);
-
-    for (int i = 0; i < nrFields; i++) {
-      fieldName[i] = "field" + i;
-    }
+    logLevel = LogLevel.BASIC;
+    logMessage = "";
+    logFields = new ArrayList<>();
   }
 
   @Override
@@ -269,10 +191,11 @@ public class WriteToLogMeta extends 
BaseTransformMeta<WriteToLog, WriteToLogData
       boolean errorFound = false;
 
       // Starting from selected fields in ...
-      for (int i = 0; i < fieldName.length; i++) {
-        int idx = prev.indexOfValue(fieldName[i]);
+      // for (int i = 0; i < fieldName.length; i++) {
+      for (LogField field : logFields) {
+        int idx = prev.indexOfValue(field.getName());
         if (idx < 0) {
-          errorMessage += "\t\t" + fieldName[i] + Const.CR;
+          errorMessage += "\t\t" + field.getName() + Const.CR;
           errorFound = true;
         }
       }
@@ -283,19 +206,21 @@ public class WriteToLogMeta extends 
BaseTransformMeta<WriteToLog, WriteToLogData
         cr = new CheckResult(ICheckResult.TYPE_RESULT_ERROR, errorMessage, 
transformMeta);
         remarks.add(cr);
       } else {
-        if (fieldName.length > 0) {
+        if (logFields.isEmpty()) {
           cr =
               new CheckResult(
-                  ICheckResult.TYPE_RESULT_OK,
-                  BaseMessages.getString(PKG, 
"WriteToLogMeta.CheckResult.AllFieldsFound"),
+                  CheckResult.TYPE_RESULT_WARNING,
+                  BaseMessages.getString(PKG, 
"WriteToLogMeta.CheckResult.NoFieldsEntered"),
                   transformMeta);
+
           remarks.add(cr);
         } else {
           cr =
               new CheckResult(
-                  CheckResult.TYPE_RESULT_WARNING,
-                  BaseMessages.getString(PKG, 
"WriteToLogMeta.CheckResult.NoFieldsEntered"),
+                  ICheckResult.TYPE_RESULT_OK,
+                  BaseMessages.getString(PKG, 
"WriteToLogMeta.CheckResult.AllFieldsFound"),
                   transformMeta);
+
           remarks.add(cr);
         }
       }
diff --git 
a/plugins/transforms/writetolog/src/main/resources/org/apache/hop/pipeline/transforms/writetolog/messages/messages_en_US.properties
 
b/plugins/transforms/writetolog/src/main/resources/org/apache/hop/pipeline/transforms/writetolog/messages/messages_en_US.properties
index 60d3c0be73..990c2eeaf6 100644
--- 
a/plugins/transforms/writetolog/src/main/resources/org/apache/hop/pipeline/transforms/writetolog/messages/messages_en_US.properties
+++ 
b/plugins/transforms/writetolog/src/main/resources/org/apache/hop/pipeline/transforms/writetolog/messages/messages_en_US.properties
@@ -36,3 +36,11 @@ WriteToLogMeta.CheckResult.NotReceivingFields=Not receiving 
any fields from prev
 WriteToLogMeta.CheckResult.TransformRecevingData=Transform is connected to 
previous one, receiving {0} fields
 WriteToLogMeta.CheckResult.TransformRecevingData2=Transform is receiving info 
from other transforms.
 WriteToLogMeta.keyword=write,log
+WriteToLogMeta.Injection.DisplayHeader=Print header (Y/N)
+WriteToLogMeta.Injection.LimitRows=Limit rows (Y/N)
+WriteToLogMeta.Injection.LimitRowsNumber=Nr of rows to print
+WriteToLogMeta.Injection.LogMessage=Write to log
+WriteToLogMeta.Injection.LogLevel=Log level
+WriteToLogMeta.Injection.Fields=Fields
+WriteToLogMeta.Injection.Field=Field
+WriteToLogMeta.Injection.field.Name=Name
diff --git 
a/plugins/transforms/writetolog/src/test/java/org/apache/pipeline/transforms/writetolog/WriteToLogMetaSymmetric.java
 
b/plugins/transforms/writetolog/src/test/java/org/apache/pipeline/transforms/writetolog/WriteToLogMetaSymmetric.java
deleted file mode 100644
index 696bb2e592..0000000000
--- 
a/plugins/transforms/writetolog/src/test/java/org/apache/pipeline/transforms/writetolog/WriteToLogMetaSymmetric.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.pipeline.transforms.writetolog;
-
-import org.apache.hop.core.logging.LogLevel;
-import org.apache.hop.pipeline.transforms.writetolog.WriteToLogMeta;
-
-public class WriteToLogMetaSymmetric extends WriteToLogMeta {
-
-  /**
-   * This class is here because of the asymmetry in WriteToLogMeta with 
respect to the getter and
-   * setter for the "loglevel" variable. The only getter for the variable 
actually returns a
-   * LogLevel object, and the setter expects an int. The underlying storage is 
a String. This
-   * asymmetry causes issues with test harnesses using reflection.
-   *
-   * <p>MB - 5/2016
-   */
-  public WriteToLogMetaSymmetric() {
-    super();
-  }
-
-  public String getLogLevelString() {
-    LogLevel lvl = super.getLogLevelByDesc();
-    if (lvl == null) {
-      lvl = LogLevel.BASIC;
-    }
-    return WriteToLogMeta.logLevelCodes[lvl.getLevel()];
-  }
-
-  public void setLogLevelString(String value) {
-    LogLevel lvl = LogLevel.lookupCode(value);
-    super.setLogLevel(lvl.getLevel());
-  }
-}
diff --git 
a/plugins/transforms/writetolog/src/test/java/org/apache/pipeline/transforms/writetolog/WriteToLogMetaTest.java
 
b/plugins/transforms/writetolog/src/test/java/org/apache/pipeline/transforms/writetolog/WriteToLogMetaTest.java
index c5ebc6303b..f35324e007 100644
--- 
a/plugins/transforms/writetolog/src/test/java/org/apache/pipeline/transforms/writetolog/WriteToLogMetaTest.java
+++ 
b/plugins/transforms/writetolog/src/test/java/org/apache/pipeline/transforms/writetolog/WriteToLogMetaTest.java
@@ -16,20 +16,26 @@
  */
 package org.apache.pipeline.transforms.writetolog;
 
-import java.util.Arrays;
+import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
+import java.util.UUID;
 import org.apache.hop.core.HopEnvironment;
 import org.apache.hop.core.exception.HopException;
+import org.apache.hop.core.logging.LogLevel;
 import org.apache.hop.core.plugins.PluginRegistry;
 import org.apache.hop.junit.rules.RestoreHopEngineEnvironment;
 import org.apache.hop.pipeline.transforms.loadsave.LoadSaveTester;
 import org.apache.hop.pipeline.transforms.loadsave.initializer.IInitializer;
-import 
org.apache.hop.pipeline.transforms.loadsave.validator.ArrayLoadSaveValidator;
+import 
org.apache.hop.pipeline.transforms.loadsave.validator.BooleanLoadSaveValidator;
+import 
org.apache.hop.pipeline.transforms.loadsave.validator.EnumLoadSaveValidator;
 import 
org.apache.hop.pipeline.transforms.loadsave.validator.IFieldLoadSaveValidator;
+import 
org.apache.hop.pipeline.transforms.loadsave.validator.IntLoadSaveValidator;
+import 
org.apache.hop.pipeline.transforms.loadsave.validator.ListLoadSaveValidator;
 import 
org.apache.hop.pipeline.transforms.loadsave.validator.StringLoadSaveValidator;
+import org.apache.hop.pipeline.transforms.writetolog.LogField;
 import org.apache.hop.pipeline.transforms.writetolog.WriteToLogMeta;
 import org.junit.Before;
 import org.junit.ClassRule;
@@ -37,51 +43,53 @@ import org.junit.Test;
 
 public class WriteToLogMetaTest implements IInitializer<WriteToLogMeta> {
   @ClassRule public static RestoreHopEngineEnvironment env = new 
RestoreHopEngineEnvironment();
-  LoadSaveTester loadSaveTester;
-  Class<WriteToLogMetaSymmetric> testMetaClass = WriteToLogMetaSymmetric.class;
+  LoadSaveTester<WriteToLogMeta> loadSaveTester;
 
   @Before
   public void setUpLoadSave() throws Exception {
     HopEnvironment.init();
     PluginRegistry.init();
     List<String> attributes =
-        Arrays.asList(
-            "displayHeader", "limitRows", "limitRowsNumber", "logmessage", 
"loglevel", "fieldName");
+        List.of(
+            "DisplayHeader", "LimitRows", "LimitRowsNumber", "LogMessage", 
"LogLevel", "LogFields");
 
     Map<String, String> getterMap =
-        new HashMap<String, String>() {
+        new HashMap<>() {
           {
-            put("displayHeader", "isDisplayHeader");
-            put("limitRows", "isLimitRows");
-            put("limitRowsNumber", "getLimitRowsNumber");
-            put("logmessage", "getLogMessage");
-            put("loglevel", "getLogLevelString");
-            put("fieldName", "getFieldName");
+            put("DisplayHeader", "isDisplayHeader");
+            put("LimitRows", "isLimitRows");
+            put("LimitRowsNumber", "getLimitRowsNumber");
+            put("LogMessage", "getLogMessage");
+            put("LogLevel", "getLogLevel");
+            put("LogFields", "getLogFields");
           }
         };
+
     Map<String, String> setterMap =
-        new HashMap<String, String>() {
+        new HashMap<>() {
           {
-            put("displayHeader", "setDisplayHeader");
-            put("limitRows", "setLimitRows");
-            put("limitRowsNumber", "setLimitRowsNumber");
-            put("logmessage", "setLogMessage");
-            put("loglevel", "setLogLevelString");
-            put("fieldName", "setFieldName");
+            put("DisplayHeader", "setDisplayHeader");
+            put("LimitRows", "setLimitRows");
+            put("LimitRowsNumber", "setLimitRowsNumber");
+            put("LogMessage", "setLogMessage");
+            put("LogLevel", "setLogLevel");
+            put("LogFields", "setLogFields");
           }
         };
-    IFieldLoadSaveValidator<String[]> stringArrayLoadSaveValidator =
-        new ArrayLoadSaveValidator<>(new StringLoadSaveValidator(), 5);
 
     Map<String, IFieldLoadSaveValidator<?>> attrValidatorMap = new HashMap<>();
-    attrValidatorMap.put("fieldName", stringArrayLoadSaveValidator);
-    attrValidatorMap.put("loglevel", new LogLevelLoadSaveValidator());
+    attrValidatorMap.put("DisplayHeader", new BooleanLoadSaveValidator());
+    attrValidatorMap.put("LimitRows", new BooleanLoadSaveValidator());
+    attrValidatorMap.put("LimitRowsNumber", new IntLoadSaveValidator());
+    attrValidatorMap.put("LogMessage", new StringLoadSaveValidator());
+    attrValidatorMap.put("LogLevel", createLogLevelValidators());
+    attrValidatorMap.put("LogFields", new ListLoadSaveValidator<>(new 
LogFieldLoadSaveValidator()));
 
     Map<String, IFieldLoadSaveValidator<?>> typeValidatorMap = new HashMap<>();
 
     loadSaveTester =
-        new LoadSaveTester(
-            testMetaClass,
+        new LoadSaveTester<WriteToLogMeta>(
+            WriteToLogMeta.class,
             attributes,
             getterMap,
             setterMap,
@@ -90,35 +98,36 @@ public class WriteToLogMetaTest implements 
IInitializer<WriteToLogMeta> {
             this);
   }
 
-  // Call the allocate method on the LoadSaveTester meta class
-  @Override
-  public void modify(WriteToLogMeta someMeta) {
-    if (someMeta instanceof WriteToLogMeta) {
-      ((WriteToLogMeta) someMeta).allocate(5);
-    }
-  }
-
   @Test
   public void testSerialization() throws HopException {
     loadSaveTester.testSerialization();
   }
 
-  public class LogLevelLoadSaveValidator implements 
IFieldLoadSaveValidator<String> {
-    final Random rand = new Random();
-
-    @Override
-    public String getTestObject() {
-      int idx = rand.nextInt((WriteToLogMeta.logLevelCodes.length));
-      return WriteToLogMeta.logLevelCodes[idx];
-    }
+  protected EnumLoadSaveValidator<LogLevel> createLogLevelValidators() {
+    EnumSet<LogLevel> logLevels = EnumSet.allOf(LogLevel.class);
+    LogLevel random = (LogLevel) logLevels.toArray()[new 
Random().nextInt(logLevels.size())];
+    return new EnumLoadSaveValidator<>(random);
+  }
 
+  private final class LogFieldLoadSaveValidator implements 
IFieldLoadSaveValidator<LogField> {
     @Override
-    public boolean validateTestObject(String testObject, Object actual) {
-      if (!(actual instanceof String)) {
+    public boolean validateTestObject(LogField testObject, Object actual) {
+      if (!(actual instanceof LogField)) {
         return false;
       }
-      String actualInput = (String) actual;
+      LogField actualInput = (LogField) actual;
       return (testObject.equals(actualInput));
     }
+
+    @Override
+    public LogField getTestObject() {
+      return new LogField(UUID.randomUUID().toString());
+    }
+  }
+
+  @Override
+  public void modify(WriteToLogMeta object) {
+    // TODO Auto-generated method stub
+
   }
 }


Reply via email to