Skip to content

Commit a1dfdde

Browse files
committed
Redirect xyz.wagyourtail package to com.jsmacrosce
1 parent 7d1f9b7 commit a1dfdde

2 files changed

Lines changed: 39 additions & 1 deletion

File tree

common/src/main/java/com/jsmacrosce/jsmacros/core/library/impl/FReflection.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ public <T> Class<T> getClass(String name) throws ClassNotFoundException {
8383
case "void":
8484
return (Class<T>) void.class;
8585
default:
86+
name = redirectWagYourTail(name);
8687
return (Class<T>) Class.forName(name, true, classLoader);
8788
}
8889
}
@@ -105,6 +106,9 @@ public <T> Class<T> getClass(String name) throws ClassNotFoundException {
105106
)
106107
@DocletReplaceReturn("GetJava.Type$Reflection<C>")
107108
public <T> Class<T> getClass(String name, String name2) throws ClassNotFoundException {
109+
name = redirectWagYourTail(name);
110+
name2 = redirectWagYourTail(name2);
111+
108112
try {
109113
return getClass(name);
110114
} catch (ClassNotFoundException e) {
@@ -320,6 +324,8 @@ public <T> ProxyBuilder<T> createClassProxyBuilder(Class<T> clazz, Class<?>... i
320324
* @since 1.6.5
321325
*/
322326
public <T> ClassBuilder<T> createClassBuilder(String cName, Class<T> clazz, Class<?>... interfaces) throws NotFoundException, CannotCompileException {
327+
cName = redirectWagYourTail(cName);
328+
323329
return new ClassBuilder<>(cName, clazz, interfaces);
324330
}
325331

@@ -350,6 +356,7 @@ public LibraryBuilder createLibraryBuilder(String name, boolean perExec, String.
350356
* @since 1.8.4
351357
*/
352358
public void createLibrary(String className, String javaCode) {
359+
// TODO: Should we dynamically redirect xyz.wagyourtail to com.jsmacrosce in here?
353360
runner.libraryRegistry.addLibrary((Class<? extends BaseLibrary>) compileJavaClass(className, javaCode));
354361
}
355362

@@ -368,6 +375,7 @@ public void createLibrary(String className, String javaCode) {
368375
* @since 1.8.4
369376
*/
370377
public Class<?> compileJavaClass(String className, String code) {
378+
// TODO: Should we dynamically redirect xyz.wagyourtail to com.jsmacrosce in here?
371379
Class<?> clazz = Reflect.compile(className, code).type();
372380
JAVA_CLASS_CACHE.putIfAbsent(className, new ArrayList<>());
373381
JAVA_CLASS_CACHE.get(className).add(clazz);
@@ -380,6 +388,8 @@ public Class<?> compileJavaClass(String className, String code) {
380388
* @since 1.8.4
381389
*/
382390
public Class<?> getCompiledJavaClass(String className) {
391+
className = redirectWagYourTail(className);
392+
383393
List<Class<?>> versions = JAVA_CLASS_CACHE.get(className);
384394
return versions == null ? null : versions.get(versions.size() - 1);
385395
}
@@ -390,6 +400,7 @@ public Class<?> getCompiledJavaClass(String className) {
390400
* @since 1.8.4
391401
*/
392402
public List<Class<?>> getAllCompiledJavaClassVersions(String className) {
403+
className = redirectWagYourTail(className);
393404
List<Class<?>> versions = JAVA_CLASS_CACHE.get(className);
394405
return versions == null ? Collections.emptyList() : ImmutableList.copyOf(versions);
395406
}
@@ -437,6 +448,10 @@ public String getClassName(Object o) {
437448
}
438449
}
439450

451+
public static String redirectWagYourTail(String name) {
452+
return name.replace("xyz.wagyourtail.", "com.jsmacrosce.");
453+
}
454+
440455
/**
441456
* I know this is probably bad practice, but lets be real, this whole library is bad practice, So I can make it
442457
* worse, right? at least this should work better than {@code try/catch}'ing using

extension/graal/src/main/java/com/jsmacrosce/jsmacros/graal/language/impl/GraalLanguageDefinition.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.jsmacrosce.jsmacros.core.event.BaseEvent;
1111
import com.jsmacrosce.jsmacros.core.extensions.Extension;
1212
import com.jsmacrosce.jsmacros.core.language.BaseLanguage;
13+
import com.jsmacrosce.jsmacros.core.library.impl.FReflection;
1314
import com.jsmacrosce.jsmacros.core.language.EventContainer;
1415
import com.jsmacrosce.jsmacros.core.library.BaseLibrary;
1516
import com.jsmacrosce.jsmacros.graal.GraalConfig;
@@ -23,6 +24,7 @@
2324
public class GraalLanguageDefinition extends BaseLanguage<Context, GraalScriptContext> {
2425
private static volatile Engine engine = null;
2526
public static final boolean isJsInstalled;
27+
private static final ClassLoader REDIRECTING_CLASS_LOADER = new RedirectingClassLoader(FReflection.classLoader);
2628

2729
static {
2830
// Create a temporary engine just to check available languages
@@ -68,7 +70,9 @@ protected Context buildContext(File currentDir, String lang, Map<String, String>
6870
.engine(engine)
6971
.allowAllAccess(true)
7072
.allowNativeAccess(true)
71-
.allowExperimentalOptions(true);
73+
.allowExperimentalOptions(true)
74+
.allowHostClassLookup(name -> true)
75+
.hostClassLoader(REDIRECTING_CLASS_LOADER);
7276

7377
for (Map.Entry<String, String> e : extraLangOptions.entrySet()) {
7478
try {
@@ -204,4 +208,23 @@ public GraalScriptContext createContext(BaseEvent event, File file) {
204208
return new GraalScriptContext(runner, event, file);
205209
}
206210

211+
private static final class RedirectingClassLoader extends ClassLoader {
212+
private RedirectingClassLoader(ClassLoader parent) {
213+
super(parent);
214+
}
215+
216+
@Override
217+
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
218+
try {
219+
return super.loadClass(name, resolve);
220+
} catch (ClassNotFoundException e) {
221+
String redirected = FReflection.redirectWagYourTail(name);
222+
if (!redirected.equals(name)) {
223+
return super.loadClass(redirected, resolve);
224+
}
225+
throw e;
226+
}
227+
}
228+
}
229+
207230
}

0 commit comments

Comments
 (0)