Skip to content

Instantly share code, notes, and snippets.

@bassemZohdy
Created September 13, 2016 17:36
Show Gist options
  • Save bassemZohdy/494ac5d82d7d7add9f94bd42e9c21ba5 to your computer and use it in GitHub Desktop.
Save bassemZohdy/494ac5d82d7d7add9f94bd42e9c21ba5 to your computer and use it in GitHub Desktop.
ScriptValidator validate java object with javascript
import java.util.function.Predicate;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class ScriptValidator implements Predicate<Object> {
private final ScriptEngine engine;
private final String functionName;
private ScriptValidator(String script, String functionName) {
this.engine = new ScriptEngineManager().getEngineByName("nashorn");
this.functionName = functionName;
}
public static ScriptValidator of(String script, String functionName) throws ScriptException {
ScriptValidator scriptValidator = new ScriptValidator(script, functionName);
scriptValidator.engine.eval(script);
return scriptValidator;
}
@Override
public boolean test(Object o) {
Invocable invocable = (Invocable) engine;
try {
return (boolean) invocable.invokeFunction(functionName, o);
} catch (NoSuchMethodException | ScriptException e) {
return false;
}
}
}
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import javax.script.ScriptException;
public class Test {
public static void main(String[] args) throws ScriptException, NoSuchMethodException {
String validation = "function validate(m){return m.value.length>0}";
ScriptValidator validator = ScriptValidator.of(validation, "validate");
List<Map<String, Object>> list = new ArrayList<>();
Random r = new Random();
for (int i = 0; i < 1000; i++) {
Map<String, Object> m = new HashMap<>();
if (r.nextBoolean())
m.put("value", "Hello");
list.add(m);
}
list.stream().filter(validator).forEach(System.out::println);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment