Skip to content

Commit 3d9a45b

Browse files
committed
Improved user interface for pipeline and workflow verification #4912
- Add the possibility of verifying workflows. - Display verification results in graph extra views. - Add keyboard shortcut F7 to verify a component. - Edit a component when double-clicking on a problem. - Replace Metrics icon.
1 parent 89611b3 commit 3d9a45b

File tree

28 files changed

+796
-420
lines changed

28 files changed

+796
-420
lines changed

core/src/main/resources/org/apache/hop/i18n/messages/messages_en_US.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ System.Log.UnexpectedError=Unexpected error
108108
System.Tooltip.Browse=Browse folders or files...
109109
System.Tooltip.BrowseForDir=Browse for a directory
110110
System.Tooltip.BrowseForFileOrDirAndAdd=Browse for a file or directory & add to the list
111+
System.Tooltip.CollapseALl=Collapse all
112+
System.Tooltip.ExpandAll=Expand all
111113
System.Tooltip.GetFields=Get the fields as defined in previous transforms.
112114
System.Tooltip.Help=Display detailed information
113115
System.Tooltip.VariableToDir=Insert a variable in the directory

engine/src/main/java/org/apache/hop/pipeline/PipelineMeta.java

Lines changed: 36 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.apache.hop.core.ICheckResult;
4141
import org.apache.hop.core.IProgressMonitor;
4242
import org.apache.hop.core.NotePadMeta;
43+
import org.apache.hop.core.ProgressNullMonitorListener;
4344
import org.apache.hop.core.Result;
4445
import org.apache.hop.core.SqlStatement;
4546
import org.apache.hop.core.attributes.AttributesUtil;
@@ -2782,42 +2783,41 @@ public void checkTransforms(
27822783
IVariables variables,
27832784
IHopMetadataProvider metadataProvider) {
27842785
try {
2785-
remarks.clear(); // Start with a clean slate...
2786+
// Start with a clean slate...
2787+
remarks.clear();
27862788

2787-
Map<IValueMeta, String> values = new Hashtable<>();
2788-
String[] transformnames;
2789-
TransformMeta[] transforms;
2790-
List<TransformMeta> selectedTransforms = getSelectedTransforms();
2791-
if (!onlySelected || selectedTransforms.isEmpty()) {
2792-
transformnames = getTransformNames();
2793-
transforms = getTransformsArray();
2794-
} else {
2795-
transformnames = getSelectedTransformNames();
2796-
transforms = selectedTransforms.toArray(new TransformMeta[selectedTransforms.size()]);
2789+
if (monitor == null) {
2790+
monitor = new ProgressNullMonitorListener();
27972791
}
27982792

2793+
Map<IValueMeta, String> values = new Hashtable<>();
2794+
2795+
List<TransformMeta> transforms = (onlySelected) ? getSelectedTransforms() : getTransforms();
2796+
2797+
TransformMeta[] transformArray = transforms.toArray(new TransformMeta[0]);
2798+
27992799
ExtensionPointHandler.callExtensionPoint(
28002800
LogChannel.GENERAL,
28012801
variables,
28022802
HopExtensionPoint.BeforeCheckTransforms.id,
2803-
new CheckTransformsExtension(remarks, variables, this, transforms, metadataProvider));
2803+
new CheckTransformsExtension(remarks, variables, this, transformArray, metadataProvider));
28042804

28052805
boolean stopChecking = false;
28062806

2807-
if (monitor != null) {
2808-
monitor.beginTask(
2809-
BaseMessages.getString(PKG, "PipelineMeta.Monitor.VerifyingThisPipelineTask.Title"),
2810-
transforms.length + 2);
2811-
}
2807+
monitor.beginTask(
2808+
BaseMessages.getString(PKG, "PipelineMeta.Monitor.VerifyingThisPipelineTask.Title"),
2809+
transforms.size());
2810+
2811+
int worked = 1;
2812+
for (TransformMeta transformMeta : transforms) {
28122813

2813-
for (int i = 0; i < transforms.length && !stopChecking; i++) {
2814-
if (monitor != null) {
2815-
monitor.subTask(
2816-
BaseMessages.getString(
2817-
PKG, "PipelineMeta.Monitor.VerifyingTransformTask.Title", transformnames[i]));
2814+
if (stopChecking) {
2815+
break;
28182816
}
28192817

2820-
TransformMeta transformMeta = transforms[i];
2818+
monitor.subTask(
2819+
BaseMessages.getString(
2820+
PKG, "PipelineMeta.Monitor.VerifyingTransformTask.Title", transformMeta.getName()));
28212821

28222822
int nrinfo = findNrInfoTransforms(transformMeta);
28232823
TransformMeta[] infoTransform = null;
@@ -2978,21 +2978,18 @@ public void checkTransforms(
29782978
remarks.add(cr);
29792979
}
29802980

2981-
if (monitor != null) {
2982-
monitor.worked(1); // progress bar...
2983-
if (monitor.isCanceled()) {
2984-
stopChecking = true;
2985-
}
2981+
monitor.worked(worked++); // progress bar...
2982+
if (monitor.isCanceled()) {
2983+
stopChecking = true;
29862984
}
29872985
}
29882986

2989-
if (monitor != null) {
2990-
monitor.subTask(
2991-
BaseMessages.getString(
2992-
PKG,
2993-
"PipelineMeta.Monitor.CheckingForDatabaseUnfriendlyCharactersInFieldNamesTask.Title"));
2994-
}
2995-
if (values.size() > 0) {
2987+
monitor.subTask(
2988+
BaseMessages.getString(
2989+
PKG,
2990+
"PipelineMeta.Monitor.CheckingForDatabaseUnfriendlyCharactersInFieldNamesTask.Title"));
2991+
2992+
if (!values.isEmpty()) {
29962993
for (IValueMeta v : values.keySet()) {
29972994
String message = values.get(v);
29982995
CheckResult cr =
@@ -3015,14 +3012,14 @@ public void checkTransforms(
30153012
null);
30163013
remarks.add(cr);
30173014
}
3018-
if (monitor != null) {
3019-
monitor.worked(1);
3020-
}
3015+
30213016
ExtensionPointHandler.callExtensionPoint(
30223017
LogChannel.GENERAL,
30233018
variables,
30243019
HopExtensionPoint.AfterCheckTransforms.id,
3025-
new CheckTransformsExtension(remarks, variables, this, transforms, metadataProvider));
3020+
new CheckTransformsExtension(remarks, variables, this, transformArray, metadataProvider));
3021+
3022+
monitor.done();
30263023
} catch (Exception e) {
30273024
throw new RuntimeException("Error checking transforms", e);
30283025
}

engine/src/main/java/org/apache/hop/workflow/WorkflowMeta.java

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.apache.hop.core.ICheckResult;
3535
import org.apache.hop.core.IProgressMonitor;
3636
import org.apache.hop.core.NotePadMeta;
37+
import org.apache.hop.core.ProgressNullMonitorListener;
3738
import org.apache.hop.core.SqlStatement;
3839
import org.apache.hop.core.attributes.AttributesUtil;
3940
import org.apache.hop.core.database.DatabaseMeta;
@@ -1720,7 +1721,7 @@ protected void setInternalEntryCurrentDirectory(IVariables variables) {
17201721
* own settings.
17211722
*
17221723
* @param remarks List of CheckResult remarks inserted into by each Action
1723-
* @param onlySelected true if you only want to check the selected workflows
1724+
* @param onlySelected true if you only want to check the selected actions
17241725
* @param monitor Progress monitor (not presently in use)
17251726
*/
17261727
public void checkActions(
@@ -1729,39 +1730,40 @@ public void checkActions(
17291730
IProgressMonitor monitor,
17301731
IVariables variables,
17311732
IHopMetadataProvider metadataProvider) {
1732-
remarks.clear(); // Empty remarks
1733-
if (monitor != null) {
1734-
monitor.beginTask(
1735-
BaseMessages.getString(PKG, "WorkflowMeta.Monitor.VerifyingThisActionTask.Title"),
1736-
workflowActions.size() + 2);
1737-
}
1738-
boolean stopChecking = false;
1739-
for (int i = 0; i < workflowActions.size() && !stopChecking; i++) {
1740-
ActionMeta copy = workflowActions.get(i); // get the action copy
1741-
if ((!onlySelected) || (onlySelected && copy.isSelected())) {
1742-
IAction action = copy.getAction();
1743-
if (action != null) {
1744-
if (monitor != null) {
1745-
monitor.subTask(
1746-
BaseMessages.getString(
1747-
PKG, "WorkflowMeta.Monitor.VerifyingAction.Title", action.getName()));
1748-
}
1749-
action.check(remarks, this, variables, metadataProvider);
1750-
if (monitor != null) {
1751-
monitor.worked(1); // progress bar...
1752-
if (monitor.isCanceled()) {
1753-
stopChecking = true;
1754-
}
1755-
}
1756-
}
1733+
1734+
// Start with a clean slate...
1735+
remarks.clear();
1736+
1737+
if (monitor == null) {
1738+
monitor = new ProgressNullMonitorListener();
1739+
}
1740+
1741+
List<ActionMeta> actions = (onlySelected) ? this.getSelectedActions() : getActions();
1742+
1743+
monitor.beginTask(
1744+
BaseMessages.getString(PKG, "WorkflowMeta.Monitor.VerifyingThisActionTask.Title"),
1745+
actions.size());
1746+
1747+
int worked = 1;
1748+
for (ActionMeta actionMeta : actions) {
1749+
if (monitor.isCanceled()) {
1750+
break;
17571751
}
1758-
if (monitor != null) {
1759-
monitor.worked(1);
1752+
1753+
IAction action = actionMeta.getAction();
1754+
if (action != null) {
1755+
monitor.subTask(
1756+
BaseMessages.getString(
1757+
PKG, "WorkflowMeta.Monitor.VerifyingAction.Title", action.getName()));
1758+
1759+
action.check(remarks, this, variables, metadataProvider);
1760+
1761+
// Progress bar...
1762+
monitor.worked(worked++);
17601763
}
17611764
}
1762-
if (monitor != null) {
1763-
monitor.done();
1764-
}
1765+
1766+
monitor.done();
17651767
}
17661768

17671769
/**

plugins/actions/deletefolders/src/main/java/org/apache/hop/workflow/actions/deletefolders/ActionDeleteFolders.java

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.apache.commons.vfs2.FileSelectInfo;
2626
import org.apache.commons.vfs2.FileSelector;
2727
import org.apache.commons.vfs2.FileType;
28+
import org.apache.hop.core.CheckResult;
2829
import org.apache.hop.core.Const;
2930
import org.apache.hop.core.ICheckResult;
3031
import org.apache.hop.core.Result;
@@ -43,8 +44,6 @@
4344
import org.apache.hop.resource.ResourceReference;
4445
import org.apache.hop.workflow.WorkflowMeta;
4546
import org.apache.hop.workflow.action.ActionBase;
46-
import org.apache.hop.workflow.action.validator.ActionValidatorUtils;
47-
import org.apache.hop.workflow.action.validator.AndValidator;
4847

4948
/** This defines a 'delete folders' action. */
5049
@Action(
@@ -305,16 +304,22 @@ public void check(
305304
WorkflowMeta workflowMeta,
306305
IVariables variables,
307306
IHopMetadataProvider metadataProvider) {
308-
boolean res =
309-
ActionValidatorUtils.andValidator()
310-
.validate(
311-
this,
312-
"fileItems",
313-
remarks,
314-
AndValidator.putValidators(ActionValidatorUtils.notNullValidator()));
315-
316-
if (!res) {
317-
return;
307+
// boolean res =
308+
// ActionValidatorUtils.andValidator()
309+
// .validate(
310+
// this,
311+
// "fileItems",
312+
// remarks,
313+
// AndValidator.putValidators(ActionValidatorUtils.notNullValidator()));
314+
//
315+
// if (!res) {
316+
// return;
317+
// }
318+
319+
if (fileItems == null || fileItems.isEmpty()) {
320+
String message = BaseMessages.getString(PKG, "CloneRowMeta.CheckResult.NrClonesdMissing");
321+
remarks.add(
322+
new CheckResult(ICheckResult.TYPE_RESULT_WARNING, "Any folders to deletes", this));
318323
}
319324

320325
/* TODO: If we enable action check

ui/src/main/java/org/apache/hop/ui/core/gui/GuiResource.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ public class GuiResource {
219219
private Image imageExpandAll;
220220
private Image imageCollapseAll;
221221
private Image imageAdd;
222+
private Image imageCheck;
222223
private Image imageCopy;
223224
private Image imageCancel;
224225
private Image imageCut;
@@ -440,6 +441,7 @@ private void dispose() {
440441

441442
// Common images
442443
imageLogo.dispose();
444+
imageCheck.dispose();
443445
imageDisabledHop.dispose();
444446
imageDatabase.dispose();
445447
imageData.dispose();
@@ -718,6 +720,7 @@ private void loadCommonImages() {
718720
imageAddAll = loadAsResource(display, "ui/images/add_all.svg", ConstUi.SMALL_ICON_SIZE);
719721
imageAddSingle = loadAsResource(display, "ui/images/add_single.svg", ConstUi.SMALL_ICON_SIZE);
720722
imageCalendar = loadAsResource(display, "ui/images/calendar.svg", ConstUi.SMALL_ICON_SIZE);
723+
imageCheck = loadAsResource(display, "ui/images/check.svg", ConstUi.SMALL_ICON_SIZE);
721724
imageClosePanel = loadAsResource(display, "ui/images/close-panel.svg", ConstUi.SMALL_ICON_SIZE);
722725
imageCollapseAll =
723726
loadAsResource(display, "ui/images/collapse-all.svg", ConstUi.SMALL_ICON_SIZE);
@@ -2100,6 +2103,10 @@ public Image getImageClose() {
21002103
return imageClose;
21012104
}
21022105

2106+
public Image getImageCheck() {
2107+
return imageCheck;
2108+
}
2109+
21032110
/**
21042111
* Gets imageToolbarPause
21052112
*

0 commit comments

Comments
 (0)