-
-
Notifications
You must be signed in to change notification settings - Fork 103
/
RuntimeCompiler.java
93 lines (79 loc) · 4.03 KB
/
RuntimeCompiler.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package net.aufdemrand.denizen.utilities;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import net.aufdemrand.denizen.Denizen;
import net.aufdemrand.denizen.interfaces.dExternal;
import net.aufdemrand.denizen.utilities.debugging.dB;
import org.abstractmeta.toolbox.compilation.compiler.JavaSourceCompiler;
import org.abstractmeta.toolbox.compilation.compiler.impl.JavaSourceCompilerImpl;
import org.bukkit.ChatColor;
public class RuntimeCompiler {
Denizen denizen;
public RuntimeCompiler(Denizen denizen) {
this.denizen = denizen;
}
@SuppressWarnings("unchecked")
public void loader() {
List<String> dependencies = new ArrayList<String>();
dB.log("Loading external dependencies for run-time compiler.");
try {
File file = new File(denizen.getDataFolder() + File.separator + "externals" + File.separator + "dependencies");
File[] files = file.listFiles();
if (files.length > 0){
for (File f : files){
String fileName = f.getName();
if (fileName.substring(fileName.lastIndexOf('.') + 1).equalsIgnoreCase("JAR")) {
dependencies.add(f.getPath());
dB.log("Loaded " + f.getName());
}
}
}
} catch (Exception error) { dB.log("No dependencies to load."); }
try {
File file = new File(denizen.getDataFolder() + File.separator + "externals");
File[] files = file.listFiles();
if (files.length > 0){
for (File f : files){
String fileName = f.getName();
if (fileName.substring(fileName.lastIndexOf('.') + 1).equalsIgnoreCase("JAVA") && !fileName.startsWith(".")) {
dB.log("Processing '" + fileName + "'... ");
JavaSourceCompiler javaSourceCompiler = new JavaSourceCompilerImpl();
JavaSourceCompiler.CompilationUnit compilationUnit = javaSourceCompiler.createCompilationUnit();
if (!dependencies.isEmpty()) compilationUnit.addClassPathEntries(dependencies);
try {
compilationUnit.addJavaSource(fileName.replace(".java", ""), readFile(f.getAbsolutePath()));
ClassLoader classLoader = javaSourceCompiler.compile(compilationUnit);
Class<dExternal> load = (Class<dExternal>) classLoader.loadClass(fileName.replace(".java", ""));
dExternal loadedClass = load.newInstance();
loadedClass.load();
} catch (Exception e) {
if (e instanceof IllegalStateException)
dB.echoError("No JDK found! External .java files will not be loaded.");
else {
dB.echoError(ChatColor.RED + "Woah! Error compiling " + fileName + "!");
dB.echoError(e);
}
}
}
}
dB.echoApproval("All externals loaded!");
} else dB.echoError("Woah! No externals in /plugins/Denizen/externals/.../ to load!");
} catch (Exception error) { /* No externals */ }
}
private String readFile(String file) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(file));
String line = null;
StringBuilder stringBuilder = new StringBuilder();
String ls = System.getProperty("line.separator");
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
stringBuilder.append(ls);
}
reader.close();
return stringBuilder.toString();
}
}