スクリプト用のプリプロセッサを作成しました。特定のinclude
パターンを検索します。以下に例を示します。
public final class IncludePreprocessor {
@FunctionalInterface
public interface IncludeLoader {
InputStream load(String include) throws IOException;
}
private static final Pattern INCLUDE_PATTERN = Pattern.compile("include\\s+(.+)$");
private final IncludeLoader includeLoader;
public IncludePreprocessor(IncludeLoader includeLoader) {
this.includeLoader = includeLoader;
}
public boolean preprocess(InputStream mainScript, Writer outputScript) throws IOException {
boolean preprocessed = false;
try (Scanner sc = new Scanner(mainScript)) {
while (sc.hasNextLine()) {
String line = sc.nextLine();
Matcher m = INCLUDE_PATTERN.matcher(line);
if (m.matches()) {
outputScript.append("//").append(line).append(System.lineSeparator());
String include = m.group(1);
try (InputStream in = includeLoader.load(include)) {
StringWriter sw = new StringWriter();
preprocess(in, sw);
outputScript.append(sw.toString()).append(System.lineSeparator());
preprocessed = true;
}
outputScript.append("//").append(line).append(" [EOF]").append(System.lineSeparator());
} else {
outputScript.append(line).append(System.lineSeparator());
}
}
}
return preprocessed;
}
}
そしてそれを使用する方法:
//common.groovy
def sum(a,b) {
a + b
}
// main.groovy
include common.groovy
sum(1,2)
// Demo.java
public class Demo {
public static void main(String[] args) {
IncludePreprocessor ip = new IncludePreprocessor(include -> new FileInputStream("./" + include));
StringWriter sw = new StringWriter();
ip.preprocess(new FileInputStream("./main.groovy", sw));
System.out.println(sw.toString());
}
}