Created
September 13, 2016 17:36
-
-
Save bassemZohdy/494ac5d82d7d7add9f94bd42e9c21ba5 to your computer and use it in GitHub Desktop.
ScriptValidator validate java object with javascript
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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