This is an automated email from the ASF dual-hosted git repository. nadment pushed a commit to branch 2002 in repository https://gitbox.apache.org/repos/asf/hop.git
commit 12c9f9529ee7f51596108486e2b8dc2fb5461b59 Author: Nicolas Adment <[email protected]> AuthorDate: Fri Jan 13 22:13:00 2023 +0100 Cleanup XML of action Workflow #2002 and Pipeline #1986 - Use MetaSelectionLine in Workflow and Pipeline action #2075 - LogLevel implements IEnumHasCodeAndDescription - Fix Workflow action run_configuration xml entry present twice #2361 --- .../java/org/apache/hop/core/logging/LogLevel.java | 53 ++- .../workflow/actions/pipeline/ActionPipeline.java | 510 +++++++++++---------- .../actions/pipeline/ActionPipelineDialog.java | 185 ++++---- .../workflow/actions/workflow/ActionWorkflow.java | 427 +++++++++-------- .../actions/workflow/ActionWorkflowDialog.java | 208 ++++----- .../actions/workflow/ActionWorkflowRunner.java | 1 - .../hop/ui/core/widget/MetaSelectionLine.java | 11 +- .../hop/ui/workflow/actions/ActionBaseDialog.java | 65 +-- .../actions/messages/messages_en_US.properties | 2 +- 9 files changed, 722 insertions(+), 740 deletions(-) diff --git a/core/src/main/java/org/apache/hop/core/logging/LogLevel.java b/core/src/main/java/org/apache/hop/core/logging/LogLevel.java index 5b3aaef223..bf6d8706ea 100644 --- a/core/src/main/java/org/apache/hop/core/logging/LogLevel.java +++ b/core/src/main/java/org/apache/hop/core/logging/LogLevel.java @@ -18,8 +18,10 @@ package org.apache.hop.core.logging; import org.apache.hop.i18n.BaseMessages; +import org.apache.hop.metadata.api.IEnumHasCode; +import org.apache.hop.metadata.api.IEnumHasCodeAndDescription; -public enum LogLevel { +public enum LogLevel implements IEnumHasCodeAndDescription { NOTHING(0, "Nothing"), ERROR(1, "Error"), MINIMAL(2, "Minimal"), @@ -40,8 +42,8 @@ public enum LogLevel { BaseMessages.getString(PKG, "LogWriter.Level.Rowlevel.LongDesc"), }; - private int level; - private String code; + private final int level; + private final String code; private LogLevel(int level, String code) { this.level = level; @@ -52,27 +54,45 @@ public enum LogLevel { return level; } + @Override public String getCode() { return code; } + @Override public String getDescription() { return logLevelDescriptions[level]; } - + /** * Return the log level for a certain log level code * * @param code the code to look for * @return the log level or BASIC if nothing matches. */ + @Deprecated public static LogLevel getLogLevelForCode(String code) { - for (LogLevel logLevel : values()) { - if (logLevel.getCode().equalsIgnoreCase(code)) { - return logLevel; - } - } - return BASIC; + return IEnumHasCode.lookupCode(LogLevel.class, code, LogLevel.BASIC); + } + + /** + * Return the log level for a certain log level code + * + * @param code the code to look for + * @return the log level or BASIC if nothing matches. + */ + public static LogLevel lookupCode(final String code) { + return IEnumHasCode.lookupCode(LogLevel.class, code, LogLevel.BASIC); + } + + /** + * Return the log level for a certain log level description + * + * @param description the description to look for + * @return the log level or BASIC if nothing matches. + */ + public static LogLevel lookupDescription(final String description) { + return IEnumHasCodeAndDescription.lookupDescription(LogLevel.class, description, LogLevel.BASIC); } /** @@ -118,17 +138,16 @@ public enum LogLevel { return this.level >= ROWLEVEL.level; } - /** @return An array of log level descriptions, sorted by level (0==Nothing, 6=Row Level) */ + /** + * Return an array of log level descriptions, sorted by level (0==Nothing, 6=Row Level) + * @return An array of log level descriptions + */ public static String[] getLogLevelDescriptions() { - return logLevelDescriptions; + return IEnumHasCodeAndDescription.getDescriptions(LogLevel.class); } /** @return An array of log level codes, sorted by level (0==Nothing, 6=Row Level) */ public static String[] logLogLevelCodes() { - String[] codes = new String[values().length]; - for (int i = 0; i < codes.length; i++) { - codes[i] = values()[i].getCode(); - } - return codes; + return IEnumHasCode.getCodes(LogLevel.class); } } diff --git a/plugins/actions/pipeline/src/main/java/org/apache/hop/workflow/actions/pipeline/ActionPipeline.java b/plugins/actions/pipeline/src/main/java/org/apache/hop/workflow/actions/pipeline/ActionPipeline.java index 98164e0446..cb16636561 100644 --- a/plugins/actions/pipeline/src/main/java/org/apache/hop/workflow/actions/pipeline/ActionPipeline.java +++ b/plugins/actions/pipeline/src/main/java/org/apache/hop/workflow/actions/pipeline/ActionPipeline.java @@ -26,7 +26,6 @@ import org.apache.hop.core.RowMetaAndData; import org.apache.hop.core.SqlStatement; import org.apache.hop.core.annotations.Action; import org.apache.hop.core.exception.HopException; -import org.apache.hop.core.exception.HopXmlException; import org.apache.hop.core.file.IHasFilename; import org.apache.hop.core.logging.LogChannelFileWriter; import org.apache.hop.core.logging.LogLevel; @@ -38,8 +37,8 @@ import org.apache.hop.core.util.FileUtil; import org.apache.hop.core.util.Utils; import org.apache.hop.core.variables.IVariables; import org.apache.hop.core.vfs.HopVfs; -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.TransformWithMappingMeta; @@ -56,7 +55,6 @@ import org.apache.hop.workflow.action.IAction; import org.apache.hop.workflow.action.validator.ActionValidatorUtils; import org.apache.hop.workflow.action.validator.AndValidator; import org.apache.hop.workflow.engine.IWorkflowEngine; -import org.w3c.dom.Node; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -76,80 +74,144 @@ import java.util.Map; public class ActionPipeline extends ActionBase implements Cloneable, IAction { private static final Class<?> PKG = ActionPipeline.class; // For Translator - private String filename; + public static final class ParameterDefinition { + @HopMetadataProperty(key = "pass_all_parameters") + private boolean passingAllParameters = true; + + @HopMetadataProperty(groupKey = "parameters", key = "parameter") + private List<Parameter> parameters; + + public ParameterDefinition() { + this.parameters = new ArrayList<>(); + } - public String[] arguments; + public boolean isPassingAllParameters() { + return passingAllParameters; + } - public boolean paramsFromPrevious; + public void setPassingAllParameters(boolean passingAllParameters) { + this.passingAllParameters = passingAllParameters; + } + + public List<Parameter> getParameters() { + return parameters; + } - public boolean execPerRow; + public void setParameters(List<Parameter> parameters) { + this.parameters = parameters; + } + + public String[] getNames() { + List<String> list = new ArrayList<>(); + for (Parameter parameter:parameters) { + list.add(parameter.getName()); + } + return list.toArray(new String[0]); + } + + public String[] getValues() { + List<String> list = new ArrayList<>(); + for (Parameter parameter:parameters) { + list.add(parameter.getValue()); + } + return list.toArray(new String[0]); + } + } + + public static final class Parameter { + @HopMetadataProperty + public String name; + @HopMetadataProperty + public String value; + @HopMetadataProperty(key="stream_name") + public String field; + + public String getName() { + return name; + } + public String getValue() { + return value; + } + public String getField() { + return field; + } + public void setName(String name) { + this.name = name; + } + public void setValue(String value) { + this.value = value; + } + public void setField(String field) { + this.field = field; + } + } + + @HopMetadataProperty(key = "filename") + private String filename; - public String[] parameters; + @HopMetadataProperty(key = "params_from_previous") + private boolean paramsFromPrevious; - public String[] parameterFieldNames; + @HopMetadataProperty(key = "exec_per_row") + private boolean execPerRow; - public String[] parameterValues; + @HopMetadataProperty(key = "clear_rows") + private boolean clearResultRows; - public boolean clearResultRows; + @HopMetadataProperty(key = "clear_files") + private boolean clearResultFiles; - public boolean clearResultFiles; + @HopMetadataProperty(key = "create_parent_folder") + private boolean createParentFolder; - public boolean createParentFolder; + @HopMetadataProperty(key = "set_logfile") + private boolean setLogfile; - public boolean setLogfile; + @HopMetadataProperty(key = "set_append_logfile") + private boolean setAppendLogfile; - public boolean setAppendLogfile; + @HopMetadataProperty(key = "logfile") + private String logfile; - public String logfile; - public String logext; - public boolean addDate; - public boolean addTime; + @HopMetadataProperty(key = "logext") + private String logext; - public LogLevel logFileLevel; + @HopMetadataProperty(key = "add_date") + private boolean addDate; - public boolean waitingToFinish = true; + @HopMetadataProperty(key = "add_time") + private boolean addTime; + + @HopMetadataProperty(key = "loglevel", storeWithCode = true) + private LogLevel logFileLevel; - private boolean passingAllParameters = true; + @HopMetadataProperty(key = "wait_until_finished") + private boolean waitingToFinish = true; + @HopMetadataProperty(key = "parameters") + private ParameterDefinition parameterDefinition; + + @HopMetadataProperty(key = "run_configuration") private String runConfiguration; private IPipelineEngine<PipelineMeta> pipeline; public ActionPipeline(String name) { super(name, ""); + this.parameterDefinition = new ParameterDefinition(); } public ActionPipeline() { this(""); clear(); } - - private void allocateArgs(int nrArgs) { - arguments = new String[nrArgs]; + + public ParameterDefinition getParameterDefinition() { + return parameterDefinition; } - private void allocateParams(int nrParameters) { - parameters = new String[nrParameters]; - parameterFieldNames = new String[nrParameters]; - parameterValues = new String[nrParameters]; - } - - @Override - public Object clone() { - ActionPipeline je = (ActionPipeline) super.clone(); - if (arguments != null) { - int nrArgs = arguments.length; - je.allocateArgs(nrArgs); - System.arraycopy(arguments, 0, je.arguments, 0, nrArgs); - } - if (parameters != null) { - int nrParameters = parameters.length; - je.allocateParams(nrParameters); - System.arraycopy(parameters, 0, je.parameters, 0, nrParameters); - System.arraycopy(parameterFieldNames, 0, je.parameterFieldNames, 0, nrParameters); - System.arraycopy(parameterValues, 0, je.parameterValues, 0, nrParameters); - } - return je; + public void setParameterDefinition(ParameterDefinition parameterDefinition) { + this.parameterDefinition = parameterDefinition; } public void setFileName(String n) { @@ -186,139 +248,11 @@ public class ActionPipeline extends ActionBase implements Cloneable, IAction { return retval; } - @Override - public String getXml() { - StringBuilder retval = new StringBuilder(300); - - retval.append(super.getXml()); - - retval.append(" ").append(XmlHandler.addTagValue("filename", filename)); - retval - .append(" ") - .append(XmlHandler.addTagValue("params_from_previous", paramsFromPrevious)); - retval.append(" ").append(XmlHandler.addTagValue("exec_per_row", execPerRow)); - retval.append(" ").append(XmlHandler.addTagValue("clear_rows", clearResultRows)); - retval.append(" ").append(XmlHandler.addTagValue("clear_files", clearResultFiles)); - retval.append(" ").append(XmlHandler.addTagValue("set_logfile", setLogfile)); - retval.append(" ").append(XmlHandler.addTagValue("logfile", logfile)); - retval.append(" ").append(XmlHandler.addTagValue("logext", logext)); - retval.append(" ").append(XmlHandler.addTagValue("add_date", addDate)); - retval.append(" ").append(XmlHandler.addTagValue("add_time", addTime)); - retval - .append(" ") - .append( - XmlHandler.addTagValue( - "loglevel", logFileLevel != null ? logFileLevel.getCode() : null)); - retval.append(" ").append(XmlHandler.addTagValue("set_append_logfile", setAppendLogfile)); - retval.append(" ").append(XmlHandler.addTagValue("wait_until_finished", waitingToFinish)); - retval - .append(" ") - .append(XmlHandler.addTagValue("create_parent_folder", createParentFolder)); - retval.append(" ").append(XmlHandler.addTagValue("run_configuration", runConfiguration)); - - if (arguments != null) { - for (int i = 0; i < arguments.length; i++) { - // This is a very very bad way of making an XML file, don't use it (or - // copy it). Sven Boden - retval.append(" ").append(XmlHandler.addTagValue("argument" + i, arguments[i])); - } - } - - if (parameters != null) { - retval.append(" ").append(XmlHandler.openTag("parameters")).append(Const.CR); - - retval - .append(" ") - .append(XmlHandler.addTagValue("pass_all_parameters", passingAllParameters)); - - for (int i = 0; i < parameters.length; i++) { - // This is a better way of making the XML file than the arguments. - retval.append(" ").append(XmlHandler.openTag("parameter")).append(Const.CR); - - retval.append(" ").append(XmlHandler.addTagValue("name", parameters[i])); - retval - .append(" ") - .append(XmlHandler.addTagValue("stream_name", parameterFieldNames[i])); - retval.append(" ").append(XmlHandler.addTagValue("value", parameterValues[i])); - - retval.append(" ").append(XmlHandler.closeTag("parameter")).append(Const.CR); - } - retval.append(" ").append(XmlHandler.closeTag("parameters")).append(Const.CR); - } - - return retval.toString(); - } - - @Override - public void loadXml(Node entrynode, IHopMetadataProvider metadataProvider, IVariables variables) - throws HopXmlException { - try { - super.loadXml(entrynode); - - filename = XmlHandler.getTagValue(entrynode, "filename"); - - paramsFromPrevious = - "Y".equalsIgnoreCase(XmlHandler.getTagValue(entrynode, "params_from_previous")); - execPerRow = "Y".equalsIgnoreCase(XmlHandler.getTagValue(entrynode, "exec_per_row")); - clearResultRows = "Y".equalsIgnoreCase(XmlHandler.getTagValue(entrynode, "clear_rows")); - clearResultFiles = "Y".equalsIgnoreCase(XmlHandler.getTagValue(entrynode, "clear_files")); - setLogfile = "Y".equalsIgnoreCase(XmlHandler.getTagValue(entrynode, "set_logfile")); - addDate = "Y".equalsIgnoreCase(XmlHandler.getTagValue(entrynode, "add_date")); - addTime = "Y".equalsIgnoreCase(XmlHandler.getTagValue(entrynode, "add_time")); - logfile = XmlHandler.getTagValue(entrynode, "logfile"); - logext = XmlHandler.getTagValue(entrynode, "logext"); - logFileLevel = LogLevel.getLogLevelForCode(XmlHandler.getTagValue(entrynode, "loglevel")); - createParentFolder = - "Y".equalsIgnoreCase(XmlHandler.getTagValue(entrynode, "create_parent_folder")); - runConfiguration = XmlHandler.getTagValue(entrynode, "run_configuration"); - - setAppendLogfile = - "Y".equalsIgnoreCase(XmlHandler.getTagValue(entrynode, "set_append_logfile")); - String wait = XmlHandler.getTagValue(entrynode, "wait_until_finished"); - if (Utils.isEmpty(wait)) { - waitingToFinish = true; - } else { - waitingToFinish = "Y".equalsIgnoreCase(wait); - } - - // How many arguments? - int argnr = 0; - while (XmlHandler.getTagValue(entrynode, "argument" + argnr) != null) { - argnr++; - } - allocateArgs(argnr); - - // Read them all... - for (int a = 0; a < argnr; a++) { - arguments[a] = XmlHandler.getTagValue(entrynode, "argument" + a); - } - - Node parametersNode = XmlHandler.getSubNode(entrynode, "parameters"); - - String passAll = XmlHandler.getTagValue(parametersNode, "pass_all_parameters"); - passingAllParameters = Utils.isEmpty(passAll) || "Y".equalsIgnoreCase(passAll); - - int nrParameters = XmlHandler.countNodes(parametersNode, "parameter"); - allocateParams(nrParameters); - - for (int i = 0; i < nrParameters; i++) { - Node knode = XmlHandler.getSubNodeByNr(parametersNode, "parameter", i); - - parameters[i] = XmlHandler.getTagValue(knode, "name"); - parameterFieldNames[i] = XmlHandler.getTagValue(knode, "stream_name"); - parameterValues[i] = XmlHandler.getTagValue(knode, "value"); - } - } catch (HopException e) { - throw new HopXmlException("Unable to load action of type 'pipeline' from XML node", e); - } - } - @Override public void clear() { super.clear(); filename = null; - arguments = null; execPerRow = false; addDate = false; addTime = false; @@ -434,26 +368,24 @@ public class ActionPipeline extends ActionBase implements Cloneable, IAction { } INamedParameters namedParam = new NamedParameters(); - if (parameters != null) { - for (int idx = 0; idx < parameters.length; idx++) { - if (!Utils.isEmpty(parameters[idx])) { - // We have a parameter + for (Parameter parameter : parameterDefinition.getParameters()) { + if (!Utils.isEmpty(parameter.getName())) { + // We have a parameter + // + namedParam.addParameterDefinition(parameter.getName(), "", "Action runtime"); + if (Utils.isEmpty(Const.trim(parameter.getField()))) { + // There is no field name specified. // - namedParam.addParameterDefinition(parameters[idx], "", "Action runtime"); - if (Utils.isEmpty(Const.trim(parameterFieldNames[idx]))) { - // There is no field name specified. - // - String value = Const.NVL(resolve(parameterValues[idx]), ""); - namedParam.setParameterValue(parameters[idx], value); - } else { - // something filled in, in the field column... - // - String value = ""; - if (resultRow != null) { - value = resultRow.getString(parameterFieldNames[idx], ""); - } - namedParam.setParameterValue(parameters[idx], value); + String value = Const.NVL(resolve(parameter.getValue()), ""); + namedParam.setParameterValue(parameter.getName(), value); + } else { + // something filled in, in the field column... + // + String value = ""; + if (resultRow != null) { + value = resultRow.getString(parameter.getField(), ""); } + namedParam.setParameterValue(parameter.getName(), value); } } } @@ -501,58 +433,55 @@ public class ActionPipeline extends ActionBase implements Cloneable, IAction { if (paramsFromPrevious) { // Copy the input the parameters - if (parameters != null) { - for (int idx = 0; idx < parameters.length; idx++) { - if (!Utils.isEmpty(parameters[idx])) { + for (Parameter parameter : parameterDefinition.getParameters()) { + if (!Utils.isEmpty(parameter.getName())) { // We have a parameter - if (Utils.isEmpty(Const.trim(parameterFieldNames[idx]))) { + if (Utils.isEmpty(Const.trim(parameter.getField()))) { namedParam.setParameterValue( - parameters[idx], Const.NVL(resolve(parameterValues[idx]), "")); + parameter.getName(), Const.NVL(resolve(parameter.getValue()), "")); } else { String fieldValue = ""; if (resultRow != null) { - fieldValue = resultRow.getString(parameterFieldNames[idx], ""); + fieldValue = resultRow.getString(parameter.getField(), ""); } // Get the value from the input stream - namedParam.setParameterValue(parameters[idx], Const.NVL(fieldValue, "")); + namedParam.setParameterValue(parameter.getName(), Const.NVL(fieldValue, "")); } } } - } + } } else { if (paramsFromPrevious) { // Copy the input the parameters - if (parameters != null) { - for (int idx = 0; idx < parameters.length; idx++) { - if (!Utils.isEmpty(parameters[idx])) { + for (Parameter parameter : parameterDefinition.getParameters()) { + if (!Utils.isEmpty(parameter.getName())) { // We have a parameter - if (Utils.isEmpty(Const.trim(parameterFieldNames[idx]))) { + if (Utils.isEmpty(Const.trim(parameter.getField()))) { namedParam.setParameterValue( - parameters[idx], Const.NVL(resolve(parameterValues[idx]), "")); + parameter.getName(), Const.NVL(resolve(parameter.getValue()), "")); } else { String fieldValue = ""; if (resultRow != null) { - fieldValue = resultRow.getString(parameterFieldNames[idx], ""); + fieldValue = resultRow.getString(parameter.getField(), ""); } // Get the value from the input stream - namedParam.setParameterValue(parameters[idx], Const.NVL(fieldValue, "")); + namedParam.setParameterValue(parameter.getName(), Const.NVL(fieldValue, "")); } } } } - } + } // Handle the parameters... // String[] parameterNames = pipelineMeta.listParameters(); - prepareFieldNamesParameters( - parameters, parameterFieldNames, parameterValues, namedParam, this); + prepareFieldNamesParameters(parameterDefinition.getParameters(), namedParam, this); if (StringUtils.isEmpty(runConfiguration)) { throw new HopException( @@ -592,9 +521,9 @@ public class ActionPipeline extends ActionBase implements Cloneable, IAction { pipeline, this, parameterNames, - parameters, - parameterValues, - isPassingAllParameters()); + parameterDefinition.getNames(), + parameterDefinition.getValues(), + parameterDefinition.isPassingAllParameters()); // First get the root workflow // @@ -841,7 +770,7 @@ public class ActionPipeline extends ActionBase implements Cloneable, IAction { return proposedNewFilename; } - protected String getLogfile() { + public String getLogfile() { return logfile; } @@ -855,16 +784,6 @@ public class ActionPipeline extends ActionBase implements Cloneable, IAction { this.waitingToFinish = waitingToFinish; } - /** @return the passingAllParameters */ - public boolean isPassingAllParameters() { - return passingAllParameters; - } - - /** @param passingAllParameters the passingAllParameters to set */ - public void setPassingAllParameters(boolean passingAllParameters) { - this.passingAllParameters = passingAllParameters; - } - public String getRunConfiguration() { return runConfiguration; } @@ -919,38 +838,123 @@ public class ActionPipeline extends ActionBase implements Cloneable, IAction { super.setParentWorkflowMeta(parentWorkflowMeta); } - public void prepareFieldNamesParameters( - String[] parameters, - String[] parameterFieldNames, - String[] parameterValues, - INamedParameters namedParam, - ActionPipeline actionPipeline) - throws UnknownParamException { - for (int idx = 0; idx < parameters.length; idx++) { + public void prepareFieldNamesParameters(List<Parameter> parameters, INamedParameters namedParam, + ActionPipeline actionPipeline) throws UnknownParamException { + for (Parameter parameter : parameters) { // Grab the parameter value set in the Pipeline action - // Set fieldNameParameter only if exists and if it is not declared any staticValue( - // parameterValues array ) + // Set parameter.getField() only if exists and if it is not declared any static parameter.getValue() // - String thisValue = namedParam.getParameterValue(parameters[idx]); - // Set value only if is not empty at namedParam and exists in parameterFieldNames - if (idx < parameterFieldNames.length) { - // If exists then ask if is not empty - if (!Utils.isEmpty(Const.trim(parameterFieldNames[idx]))) { - // If is not empty then we have to ask if it exists too in parameterValues array, since - // the values in - // parameterValues prevail over parameterFieldNames - if (idx < parameterValues.length) { - // If is empty at parameterValues array, then we can finally add that variable with that - // value - if (Utils.isEmpty(Const.trim(parameterValues[idx]))) { - actionPipeline.setVariable(parameters[idx], Const.NVL(thisValue, "")); - } - } else { - // Or if not in parameterValues then we can add that variable with that value too - actionPipeline.setVariable(parameters[idx], Const.NVL(thisValue, "")); - } + String thisValue = namedParam.getParameterValue(parameter.getName()); + // Set value only if is not empty at namedParam and exists in parameter.getField + if (!Utils.isEmpty(Const.trim(parameter.getField()))) { + // If is not empty then we have to ask if it exists too in parameter.getValue(), since + // the values in parameter.getValue() prevail over parameterFieldNames + // If is empty at parameter.getValue(), then we can finally add that variable with that + // value + if (Utils.isEmpty(Const.trim(parameter.getValue()))) { + actionPipeline.setVariable(parameter.getName(), Const.NVL(thisValue, "")); } + } else { + // Or if not in parameter.getValue() then we can add that variable with that value too + actionPipeline.setVariable(parameter.getName(), Const.NVL(thisValue, "")); } + } } + + public boolean isExecPerRow() { + return execPerRow; + } + + public void setExecPerRow(boolean runEveryResultRow) { + this.execPerRow = runEveryResultRow; + } + + public boolean isAddDate() { + return addDate; + } + + public boolean isAddTime() { + return addTime; + } + + public void setAddDate(boolean addDate) { + this.addDate = addDate; + } + + public void setAddTime(boolean addTime) { + this.addTime = addTime; + } + + public String getLogext() { + return logext; + } + + public void setFilename(String filename) { + this.filename = filename; + } + + public void setLogfile(String logfile) { + this.logfile = logfile; + } + + public void setLogext(String logext) { + this.logext = logext; + } + + public boolean isSetLogfile() { + return setLogfile; + } + + public LogLevel getLogFileLevel() { + return logFileLevel; + } + + public boolean isCreateParentFolder() { + return createParentFolder; + } + + public void setSetLogfile(boolean setLogfile) { + this.setLogfile = setLogfile; + } + + public void setLogFileLevel(LogLevel logFileLevel) { + this.logFileLevel = logFileLevel; + } + + public void setCreateParentFolder(boolean createParentFolder) { + this.createParentFolder = createParentFolder; + } + + public boolean isParamsFromPrevious() { + return paramsFromPrevious; + } + + public boolean isSetAppendLogfile() { + return setAppendLogfile; + } + + public void setParamsFromPrevious(boolean paramsFromPrevious) { + this.paramsFromPrevious = paramsFromPrevious; + } + + public void setSetAppendLogfile(boolean setAppendLogfile) { + this.setAppendLogfile = setAppendLogfile; + } + + public boolean isClearResultRows() { + return clearResultRows; + } + + public boolean isClearResultFiles() { + return clearResultFiles; + } + + public void setClearResultRows(boolean clearResultRows) { + this.clearResultRows = clearResultRows; + } + + public void setClearResultFiles(boolean clearResultFiles) { + this.clearResultFiles = clearResultFiles; + } } diff --git a/plugins/actions/pipeline/src/main/java/org/apache/hop/workflow/actions/pipeline/ActionPipelineDialog.java b/plugins/actions/pipeline/src/main/java/org/apache/hop/workflow/actions/pipeline/ActionPipelineDialog.java index 37bc9259f7..2166418cb2 100644 --- a/plugins/actions/pipeline/src/main/java/org/apache/hop/workflow/actions/pipeline/ActionPipelineDialog.java +++ b/plugins/actions/pipeline/src/main/java/org/apache/hop/workflow/actions/pipeline/ActionPipelineDialog.java @@ -33,6 +33,7 @@ import org.apache.hop.ui.core.PropsUi; import org.apache.hop.ui.core.dialog.BaseDialog; import org.apache.hop.ui.core.dialog.ErrorDialog; import org.apache.hop.ui.core.dialog.MessageBox; +import org.apache.hop.ui.core.widget.MetaSelectionLine; import org.apache.hop.ui.hopgui.HopGui; import org.apache.hop.ui.hopgui.file.pipeline.HopPipelineFileType; import org.apache.hop.ui.util.SwtSvgImageUtil; @@ -42,13 +43,14 @@ import org.apache.hop.workflow.WorkflowMeta; import org.apache.hop.workflow.action.ActionBase; import org.apache.hop.workflow.action.IAction; import org.apache.hop.workflow.action.IActionDialog; +import org.apache.hop.workflow.actions.pipeline.ActionPipeline.Parameter; +import org.apache.hop.workflow.actions.pipeline.ActionPipeline.ParameterDefinition; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TableItem; @@ -58,7 +60,8 @@ import java.util.List; public class ActionPipelineDialog extends ActionBaseDialog implements IActionDialog { private static final Class<?> PKG = ActionPipeline.class; // For Translator - protected ActionPipeline action; + private ActionPipeline action; + private MetaSelectionLine<PipelineRunConfiguration> wRunConfiguration; private static final String[] FILE_FILTERLOGNAMES = new String[] { @@ -125,30 +128,13 @@ public class ActionPipelineDialog extends ActionBaseDialog implements IActionDia fdWait.top = new FormAttachment(wClearFiles, 10); fdWait.left = new FormAttachment(0, 0); wWaitingToFinish.setLayoutData(fdWait); + + // force reload from file specification + wbGetParams.addListener(SWT.Selection, e -> getParameters(null)); - wbGetParams.addSelectionListener( - new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent arg0) { - getParameters(null); // force reload from file specification - } - }); - - wbBrowse.addSelectionListener( - new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - pickFileVFS(); - } - }); - - wbLogFilename.addSelectionListener( - new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - selectLogFile(FILE_FILTERLOGNAMES); - } - }); + wbBrowse.addListener(SWT.Selection, e -> pickFileVFS()); + + wbLogFilename.addListener(SWT.Selection, e -> selectLogFile(FILE_FILTERLOGNAMES)); } @Override @@ -167,8 +153,8 @@ public class ActionPipelineDialog extends ActionBaseDialog implements IActionDia } @Override - protected String[] getParameters() { - return action.parameters; + protected int getParameterCount() { + return action.getParameterDefinition().getParameters().size(); } private void getParameters(PipelineMeta inputPipelineMeta) { @@ -201,6 +187,22 @@ public class ActionPipelineDialog extends ActionBaseDialog implements IActionDia } } + @Override + protected Control createRunConfigurationControl() { + wRunConfiguration = + new MetaSelectionLine<>( + variables, + metadataProvider, + PipelineRunConfiguration.class, + shell, + SWT.BORDER, + null, + null, + true); + + return wRunConfiguration; + } + protected void pickFileVFS() { HopPipelineFileType<PipelineMeta> pipelineFileType = new HopPipelineFileType<>(); String filename = @@ -225,43 +227,42 @@ public class ActionPipelineDialog extends ActionBaseDialog implements IActionDia wPath.setText(Const.NVL(action.getFilename(), "")); // Parameters - if (action.parameters != null) { - for (int i = 0; i < action.parameters.length; i++) { - TableItem ti = wParameters.table.getItem(i); - if (!Utils.isEmpty(action.parameters[i])) { - ti.setText(1, Const.NVL(action.parameters[i], "")); - ti.setText(2, Const.NVL(action.parameterFieldNames[i], "")); - ti.setText(3, Const.NVL(action.parameterValues[i], "")); + ParameterDefinition parameterDefinition = action.getParameterDefinition(); + if (action.getParameterDefinition() != null) { + for (int i = 0; i < parameterDefinition.getParameters().size(); i++) { + Parameter parameter = parameterDefinition.getParameters().get(i); + TableItem item = wParameters.getTable().getItem(i); + if (!Utils.isEmpty(parameter.getName())) { + item.setText(1, Const.NVL(parameter.getName(), "")); + item.setText(2, Const.NVL(parameter.getField(), "")); + item.setText(3, Const.NVL(parameter.getValue(), "")); } } wParameters.setRowNums(); wParameters.optWidth(true); } - wPassParams.setSelection(action.isPassingAllParameters()); + wPassParams.setSelection(parameterDefinition.isPassingAllParameters()); - if (action.logfile != null) { - wLogfile.setText(action.logfile); + if (action.getLogfile() != null) { + wLogfile.setText(action.getLogfile()); } - if (action.logext != null) { - wLogext.setText(action.logext); + if (action.getLogext() != null) { + wLogext.setText(action.getLogext()); } - wPrevToParams.setSelection(action.paramsFromPrevious); - wEveryRow.setSelection(action.execPerRow); - wSetLogfile.setSelection(action.setLogfile); - wAddDate.setSelection(action.addDate); - wAddTime.setSelection(action.addTime); - wClearRows.setSelection(action.clearResultRows); - wClearFiles.setSelection(action.clearResultFiles); + wPrevToParams.setSelection(action.isParamsFromPrevious()); + wEveryRow.setSelection(action.isExecPerRow()); + wSetLogfile.setSelection(action.isSetLogfile()); + wAddDate.setSelection(action.isAddDate()); + wAddTime.setSelection(action.isAddTime()); + wClearRows.setSelection(action.isClearResultRows()); + wClearFiles.setSelection(action.isClearResultFiles()); wWaitingToFinish.setSelection(action.isWaitingToFinish()); - wAppendLogfile.setSelection(action.setAppendLogfile); - - wbLogFilename.setSelection(action.setAppendLogfile); - - wCreateParentFolder.setSelection(action.createParentFolder); - if (action.logFileLevel != null) { - wLoglevel.select(action.logFileLevel.getLevel()); + wAppendLogfile.setSelection(action.isSetAppendLogfile()); + wCreateParentFolder.setSelection(action.isCreateParentFolder()); + if (action.getLogFileLevel() != null) { + wLoglevel.select(action.getLogFileLevel().getLevel()); } try { @@ -292,6 +293,8 @@ public class ActionPipelineDialog extends ActionBaseDialog implements IActionDia LogChannel.UI.logError("Error getting pipeline run configurations", e); } + setLogFileEnabled(); + wName.selectAll(); wName.setFocus(); } @@ -314,62 +317,48 @@ public class ActionPipelineDialog extends ActionBaseDialog implements IActionDia PKG, "ActionPipeline.Dialog.Exception.NoValidMappingDetailsFound")); } + ParameterDefinition parameterDefinition = action.getParameterDefinition(); + parameterDefinition.getParameters().clear(); + // Do the parameters int nrItems = wParameters.nrNonEmpty(); - int nr = 0; for (int i = 0; i < nrItems; i++) { - String param = wParameters.getNonEmpty(i).getText(1); - if (param != null && param.length() != 0) { - nr++; - } - } - actionPipeline.parameters = new String[nrItems]; - actionPipeline.parameterFieldNames = new String[nrItems]; - actionPipeline.parameterValues = new String[nrItems]; - nr = 0; - for (int i = 0; i < nrItems; i++) { - String param = wParameters.getNonEmpty(i).getText(1); - String fieldName = wParameters.getNonEmpty(i).getText(2); - String value = wParameters.getNonEmpty(i).getText(3); + TableItem item = wParameters.getNonEmpty(i); - actionPipeline.parameters[nr] = param; + Parameter parameter = new Parameter(); + parameter.setName(item.getText(1)); - if (!Utils.isEmpty(Const.trim(fieldName))) { - actionPipeline.parameterFieldNames[nr] = fieldName; + String fieldName = Const.trim(item.getText(2)); + if (!Utils.isEmpty(fieldName)) { + parameter.setField(fieldName); } else { - actionPipeline.parameterFieldNames[nr] = ""; + parameter.setField(""); } - if (!Utils.isEmpty(Const.trim(value))) { - actionPipeline.parameterValues[nr] = value; + String value = Const.trim(item.getText(3)); + if (!Utils.isEmpty(value)) { + parameter.setValue(value); } else { - actionPipeline.parameterValues[nr] = ""; + parameter.setValue(""); } - - nr++; + + parameterDefinition.getParameters().add(parameter); } - - actionPipeline.setPassingAllParameters(wPassParams.getSelection()); - - actionPipeline.logfile = wLogfile.getText(); - actionPipeline.logext = wLogext.getText(); - - if (wLoglevel.getSelectionIndex() >= 0) { - actionPipeline.logFileLevel = LogLevel.values()[wLoglevel.getSelectionIndex()]; - } else { - actionPipeline.logFileLevel = LogLevel.BASIC; - } - - actionPipeline.paramsFromPrevious = wPrevToParams.getSelection(); - actionPipeline.execPerRow = wEveryRow.getSelection(); - actionPipeline.setLogfile = wSetLogfile.getSelection(); - actionPipeline.addDate = wAddDate.getSelection(); - actionPipeline.addTime = wAddTime.getSelection(); - actionPipeline.clearResultRows = wClearRows.getSelection(); - actionPipeline.clearResultFiles = wClearFiles.getSelection(); - actionPipeline.createParentFolder = wCreateParentFolder.getSelection(); + parameterDefinition.setPassingAllParameters(wPassParams.getSelection()); + + actionPipeline.setLogfile(wLogfile.getText()); + actionPipeline.setLogext(wLogext.getText()); + actionPipeline.setLogFileLevel(LogLevel.lookupDescription(wLoglevel.getText())); + actionPipeline.setParamsFromPrevious(wPrevToParams.getSelection()); + actionPipeline.setExecPerRow(wEveryRow.getSelection()); + actionPipeline.setSetLogfile(wSetLogfile.getSelection()); + actionPipeline.setAddDate(wAddDate.getSelection()); + actionPipeline.setAddTime(wAddTime.getSelection()); + actionPipeline.setClearResultRows(wClearRows.getSelection()); + actionPipeline.setClearResultFiles(wClearFiles.getSelection()); + actionPipeline.setCreateParentFolder(wCreateParentFolder.getSelection()); actionPipeline.setRunConfiguration(wRunConfiguration.getText()); - actionPipeline.setAppendLogfile = wAppendLogfile.getSelection(); + actionPipeline.setSetAppendLogfile(wAppendLogfile.getSelection()); actionPipeline.setWaitingToFinish(wWaitingToFinish.getSelection()); } diff --git a/plugins/actions/workflow/src/main/java/org/apache/hop/workflow/actions/workflow/ActionWorkflow.java b/plugins/actions/workflow/src/main/java/org/apache/hop/workflow/actions/workflow/ActionWorkflow.java index 07be3351fb..10bf07a9a3 100644 --- a/plugins/actions/workflow/src/main/java/org/apache/hop/workflow/actions/workflow/ActionWorkflow.java +++ b/plugins/actions/workflow/src/main/java/org/apache/hop/workflow/actions/workflow/ActionWorkflow.java @@ -26,7 +26,6 @@ import org.apache.hop.core.RowMetaAndData; import org.apache.hop.core.SqlStatement; import org.apache.hop.core.annotations.Action; import org.apache.hop.core.exception.HopException; -import org.apache.hop.core.exception.HopXmlException; import org.apache.hop.core.file.IHasFilename; import org.apache.hop.core.logging.LogChannelFileWriter; import org.apache.hop.core.logging.LogLevel; @@ -37,8 +36,8 @@ import org.apache.hop.core.util.CurrentDirectoryResolver; import org.apache.hop.core.util.Utils; import org.apache.hop.core.variables.IVariables; import org.apache.hop.core.vfs.HopVfs; -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.resource.IResourceNaming; import org.apache.hop.resource.ResourceDefinition; @@ -52,7 +51,6 @@ import org.apache.hop.workflow.action.validator.ActionValidatorUtils; import org.apache.hop.workflow.action.validator.AndValidator; import org.apache.hop.workflow.engine.IWorkflowEngine; import org.apache.hop.workflow.engine.WorkflowEngineFactory; -import org.w3c.dom.Node; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -77,30 +75,102 @@ import java.util.UUID; public class ActionWorkflow extends ActionBase implements Cloneable, IAction { private static final Class<?> PKG = ActionWorkflow.class; // For Translator - private String filename; - - public boolean paramsFromPrevious; - public boolean execPerRow; - - public String[] parameters; - public String[] parameterFieldNames; - public String[] parameterValues; + public static final class ParameterDefinition { + @HopMetadataProperty(key = "pass_all_parameters") + private boolean passingAllParameters = true; + + @HopMetadataProperty(groupKey = "parameters", key = "parameter") + private List<Parameter> parameters; - public boolean setLogfile; - public String logfile; - public String logext; - public boolean addDate; - public boolean addTime; - public LogLevel logFileLevel; - - public boolean parallel; - public boolean setAppendLogfile; - public boolean createParentFolder; + public ParameterDefinition() { + this.parameters = new ArrayList<>(); + } - public boolean waitingToFinish = true; + public boolean isPassingAllParameters() { + return passingAllParameters; + } - public boolean passingAllParameters = true; + public void setPassingAllParameters(boolean passingAllParameters) { + this.passingAllParameters = passingAllParameters; + } + + public List<Parameter> getParameters() { + return parameters; + } + public void setParameters(List<Parameter> parameters) { + this.parameters = parameters; + } + } + + public static final class Parameter { + @HopMetadataProperty + public String name; + @HopMetadataProperty + public String value; + @HopMetadataProperty(key="stream_name") + public String field; + + public String getName() { + return name; + } + public String getValue() { + return value; + } + public String getField() { + return field; + } + public void setName(String name) { + this.name = name; + } + public void setValue(String value) { + this.value = value; + } + public void setField(String field) { + this.field = field; + } + } + + @HopMetadataProperty(key = "filename") + private String filename; + + @HopMetadataProperty(key = "params_from_previous") + private boolean paramsFromPrevious; + + @HopMetadataProperty(key = "exec_per_row") + private boolean execPerRow; + + @HopMetadataProperty(key = "set_logfile") + private boolean setLogfile; + + @HopMetadataProperty(key = "logfile") + private String logfile; + + @HopMetadataProperty(key = "logext") + private String logext; + + @HopMetadataProperty(key = "add_date") + private boolean addDate; + + @HopMetadataProperty(key = "add_time") + private boolean addTime; + + @HopMetadataProperty(key = "loglevel", storeWithCode = true) + private LogLevel logFileLevel; + + @HopMetadataProperty(key = "set_append_logfile") + private boolean setAppendLogfile; + + @HopMetadataProperty(key = "create_parent_folder") + private boolean createParentFolder; + + @HopMetadataProperty(key = "wait_until_finished") + private boolean waitingToFinish = true; + + @HopMetadataProperty(key = "parameters") + private ParameterDefinition parameterDefinition; + + @HopMetadataProperty(key = "run_configuration") private String runConfiguration; public static final LogLevel DEFAULT_LOG_LEVEL = LogLevel.NOTHING; @@ -109,6 +179,7 @@ public class ActionWorkflow extends ActionBase implements Cloneable, IAction { public ActionWorkflow(String name) { super(name, ""); + this.parameterDefinition = new ParameterDefinition(); } public ActionWorkflow() { @@ -116,29 +187,8 @@ public class ActionWorkflow extends ActionBase implements Cloneable, IAction { clear(); } - private void allocateArgs(int nrArgs) {} - - private void allocateParams(int nrParameters) { - parameters = new String[nrParameters]; - parameterFieldNames = new String[nrParameters]; - parameterValues = new String[nrParameters]; - } - - @Override - public Object clone() { - ActionWorkflow je = (ActionWorkflow) super.clone(); - if (parameters != null) { - int nrParameters = parameters.length; - je.allocateParams(nrParameters); - System.arraycopy(parameters, 0, je.parameters, 0, nrParameters); - System.arraycopy(parameterFieldNames, 0, je.parameterFieldNames, 0, nrParameters); - System.arraycopy(parameterValues, 0, je.parameterValues, 0, nrParameters); - } - return je; - } - - public void setFileName(String n) { - filename = n; + public void setFileName(String name) { + this.filename = name; } @Override @@ -179,119 +229,12 @@ public class ActionWorkflow extends ActionBase implements Cloneable, IAction { return retval; } - @Override - public String getXml() { - StringBuilder retval = new StringBuilder(400); - - retval.append(super.getXml()); - - retval.append(" ").append(XmlHandler.addTagValue("run_configuration", runConfiguration)); - - retval.append(" ").append(XmlHandler.addTagValue("filename", filename)); - - retval - .append(" ") - .append(XmlHandler.addTagValue("params_from_previous", paramsFromPrevious)); - retval.append(" ").append(XmlHandler.addTagValue("exec_per_row", execPerRow)); - retval.append(" ").append(XmlHandler.addTagValue("set_logfile", setLogfile)); - retval.append(" ").append(XmlHandler.addTagValue("logfile", logfile)); - retval.append(" ").append(XmlHandler.addTagValue("logext", logext)); - retval.append(" ").append(XmlHandler.addTagValue("add_date", addDate)); - retval.append(" ").append(XmlHandler.addTagValue("add_time", addTime)); - retval - .append(" ") - .append( - XmlHandler.addTagValue( - "loglevel", - logFileLevel != null ? logFileLevel.getCode() : DEFAULT_LOG_LEVEL.getCode())); - retval.append(" ").append(XmlHandler.addTagValue("wait_until_finished", waitingToFinish)); - retval - .append(" ") - .append(XmlHandler.addTagValue("create_parent_folder", createParentFolder)); - retval.append(" ").append(XmlHandler.addTagValue("run_configuration", runConfiguration)); - - if (parameters != null) { - retval.append(" ").append(XmlHandler.openTag("parameters")); - - retval - .append(" ") - .append(XmlHandler.addTagValue("pass_all_parameters", passingAllParameters)); - - for (int i = 0; i < parameters.length; i++) { - // This is a better way of making the XML file than the arguments. - retval.append(" ").append(XmlHandler.openTag("parameter")); - - retval.append(" ").append(XmlHandler.addTagValue("name", parameters[i])); - retval - .append(" ") - .append(XmlHandler.addTagValue("stream_name", parameterFieldNames[i])); - retval.append(" ").append(XmlHandler.addTagValue("value", parameterValues[i])); - - retval.append(" ").append(XmlHandler.closeTag("parameter")); - } - retval.append(" ").append(XmlHandler.closeTag("parameters")); - } - retval.append(" ").append(XmlHandler.addTagValue("set_append_logfile", setAppendLogfile)); - - return retval.toString(); + public ParameterDefinition getParameterDefinition() { + return parameterDefinition; } - @Override - public void loadXml(Node entrynode, IHopMetadataProvider metadataProvider, IVariables variables) - throws HopXmlException { - try { - super.loadXml(entrynode); - - runConfiguration = XmlHandler.getTagValue(entrynode, "run_configuration"); - filename = XmlHandler.getTagValue(entrynode, "filename"); - - paramsFromPrevious = - "Y".equalsIgnoreCase(XmlHandler.getTagValue(entrynode, "params_from_previous")); - execPerRow = "Y".equalsIgnoreCase(XmlHandler.getTagValue(entrynode, "exec_per_row")); - setLogfile = "Y".equalsIgnoreCase(XmlHandler.getTagValue(entrynode, "set_logfile")); - addDate = "Y".equalsIgnoreCase(XmlHandler.getTagValue(entrynode, "add_date")); - addTime = "Y".equalsIgnoreCase(XmlHandler.getTagValue(entrynode, "add_time")); - logfile = XmlHandler.getTagValue(entrynode, "logfile"); - logext = XmlHandler.getTagValue(entrynode, "logext"); - logFileLevel = LogLevel.getLogLevelForCode(XmlHandler.getTagValue(entrynode, "loglevel")); - setAppendLogfile = - "Y".equalsIgnoreCase(XmlHandler.getTagValue(entrynode, "set_append_logfile")); - createParentFolder = - "Y".equalsIgnoreCase(XmlHandler.getTagValue(entrynode, "create_parent_folder")); - runConfiguration = XmlHandler.getTagValue(entrynode, "run_configuration"); - - String wait = XmlHandler.getTagValue(entrynode, "wait_until_finished"); - if (Utils.isEmpty(wait)) { - waitingToFinish = true; - } else { - waitingToFinish = "Y".equalsIgnoreCase(wait); - } - - // How many arguments? - int argnr = 0; - while (XmlHandler.getTagValue(entrynode, "argument" + argnr) != null) { - argnr++; - } - allocateArgs(argnr); - - Node parametersNode = XmlHandler.getSubNode(entrynode, "parameters"); - - String passAll = XmlHandler.getTagValue(parametersNode, "pass_all_parameters"); - passingAllParameters = Utils.isEmpty(passAll) || "Y".equalsIgnoreCase(passAll); - - int nrParameters = XmlHandler.countNodes(parametersNode, "parameter"); - allocateParams(nrParameters); - - for (int i = 0; i < nrParameters; i++) { - Node knode = XmlHandler.getSubNodeByNr(parametersNode, "parameter", i); - - parameters[i] = XmlHandler.getTagValue(knode, "name"); - parameterFieldNames[i] = XmlHandler.getTagValue(knode, "stream_name"); - parameterValues[i] = XmlHandler.getTagValue(knode, "value"); - } - } catch (HopXmlException xe) { - throw new HopXmlException("Unable to load 'workflow' action from XML node", xe); - } + public void setParameterDefinition(ParameterDefinition parameterDefinition) { + this.parameterDefinition = parameterDefinition; } @Override @@ -299,7 +242,7 @@ public class ActionWorkflow extends ActionBase implements Cloneable, IAction { result.setEntryNr(nr); LogChannelFileWriter logChannelFileWriter = null; - LogLevel jobLogLevel = parentWorkflow.getLogLevel(); + LogLevel workflowLogLevel = parentWorkflow.getLogLevel(); if (setLogfile) { String realLogFilename = resolve(getLogFilename()); @@ -331,7 +274,7 @@ public class ActionWorkflow extends ActionBase implements Cloneable, IAction { result.setResult(false); return result; } - jobLogLevel = logFileLevel; + workflowLogLevel = logFileLevel; } try { @@ -403,37 +346,36 @@ public class ActionWorkflow extends ActionBase implements Cloneable, IAction { // Now add those parameter values specified by the user in the action // - if (parameters != null) { - for (int idx = 0; idx < parameters.length; idx++) { - if (!Utils.isEmpty(parameters[idx])) { + for (Parameter parameter : parameterDefinition.getParameters()) { + if (!Utils.isEmpty(parameter.getName())) { // If it's not yet present in the parent workflow, add it... // - if (Const.indexOfString(parameters[idx], namedParam.listParameters()) < 0) { + if (Const.indexOfString(parameter.getName(), namedParam.listParameters()) < 0) { // We have a parameter try { - namedParam.addParameterDefinition(parameters[idx], "", "Action runtime"); + namedParam.addParameterDefinition(parameter.getName(), "", "Action runtime"); } catch (DuplicateParamException e) { // Should never happen // - logError("Duplicate parameter definition for " + parameters[idx]); + logError("Duplicate parameter definition for " + parameter.getName()); } } - if (Utils.isEmpty(Const.trim(parameterFieldNames[idx]))) { + if (Utils.isEmpty(Const.trim(parameter.getField()))) { namedParam.setParameterValue( - parameters[idx], Const.NVL(resolve(parameterValues[idx]), "")); + parameter.getName(), Const.NVL(resolve(parameter.getValue()), "")); } else { // something filled in, in the field column... // String value = ""; if (resultRow != null) { - value = resultRow.getString(parameterFieldNames[idx], ""); + value = resultRow.getString(parameter.getField(), ""); } - namedParam.setParameterValue(parameters[idx], value); + namedParam.setParameterValue(parameter.getName(), value); } } - } + } Result oneResult = new Result(); @@ -450,22 +392,20 @@ public class ActionWorkflow extends ActionBase implements Cloneable, IAction { if (paramsFromPrevious) { // Copy the input the parameters - if (parameters != null) { - for (int idx = 0; idx < parameters.length; idx++) { - if (!Utils.isEmpty(parameters[idx])) { - // We have a parameter - if (Utils.isEmpty(Const.trim(parameterFieldNames[idx]))) { - namedParam.setParameterValue( - parameters[idx], Const.NVL(resolve(parameterValues[idx]), "")); - } else { - String fieldValue = ""; - - if (resultRow != null) { - fieldValue = resultRow.getString(parameterFieldNames[idx], ""); - } - // Get the value from the input stream - namedParam.setParameterValue(parameters[idx], Const.NVL(fieldValue, "")); + for (Parameter parameter : parameterDefinition.getParameters()) { + if (!Utils.isEmpty(parameter.getName())) { + // We have a parameter + if (Utils.isEmpty(Const.trim(parameter.getField()))) { + namedParam.setParameterValue(parameter.getName(), + Const.NVL(resolve(parameter.getValue()), "")); + } else { + String fieldValue = ""; + + if (resultRow != null) { + fieldValue = resultRow.getString(parameter.getField(), ""); } + // Get the value from the input stream + namedParam.setParameterValue(parameter.getName(), Const.NVL(fieldValue, "")); } } } @@ -477,23 +417,20 @@ public class ActionWorkflow extends ActionBase implements Cloneable, IAction { sourceRows = result.getRows(); if (paramsFromPrevious) { // Copy the input the parameters - - if (parameters != null) { - for (int idx = 0; idx < parameters.length; idx++) { - if (!Utils.isEmpty(parameters[idx])) { - // We have a parameter - if (Utils.isEmpty(Const.trim(parameterFieldNames[idx]))) { - namedParam.setParameterValue( - parameters[idx], Const.NVL(resolve(parameterValues[idx]), "")); - } else { - String fieldValue = ""; - - if (resultRow != null) { - fieldValue = resultRow.getString(parameterFieldNames[idx], ""); - } - // Get the value from the input stream - namedParam.setParameterValue(parameters[idx], Const.NVL(fieldValue, "")); + for (Parameter parameter : parameterDefinition.getParameters()) { + if (!Utils.isEmpty(parameter.getName())) { + // We have a parameter + if (Utils.isEmpty(Const.trim(parameter.getField()))) { + namedParam.setParameterValue(parameter.getName(), + Const.NVL(resolve(parameter.getValue()), "")); + } else { + String fieldValue = ""; + + if (resultRow != null) { + fieldValue = resultRow.getString(parameter.getField(), ""); } + // Get the value from the input stream + namedParam.setParameterValue(parameter.getName(), Const.NVL(fieldValue, "")); } } } @@ -506,7 +443,7 @@ public class ActionWorkflow extends ActionBase implements Cloneable, IAction { WorkflowEngineFactory.createWorkflowEngine( this, resolve(runConfiguration), getMetadataProvider(), workflowMeta, this); workflow.setParentWorkflow(parentWorkflow); - workflow.setLogLevel(jobLogLevel); + workflow.setLogLevel(workflowLogLevel); workflow.shareWith(this); workflow.setResult(result); workflow.setInternalHopVariables(); @@ -533,7 +470,7 @@ public class ActionWorkflow extends ActionBase implements Cloneable, IAction { // This value should pass down to the sub-workflow if that's what we // opted to do. // - if (isPassingAllParameters()) { + if (parameterDefinition.isPassingAllParameters()) { String parentValue = parentWorkflow.getParameterValue(parameterNames[idx]); if (!Utils.isEmpty(parentValue)) { workflow.setParameterValue(parameterNames[idx], parentValue); @@ -884,7 +821,7 @@ public class ActionWorkflow extends ActionBase implements Cloneable, IAction { } } - protected String getLogfile() { + public String getLogfile() { return logfile; } @@ -898,16 +835,6 @@ public class ActionWorkflow extends ActionBase implements Cloneable, IAction { this.waitingToFinish = waitingToFinish; } - /** @return the passingAllParameters */ - public boolean isPassingAllParameters() { - return passingAllParameters; - } - - /** @param passingAllParameters the passingAllParameters to set */ - public void setPassingAllParameters(boolean passingAllParameters) { - this.passingAllParameters = passingAllParameters; - } - public IWorkflowEngine<WorkflowMeta> getWorkflow() { return workflow; } @@ -948,4 +875,76 @@ public class ActionWorkflow extends ActionBase implements Cloneable, IAction { int index, IHopMetadataProvider metadataProvider, IVariables variables) throws HopException { return getWorkflowMeta(metadataProvider, variables); } + + public boolean isAddDate() { + return addDate; + } + + public boolean isAddTime() { + return addTime; + } + + public void setAddDate(boolean addDate) { + this.addDate = addDate; + } + + public void setAddTime(boolean addTime) { + this.addTime = addTime; + } + + public String getLogext() { + return logext; + } + + public void setFilename(String filename) { + this.filename = filename; + } + + public void setLogfile(String logfile) { + this.logfile = logfile; + } + + public void setLogext(String logext) { + this.logext = logext; + } + + public boolean isSetLogfile() { + return setLogfile; + } + + public LogLevel getLogFileLevel() { + return logFileLevel; + } + + public boolean isCreateParentFolder() { + return createParentFolder; + } + + public void setSetLogfile(boolean setLogfile) { + this.setLogfile = setLogfile; + } + + public void setLogFileLevel(LogLevel logFileLevel) { + this.logFileLevel = logFileLevel; + } + + public void setCreateParentFolder(boolean createParentFolder) { + this.createParentFolder = createParentFolder; + } + + public boolean isParamsFromPrevious() { + return paramsFromPrevious; + } + + public boolean isSetAppendLogfile() { + return setAppendLogfile; + } + + public void setParamsFromPrevious(boolean paramsFromPrevious) { + this.paramsFromPrevious = paramsFromPrevious; + } + + public void setSetAppendLogfile(boolean setAppendLogfile) { + this.setAppendLogfile = setAppendLogfile; + } } diff --git a/plugins/actions/workflow/src/main/java/org/apache/hop/workflow/actions/workflow/ActionWorkflowDialog.java b/plugins/actions/workflow/src/main/java/org/apache/hop/workflow/actions/workflow/ActionWorkflowDialog.java index 5b585398b9..1245b80bca 100644 --- a/plugins/actions/workflow/src/main/java/org/apache/hop/workflow/actions/workflow/ActionWorkflowDialog.java +++ b/plugins/actions/workflow/src/main/java/org/apache/hop/workflow/actions/workflow/ActionWorkflowDialog.java @@ -32,6 +32,7 @@ import org.apache.hop.ui.core.PropsUi; import org.apache.hop.ui.core.dialog.BaseDialog; import org.apache.hop.ui.core.dialog.ErrorDialog; import org.apache.hop.ui.core.dialog.MessageBox; +import org.apache.hop.ui.core.widget.MetaSelectionLine; import org.apache.hop.ui.hopgui.HopGui; import org.apache.hop.ui.hopgui.file.workflow.HopWorkflowFileType; import org.apache.hop.ui.util.SwtSvgImageUtil; @@ -41,16 +42,15 @@ import org.apache.hop.workflow.WorkflowMeta; import org.apache.hop.workflow.action.ActionBase; import org.apache.hop.workflow.action.IAction; import org.apache.hop.workflow.action.IActionDialog; +import org.apache.hop.workflow.actions.workflow.ActionWorkflow.Parameter; +import org.apache.hop.workflow.actions.workflow.ActionWorkflow.ParameterDefinition; import org.apache.hop.workflow.config.WorkflowRunConfiguration; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; 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.Composite; +import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TableItem; @@ -60,8 +60,9 @@ import java.util.List; public class ActionWorkflowDialog extends ActionBaseDialog implements IActionDialog { private static final Class<?> PKG = ActionWorkflow.class; // For Translator - protected ActionWorkflow action; - + private ActionWorkflow action; + private MetaSelectionLine<WorkflowRunConfiguration> wRunConfiguration; + private static final String[] FILE_FILTERLOGNAMES = new String[] { BaseMessages.getString(PKG, "ActionWorkflow.Fileformat.TXT"), @@ -112,39 +113,12 @@ public class ActionWorkflowDialog extends ActionBaseDialog implements IActionDia fdWait.left = new FormAttachment(0, 0); wWaitingToFinish.setLayoutData(fdWait); - // End Server Section - - Composite cRunConfiguration = new Composite(wOptions, SWT.NONE); - cRunConfiguration.setLayout(new FormLayout()); - PropsUi.setLook(cRunConfiguration); - FormData fdLocal = new FormData(); - fdLocal.top = new FormAttachment(0); - fdLocal.right = new FormAttachment(100); - fdLocal.left = new FormAttachment(0); - - wbGetParams.addSelectionListener( - new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent arg0) { - getParameters(null); // force reload from file specification - } - }); - - wbBrowse.addSelectionListener( - new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - pickFileVFS(); - } - }); - - wbLogFilename.addSelectionListener( - new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - selectLogFile(FILE_FILTERLOGNAMES); - } - }); + // force reload from file specification + wbGetParams.addListener(SWT.Selection, e -> getParameters(null)); + + wbBrowse.addListener(SWT.Selection, e -> pickFileVFS()); + + wbLogFilename.addListener(SWT.Selection, e -> selectLogFile(FILE_FILTERLOGNAMES)); } @Override @@ -163,8 +137,8 @@ public class ActionWorkflowDialog extends ActionBaseDialog implements IActionDia } @Override - protected String[] getParameters() { - return action.parameters; + protected int getParameterCount() { + return action.getParameterDefinition().getParameters().size(); } protected void getParameters(WorkflowMeta inputWorkflowMeta) { @@ -195,6 +169,22 @@ public class ActionWorkflowDialog extends ActionBaseDialog implements IActionDia e); } } + + @Override + protected Control createRunConfigurationControl() { + wRunConfiguration = + new MetaSelectionLine<>( + variables, + metadataProvider, + WorkflowRunConfiguration.class, + shell, + SWT.BORDER, + null, + null, + true); + + return wRunConfiguration; + } protected void pickFileVFS() { HopWorkflowFileType<WorkflowMeta> workflowFileType = new HopWorkflowFileType<>(); @@ -221,41 +211,43 @@ public class ActionWorkflowDialog extends ActionBaseDialog implements IActionDia wPath.setText(Const.NVL(action.getFilename(), "")); // Parameters - if (action.parameters != null) { - for (int i = 0; i < action.parameters.length; i++) { - TableItem ti = wParameters.table.getItem(i); - if (!Utils.isEmpty(action.parameters[i])) { - ti.setText(1, Const.NVL(action.parameters[i], "")); - ti.setText(2, Const.NVL(action.parameterFieldNames[i], "")); - ti.setText(3, Const.NVL(action.parameterValues[i], "")); + ParameterDefinition parameterDefinition = action.getParameterDefinition(); + if (action.getParameterDefinition() != null) { + for (int i = 0; i < parameterDefinition.getParameters().size(); i++) { + Parameter parameter = parameterDefinition.getParameters().get(i); + TableItem item = wParameters.getTable().getItem(i); + if (!Utils.isEmpty(parameter.getName())) { + item.setText(1, Const.NVL(parameter.getName(), "")); + item.setText(2, Const.NVL(parameter.getField(), "")); + item.setText(3, Const.NVL(parameter.getValue(), "")); } } wParameters.setRowNums(); wParameters.optWidth(true); } - wPassParams.setSelection(action.isPassingAllParameters()); + wPassParams.setSelection(parameterDefinition.isPassingAllParameters()); - wPrevToParams.setSelection(action.paramsFromPrevious); - wEveryRow.setSelection(action.execPerRow); - wSetLogfile.setSelection(action.setLogfile); - if (action.logfile != null) { - wLogfile.setText(action.logfile); + wPrevToParams.setSelection(action.isParamsFromPrevious()); + wEveryRow.setSelection(action.isExecPerRow()); + wSetLogfile.setSelection(action.isSetLogfile()); + if (action.getLogfile() != null) { + wLogfile.setText(action.getLogfile()); } - if (action.logext != null) { - wLogext.setText(action.logext); + if (action.getLogext() != null) { + wLogext.setText(action.getLogext()); } - wAddDate.setSelection(action.addDate); - wAddTime.setSelection(action.addTime); + wAddDate.setSelection(action.isAddDate()); + wAddTime.setSelection(action.isAddTime()); - if (action.logFileLevel != null) { - wLoglevel.select(action.logFileLevel.getLevel()); + if (action.getLogFileLevel() != null) { + wLoglevel.select(action.getLogFileLevel().getLevel()); } else { // Set the default log level wLoglevel.select(ActionWorkflow.DEFAULT_LOG_LEVEL.getLevel()); } - wAppendLogfile.setSelection(action.setAppendLogfile); - wCreateParentFolder.setSelection(action.createParentFolder); + wAppendLogfile.setSelection(action.isSetAppendLogfile()); + wCreateParentFolder.setSelection(action.isCreateParentFolder()); wWaitingToFinish.setSelection(action.isWaitingToFinish()); try { @@ -273,10 +265,8 @@ public class ActionWorkflowDialog extends ActionBaseDialog implements IActionDia } catch (HopException e) { // Ignore errors } - + wRunConfiguration.setItems(runConfigurations.toArray(new String[0])); - wRunConfiguration.setText(Const.NVL(action.getRunConfiguration(), "")); - if (Utils.isEmpty(action.getRunConfiguration())) { wRunConfiguration.select(0); } else { @@ -286,6 +276,8 @@ public class ActionWorkflowDialog extends ActionBaseDialog implements IActionDia LogChannel.UI.logError("Error getting workflow run configurations", e); } + setLogFileEnabled(); + wName.selectAll(); wName.setFocus(); } @@ -299,64 +291,52 @@ public class ActionWorkflowDialog extends ActionBaseDialog implements IActionDia } @VisibleForTesting - protected void getInfo(ActionWorkflow aw) { - String jobPath = getPath(); - aw.setName(getName()); - aw.setFileName(jobPath); - aw.setRunConfiguration(wRunConfiguration.getText()); - + protected void getInfo(ActionWorkflow action) { + action.setName(wName.getText()); + action.setFileName(wPath.getText()); + action.setRunConfiguration(wRunConfiguration.getText()); + + ParameterDefinition parameterDefinition = action.getParameterDefinition(); + parameterDefinition.getParameters().clear(); + // Do the parameters int nrItems = wParameters.nrNonEmpty(); - int nr = 0; for (int i = 0; i < nrItems; i++) { - String param = wParameters.getNonEmpty(i).getText(1); - if (param != null && param.length() != 0) { - nr++; - } - } - aw.parameters = new String[nr]; - aw.parameterFieldNames = new String[nr]; - aw.parameterValues = new String[nr]; - nr = 0; - for (int i = 0; i < nrItems; i++) { - String param = wParameters.getNonEmpty(i).getText(1); - String fieldName = wParameters.getNonEmpty(i).getText(2); - String value = wParameters.getNonEmpty(i).getText(3); - - aw.parameters[nr] = param; - - if (!Utils.isEmpty(Const.trim(fieldName))) { - aw.parameterFieldNames[nr] = fieldName; + TableItem item = wParameters.getNonEmpty(i); + + Parameter parameter = new Parameter(); + parameter.setName(item.getText(1)); + + String fieldName = Const.trim(item.getText(2)); + if (!Utils.isEmpty(fieldName)) { + parameter.setField(fieldName); } else { - aw.parameterFieldNames[nr] = ""; + parameter.setField(""); } - if (!Utils.isEmpty(Const.trim(value))) { - aw.parameterValues[nr] = value; + String value = Const.trim(item.getText(3)); + if (!Utils.isEmpty(value)) { + parameter.setValue(value); } else { - aw.parameterValues[nr] = ""; + parameter.setValue(""); } - - nr++; - } - aw.setPassingAllParameters(wPassParams.getSelection()); - - aw.setLogfile = wSetLogfile.getSelection(); - aw.addDate = wAddDate.getSelection(); - aw.addTime = wAddTime.getSelection(); - aw.logfile = wLogfile.getText(); - aw.logext = wLogext.getText(); - if (wLoglevel.getSelectionIndex() >= 0) { - aw.logFileLevel = LogLevel.values()[wLoglevel.getSelectionIndex()]; - } else { - aw.logFileLevel = LogLevel.BASIC; + + parameterDefinition.getParameters().add(parameter); } - aw.paramsFromPrevious = wPrevToParams.getSelection(); - aw.execPerRow = wEveryRow.getSelection(); - aw.setAppendLogfile = wAppendLogfile.getSelection(); - aw.setWaitingToFinish(wWaitingToFinish.getSelection()); - aw.createParentFolder = wCreateParentFolder.getSelection(); - aw.setRunConfiguration(wRunConfiguration.getText()); + parameterDefinition.setPassingAllParameters(wPassParams.getSelection()); + + action.setSetLogfile(wSetLogfile.getSelection()); + action.setAddDate(wAddDate.getSelection()); + action.setAddTime(wAddTime.getSelection()); + action.setLogfile(wLogfile.getText()); + action.setLogext(wLogext.getText()); + action.setLogFileLevel(LogLevel.lookupDescription(wLoglevel.getText())); + action.setParamsFromPrevious(wPrevToParams.getSelection()); + action.setExecPerRow(wEveryRow.getSelection()); + action.setSetAppendLogfile(wAppendLogfile.getSelection()); + action.setWaitingToFinish(wWaitingToFinish.getSelection()); + action.setCreateParentFolder(wCreateParentFolder.getSelection()); + action.setRunConfiguration(wRunConfiguration.getText()); } @Override diff --git a/plugins/actions/workflow/src/main/java/org/apache/hop/workflow/actions/workflow/ActionWorkflowRunner.java b/plugins/actions/workflow/src/main/java/org/apache/hop/workflow/actions/workflow/ActionWorkflowRunner.java index 9857195078..8949304338 100644 --- a/plugins/actions/workflow/src/main/java/org/apache/hop/workflow/actions/workflow/ActionWorkflowRunner.java +++ b/plugins/actions/workflow/src/main/java/org/apache/hop/workflow/actions/workflow/ActionWorkflowRunner.java @@ -25,7 +25,6 @@ import org.apache.hop.i18n.BaseMessages; import org.apache.hop.workflow.Workflow; import org.apache.hop.workflow.WorkflowMeta; import org.apache.hop.workflow.engine.IWorkflowEngine; -import org.apache.hop.workflow.engines.local.LocalWorkflowEngine; public class ActionWorkflowRunner implements Runnable { private static final Class<?> PKG = Workflow.class; // For Translator diff --git a/ui/src/main/java/org/apache/hop/ui/core/widget/MetaSelectionLine.java b/ui/src/main/java/org/apache/hop/ui/core/widget/MetaSelectionLine.java index 5f12968d28..b7f8981c88 100644 --- a/ui/src/main/java/org/apache/hop/ui/core/widget/MetaSelectionLine.java +++ b/ui/src/main/java/org/apache/hop/ui/core/widget/MetaSelectionLine.java @@ -171,7 +171,9 @@ public class MetaSelectionLine<T extends IHopMetadata> extends Composite { } fdLabel.top = new FormAttachment(0, margin + (EnvironmentUtils.getInstance().isWeb() ? 3 : 0)); wLabel.setLayoutData(fdLabel); - wLabel.setText(labelText); + if ( labelText!=null ) { + wLabel.setText(labelText); + } wLabel.setToolTipText(toolTipText); wLabel.requestLayout(); // Avoid GTK error in log @@ -209,7 +211,12 @@ public class MetaSelectionLine<T extends IHopMetadata> extends Composite { wCombo = new ComboVar(this.variables, this, textFlags, toolTipText); FormData fdCombo = new FormData(); if (leftAlignedLabel) { - fdCombo.left = new FormAttachment(wLabel, margin, SWT.RIGHT); + if ( labelText==null ) { + fdCombo.left = new FormAttachment(0, 0); + } + else { + fdCombo.left = new FormAttachment(wLabel, margin, SWT.RIGHT); + } } else { fdCombo.left = new FormAttachment(middle, 0); } diff --git a/ui/src/main/java/org/apache/hop/ui/workflow/actions/ActionBaseDialog.java b/ui/src/main/java/org/apache/hop/ui/workflow/actions/ActionBaseDialog.java index 545bbef2ab..a24495ef34 100644 --- a/ui/src/main/java/org/apache/hop/ui/workflow/actions/ActionBaseDialog.java +++ b/ui/src/main/java/org/apache/hop/ui/workflow/actions/ActionBaseDialog.java @@ -32,7 +32,6 @@ import org.apache.hop.ui.core.dialog.MessageBox; import org.apache.hop.ui.core.gui.GuiResource; import org.apache.hop.ui.core.widget.ColumnInfo; import org.apache.hop.ui.core.widget.ColumnsResizer; -import org.apache.hop.ui.core.widget.ComboVar; import org.apache.hop.ui.core.widget.TableView; import org.apache.hop.ui.core.widget.TextVar; import org.apache.hop.ui.pipeline.transform.BaseTransformDialog; @@ -53,6 +52,7 @@ import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; @@ -70,17 +70,11 @@ public abstract class ActionBaseDialog extends ActionDialog { protected Button wbBrowse; - protected Label wlRunConfiguration; - protected ComboVar wRunConfiguration; - protected Group gLogFile; protected Composite wOptions; - protected Label wlName; protected Text wName; - protected FormData fdlName; - protected FormData fdName; protected Button wSetLogfile; @@ -88,7 +82,6 @@ public abstract class ActionBaseDialog extends ActionDialog { protected TextVar wLogfile; protected Button wbLogFilename; - protected FormData fdbLogFilename; protected Button wCreateParentFolder; @@ -133,8 +126,6 @@ public abstract class ActionBaseDialog extends ActionDialog { protected Display display; - protected FormData fdgExecution; - protected LogChannel log; public ActionBaseDialog( @@ -161,17 +152,17 @@ public abstract class ActionBaseDialog extends ActionDialog { wicon.setLayoutData(fdlicon); PropsUi.setLook(wicon); - wlName = new Label(shell, SWT.LEFT); + Label wlName = new Label(shell, SWT.LEFT); PropsUi.setLook(wlName); wlName.setText(BaseMessages.getString(PKG, "ActionPipeline.ActionName.Label")); - fdlName = new FormData(); + FormData fdlName = new FormData(); fdlName.left = new FormAttachment(0, 0); fdlName.top = new FormAttachment(0, 0); wlName.setLayoutData(fdlName); wName = new Text(shell, SWT.SINGLE | SWT.LEFT | SWT.BORDER); PropsUi.setLook(wName); - fdName = new FormData(); + FormData fdName = new FormData(); fdName.right = new FormAttachment(wicon, -5); fdName.top = new FormAttachment(wlName, 5); fdName.left = new FormAttachment(0, 0); @@ -208,7 +199,7 @@ public abstract class ActionBaseDialog extends ActionDialog { fdPath.right = new FormAttachment(wbBrowse, -5); wPath.setLayoutData(fdPath); - wlRunConfiguration = new Label(shell, SWT.LEFT); + Label wlRunConfiguration = new Label(shell, SWT.LEFT); wlRunConfiguration.setText( BaseMessages.getString(PKG, "ActionPipeline.RunConfiguration.Label")); PropsUi.setLook(wlRunConfiguration); @@ -218,14 +209,13 @@ public abstract class ActionBaseDialog extends ActionDialog { fdlRunConfiguration.right = new FormAttachment(50, 0); wlRunConfiguration.setLayoutData(fdlRunConfiguration); - wRunConfiguration = new ComboVar(variables, shell, SWT.LEFT | SWT.BORDER); - PropsUi.setLook(wRunConfiguration); + Control wRunConfiguration = this.createRunConfigurationControl(); FormData fdRunConfiguration = new FormData(); fdRunConfiguration.left = new FormAttachment(0, 0); - fdRunConfiguration.top = new FormAttachment(wlRunConfiguration, Const.isOSX() ? 0 : 5); fdRunConfiguration.right = new FormAttachment(100, 0); + fdRunConfiguration.top = new FormAttachment(wlRunConfiguration, Const.isOSX() ? 0 : 5); wRunConfiguration.setLayoutData(fdRunConfiguration); - + CTabFolder wTabFolder = new CTabFolder(shell, SWT.BORDER); PropsUi.setLook(wTabFolder, Props.WIDGET_STYLE_TAB); @@ -250,7 +240,7 @@ public abstract class ActionBaseDialog extends ActionDialog { gExecutionLayout.marginHeight = 15; gExecution.setLayout(gExecutionLayout); - fdgExecution = new FormData(); + FormData fdgExecution = new FormData(); fdgExecution.top = new FormAttachment(0, 10); fdgExecution.left = new FormAttachment(0, 0); fdgExecution.right = new FormAttachment(100, 0); @@ -294,6 +284,7 @@ public abstract class ActionBaseDialog extends ActionDialog { fdSpecifyLogFile.left = new FormAttachment(0, 0); fdSpecifyLogFile.top = new FormAttachment(0, 0); wSetLogfile.setLayoutData(fdSpecifyLogFile); + wSetLogfile.addListener(SWT.Selection, e -> setLogFileEnabled()); gLogFile = new Group(wLogging, SWT.SHADOW_ETCHED_IN); PropsUi.setLook(gLogFile); @@ -312,23 +303,23 @@ public abstract class ActionBaseDialog extends ActionDialog { wlLogfile = new Label(gLogFile, SWT.LEFT); PropsUi.setLook(wlLogfile); wlLogfile.setText(BaseMessages.getString(PKG, "ActionPipeline.NameOfLogfile.Label")); - FormData fdlName = new FormData(); - fdlName.left = new FormAttachment(0, 0); - fdlName.top = new FormAttachment(0, 0); - wlLogfile.setLayoutData(fdlName); + FormData fdlLogfile = new FormData(); + fdlLogfile.left = new FormAttachment(0, 0); + fdlLogfile.top = new FormAttachment(0, 0); + wlLogfile.setLayoutData(fdlLogfile); wLogfile = new TextVar(variables, gLogFile, SWT.SINGLE | SWT.LEFT | SWT.BORDER); PropsUi.setLook(wLogfile); - FormData fdName = new FormData(); - fdName.width = 250; - fdName.left = new FormAttachment(0, 0); - fdName.top = new FormAttachment(wlLogfile, 5); - wLogfile.setLayoutData(fdName); + FormData fdLogfile = new FormData(); + fdLogfile.width = 250; + fdLogfile.left = new FormAttachment(0, 0); + fdLogfile.top = new FormAttachment(wlLogfile, 5); + wLogfile.setLayoutData(fdLogfile); wbLogFilename = new Button(gLogFile, SWT.PUSH | SWT.CENTER); PropsUi.setLook(wbLogFilename); wbLogFilename.setText(BaseMessages.getString(PKG, "ActionPipeline.Browse.Label")); - fdbLogFilename = new FormData(); + FormData fdbLogFilename = new FormData(); fdbLogFilename.top = new FormAttachment(wlLogfile, Const.isOSX() ? 0 : 5); fdbLogFilename.left = new FormAttachment(wLogfile, 5); wbLogFilename.setLayoutData(fdbLogFilename); @@ -399,14 +390,6 @@ public abstract class ActionBaseDialog extends ActionDialog { fdIncludeTime.top = new FormAttachment(wAddDate, 10); wAddTime.setLayoutData(fdIncludeTime); - wSetLogfile.addSelectionListener( - new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent selectionEvent) { - setLogFileEnabled(); - } - }); - wLoggingTab.setControl(wLogging); FormData fdLogging = new FormData(); @@ -458,7 +441,7 @@ public abstract class ActionBaseDialog extends ActionDialog { fdGetParams.right = new FormAttachment(100, 0); wbGetParams.setLayoutData(fdGetParams); - final int parameterRows = getParameters() != null ? getParameters().length : 0; + final int parameterRows = getParameterCount(); ColumnInfo[] colinf = new ColumnInfo[] { @@ -529,7 +512,7 @@ public abstract class ActionBaseDialog extends ActionDialog { FormData fdTabFolder = new FormData(); fdTabFolder.left = new FormAttachment(0, 0); - fdTabFolder.top = new FormAttachment(wRunConfiguration, 20); + fdTabFolder.top = new FormAttachment(wRunConfiguration, 20); fdTabFolder.right = new FormAttachment(100, 0); fdTabFolder.bottom = new FormAttachment(hSpacer, -15); wTabFolder.setLayoutData(fdTabFolder); @@ -614,5 +597,7 @@ public abstract class ActionBaseDialog extends ActionDialog { protected abstract Image getImage(); - protected abstract String[] getParameters(); + protected abstract int getParameterCount(); + + protected abstract Control createRunConfigurationControl(); } diff --git a/ui/src/main/resources/org/apache/hop/ui/workflow/actions/messages/messages_en_US.properties b/ui/src/main/resources/org/apache/hop/ui/workflow/actions/messages/messages_en_US.properties index c85c3f2ef2..4759fd3971 100644 --- a/ui/src/main/resources/org/apache/hop/ui/workflow/actions/messages/messages_en_US.properties +++ b/ui/src/main/resources/org/apache/hop/ui/workflow/actions/messages/messages_en_US.properties @@ -37,5 +37,5 @@ ActionPipeline.Parameters.ColumnName.Label=Stream Column Name ActionPipeline.Parameters.Parameter.Label=Parameter ActionPipeline.Parameters.Value.Label=Value ActionPipeline.PrevToParams.Label=Copy results to parameters -ActionPipeline.RunConfiguration.Label=Run configuration +ActionPipeline.RunConfiguration.Label=Run configuration: ActionPipeline.Specify.Logfile.Label=Specify logfile
