camunda-bpm-platform
camunda-bpm-platform copied to clipboard
Regexes not working in JavaScript script tasks using GraalVM on WildFly
Environment (Required on creation)
- WildFly
- Camunda 7.16 onwards
- BPMN model including a script script task with an inline JavaScript snippet making use of regexes.
Description (Required on creation; please attach any relevant screenshots, stacktraces, log files, etc. to the ticket)
Executing a script task with a problematic script will result in java.lang.NoClassDefFoundError
.
Here are two variants
Missing class: EconomicMap
org.graalvm.polyglot.PolyglotException: java.lang.NoClassDefFoundError: org/graalvm/collections/EconomicMap
at org.graalvm.regex.regex//com.oracle.truffle.regex.charset.UnicodePropertyData.<clinit>(UnicodePropertyData.java:54)
at org.graalvm.regex.regex//com.oracle.truffle.regex.charset.UnicodeProperties.isSupportedGeneralCategory(UnicodeProperties.java:140)
at org.graalvm.regex.regex//com.oracle.truffle.regex.charset.UnicodeProperties.normalizePropertySpec(UnicodeProperties.java:85)
at org.graalvm.regex.regex//com.oracle.truffle.regex.charset.UnicodeProperties.getProperty(UnicodeProperties.java:52)
at org.graalvm.regex.regex//com.oracle.truffle.regex.charset.UnicodeProperties.getProperty(UnicodeProperties.java:48)
at org.graalvm.regex.regex//com.oracle.truffle.regex.tregex.parser.RegexLexer.<clinit>(RegexLexer.java:65)
at org.graalvm.regex.regex//com.oracle.truffle.regex.tregex.parser.RegexParser.<init>(RegexParser.java:109)
at org.graalvm.regex.regex//com.oracle.truffle.regex.tregex.parser.RegexParser.parseRootLess(RegexParser.java:120)
at org.graalvm.regex.regex//com.oracle.truffle.regex.tregex.parser.RegexParserGlobals.<init>(RegexParserGlobals.java:62)
at org.graalvm.regex.regex//com.oracle.truffle.regex.RegexLanguage.<init>(RegexLanguage.java:138)
at org.graalvm.regex.regex//com.oracle.truffle.regex.RegexLanguageProvider.create(RegexLanguageProvider.java:28)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.LanguageCache$Loader$ServicesLoader$ServiceLoaderLanguageReflection.newInstance(LanguageCache.java:895)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.LanguageCache.loadLanguage(LanguageCache.java:303)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotLanguageInstance.<init>(PolyglotLanguageInstance.java:102)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotLanguage.getOptionsInternal(PolyglotLanguage.java:192)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotLanguage.getOptionValues(PolyglotLanguage.java:348)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotContextConfig.getLanguageOptionValues(PolyglotContextConfig.java:221)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotLanguageContext.ensureCreated(PolyglotLanguageContext.java:476)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotLanguageContext.ensureInitialized(PolyglotLanguageContext.java:586)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotContextImpl.getContextInitialized(PolyglotContextImpl.java:456)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.EngineAccessor$EngineImpl.parseForLanguage(EngineAccessor.java:243)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.api.TruffleLanguage$Env.parseInternal(TruffleLanguage.java:2477)
at org.graalvm.js.js//com.oracle.truffle.js.runtime.RegexCompilerInterface.validate(RegexCompilerInterface.java:81)
at org.graalvm.js.js//com.oracle.truffle.js.parser.GraalJSParserHelper$1.validateLexerToken(GraalJSParserHelper.java:164)
at org.graalvm.js.js//com.oracle.js.parser.AbstractParser.getLiteral(AbstractParser.java:563)
at org.graalvm.js.js//com.oracle.js.parser.Parser.primaryExpression(Parser.java:3675)
at org.graalvm.js.js//com.oracle.js.parser.Parser.memberExpression(Parser.java:4627)
at org.graalvm.js.js//com.oracle.js.parser.Parser.leftHandSideExpression(Parser.java:4314)
at org.graalvm.js.js//com.oracle.js.parser.Parser.unaryExpression(Parser.java:5493)
at org.graalvm.js.js//com.oracle.js.parser.Parser.expression(Parser.java:5749)
at org.graalvm.js.js//com.oracle.js.parser.Parser.conditionalExpression(Parser.java:5879)
at org.graalvm.js.js//com.oracle.js.parser.Parser.assignmentExpression(Parser.java:5837)
at org.graalvm.js.js//com.oracle.js.parser.Parser.assignmentExpression(Parser.java:5807)
at org.graalvm.js.js//com.oracle.js.parser.Parser.variableDeclarationList(Parser.java:2263)
at org.graalvm.js.js//com.oracle.js.parser.Parser.variableStatement(Parser.java:2161)
at org.graalvm.js.js//com.oracle.js.parser.Parser.statement(Parser.java:1325)
at org.graalvm.js.js//com.oracle.js.parser.Parser.statement(Parser.java:1309)
at org.graalvm.js.js//com.oracle.js.parser.Parser.sourceElements(Parser.java:1163)
at org.graalvm.js.js//com.oracle.js.parser.Parser.program(Parser.java:1057)
at org.graalvm.js.js//com.oracle.js.parser.Parser.parse(Parser.java:418)
at org.graalvm.js.js//com.oracle.js.parser.Parser.parse(Parser.java:344)
at org.graalvm.js.js//com.oracle.truffle.js.parser.GraalJSParserHelper.parseSource(GraalJSParserHelper.java:128)
at org.graalvm.js.js//com.oracle.truffle.js.parser.GraalJSParserHelper.parseScript(GraalJSParserHelper.java:87)
at org.graalvm.js.js//com.oracle.truffle.js.parser.JavaScriptTranslator.translateScript(JavaScriptTranslator.java:92)
at org.graalvm.js.js//com.oracle.truffle.js.parser.JavaScriptTranslator.translateScript(JavaScriptTranslator.java:74)
at org.graalvm.js.js//com.oracle.truffle.js.parser.GraalJSEvaluator.parseScript(GraalJSEvaluator.java:259)
at org.graalvm.js.js//com.oracle.truffle.js.lang.JavaScriptLanguage.parseScript(JavaScriptLanguage.java:279)
at org.graalvm.js.js//com.oracle.truffle.js.lang.JavaScriptLanguage.parse(JavaScriptLanguage.java:187)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.api.TruffleLanguage$ParsingRequest.parse(TruffleLanguage.java:854)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.api.TruffleLanguage.parse(TruffleLanguage.java:1508)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.api.LanguageAccessor$LanguageImpl.parse(LanguageAccessor.java:311)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotSourceCache.parseImpl(PolyglotSourceCache.java:94)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotSourceCache.access$300(PolyglotSourceCache.java:56)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotSourceCache$WeakCache.lookup(PolyglotSourceCache.java:223)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotSourceCache.parseCached(PolyglotSourceCache.java:80)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotLanguageContext.parseCached(PolyglotLanguageContext.java:371)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotContextImpl.eval(PolyglotContextImpl.java:1049)
at org.graalvm.sdk.graal-sdk//org.graalvm.polyglot.Context.eval(Context.java:353)
at org.graalvm.js.js-scriptengine//com.oracle.truffle.js.scriptengine.GraalJSScriptEngine.eval(GraalJSScriptEngine.java:428)
Missing class: RegexLexer
org.graalvm.polyglot.PolyglotException: java.lang.NoClassDefFoundError: Could not initialize class com.oracle.truffle.regex.tregex.parser.RegexLexer
at org.graalvm.regex.regex//com.oracle.truffle.regex.tregex.parser.RegexParser.<init>(RegexParser.java:109)
at org.graalvm.regex.regex//com.oracle.truffle.regex.tregex.parser.RegexParser.parseRootLess(RegexParser.java:120)
at org.graalvm.regex.regex//com.oracle.truffle.regex.tregex.parser.RegexParserGlobals.<init>(RegexParserGlobals.java:62)
at org.graalvm.regex.regex//com.oracle.truffle.regex.RegexLanguage.<init>(RegexLanguage.java:138)
at org.graalvm.regex.regex//com.oracle.truffle.regex.RegexLanguageProvider.create(RegexLanguageProvider.java:28)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.LanguageCache$Loader$ServicesLoader$ServiceLoaderLanguageReflection.newInstance(LanguageCache.java:895)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.LanguageCache.loadLanguage(LanguageCache.java:303)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotLanguageInstance.<init>(PolyglotLanguageInstance.java:102)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotLanguage.getOptionsInternal(PolyglotLanguage.java:192)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotLanguage.getOptionValues(PolyglotLanguage.java:348)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotContextConfig.getLanguageOptionValues(PolyglotContextConfig.java:221)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotLanguageContext.ensureCreated(PolyglotLanguageContext.java:476)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotLanguageContext.ensureInitialized(PolyglotLanguageContext.java:586)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotContextImpl.getContextInitialized(PolyglotContextImpl.java:456)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.EngineAccessor$EngineImpl.parseForLanguage(EngineAccessor.java:243)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.api.TruffleLanguage$Env.parseInternal(TruffleLanguage.java:2477)
at org.graalvm.js.js//com.oracle.truffle.js.runtime.RegexCompilerInterface.validate(RegexCompilerInterface.java:81)
at org.graalvm.js.js//com.oracle.truffle.js.parser.GraalJSParserHelper$1.validateLexerToken(GraalJSParserHelper.java:164)
at org.graalvm.js.js//com.oracle.js.parser.AbstractParser.getLiteral(AbstractParser.java:563)
at org.graalvm.js.js//com.oracle.js.parser.Parser.primaryExpression(Parser.java:3675)
at org.graalvm.js.js//com.oracle.js.parser.Parser.memberExpression(Parser.java:4627)
at org.graalvm.js.js//com.oracle.js.parser.Parser.leftHandSideExpression(Parser.java:4314)
at org.graalvm.js.js//com.oracle.js.parser.Parser.unaryExpression(Parser.java:5493)
at org.graalvm.js.js//com.oracle.js.parser.Parser.expression(Parser.java:5749)
at org.graalvm.js.js//com.oracle.js.parser.Parser.conditionalExpression(Parser.java:5879)
at org.graalvm.js.js//com.oracle.js.parser.Parser.assignmentExpression(Parser.java:5837)
at org.graalvm.js.js//com.oracle.js.parser.Parser.assignmentExpression(Parser.java:5807)
at org.graalvm.js.js//com.oracle.js.parser.Parser.variableDeclarationList(Parser.java:2263)
at org.graalvm.js.js//com.oracle.js.parser.Parser.variableStatement(Parser.java:2161)
at org.graalvm.js.js//com.oracle.js.parser.Parser.statement(Parser.java:1325)
at org.graalvm.js.js//com.oracle.js.parser.Parser.statement(Parser.java:1309)
at org.graalvm.js.js//com.oracle.js.parser.Parser.sourceElements(Parser.java:1163)
at org.graalvm.js.js//com.oracle.js.parser.Parser.program(Parser.java:1057)
at org.graalvm.js.js//com.oracle.js.parser.Parser.parse(Parser.java:418)
at org.graalvm.js.js//com.oracle.js.parser.Parser.parse(Parser.java:344)
at org.graalvm.js.js//com.oracle.truffle.js.parser.GraalJSParserHelper.parseSource(GraalJSParserHelper.java:128)
at org.graalvm.js.js//com.oracle.truffle.js.parser.GraalJSParserHelper.parseScript(GraalJSParserHelper.java:87)
at org.graalvm.js.js//com.oracle.truffle.js.parser.JavaScriptTranslator.translateScript(JavaScriptTranslator.java:92)
at org.graalvm.js.js//com.oracle.truffle.js.parser.JavaScriptTranslator.translateScript(JavaScriptTranslator.java:74)
at org.graalvm.js.js//com.oracle.truffle.js.parser.GraalJSEvaluator.parseScript(GraalJSEvaluator.java:259)
at org.graalvm.js.js//com.oracle.truffle.js.lang.JavaScriptLanguage.parseScript(JavaScriptLanguage.java:279)
at org.graalvm.js.js//com.oracle.truffle.js.lang.JavaScriptLanguage.parse(JavaScriptLanguage.java:187)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.api.TruffleLanguage$ParsingRequest.parse(TruffleLanguage.java:854)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.api.TruffleLanguage.parse(TruffleLanguage.java:1508)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.api.LanguageAccessor$LanguageImpl.parse(LanguageAccessor.java:311)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotSourceCache.parseImpl(PolyglotSourceCache.java:94)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotSourceCache.access$300(PolyglotSourceCache.java:56)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotSourceCache$WeakCache.lookup(PolyglotSourceCache.java:223)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotSourceCache.parseCached(PolyglotSourceCache.java:80)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotLanguageContext.parseCached(PolyglotLanguageContext.java:371)
at org.graalvm.truffle.truffle-api//com.oracle.truffle.polyglot.PolyglotContextImpl.eval(PolyglotContextImpl.java:1049)
at org.graalvm.sdk.graal-sdk//org.graalvm.polyglot.Context.eval(Context.java:353)
at org.graalvm.js.js-scriptengine//com.oracle.truffle.js.scriptengine.GraalJSScriptEngine.eval(GraalJSScriptEngine.java:428)
Steps to reproduce (Required on creation)
- Create a simple BPMN process with a single script task
- Use the following script (see below) for the script task's script
- Deploy the process to a Camunda WildFly distro (7.16-7.20)
- Start an instance an let the engine execute the script task
Script:
var regex = /(.*?)/g;
var test = "test";
java.lang.System.out.println(test.replace(regex, "1"));
Observed Behavior (Required on creation)
The execution fails with the above exception (class not found).
Expected behavior (Required on creation)
The script is executed successfully, like before 7.16.
Root Cause (Required on prioritization)
In the WildFly distro's module structure, the dependencies for the GraalVM JavaScript engine are not correctly resolved.
Solution Ideas
- Add all GraalVM modules to the camunda-engine module as dependencies and
services="export" export="true"
to all GraalVM module's dependencies (here and here).
Hints
Links
- https://jira.camunda.com/browse/SUPPORT-20377
Breakdown
### Pull Requests
- [ ] https://github.com/camunda/camunda-bpm-platform/pull/4248
Dev2QA handover
Overview
On Wildfly, starting from version 7.16, a script task with an inline JavaScript script using regex will fail with NoClassDefFoundError
because of missing dependencies.
Steps to reproduce
Starting version 7.16:
- Create a simple BPMN process with a single script task.
- Use the script below for the script task's script.
- Deploy the process to a Camunda WildFly distro.
- Start an instance an let the engine execute the script task.
- An exception (see above) should be logged in the console.
Script:
var regex = /(.*?)/g;
var test = "test";
java.lang.System.out.println(test.replace(regex, "1"));
Expected behavior
On 7.22 snapshot, performing the same steps should result in printing "1t1e1s1t1"
to the console without errors.