diff --git a/src/main/java/org/lsc/utils/ScriptingEvaluator.java b/src/main/java/org/lsc/utils/ScriptingEvaluator.java index ebf3d3e4..aa39a4c2 100644 --- a/src/main/java/org/lsc/utils/ScriptingEvaluator.java +++ b/src/main/java/org/lsc/utils/ScriptingEvaluator.java @@ -5,6 +5,7 @@ import java.util.Map; import java.util.Optional; import java.util.function.Predicate; +import java.util.regex.Pattern; import javax.script.*; @@ -34,6 +35,8 @@ public class ScriptingEvaluator { private Optional defaultImplementation; + private Map prefixRegex = new HashMap<>(); + static { implementetionsCache = new HashMap>(); instancesCache = CacheBuilder.newBuilder().maximumSize(15).build(); @@ -41,7 +44,7 @@ public class ScriptingEvaluator { } private ScriptingEvaluator() { - instancesTypeCache = new HashMap(); + instancesTypeCache = new HashMap<>(); List factories = mgr.getEngineFactories(); for (ScriptEngineFactory sef : factories) { boolean loaded = false; @@ -94,6 +97,9 @@ else if ("graal.js".equals(name)) { defaultImplementation = Optional.ofNullable(Optional.ofNullable(instancesTypeCache.get("js")) .orElse(instancesTypeCache.get("rjs"))); } + + // Compile regex jscript pattern match + compileRegexPatternMatch(); } private static ScriptingEvaluator getInstance() { @@ -115,13 +121,40 @@ public static void contribute(String implementationName, private ScriptableEvaluator identifyScriptingEngine(String expression) throws LscServiceException { String[] parts = expression.split(":"); - if (parts != null && parts.length > 0 && parts[0].length() < 10 - && instancesTypeCache.containsKey(parts[0])) { - return instancesTypeCache.get(parts[0]); + String match = matchJScriptEvaluator(parts[0]); + if (!match.isEmpty()) { + return instancesTypeCache.get(match); } return defaultImplementation.orElseThrow(() -> new LscServiceException("Missing Script evaluator")); } + /** + * Matches the prefix specifying the jscript evaluator. + * + * @param jscript the prefix + * @return the matched jscript evaluator + */ + public String matchJScriptEvaluator(String jscript) { + for (Map.Entry entry : prefixRegex.entrySet()) { + if (entry.getKey().matcher(jscript).matches()) { + return entry.getValue(); + } + } + return ""; + } + + /** + * Compiling Regex pattern to match jscript engine. + */ + public void compileRegexPatternMatch() { + for (String jscriptEngine: instancesTypeCache.keySet()) { + Pattern pattern = Pattern.compile("((\\n.*)+)" + jscriptEngine); + prefixRegex.put(pattern, jscriptEngine); + pattern = Pattern.compile(jscriptEngine); + prefixRegex.put(pattern, jscriptEngine); + } + } + /** * Remove scripting engine prefix if required * @param expression the expression diff --git a/src/test/java/org/lsc/utils/ScriptingEvaluatorTest.java b/src/test/java/org/lsc/utils/ScriptingEvaluatorTest.java index 9345397b..96d95207 100644 --- a/src/test/java/org/lsc/utils/ScriptingEvaluatorTest.java +++ b/src/test/java/org/lsc/utils/ScriptingEvaluatorTest.java @@ -42,4 +42,39 @@ public void testBoolean() throws LscServiceException { boolean booleanOutput = ScriptingEvaluator.evalToBoolean(task, expression, new HashMap<>()); assertTrue(booleanOutput); } + + @Test + public void testJSPrefix1() throws LscServiceException { + String expression = "\njs:true"; + boolean booleanOutput = ScriptingEvaluator.evalToBoolean(task, expression, new HashMap<>()); + assertTrue(booleanOutput); + } + + @Test + public void testJSPrefix2() throws LscServiceException { + String expression = "\njs:\ntrue"; + boolean booleanOutput = ScriptingEvaluator.evalToBoolean(task, expression, new HashMap<>()); + assertTrue(booleanOutput); + } + + @Test + public void testJSPrefix3() throws LscServiceException { + String expression = "\njs:test=\"js\""; + String stringOutput = ScriptingEvaluator.evalToString(task, expression, new HashMap<>()); + assertEquals("js", stringOutput); + } + + @Test + public void testJSPrefix4() throws LscServiceException { + String expression = "\njs:\ntest=\"js\""; + String stringOutput = ScriptingEvaluator.evalToString(task, expression, new HashMap<>()); + assertEquals("js", stringOutput); + } + + @Test + public void testJSPrefix5() throws LscServiceException { + String expression = "\n\njs:\n\ntest=\"js\""; + String stringOutput = ScriptingEvaluator.evalToString(task, expression, new HashMap<>()); + assertEquals("js", stringOutput); + } } \ No newline at end of file