Skip to content

Commit 197bd42

Browse files
committed
Cleanup XML of action Delete Files apache#1963
1 parent 2ec5141 commit 197bd42

16 files changed

+217
-269
lines changed

plugins/actions/deletefiles/src/main/java/org/apache/hop/workflow/actions/deletefiles/ActionDeleteFiles.java

+48-156
Original file line numberDiff line numberDiff line change
@@ -19,43 +19,43 @@
1919

2020
import com.google.common.collect.ArrayListMultimap;
2121
import com.google.common.collect.Multimap;
22-
import java.io.IOException;
22+
import java.util.ArrayList;
2323
import java.util.List;
2424
import java.util.Map;
2525
import java.util.regex.Matcher;
2626
import java.util.regex.Pattern;
27+
import lombok.Getter;
28+
import lombok.Setter;
2729
import org.apache.commons.vfs2.FileObject;
2830
import org.apache.commons.vfs2.FileSelectInfo;
2931
import org.apache.commons.vfs2.FileSelector;
3032
import org.apache.commons.vfs2.FileType;
31-
import org.apache.hop.core.Const;
3233
import org.apache.hop.core.ICheckResult;
3334
import org.apache.hop.core.Result;
3435
import org.apache.hop.core.RowMetaAndData;
3536
import org.apache.hop.core.annotations.Action;
3637
import org.apache.hop.core.exception.HopException;
3738
import org.apache.hop.core.exception.HopValueException;
38-
import org.apache.hop.core.exception.HopXmlException;
3939
import org.apache.hop.core.util.Utils;
4040
import org.apache.hop.core.variables.IVariables;
4141
import org.apache.hop.core.vfs.HopVfs;
42-
import org.apache.hop.core.xml.XmlHandler;
4342
import org.apache.hop.i18n.BaseMessages;
43+
import org.apache.hop.metadata.api.HopMetadataProperty;
4444
import org.apache.hop.metadata.api.IHopMetadataProvider;
4545
import org.apache.hop.resource.ResourceEntry;
4646
import org.apache.hop.resource.ResourceEntry.ResourceType;
4747
import org.apache.hop.resource.ResourceReference;
4848
import org.apache.hop.workflow.WorkflowMeta;
4949
import org.apache.hop.workflow.action.ActionBase;
50-
import org.apache.hop.workflow.action.IAction;
5150
import org.apache.hop.workflow.action.validator.AbstractFileValidator;
5251
import org.apache.hop.workflow.action.validator.ActionValidatorUtils;
5352
import org.apache.hop.workflow.action.validator.AndValidator;
5453
import org.apache.hop.workflow.action.validator.ValidatorContext;
5554
import org.apache.hop.workflow.engine.IWorkflowEngine;
56-
import org.w3c.dom.Node;
5755

5856
/** This defines a 'delete files' action. */
57+
@Setter
58+
@Getter
5959
@Action(
6060
id = "DELETE_FILES",
6161
name = "i18n::ActionDeleteFiles.Name",
@@ -64,94 +64,40 @@
6464
categoryDescription = "i18n:org.apache.hop.workflow:ActionCategory.Category.FileManagement",
6565
keywords = "i18n::ActionDeleteFiles.keyword",
6666
documentationUrl = "/workflow/actions/deletefiles.html")
67-
public class ActionDeleteFiles extends ActionBase implements Cloneable, IAction {
67+
public class ActionDeleteFiles extends ActionBase {
6868

6969
private static final Class<?> PKG = ActionDeleteFiles.class;
7070

71+
@HopMetadataProperty(key = "arg_from_previous")
7172
private boolean argFromPrevious;
7273

74+
@HopMetadataProperty(key = "include_subfolders")
7375
private boolean includeSubfolders;
7476

75-
private String[] arguments;
76-
77-
private String[] filemasks;
77+
@HopMetadataProperty(groupKey = "fields", key = "field")
78+
private List<FileItem> fileItems;
7879

7980
public ActionDeleteFiles(String workflowName) {
8081
super(workflowName, "");
8182
argFromPrevious = false;
82-
arguments = null;
83-
8483
includeSubfolders = false;
84+
fileItems = List.of();
8585
}
8686

8787
public ActionDeleteFiles() {
8888
this("");
8989
}
9090

91-
public void allocate(int numberOfFields) {
92-
arguments = new String[numberOfFields];
93-
filemasks = new String[numberOfFields];
91+
public ActionDeleteFiles(ActionDeleteFiles other) {
92+
super(other.getName(), other.getDescription(), other.getPluginId());
93+
this.argFromPrevious = other.argFromPrevious;
94+
this.includeSubfolders = other.includeSubfolders;
95+
this.fileItems = new ArrayList<>(other.fileItems);
9496
}
9597

9698
@Override
9799
public Object clone() {
98-
ActionDeleteFiles action = (ActionDeleteFiles) super.clone();
99-
if (arguments != null) {
100-
int nrFields = arguments.length;
101-
action.allocate(nrFields);
102-
System.arraycopy(arguments, 0, action.arguments, 0, nrFields);
103-
System.arraycopy(filemasks, 0, action.filemasks, 0, nrFields);
104-
}
105-
return action;
106-
}
107-
108-
@Override
109-
public String getXml() {
110-
StringBuilder retval = new StringBuilder(300);
111-
112-
retval.append(super.getXml());
113-
retval.append(" ").append(XmlHandler.addTagValue("arg_from_previous", argFromPrevious));
114-
retval.append(" ").append(XmlHandler.addTagValue("include_subfolders", includeSubfolders));
115-
116-
retval.append(" <fields>").append(Const.CR);
117-
if (arguments != null) {
118-
for (int i = 0; i < arguments.length; i++) {
119-
retval.append(" <field>").append(Const.CR);
120-
retval.append(" ").append(XmlHandler.addTagValue("name", arguments[i]));
121-
retval.append(" ").append(XmlHandler.addTagValue("filemask", filemasks[i]));
122-
retval.append(" </field>").append(Const.CR);
123-
}
124-
}
125-
retval.append(" </fields>").append(Const.CR);
126-
127-
return retval.toString();
128-
}
129-
130-
@Override
131-
public void loadXml(Node entrynode, IHopMetadataProvider metadataProvider, IVariables variables)
132-
throws HopXmlException {
133-
try {
134-
super.loadXml(entrynode);
135-
argFromPrevious =
136-
"Y".equalsIgnoreCase(XmlHandler.getTagValue(entrynode, "arg_from_previous"));
137-
includeSubfolders =
138-
"Y".equalsIgnoreCase(XmlHandler.getTagValue(entrynode, "include_subfolders"));
139-
140-
Node fields = XmlHandler.getSubNode(entrynode, "fields");
141-
142-
int numberOfFields = XmlHandler.countNodes(fields, "field");
143-
allocate(numberOfFields);
144-
145-
for (int i = 0; i < numberOfFields; i++) {
146-
Node fnode = XmlHandler.getSubNodeByNr(fields, "field", i);
147-
148-
arguments[i] = XmlHandler.getTagValue(fnode, "name");
149-
filemasks[i] = XmlHandler.getTagValue(fnode, "filemask");
150-
}
151-
} catch (HopXmlException xe) {
152-
throw new HopXmlException(
153-
BaseMessages.getString(PKG, "ActionDeleteFiles.UnableToLoadFromXml"), xe);
154-
}
100+
return new ActionDeleteFiles(this);
155101
}
156102

157103
@Override
@@ -170,7 +116,7 @@ public Result execute(Result result, int nr) throws HopException {
170116
String.valueOf((resultRows != null ? resultRows.size() : 0))));
171117
}
172118

173-
Multimap<String, String> pathToMaskMap = populateDataForJobExecution(resultRows);
119+
Multimap<String, String> pathToMaskMap = populateDataForWorkflowExecution(resultRows);
174120

175121
for (Map.Entry<String, String> pathToMask : pathToMaskMap.entries()) {
176122
final String filePath = resolve(pathToMask.getKey());
@@ -211,13 +157,13 @@ public Result execute(Result result, int nr) throws HopException {
211157
* obtained in two ways: 1. As an argument of a current action 2. As a table, that comes as a
212158
* result of execution previous workflow/pipeline.
213159
*
214-
* <p>As the logic of processing this data is the same for both of this cases, we first populate
160+
* <p>As the logic of processing this data is the same for both of these cases, we first populate
215161
* this data (in this method) and then process it.
216162
*
217163
* <p>We are using guava multimap here, because if allows key duplication and there could be a
218164
* situation where two paths to one folder with different wildcards are provided.
219165
*/
220-
private Multimap<String, String> populateDataForJobExecution(
166+
private Multimap<String, String> populateDataForWorkflowExecution(
221167
List<RowMetaAndData> rowsFromPreviousMeta) throws HopValueException {
222168
Multimap<String, String> pathToMaskMap = ArrayListMultimap.create();
223169
if (argFromPrevious && rowsFromPreviousMeta != null) {
@@ -240,14 +186,14 @@ private Multimap<String, String> populateDataForJobExecution(
240186

241187
pathToMaskMap.put(pathToFile, fileMask);
242188
}
243-
} else if (arguments != null) {
244-
for (int i = 0; i < arguments.length; i++) {
189+
} else if (fileItems != null && !fileItems.isEmpty()) {
190+
for (FileItem item : fileItems) {
245191
if (isDetailed()) {
246192
logDetailed(
247193
BaseMessages.getString(
248-
PKG, "ActionDeleteFiles.ProcessingArg", arguments[i], filemasks[i]));
194+
PKG, "ActionDeleteFiles.ProcessingArg", item.getFileName(), item.getFileMask()));
249195
}
250-
pathToMaskMap.put(arguments[i], filemasks[i]);
196+
pathToMaskMap.put(item.getFileName(), item.getFileMask());
251197
}
252198
}
253199

@@ -256,10 +202,8 @@ private Multimap<String, String> populateDataForJobExecution(
256202

257203
boolean processFile(String path, String wildcard, IWorkflowEngine<WorkflowMeta> parentWorkflow) {
258204
boolean isDeleted = false;
259-
FileObject fileFolder = null;
260205

261-
try {
262-
fileFolder = HopVfs.getFileObject(path, getVariables());
206+
try (FileObject fileFolder = HopVfs.getFileObject(path, getVariables())) {
263207

264208
if (fileFolder.exists()) {
265209
if (fileFolder.getType() == FileType.FOLDER) {
@@ -303,14 +247,6 @@ boolean processFile(String path, String wildcard, IWorkflowEngine<WorkflowMeta>
303247
logError(
304248
BaseMessages.getString(PKG, "ActionDeleteFiles.CouldNotProcess", path, e.getMessage()),
305249
e);
306-
} finally {
307-
if (fileFolder != null) {
308-
try {
309-
fileFolder.close();
310-
} catch (IOException ex) {
311-
// Ignore
312-
}
313-
}
314250
}
315251

316252
return isDeleted;
@@ -319,32 +255,32 @@ boolean processFile(String path, String wildcard, IWorkflowEngine<WorkflowMeta>
319255
private class TextFileSelector implements FileSelector {
320256
String fileWildcard = null;
321257
String sourceFolder = null;
322-
IWorkflowEngine<WorkflowMeta> parentjob;
258+
IWorkflowEngine<WorkflowMeta> workflow;
323259

324260
public TextFileSelector(
325-
String sourcefolderin, String filewildcard, IWorkflowEngine<WorkflowMeta> parentWorkflow) {
261+
String sourceFolder, String fileWildcard, IWorkflowEngine<WorkflowMeta> workflow) {
326262

327-
if (!Utils.isEmpty(sourcefolderin)) {
328-
sourceFolder = sourcefolderin;
263+
if (!Utils.isEmpty(sourceFolder)) {
264+
this.sourceFolder = sourceFolder;
329265
}
330266

331-
if (!Utils.isEmpty(filewildcard)) {
332-
fileWildcard = filewildcard;
267+
if (!Utils.isEmpty(fileWildcard)) {
268+
this.fileWildcard = fileWildcard;
333269
}
334-
parentjob = parentWorkflow;
270+
this.workflow = workflow;
335271
}
336272

337273
@Override
338274
public boolean includeFile(FileSelectInfo info) {
339275
boolean doReturnCode = false;
340276
try {
341277

342-
if (!info.getFile().toString().equals(sourceFolder) && !parentjob.isStopped()) {
278+
if (!info.getFile().toString().equals(sourceFolder) && !workflow.isStopped()) {
343279
// Pass over the Base folder itself
344280
String shortFilename = info.getFile().getName().getBaseName();
345281

346282
if (!info.getFile().getParent().equals(info.getBaseFolder())) {
347-
// Not in the Base Folder..Only if include sub folders
283+
// Not in the Base Folder. Only if include sub folders
348284
if (includeSubfolders
349285
&& (info.getFile().getType() == FileType.FILE)
350286
&& getFileWildcard(shortFilename, fileWildcard)) {
@@ -370,10 +306,9 @@ && getFileWildcard(shortFilename, fileWildcard)) {
370306
}
371307
} catch (Exception e) {
372308
logError(
373-
BaseMessages.getString(PKG, "ActionDeleteFiles.Error.Exception.DeleteProcessError"),
374309
BaseMessages.getString(
375310
PKG,
376-
"JobDeleteFiles.Error.Exception.DeleteProcess",
311+
"ActionDeleteFiles.Error.Exception.DeleteProcessError",
377312
info.getFile().toString(),
378313
e.getMessage()));
379314

@@ -393,7 +328,7 @@ public boolean traverseDescendents(FileSelectInfo info) {
393328
*
394329
* @param selectedfile
395330
* @param wildcard
396-
* @return True if the selectedfile matches the wildcard
331+
* @return True if the selected file matches the wildcard
397332
**********************************************************/
398333
private boolean getFileWildcard(String selectedfile, String wildcard) {
399334
boolean getIt = true;
@@ -408,10 +343,6 @@ private boolean getFileWildcard(String selectedfile, String wildcard) {
408343
return getIt;
409344
}
410345

411-
public void setIncludeSubfolders(boolean includeSubfolders) {
412-
this.includeSubfolders = includeSubfolders;
413-
}
414-
415346
@Override
416347
public boolean isEvaluation() {
417348
return true;
@@ -423,71 +354,32 @@ public void check(
423354
WorkflowMeta workflowMeta,
424355
IVariables variables,
425356
IHopMetadataProvider metadataProvider) {
426-
boolean isValid =
427-
ActionValidatorUtils.andValidator()
428-
.validate(
429-
this,
430-
"arguments",
431-
remarks,
432-
AndValidator.putValidators(ActionValidatorUtils.notNullValidator()));
433-
434-
if (!isValid) {
435-
return;
436-
}
437357

438358
ValidatorContext ctx = new ValidatorContext();
439359
AbstractFileValidator.putVariableSpace(ctx, getVariables());
440360
AndValidator.putValidators(
441361
ctx, ActionValidatorUtils.notNullValidator(), ActionValidatorUtils.fileExistsValidator());
442362

443-
for (int i = 0; i < arguments.length; i++) {
444-
ActionValidatorUtils.andValidator().validate(this, "arguments[" + i + "]", remarks, ctx);
363+
for (FileItem item : fileItems) {
364+
ActionValidatorUtils.andValidator().validate(this, item.getFileName(), remarks, ctx);
445365
}
446366
}
447367

448368
@Override
449369
public List<ResourceReference> getResourceDependencies(
450370
IVariables variables, WorkflowMeta workflowMeta) {
451371
List<ResourceReference> references = super.getResourceDependencies(variables, workflowMeta);
452-
if (arguments != null) {
453-
ResourceReference reference = null;
454-
for (int i = 0; i < arguments.length; i++) {
455-
String filename = resolve(arguments[i]);
456-
if (reference == null) {
457-
reference = new ResourceReference(this);
458-
references.add(reference);
459-
}
460-
reference.getEntries().add(new ResourceEntry(filename, ResourceType.FILE));
372+
373+
ResourceReference reference = null;
374+
for (FileItem item : fileItems) {
375+
String filename = resolve(item.getFileName());
376+
if (reference == null) {
377+
reference = new ResourceReference(this);
378+
references.add(reference);
461379
}
380+
reference.getEntries().add(new ResourceEntry(filename, ResourceType.FILE));
462381
}
463-
return references;
464-
}
465-
466-
public void setArguments(String[] arguments) {
467-
this.arguments = arguments;
468-
}
469-
470-
public void setFilemasks(String[] filemasks) {
471-
this.filemasks = filemasks;
472-
}
473-
474-
public void setArgFromPrevious(boolean argFromPrevious) {
475-
this.argFromPrevious = argFromPrevious;
476-
}
477-
478-
public boolean isArgFromPrevious() {
479-
return argFromPrevious;
480-
}
481382

482-
public String[] getArguments() {
483-
return arguments;
484-
}
485-
486-
public String[] getFilemasks() {
487-
return filemasks;
488-
}
489-
490-
public boolean isIncludeSubfolders() {
491-
return includeSubfolders;
383+
return references;
492384
}
493385
}

0 commit comments

Comments
 (0)