From dbc3e0f8f180e547acccbf13f34ddeadb64e3c11 Mon Sep 17 00:00:00 2001 From: iHDeveloper <20463031+iHDeveloper@users.noreply.github.com> Date: Sun, 26 Jul 2020 06:51:04 +0300 Subject: [PATCH 1/9] ASM-API: Initial The assembly transformer api goal is to provide a flexible way to transform classes. The current one doesn't help the mod to support multiple versions. And, It has many duplicates to maintain and other issues. The new api takes the class node as input. And, changes the node by the transformers. --- asm-api/build.gradle | 4 ++ .../asm/api/TransformerEngine.java | 21 ++++++++++ build.gradle | 38 +++++++++++-------- settings.gradle | 5 ++- 4 files changed, 51 insertions(+), 17 deletions(-) create mode 100644 asm-api/build.gradle create mode 100644 asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/TransformerEngine.java diff --git a/asm-api/build.gradle b/asm-api/build.gradle new file mode 100644 index 0000000000..d841aea26e --- /dev/null +++ b/asm-api/build.gradle @@ -0,0 +1,4 @@ +dependencies { + implementation('org.ow2.asm:asm:9.0-beta') + implementation('org.ow2.asm:asm-tree:9.0-beta') +} diff --git a/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/TransformerEngine.java b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/TransformerEngine.java new file mode 100644 index 0000000000..6088f7c83e --- /dev/null +++ b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/TransformerEngine.java @@ -0,0 +1,21 @@ +package codes.biscuit.skyblockaddons.asm.api; + +import org.objectweb.asm.tree.ClassNode; + +/** + * Manage the transformers and transform any class node. + * + * @author iHDeveloper + */ +public abstract class TransformerEngine { + + /** + * Transform the class node through the transformers + * + * @param node The class to transform + */ + public void transform(ClassNode node) { + throw new UnsupportedOperationException(); + } + +} diff --git a/build.gradle b/build.gradle index 4899eea92e..084ca1ee26 100644 --- a/build.gradle +++ b/build.gradle @@ -10,20 +10,32 @@ group = 'codes.biscuit' // The below line is for version checkers <= 1.4.2 //version = "1.5.2" -// Java plugin settings -sourceCompatibility = JavaVersion.VERSION_1_8 -targetCompatibility = JavaVersion.VERSION_1_8 -compileJava.options.encoding = 'UTF-8' - -repositories { - mavenCentral() - maven { - name 'JitPack' - url 'https://jitpack.io' +allprojects { + apply plugin: 'java' + + // Java plugin settings + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + compileJava.options.encoding = 'UTF-8' + + repositories { + mavenCentral() + maven { + name 'JitPack' + url 'https://jitpack.io' + } + } +} + +sourceSets { + main { + output.resourcesDir = java.outputDir } } dependencies { + // Assembly Transformer API + implementation(project('asm-api')) // Discord RPC for Java https://github.com/jagrosh/DiscordIPC implementation('com.github.jagrosh:DiscordIPC:e29d6d8') { exclude module: 'log4j' @@ -31,12 +43,6 @@ dependencies { testImplementation('org.junit.jupiter:junit-jupiter:5.6.2') } -sourceSets { - main { - output.resourcesDir = java.outputDir - } -} - minecraft { version = "${project.minecraftVersion}-${project.forgeVersion}" runDir = "run" diff --git a/settings.gradle b/settings.gradle index c3736c11b4..881036cb1a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -13,4 +13,7 @@ pluginManagement { } } } -} \ No newline at end of file +} + +// Assembly Transformer API +include 'asm-api' From d96a05348dcbcb8c21289bb2a0f9e3328deb4094 Mon Sep 17 00:00:00 2001 From: iHDeveloper <20463031+iHDeveloper@users.noreply.github.com> Date: Mon, 27 Jul 2020 12:33:26 +0300 Subject: [PATCH 2/9] Add lombok to all projects Lombok is a powerful tool. And, since the project is growing to be multi-module. It would be powerful to have this tool applied to every module on it. --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index 084ca1ee26..9efa5f7dff 100644 --- a/build.gradle +++ b/build.gradle @@ -12,6 +12,7 @@ group = 'codes.biscuit' allprojects { apply plugin: 'java' + apply plugin: 'io.franzbecker.gradle-lombok' // Java plugin settings sourceCompatibility = JavaVersion.VERSION_1_8 From 5d21efe50f707f0e0aabdd47bd3116890683376c Mon Sep 17 00:00:00 2001 From: iHDeveloper <20463031+iHDeveloper@users.noreply.github.com> Date: Mon, 27 Jul 2020 17:12:31 +0300 Subject: [PATCH 3/9] ASM-API: Implement java identifiers as helpers The implementation contains class, method and field identifiers. The class identifier is extendable to provide flexibility for the architecture. The identifiers are helpers since they help us orgnaize what to transform. The identifiers support any class and they're not stricted to Minecraft classes only. --- .../asm/api/helper/TransformClassHelper.java | 31 +++++ .../asm/api/helper/TransformFieldHelper.java | 77 +++++++++++ .../asm/api/helper/TransformFieldTypes.java | 12 ++ .../asm/api/helper/TransformMethodHelper.java | 125 ++++++++++++++++++ 4 files changed, 245 insertions(+) create mode 100644 asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/TransformClassHelper.java create mode 100644 asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/TransformFieldHelper.java create mode 100644 asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/TransformFieldTypes.java create mode 100644 asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/TransformMethodHelper.java diff --git a/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/TransformClassHelper.java b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/TransformClassHelper.java new file mode 100644 index 0000000000..a75b571dc9 --- /dev/null +++ b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/TransformClassHelper.java @@ -0,0 +1,31 @@ +package codes.biscuit.skyblockaddons.asm.api.helper; + +import lombok.Getter; + +/** + * An identifier for a class to transform + * + * @author iHDeveloper + */ +public abstract class TransformClassHelper { + + /** + * @return The name used for the owner of a field or method, or a field type. + */ + public final String getNameAsOwner() { + return "L" + getName() + ";"; + } + + /** + * @return The name used to identify this class + */ + public String getTransformerName() { + // The regex matches single slash or multiple and replace them with one dot + return getName().replaceAll("(\\/)+", "."); + } + + /** + * @return The raw name of the class + */ + public abstract String getName(); +} diff --git a/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/TransformFieldHelper.java b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/TransformFieldHelper.java new file mode 100644 index 0000000000..fb9aee53f1 --- /dev/null +++ b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/TransformFieldHelper.java @@ -0,0 +1,77 @@ +package codes.biscuit.skyblockaddons.asm.api.helper; + +import lombok.Getter; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.FieldInsnNode; + +/** + * An identifier for a field to transform + * + * @author iHDeveloper + */ +@Getter +public class TransformFieldHelper { + + private final TransformClassHelper owner; + private final String name; + private String type; + + /** + * Create a field helper to help the transformation process + * + * @param owner The owner of the field + * @param name The name of the field + * @param type A non-class field type {@link TransformFieldTypes} + */ + public TransformFieldHelper(TransformClassHelper owner, String name, char type) { + this(owner, name, ""); + this.type = "" + type; + } + + /** + * Create a field helper to help the transformation process + * + * @param owner The owner of the field + * @param name The name of the field + * @param type A class helper if the field type is class + */ + public TransformFieldHelper(TransformClassHelper owner, String name, TransformClassHelper type) { + this(owner, name, type.getNameAsOwner()); + } + + /** + * Create a field helper to help the transformation process + * + * @param owner The owner of the field + * @param name The name of the field + * @param type The raw name of the class + */ + public TransformFieldHelper(TransformClassHelper owner, String name, String type) { + this.owner = owner; + this.name = name; + this.type = "L" + type + ";"; + } + + /** + * Generate the get field instruction of the field + * + * @return An instruction node of the get field instruction + */ + public FieldInsnNode createGetInstruction() { + return new FieldInsnNode(Opcodes.GETFIELD, owner.getNameAsOwner(), name, type); + } + + /** + * Generate the put instruction of the field + * + * @return An instruction node of the put field instruction + */ + public FieldInsnNode createPutInstruction() { + return new FieldInsnNode(Opcodes.PUTFIELD, owner.getNameAsOwner(), name, type); + } + + public boolean equals(FieldInsnNode insnNode) { + return name.equals(insnNode.name) && type.equals(insnNode.desc); + } + +} diff --git a/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/TransformFieldTypes.java b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/TransformFieldTypes.java new file mode 100644 index 0000000000..f9cb4125f9 --- /dev/null +++ b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/TransformFieldTypes.java @@ -0,0 +1,12 @@ +package codes.biscuit.skyblockaddons.asm.api.helper; + +public final class TransformFieldTypes { + public static final char BYTE = 'B'; + public static final char CHAR = 'C'; + public static final char DOUBLE = 'D'; + public static final char FLOAT = 'F'; + public static final char INT = 'I'; + public static final char LONG = 'j'; + public static final char SHORT = 'S'; + public static final char BOOLEAN = 'Z'; +} diff --git a/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/TransformMethodHelper.java b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/TransformMethodHelper.java new file mode 100644 index 0000000000..cf5324e077 --- /dev/null +++ b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/TransformMethodHelper.java @@ -0,0 +1,125 @@ +package codes.biscuit.skyblockaddons.asm.api.helper; + +import lombok.Getter; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.MethodInsnNode; +import org.objectweb.asm.tree.MethodNode; + +/** + * An identifier for a method to transform + * + * @author iHDeveloper + */ +@Getter +public class TransformMethodHelper { + + /** + * Represents the constructor of the class + */ + public static final TransformMethodHelper INIT = new TransformMethodHelper("", ""); + + private final String name; + private String type; + private final String[] parameters; + private final boolean ioException; + + /** + * Create a method with name and void as return type + * + * @param name The name of the method + */ + public TransformMethodHelper(String name) { + this(name, null); + } + + /** + * Create a method with name and non-class return type + * + * @param name The name of the method + * @param type A non-class field type {@link TransformFieldTypes} + */ + public TransformMethodHelper(String name, char type) { + this(name, ""); + this.type = "" + type; + } + + /** + * Create a method with name and class as return type + * + * @param name The name of the method + * @param type A class as return type + */ + public TransformMethodHelper(String name, String type) { + this(name, type, new String[0]); + } + + /** + * Create a method with name, class as return type and parameters + * + * @param name The name of the method + * @param type A class as return type + * @param parameters The parameters of the method + */ + public TransformMethodHelper(String name, String type, String[] parameters) { + this(name, type, parameters, false); + } + + /** + * Create a method with name, class as return type and parameters + * + * @param name The name of the method + * @param type A class as return type + * @param parameters The parameters of the method + * @param ioException Does the method throw an IO exception + */ + public TransformMethodHelper(String name, String type, String[] parameters, boolean ioException) { + this.name = name; + this.type = type == null ? null : "L" + type + ";"; + this.parameters = parameters; + this.ioException = ioException; + } + + /** + * Generate a assembly method node of the method + * + * @return The generated node of the method + */ + public final MethodNode createMethodNode() { + return new MethodNode(Opcodes.ACC_PUBLIC, name, getDescriptor(), null, getExceptions()); + } + + public boolean equals(MethodInsnNode insnNode) { + return name.equals(insnNode.name) && getDescriptor().equals(insnNode.desc); + } + + public boolean equals(MethodNode node) { + return name.equals(node.name) && (getDescriptor().equals(node.desc) || this == INIT); + } + + /** + * Build a descriptor from the method parameters and result + * + * @return Method Descriptor + */ + public String getDescriptor() { + StringBuilder builder = new StringBuilder(); + builder.append("("); + for (String param : parameters) { + builder.append(param); + } + builder.append(")"); + if (type == null) builder.append("V"); + else builder.append(type); + return builder.toString(); + } + + /** + * Exceptions thrown by the method + * + * @return A list of exceptions + */ + public String[] getExceptions() { + if (ioException) return new String[0]; + return new String[] { "java/io/IOException" }; + } +} From baa04a2b0b4d07c255e9c7b7273077bc31f43a98 Mon Sep 17 00:00:00 2001 From: iHDeveloper <20463031+iHDeveloper@users.noreply.github.com> Date: Tue, 28 Jul 2020 10:23:10 +0300 Subject: [PATCH 4/9] ASM-API: Provide an interface for the transformer The transformer is designed in a way to identify its target. And, to transform those targets by receiving the class node of those targets. --- .../skyblockaddons/asm/api/Transformer.java | 47 +++++++++++++++++++ .../asm/api/helper/TransformClassHelper.java | 4 ++ 2 files changed, 51 insertions(+) create mode 100644 asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/Transformer.java diff --git a/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/Transformer.java b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/Transformer.java new file mode 100644 index 0000000000..f3b571f6ef --- /dev/null +++ b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/Transformer.java @@ -0,0 +1,47 @@ +package codes.biscuit.skyblockaddons.asm.api; + +import codes.biscuit.skyblockaddons.asm.api.helper.TransformClassHelper; +import org.objectweb.asm.tree.ClassNode; + +/** + * Transforming the targeted classes in order to change how the class behave. + * Or, injecting hooks triggers. + * + * @author iHDeveloper + */ +public abstract class Transformer { + + /** + * Puts a single class helper into an array + * + * @param classHelper The class helper to put into an array + * @return An array containing single class helper + */ + protected TransformClassHelper[] single(TransformClassHelper classHelper) { + return new TransformClassHelper[] { classHelper }; + } + + /** + * Puts multiple class helpers into an array + * @param classHelpers The class helpers to put into an array + * @return An array containing multiple class helpers + */ + protected TransformClassHelper[] multiple(TransformClassHelper... classHelpers) { + return classHelpers; + } + + /** + * Get the targeted class helpers + * + * @return An array of class helpers + */ + public abstract TransformClassHelper[] targets(); + + /** + * Transform a class node with its helper + * + * @param targetClassHelper The class helper of the target to transform + * @param node The class node of the target + */ + public abstract void transform(TransformClassHelper targetClassHelper, ClassNode node); +} diff --git a/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/TransformClassHelper.java b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/TransformClassHelper.java index a75b571dc9..a3b8f5ee44 100644 --- a/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/TransformClassHelper.java +++ b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/TransformClassHelper.java @@ -24,6 +24,10 @@ public String getTransformerName() { return getName().replaceAll("(\\/)+", "."); } + public boolean equals(TransformClassHelper classHelper) { + return getTransformerName().equals(classHelper.getTransformerName()); + } + /** * @return The raw name of the class */ From a8c3f7e4200e04f20ed2cb2e75b26644a6792b53 Mon Sep 17 00:00:00 2001 From: iHDeveloper <20463031+iHDeveloper@users.noreply.github.com> Date: Tue, 28 Jul 2020 13:02:48 +0300 Subject: [PATCH 5/9] Fix: Dependencies version conflict - Change the OW2-ASM from 9.0-beta to 5.0.3 - Add Google Guava 17.0 - Make all dependencies compile only. Since the module is going to be included with the main module --- asm-api/build.gradle | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/asm-api/build.gradle b/asm-api/build.gradle index d841aea26e..cd8763a199 100644 --- a/asm-api/build.gradle +++ b/asm-api/build.gradle @@ -1,4 +1,8 @@ dependencies { - implementation('org.ow2.asm:asm:9.0-beta') - implementation('org.ow2.asm:asm-tree:9.0-beta') + // OW2 ASM v5.0.3 + compileOnly('org.ow2.asm:asm:5.0.3') + compileOnly('org.ow2.asm:asm-tree:5.0.3') + + // Google Guava v17.0 + compileOnly("com.google.guava:guava:17.0") } From b5d6798d6a0cb3d55ab85561f01e133db71c7511 Mon Sep 17 00:00:00 2001 From: iHDeveloper <20463031+iHDeveloper@users.noreply.github.com> Date: Tue, 28 Jul 2020 13:26:05 +0300 Subject: [PATCH 6/9] ASM-API: Implement functionality to the engine The engine is the core of the transformation process. The engine now is able to register transformers and check if the class needs to transform by any transformer or not. --- .../asm/api/TransformerEngine.java | 48 ++++++++++++++++++- .../normal/NormalTransformClassHelper.java | 28 +++++++++++ 2 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/normal/NormalTransformClassHelper.java diff --git a/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/TransformerEngine.java b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/TransformerEngine.java index 6088f7c83e..ee379ddcf1 100644 --- a/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/TransformerEngine.java +++ b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/TransformerEngine.java @@ -1,5 +1,9 @@ package codes.biscuit.skyblockaddons.asm.api; +import codes.biscuit.skyblockaddons.asm.api.helper.TransformClassHelper; +import codes.biscuit.skyblockaddons.asm.api.helper.normal.NormalTransformClassHelper; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; import org.objectweb.asm.tree.ClassNode; /** @@ -9,13 +13,53 @@ */ public abstract class TransformerEngine { + // TODO Implement a logger for the engine + private Multimap transformers = ArrayListMultimap.create(); + + /** + * Create an engine with transformers built-in + * + * @param transformers The transformers to register into the engine + */ + public TransformerEngine(Transformer[] transformers) { + for (Transformer transformer : transformers) { + register(transformer); + } + } + + /** + * Check if the class name is a target for transformation + * + * @param name The class name + */ + public boolean exists(String name) { + return transformers.containsKey(name); + } + /** * Transform the class node through the transformers * * @param node The class to transform */ - public void transform(ClassNode node) { - throw new UnsupportedOperationException(); + public void transform(String name, ClassNode node) { + TransformClassHelper classHelper = new NormalTransformClassHelper(name); + + for (Transformer transformer : transformers.get(name)) { + transformer.transform(classHelper, node); + } + + // TODO Implement a way to change the write flags of the class writer + } + + /** + * Register a transformer with its targets + * + * @param transformer The transformer to register + */ + protected void register(Transformer transformer) { + for (TransformClassHelper targetClassHelper : transformer.targets()) { + transformers.put(targetClassHelper.getTransformerName(), transformer); + } } } diff --git a/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/normal/NormalTransformClassHelper.java b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/normal/NormalTransformClassHelper.java new file mode 100644 index 0000000000..853e056f62 --- /dev/null +++ b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/normal/NormalTransformClassHelper.java @@ -0,0 +1,28 @@ +package codes.biscuit.skyblockaddons.asm.api.helper.normal; + +import codes.biscuit.skyblockaddons.asm.api.helper.TransformClassHelper; + +/** + * A normal helper for transform class + * + * @author iHDeveloper + */ +public class NormalTransformClassHelper extends TransformClassHelper { + + private String name; + + /** + * Create a helper for transform class with name + * + * @param name The name of the class + */ + public NormalTransformClassHelper(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } + +} From ddf60698f64959deb9d7695f0155e6ddff51ac25 Mon Sep 17 00:00:00 2001 From: iHDeveloper <20463031+iHDeveloper@users.noreply.github.com> Date: Wed, 29 Jul 2020 00:10:26 +0300 Subject: [PATCH 7/9] ASM-API: Implement write flags to the engine - Replace 'asm' and 'asm-tree' with 'asm-debug-all' - Add Apache Commons Lang v3 - Implement a way to change the write flags and read them in the engine - Give access to the engine from the transformer in order to change the write flags --- asm-api/build.gradle | 12 +++++---- .../skyblockaddons/asm/api/Transformer.java | 3 ++- .../asm/api/TransformerEngine.java | 25 +++++++++++++++++-- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/asm-api/build.gradle b/asm-api/build.gradle index cd8763a199..7d6ec85ecb 100644 --- a/asm-api/build.gradle +++ b/asm-api/build.gradle @@ -1,8 +1,10 @@ dependencies { - // OW2 ASM v5.0.3 - compileOnly('org.ow2.asm:asm:5.0.3') - compileOnly('org.ow2.asm:asm-tree:5.0.3') + /* OW2 ASM v5.0.3 */ + compileOnly('org.ow2.asm:asm-debug-all:5.0.3') - // Google Guava v17.0 - compileOnly("com.google.guava:guava:17.0") + /* Google Guava v17.0 */ + compileOnly('com.google.guava:guava:17.0') + + /* Apache Commons Lang v3 */ + compileOnly('org.apache.commons:commons-lang3:3.3.2') } diff --git a/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/Transformer.java b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/Transformer.java index f3b571f6ef..1cd61887fb 100644 --- a/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/Transformer.java +++ b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/Transformer.java @@ -40,8 +40,9 @@ protected TransformClassHelper[] multiple(TransformClassHelper... classHelpers) /** * Transform a class node with its helper * + * @param engine The engine which is performing the transformation process * @param targetClassHelper The class helper of the target to transform * @param node The class node of the target */ - public abstract void transform(TransformClassHelper targetClassHelper, ClassNode node); + public abstract void transform(TransformerEngine engine, TransformClassHelper targetClassHelper, ClassNode node); } diff --git a/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/TransformerEngine.java b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/TransformerEngine.java index ee379ddcf1..033f71c368 100644 --- a/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/TransformerEngine.java +++ b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/TransformerEngine.java @@ -4,6 +4,8 @@ import codes.biscuit.skyblockaddons.asm.api.helper.normal.NormalTransformClassHelper; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; +import org.apache.commons.lang3.mutable.MutableInt; +import org.objectweb.asm.ClassWriter; import org.objectweb.asm.tree.ClassNode; /** @@ -15,6 +17,7 @@ public abstract class TransformerEngine { // TODO Implement a logger for the engine private Multimap transformers = ArrayListMultimap.create(); + private MutableInt writeFlags = new MutableInt(); /** * Create an engine with transformers built-in @@ -44,11 +47,29 @@ public boolean exists(String name) { public void transform(String name, ClassNode node) { TransformClassHelper classHelper = new NormalTransformClassHelper(name); + writeFlags.setValue(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); + for (Transformer transformer : transformers.get(name)) { - transformer.transform(classHelper, node); + transformer.transform(this, classHelper, node); } + } + + /** + * Set the write flags of the current class for the writer + * + * @param flags The flags for the class writer see {@link ClassWriter} + */ + public void setWriteFlags(int flags) { + writeFlags.setValue(flags); + } - // TODO Implement a way to change the write flags of the class writer + /** + * Get the current write flags + * + * @return The write flags as integer + */ + public int getWriteFlags() { + return writeFlags.getValue(); } /** From 9236db9bf128c7305b229297e726c2f597ec86d4 Mon Sep 17 00:00:00 2001 From: iHDeveloper <20463031+iHDeveloper@users.noreply.github.com> Date: Wed, 29 Jul 2020 00:22:00 +0300 Subject: [PATCH 8/9] ASM-API: Implement logger to the engine - Add Apache Log4J v2.0-beta9 - Give access to the engine's logger. For the transformers to log there. --- asm-api/build.gradle | 3 +++ .../skyblockaddons/asm/api/TransformerEngine.java | 13 ++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/asm-api/build.gradle b/asm-api/build.gradle index 7d6ec85ecb..78b4c99d0f 100644 --- a/asm-api/build.gradle +++ b/asm-api/build.gradle @@ -7,4 +7,7 @@ dependencies { /* Apache Commons Lang v3 */ compileOnly('org.apache.commons:commons-lang3:3.3.2') + + /* Apache Log4J v2.0-beta9 */ + compileOnly('org.apache.logging.log4j:log4j-api:2.0-beta9') } diff --git a/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/TransformerEngine.java b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/TransformerEngine.java index 033f71c368..ba1323b972 100644 --- a/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/TransformerEngine.java +++ b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/TransformerEngine.java @@ -5,6 +5,8 @@ import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; import org.apache.commons.lang3.mutable.MutableInt; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.tree.ClassNode; @@ -15,7 +17,7 @@ */ public abstract class TransformerEngine { - // TODO Implement a logger for the engine + private Logger logger = LogManager.getLogger("SBA: ASM Transformers"); private Multimap transformers = ArrayListMultimap.create(); private MutableInt writeFlags = new MutableInt(); @@ -54,6 +56,15 @@ public void transform(String name, ClassNode node) { } } + /** + * Get the engine logger + * + * @return The logger of the engine + */ + public Logger getLogger() { + return logger; + } + /** * Set the write flags of the current class for the writer * From c079b95448f01f20ccd36924e83641d1c145fd1b Mon Sep 17 00:00:00 2001 From: iHDeveloper <20463031+iHDeveloper@users.noreply.github.com> Date: Wed, 29 Jul 2020 05:18:00 +0300 Subject: [PATCH 9/9] ASM-API: Implement an interface for the hook - Create interface for hook in order to identify the hooks in the engine - A helper for hook if it has result. Even if there's no value but the hook has action to do without value. --- .../biscuit/skyblockaddons/asm/api/Hook.java | 9 ++++ .../asm/api/helper/HookResult.java | 50 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/Hook.java create mode 100644 asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/HookResult.java diff --git a/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/Hook.java b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/Hook.java new file mode 100644 index 0000000000..27e0b1649b --- /dev/null +++ b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/Hook.java @@ -0,0 +1,9 @@ +package codes.biscuit.skyblockaddons.asm.api; + +/** + * Listener to triggered actions by triggers that were injected using {@link Transformer} + * + * @author iHDeveloper + */ +public interface Hook { +} diff --git a/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/HookResult.java b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/HookResult.java new file mode 100644 index 0000000000..191facc512 --- /dev/null +++ b/asm-api/src/main/java/codes/biscuit/skyblockaddons/asm/api/helper/HookResult.java @@ -0,0 +1,50 @@ +package codes.biscuit.skyblockaddons.asm.api.helper; + +/** + * A helper for getting result from hook to include in return or another function. + * + * @param The type of the result we are getting from the hook + * + * @author iHDeveloper + */ +public class HookResult { + + private boolean empty = false; + private V value = null; + + /** + * Check if the result is empty or not. Or, have the result been set before or not. + * + * @return Is the result empty or not + */ + public boolean is() { + return empty; + } + + /** + * Set the result to be nothing but it's not empty! + */ + public void set() { + set(null); + } + + /** + * Set the result to certain value. And, it's not empty anymore. + * + * @param value The value to include in the result + */ + public void set(V value) { + this.value = value; + this.empty = true; + } + + /** + * Get the value from the result + * + * @return The value that's has been set by the hook + */ + public V get() { + return value; + } + +}