camunda-bpm-platform icon indicating copy to clipboard operation
camunda-bpm-platform copied to clipboard

Regexes not working in JavaScript script tasks using GraalVM on WildFly

Open mboskamp opened this issue 11 months ago • 0 comments

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)

  1. Create a simple BPMN process with a single script task
  2. Use the following script (see below) for the script task's script
  3. Deploy the process to a Camunda WildFly distro (7.16-7.20)
  4. 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:

  1. Create a simple BPMN process with a single script task.
  2. Use the script below for the script task's script.
  3. Deploy the process to a Camunda WildFly distro.
  4. Start an instance an let the engine execute the script task.
  5. 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.

mboskamp avatar Mar 20 '24 13:03 mboskamp