Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
4c012e9
Bind JavaScript placeholders automatically as data
BenCodez Aug 26, 2026
fed11f9
Isolate JavaScript parser compatibility tests
BenCodez Aug 26, 2026
ee31bd8
Prepare JavaScript compatibility fixes
BenCodez Aug 26, 2026
52e406e
Fix JavaScript compatibility workflow
BenCodez Aug 26, 2026
c8a958b
Add JavaScript compatibility patch script
BenCodez Aug 26, 2026
aaf9abd
Run JavaScript compatibility patch
BenCodez Aug 26, 2026
c3e8597
Fix automatic JavaScript placeholder compatibility
BenCodez Aug 26, 2026
c8ab21d
Test packaged JavaScript parser availability
BenCodez Aug 26, 2026
68c6487
Prepare Codex parser fallback fixes
BenCodez Aug 26, 2026
ab15043
Run Codex parser fallback fixes
BenCodez Aug 26, 2026
9b45588
Harden parser fallback compatibility
BenCodez Aug 26, 2026
4e8204c
Test modern JavaScript placeholder fallback
BenCodez Aug 26, 2026
c453979
Prepare fallback regex compile fix
BenCodez Aug 26, 2026
ca796b0
Fix JavaScript fallback regex compilation
BenCodez Aug 26, 2026
fe87cb9
Strengthen modern JavaScript placeholder fallback tests
BenCodez Aug 26, 2026
559204f
Prepare fallback literal pattern fix
BenCodez Aug 26, 2026
01a6ddc
Fix JavaScript fallback literal patterns
BenCodez Aug 26, 2026
0586a6c
Cover modern JavaScript template fallback
BenCodez Aug 26, 2026
15655af
Prepare parser diagnostic fallback fix
BenCodez Aug 26, 2026
a14d89e
Add parser diagnostic patch script
BenCodez Aug 26, 2026
f21fe39
Run parser diagnostic patch script
BenCodez Aug 26, 2026
32596fa
Fall back on JavaScript parser diagnostics
BenCodez Aug 26, 2026
3b8cbec
Test modern syntax placeholder injection fallback
BenCodez Aug 26, 2026
36ec123
Prepare CodeQL regex fallback fix
BenCodez Aug 26, 2026
44985fd
Run CodeQL regex performance fix
BenCodez Aug 26, 2026
cd5a332
Make JavaScript fallback regex linear
BenCodez Aug 26, 2026
4b5ecf4
Test possessive JavaScript regex fallback semantics
BenCodez Aug 26, 2026
f40e12e
Prepare linear regex fallback correction
BenCodez Aug 26, 2026
118eb6a
Use disjoint JavaScript regex fallback
BenCodez Aug 26, 2026
b4fcc69
Stress JavaScript regex fallback matching
BenCodez Aug 26, 2026
4385f8b
Prepare iterative regex fallback fix
BenCodez Aug 26, 2026
14e74ff
Run iterative regex fallback fix
BenCodez Aug 26, 2026
8c60691
Use iterative JavaScript regex fallback scanner
BenCodez Aug 26, 2026
9ac0de6
Test iterative JavaScript regex fallback
BenCodez Aug 26, 2026
1706d73
Prepare latest Codex fallback fixes
BenCodez Aug 26, 2026
4cad359
Add latest Codex fallback patch script
BenCodez Aug 26, 2026
85c379c
Run latest Codex fallback patch
BenCodez Aug 26, 2026
5b1140e
Harden JavaScript fallback contexts
BenCodez Aug 26, 2026
43d8be3
Test latest JavaScript fallback findings
BenCodez Aug 26, 2026
2a54fbe
Prepare template parser compatibility fix
BenCodez Aug 26, 2026
c77c6e5
Add template parser compatibility patch script
BenCodez Aug 26, 2026
57be002
Run template parser compatibility patch
BenCodez Aug 26, 2026
dd09c02
Preserve parser template escaping
BenCodez Aug 26, 2026
ce036cf
Strengthen division fallback regression
BenCodez Aug 26, 2026
4113599
Prepare latest JavaScript fallback fixes
BenCodez Aug 26, 2026
8f42f7a
Run latest JavaScript fallback fixes
BenCodez Aug 26, 2026
fb2d946
Harden template and regex fallback scanning
BenCodez Aug 26, 2026
36d75a5
Test nested template and quoted regex fallback contexts
BenCodez Aug 26, 2026
a98d63b
Prepare Codex round six fixes
BenCodez Aug 26, 2026
d58b77e
Run Codex round six fixes
BenCodez Aug 26, 2026
8fda25c
Fix nested templates and PAPI chaining
BenCodez Aug 26, 2026
adf589d
Test nested fallback templates
BenCodez Aug 26, 2026
04f9f6e
Test custom placeholder PAPI chaining
BenCodez Aug 26, 2026
699254c
Prepare Codex round seven fixes
BenCodez Aug 26, 2026
ee58d10
Run Codex round seven fixes
BenCodez Aug 26, 2026
1ee8653
Preserve JavaScript placeholder precedence and control regex contexts
BenCodez Aug 26, 2026
0bd092c
Test custom placeholder precedence over PAPI
BenCodez Aug 26, 2026
5051d90
Test regex literals after control statement heads
BenCodez Aug 26, 2026
26429e5
Fix placeholder precedence test harness
BenCodez Aug 26, 2026
b198e42
Add temporary round eight patch
BenCodez Aug 27, 2026
3063d0c
Run round eight JavaScript placeholder fixes
BenCodez Aug 27, 2026
ab7b2fb
Fix fallback comments and decoded PAPI values
BenCodez Aug 27, 2026
3561f09
Strengthen decoded placeholder regression
BenCodez Aug 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions AdvancedCore/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,12 @@
<version>2.12.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.openjdk.nashorn</groupId>
<artifactId>nashorn-core</artifactId>
<version>15.7</version>
<scope>provided</scope>
</dependency>
Comment thread
BenCodez marked this conversation as resolved.
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.bencodez.advancedcore.api.javascript;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import javax.script.ScriptEngine;
Expand All @@ -16,13 +17,17 @@
import com.bencodez.simpleapi.messages.MessageAPI;

public class JavascriptEngine {
private HashMap<String, Object> engineAPI;
private final HashMap<String, Object> engineAPI;
private final HashMap<String, String> placeholders;
private OfflinePlayer placeholderPlayer;

public JavascriptEngine() {
engineAPI = new HashMap<>();
placeholders = new HashMap<>();
}

public JavascriptEngine addPlayer(AdvancedCoreUser user) {
placeholderPlayer = user.getOfflinePlayer();
addToEngine("PlayerName", user.getPlayerName());
addToEngine("PlayerUUID", user.getUUID());
addToEngine("AdvancedCoreUser", user);
Expand All @@ -42,6 +47,7 @@ public JavascriptEngine addPlayer(CommandSender player) {
addToEngine("CommandSender", player);
if (player instanceof Player) {
Player p = (Player) player;
placeholderPlayer = p;
addToEngine("Player", p);
addToEngine("PlayerName", p.getName());
addToEngine("PlayerUUID", p.getUniqueId().toString());
Expand All @@ -58,6 +64,7 @@ public JavascriptEngine addPlayer(CommandSender player) {
}

public JavascriptEngine addPlayer(OfflinePlayer player) {
placeholderPlayer = player;
addToEngine("Player", player);
addToEngine("PlayerName", player.getName());
addToEngine("PlayerUUID", player.getUniqueId().toString());
Expand All @@ -76,6 +83,7 @@ public JavascriptEngine addPlayer(OfflinePlayer player) {

public JavascriptEngine addPlayer(Player player) {
if (player != null) {
placeholderPlayer = player;
addToEngine("Player", player);
addToEngine("PlayerName", player.getName());
addToEngine("PlayerUUID", player.getUniqueId().toString());
Expand All @@ -90,6 +98,13 @@ public JavascriptEngine addPlayer(Player player) {
return this;
}

public JavascriptEngine addPlaceholders(Map<String, String> placeholders) {
if (placeholders != null && !placeholders.isEmpty()) {
this.placeholders.putAll(placeholders);
}
return this;
}

public JavascriptEngine addToEngine(HashMap<String, Object> engineAPI) {
if (engineAPI != null && !engineAPI.isEmpty()) {
this.engineAPI.putAll(engineAPI);
Expand Down Expand Up @@ -119,7 +134,7 @@ public boolean getBooleanValue(String expression) {
}

public Object getResult(String expression) {
if (!expression.equals("")) {
if (expression != null && !expression.equals("")) {
if (!AdvancedCorePlugin.getInstance().getOptions().isJavascriptEngineEnabled()) {
return null;
}
Expand All @@ -128,6 +143,9 @@ public Object getResult(String expression) {
AdvancedCorePlugin.getInstance().debug("Failed to process javascript, engine == null");
return null;
}

String preparedExpression = JavascriptPlaceholderBinder.bind(expression, placeholderPlayer, placeholders, this);

engine.put("Bukkit", Bukkit.getServer());
engine.put("AdvancedCore", AdvancedCorePlugin.getInstance());
engine.put("Console", Bukkit.getConsoleSender());
Expand All @@ -142,7 +160,7 @@ public Object getResult(String expression) {
}

try {
return engine.eval(expression);
return engine.eval(preparedExpression);
} catch (ScriptException e) {
AdvancedCorePlugin.getInstance().getLogger().warning(
"Error occoured while evaluating javascript, turn debug on to see stacktrace: " + e.toString());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,55 @@ private ScriptEngine getServerProvidedEngine() {
}
}

/**
* Gets or prepares a Nashorn classloader for parser-only use. This is separate
* from the active ScriptEngine so a server-provided Rhino/GraalJS engine can
* still use Nashorn's parser for safe placeholder context detection.
*
* @return a classloader containing Nashorn's parser API, or null if unavailable
*/
public ClassLoader getOrCreateNashornParserClassLoader() {
if (nashornClassLoader != null) {
try {
Class.forName("org.openjdk.nashorn.api.tree.Parser", false, nashornClassLoader);
return nashornClassLoader;
} catch (ClassNotFoundException | LinkageError ignored) {
}
}
if (plugin == null) {
return null;
}

URLClassLoader loader = createParserClassLoader(PRIMARY_NASHORN_VERSION, ASM_VERSION_FOR_PRIMARY);
if (loader == null) {
loader = createParserClassLoader(FALLBACK_NASHORN_VERSION, ASM_VERSION_FOR_FALLBACK);
}
if (loader != null) {
nashornClassLoader = loader;
}
return loader;
}

private URLClassLoader createParserClassLoader(String nashornVersion, String asmVersion) {
try {
List<Path> jars = getOrDownloadJars(nashornVersion, asmVersion);
if (jars.isEmpty()) {
return null;
}
URLClassLoader loader = createClassLoader(jars);
try {
Class.forName("org.openjdk.nashorn.api.tree.Parser", false, loader);
return loader;
} catch (ClassNotFoundException | LinkageError e) {
closeQuietly(loader);
return null;
}
} catch (IOException e) {
logDebug(e);
return null;
}
}

/**
* Gets a downloaded Nashorn engine.
*
Expand Down
Loading
Loading