Skip to content

Commit c9ef9cd

Browse files
committed
completion callback should be provided up front to ensure its in place before script starts
1 parent 0dba4b8 commit c9ef9cd

2 files changed

Lines changed: 42 additions & 28 deletions

File tree

IntelliJ/src/main/java/com/nuix/enginebaseline/NuixEngine.java

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.apache.logging.log4j.core.LoggerContext;
1717
import org.apache.logging.log4j.core.config.Configuration;
1818
import org.apache.logging.log4j.core.config.LoggerConfig;
19+
import org.jruby.embed.internal.BiVariableMap;
1920

2021
import java.io.File;
2122
import java.io.IOException;
@@ -25,6 +26,7 @@
2526
import java.util.HashMap;
2627
import java.util.List;
2728
import java.util.Map;
29+
import java.util.function.BiConsumer;
2830
import java.util.function.Consumer;
2931
import java.util.function.Supplier;
3032

@@ -551,7 +553,8 @@ public NuixVersion getNuixVersion() {
551553
*/
552554
public RubyScriptRunner runRubyScriptAsync(String script, @Nullable Map<String, Object> additionalVariables,
553555
@Nullable Consumer<String> standardOutputReceiver,
554-
@Nullable Consumer<String> errorOutputReceiver) throws Exception {
556+
@Nullable Consumer<String> errorOutputReceiver,
557+
@Nullable BiConsumer<Object, BiVariableMap> completedCallback) throws Exception {
555558
Map<String, Object> vars = new HashMap<>();
556559
if (additionalVariables != null) {
557560
vars.putAll(additionalVariables);
@@ -562,6 +565,9 @@ public RubyScriptRunner runRubyScriptAsync(String script, @Nullable Map<String,
562565
RubyScriptRunner rubyScriptRunner = new RubyScriptRunner();
563566
rubyScriptRunner.setStandardOutputConsumer(standardOutputReceiver);
564567
rubyScriptRunner.setErrorOutputConsumer(errorOutputReceiver);
568+
if(completedCallback != null) {
569+
rubyScriptRunner.whenScriptCompletes(completedCallback);
570+
}
565571
rubyScriptRunner.runScriptAsync(script, getNuixVersionString(), vars);
566572
return rubyScriptRunner;
567573
}
@@ -580,8 +586,9 @@ public RubyScriptRunner runRubyScriptAsync(String script, @Nullable Map<String,
580586
* @return A {@link RubyScriptRunner} instance. Call {@link RubyScriptRunner#join()} to wait for script to complete.
581587
* @throws Exception Exceptions are allowed to bubble up.
582588
*/
583-
public RubyScriptRunner runRubyScriptAsync(String script, @Nullable Map<String, Object> additionalVariables) throws Exception {
584-
return runRubyScriptAsync(script, additionalVariables, null, null);
589+
public RubyScriptRunner runRubyScriptAsync(String script, @Nullable Map<String, Object> additionalVariables,
590+
@Nullable BiConsumer<Object, BiVariableMap> completedCallback) throws Exception {
591+
return runRubyScriptAsync(script, additionalVariables, null, null, completedCallback);
585592
}
586593

587594
/***
@@ -596,8 +603,9 @@ public RubyScriptRunner runRubyScriptAsync(String script, @Nullable Map<String,
596603
* @return A {@link RubyScriptRunner} instance. Call {@link RubyScriptRunner#join()} to wait for script to complete.
597604
* @throws Exception Exceptions are allowed to bubble up.
598605
*/
599-
public RubyScriptRunner runRubyScriptAsync(String script) throws Exception {
600-
return runRubyScriptAsync(script, null, null, null);
606+
public RubyScriptRunner runRubyScriptAsync(String script,
607+
@Nullable BiConsumer<Object, BiVariableMap> completedCallback) throws Exception {
608+
return runRubyScriptAsync(script, null, null, null, completedCallback);
601609
}
602610

603611
/***
@@ -622,7 +630,8 @@ public RubyScriptRunner runRubyScriptAsync(String script) throws Exception {
622630
*/
623631
public RubyScriptRunner runRubyScriptFileAsync(File scriptFile, @Nullable Map<String, Object> additionalVariables,
624632
@Nullable Consumer<String> standardOutputReceiver,
625-
@Nullable Consumer<String> errorOutputReceiver) throws Exception {
633+
@Nullable Consumer<String> errorOutputReceiver,
634+
@Nullable BiConsumer<Object, BiVariableMap> completedCallback) throws Exception {
626635
Map<String, Object> vars = new HashMap<>();
627636
if (additionalVariables != null) {
628637
vars.putAll(additionalVariables);
@@ -633,6 +642,9 @@ public RubyScriptRunner runRubyScriptFileAsync(File scriptFile, @Nullable Map<St
633642
RubyScriptRunner rubyScriptRunner = new RubyScriptRunner();
634643
rubyScriptRunner.setStandardOutputConsumer(standardOutputReceiver);
635644
rubyScriptRunner.setErrorOutputConsumer(errorOutputReceiver);
645+
if(completedCallback != null) {
646+
rubyScriptRunner.whenScriptCompletes(completedCallback);
647+
}
636648
rubyScriptRunner.runFileAsync(scriptFile, getNuixVersionString(), vars);
637649
return rubyScriptRunner;
638650
}
@@ -653,8 +665,9 @@ public RubyScriptRunner runRubyScriptFileAsync(File scriptFile, @Nullable Map<St
653665
* @return A {@link RubyScriptRunner} instance. Call {@link RubyScriptRunner#join()} to wait for script to complete.
654666
* @throws Exception Exceptions are allowed to bubble up.
655667
*/
656-
public RubyScriptRunner runRubyScriptFileAsync(File scriptFile, @Nullable Map<String, Object> additionalVariables) throws Exception {
657-
return runRubyScriptFileAsync(scriptFile, additionalVariables, null, null);
668+
public RubyScriptRunner runRubyScriptFileAsync(File scriptFile, @Nullable Map<String, Object> additionalVariables,
669+
@Nullable BiConsumer<Object, BiVariableMap> completedCallback) throws Exception {
670+
return runRubyScriptFileAsync(scriptFile, additionalVariables, null, null, completedCallback);
658671
}
659672

660673
/***
@@ -671,8 +684,9 @@ public RubyScriptRunner runRubyScriptFileAsync(File scriptFile, @Nullable Map<St
671684
* @return A {@link RubyScriptRunner} instance. Call {@link RubyScriptRunner#join()} to wait for script to complete.
672685
* @throws Exception Exceptions are allowed to bubble up.
673686
*/
674-
public RubyScriptRunner runRubyScriptFileAsync(File scriptFile) throws Exception {
675-
return runRubyScriptFileAsync(scriptFile, null, null, null);
687+
public RubyScriptRunner runRubyScriptFileAsync(File scriptFile,
688+
@Nullable BiConsumer<Object, BiVariableMap> completedCallback) throws Exception {
689+
return runRubyScriptFileAsync(scriptFile, null, null, null, completedCallback);
676690
}
677691

678692
/***

IntelliJ/src/test/java/RubyScriptRunnerTests.java

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ public void TestEngineRunScriptAsync() throws Exception {
3535
List<String> outputLines = new ArrayList<>();
3636
try (NuixEngine nuixEngine = constructNuixEngine()) {
3737
String script = "$utilities.getItemTypeUtility.getAllKinds.each{|kind| puts kind.getName}";
38-
RubyScriptRunner rubyScriptRunner = nuixEngine.runRubyScriptAsync(script, null, outputLines::add, outputLines::add);
38+
RubyScriptRunner rubyScriptRunner = nuixEngine.runRubyScriptAsync(
39+
script, null, outputLines::add, outputLines::add, null);
3940
rubyScriptRunner.join();
4041
log.info("Script Output:");
4142
log.info(String.join("", outputLines));
@@ -52,26 +53,25 @@ public void TestEngineRunScriptFileAsync() throws Exception {
5253
"x", 40,
5354
"y", 2
5455
);
55-
RubyScriptRunner rubyScriptRunner = nuixEngine.runRubyScriptFileAsync(rubyScriptFile, additionalVariables, outputLines::add, outputLines::add);
56+
RubyScriptRunner rubyScriptRunner = nuixEngine.runRubyScriptFileAsync(
57+
rubyScriptFile, additionalVariables, outputLines::add, outputLines::add, (result, vars) -> {
58+
log.info("Script Output:");
59+
log.info(String.join("", outputLines));
60+
assertFalse(outputLines.isEmpty());
5661

57-
rubyScriptRunner.whenScriptCompletes((result, vars) -> {
58-
log.info("Script Output:");
59-
log.info(String.join("", outputLines));
60-
assertFalse(outputLines.isEmpty());
62+
log.info("Implicit Final Result: {}", result);
63+
assertEquals(42L, result);
6164

62-
log.info("Implicit Final Result: {}", result);
63-
assertEquals(42L, result);
65+
// Note that for some reason entrySet will not include globals that were defined during
66+
// script execution, but will show globals set before script execution. They will be
67+
// accessible via get still though ¯\_(ツ)_/¯
68+
for(Map.Entry<String,Object> entry : vars.entrySet()) {
69+
log.info("{} => {}", entry.getKey(), entry.getValue());
70+
}
6471

65-
// Note that for some reason entrySet will not include globals that were defined during
66-
// script execution, but will show globals set before script execution. They will be
67-
// accessible via get still though ¯\_(ツ)_/¯
68-
for(Map.Entry<String,Object> entry : vars.entrySet()) {
69-
log.info("{} => {}", entry.getKey(), entry.getValue());
70-
}
71-
72-
Long zValue = (Long) vars.get("z");
73-
assertEquals(42L, zValue);
74-
});
72+
Long zValue = (Long) vars.get("z");
73+
assertEquals(42L, zValue);
74+
});
7575

7676
rubyScriptRunner.join();
7777
}

0 commit comments

Comments
 (0)