Skip to content

Commit 475d56a

Browse files
committed
Major refactoring
* Added ScriptInfoWidget to allow ScriptInfo parameters with a style attribute defining the input type * Added ModuleBatchProcessor that takes a ModuleInfo input * Added MenuScriptBatchProcessor and FileScriptBatchProcessor that both call ModuleBatchProcessor Closes #1, closes #2.
1 parent fe85011 commit 475d56a

File tree

10 files changed

+548
-165
lines changed

10 files changed

+548
-165
lines changed

pom.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,5 +100,14 @@
100100
<groupId>net.imagej</groupId>
101101
<artifactId>imagej</artifactId>
102102
</dependency>
103+
<dependency>
104+
<groupId>org.scijava</groupId>
105+
<artifactId>scijava-ui-swing</artifactId>
106+
</dependency>
107+
<dependency>
108+
<groupId>commons-io</groupId>
109+
<artifactId>commons-io</artifactId>
110+
<version>2.4</version>
111+
</dependency>
103112
</dependencies>
104113
</project>

src/main/java/org/scijava/batch/BatchProcessor.java

Lines changed: 0 additions & 158 deletions
This file was deleted.
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
package org.scijava.batch;
2+
3+
import java.io.File;
4+
import java.io.FilenameFilter;
5+
import java.util.ArrayList;
6+
import java.util.HashMap;
7+
import java.util.List;
8+
import java.util.regex.PatternSyntaxException;
9+
10+
import org.apache.commons.io.filefilter.DirectoryFileFilter;
11+
import org.apache.commons.io.filefilter.RegexFileFilter;
12+
import org.apache.commons.io.filefilter.WildcardFileFilter;
13+
import org.scijava.ItemVisibility;
14+
import org.scijava.command.Command;
15+
import org.scijava.command.CommandService;
16+
import org.scijava.command.DynamicCommand;
17+
import org.scijava.convert.ConvertService;
18+
import org.scijava.module.ModuleInfo;
19+
import org.scijava.module.ModuleItem;
20+
import org.scijava.module.ModuleService;
21+
import org.scijava.plugin.Parameter;
22+
import org.scijava.plugin.Plugin;
23+
import org.scijava.script.ScriptService;
24+
import org.scijava.widget.ChoiceWidget;
25+
import org.scijava.widget.FileWidget;
26+
27+
@Plugin(type = Command.class, label = "Process Folder", menuPath = "Process>Batch>Run Script from File")
28+
public class FileScriptBatchProcessor extends DynamicCommand {
29+
30+
private final String WILDCARD = "Wildcard";
31+
private final String REGEX = "Regex";
32+
33+
@Parameter
34+
private ModuleService modules;
35+
36+
@Parameter
37+
private ScriptService scripts;
38+
39+
@Parameter
40+
private CommandService commands;
41+
42+
@Parameter
43+
private ConvertService convert;
44+
45+
@Parameter(label = "Script file to run", callback = "scriptFileCallback")
46+
private File scriptFile;
47+
48+
@Parameter(visibility=ItemVisibility.MESSAGE, persist = false)
49+
private String scriptMessage = "";
50+
51+
@Parameter(style = FileWidget.DIRECTORY_STYLE, callback = "directoryCallback")
52+
private File inputFolder;
53+
54+
@Parameter(label = "Recursive (with subfolders)", callback = "directoryCallback")
55+
private boolean recursive;
56+
57+
@Parameter(label = "File selection method", choices = { WILDCARD, REGEX }, style = ChoiceWidget.RADIO_BUTTON_HORIZONTAL_STYLE, callback = "directoryCallback")
58+
private String filterChoice = WILDCARD;
59+
60+
@Parameter(label = "File name pattern", callback = "directoryCallback")
61+
private String pattern = "*.tif";
62+
63+
@Parameter(visibility = ItemVisibility.MESSAGE, persist = false)
64+
private String message = " "; // Placeholder message
65+
66+
@Parameter(label = "Output directory", style = FileWidget.DIRECTORY_STYLE, required = false)
67+
private File outputFolder;
68+
69+
private FilenameFilter inputFilter;
70+
private List<File> fileList;
71+
private ModuleInfo moduleInfo;
72+
73+
@Override
74+
public void run() {
75+
// Get list of files from input folder
76+
if (fileList == null) {
77+
directoryCallback();
78+
}
79+
80+
if (moduleInfo == null) {
81+
scriptFileCallback();
82+
}
83+
84+
HashMap<String, Object> inputMap = new HashMap<>();
85+
inputMap.put("moduleInfo", moduleInfo);
86+
File[] fileArray = fileList.toArray(new File[fileList.size()]);
87+
inputMap.put("inputFileList", fileArray);
88+
inputMap.put("outputFolder", outputFolder);
89+
commands.run(ModuleBatchProcessor.class, true, inputMap);
90+
}
91+
92+
// -- Helper methods --
93+
94+
private List<File> populateFileList(File folder, FilenameFilter filter, boolean rec) {
95+
List<File> list = new ArrayList<>();
96+
if (rec) {
97+
for (File file : folder.listFiles((FilenameFilter) DirectoryFileFilter.DIRECTORY)) {
98+
list.addAll(populateFileList(file, filter, rec));
99+
}
100+
}
101+
for (File file : folder.listFiles(filter)) {
102+
list.add(file);
103+
}
104+
return list;
105+
}
106+
107+
// -- Callback methods --
108+
109+
/**
110+
* Count all applicable files and display them in the dialog message
111+
*/
112+
protected void directoryCallback() {
113+
// get list of all applicable files
114+
try {
115+
switch (filterChoice) {
116+
case WILDCARD:
117+
inputFilter = new WildcardFileFilter(pattern);
118+
break;
119+
case REGEX:
120+
default:
121+
inputFilter = new RegexFileFilter(pattern);
122+
}
123+
fileList = populateFileList(inputFolder, inputFilter, recursive);
124+
} catch (PatternSyntaxException e) {
125+
fileList = null;
126+
message = "Syntax error in regex.";
127+
}
128+
if (fileList != null) {
129+
message = "Found " + fileList.size() + " files.";
130+
}
131+
}
132+
133+
protected void scriptFileCallback() {
134+
if (scriptFile != null) {
135+
moduleInfo = scripts.getScript(scriptFile);
136+
int nCompatibleInputs = 0;
137+
for (ModuleItem<?> input : moduleInfo.inputs()) {
138+
if (convert.supports(new File(""), input.getType())) {
139+
nCompatibleInputs++;
140+
}
141+
}
142+
scriptMessage = "This script contains " + nCompatibleInputs + " compatible inputs.";
143+
}
144+
}
145+
}

0 commit comments

Comments
 (0)