aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/ftbsc/lll/loader/LilleroLoader.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/ftbsc/lll/loader/LilleroLoader.java')
-rw-r--r--src/main/java/ftbsc/lll/loader/LilleroLoader.java107
1 files changed, 94 insertions, 13 deletions
diff --git a/src/main/java/ftbsc/lll/loader/LilleroLoader.java b/src/main/java/ftbsc/lll/loader/LilleroLoader.java
index 8999c49..044ca47 100644
--- a/src/main/java/ftbsc/lll/loader/LilleroLoader.java
+++ b/src/main/java/ftbsc/lll/loader/LilleroLoader.java
@@ -20,35 +20,84 @@ import java.nio.file.Path;
import java.util.*;
import java.util.stream.Collectors;
+/**
+ * Implements the {@link ILaunchPluginService} interface to create
+ * a loader for Lillero patches ({@link IInjector}).
+ */
public class LilleroLoader implements ILaunchPluginService {
+ /**
+ * A Log4j logger instance.
+ */
private static final Logger LOGGER = LogManager.getLogger(LilleroLoader.class.getCanonicalName());
- private static final Marker INIT = MarkerManager.getMarker("INIT");
+
+ /**
+ * A Marker for the logger, used during the initialisation phase.
+ */
+ private static final Marker INIT = MarkerManager.getMarker("INIT");
+
+ /**
+ * A Marker for the logger, used during the resource processing phase.
+ */
private static final Marker RESOURCE = MarkerManager.getMarker("RESOURCE");
- private static final Marker HANDLER = MarkerManager.getMarker("HANDLER");
- private static final Marker PATCHER = MarkerManager.getMarker("PATCHER");
+ /**
+ * A Marker for the logger, used during class inspection.
+ */
+ private static final Marker HANDLER = MarkerManager.getMarker("HANDLER");
+
+ /**
+ * A Marker for the logger, used during the patching phase.
+ */
+ private static final Marker PATCHER = MarkerManager.getMarker("PATCHER");
+
+ /**
+ * The unique identifier assigned to this plugin.
+ */
public static final String NAME = "lll-loader";
+ /**
+ * A Set used to hold declared injectors.
+ */
private final Set<IInjector> injectors = new HashSet<>();
+
+ /**
+ * A Set used to hold the fully-qualified names of target classes.
+ * Used to improve performance.
+ */
private final Set<String> targetClasses = new HashSet<>();
public LilleroLoader() {
LOGGER.info(INIT, "Patch Loader initialized");
}
+ /**
+ * The unique name of this plugin, used by the launcher and other systems to find it.
+ * @return the name of the plugin
+ * @see ILaunchPluginService#name()
+ */
@Override
public String name() {
return NAME;
}
-
- // Load mods requesting patches from resources
-
+ /**
+ * Adds a resource to this plugin for processing by it.
+ * In our implementation, it does nothing but log that it happened.
+ * @param resource The resource to be considered by this plugin.
+ * @param name A name for this resource.
+ */
@Override
public void offerResource(Path resource, String name) {
LOGGER.warn(RESOURCE, "Resource offered to us ({}@{}) but no action was taken", name, resource.toString());
}
+ /**
+ * Offer scan results from TransformationServices to this plugin.
+ * In practice, the paths of Forge mod JARs are offered to our processor here. In the method, we look for
+ * service provider files for {@link IInjector} and load them. We also memorise in a set the fully qualified
+ * name of classes that are to be patched.
+ * @param resources A collection of all the results
+ */
@Override
public void addResources(List<Map.Entry<String, Path>> resources) {
LOGGER.debug(RESOURCE, "Resources being added:");
@@ -69,16 +118,40 @@ public class LilleroLoader implements ILaunchPluginService {
}
- // Filter only classes we need to patch
+ /**
+ * What is returned when the class being processed is to be patched.
+ */
+ private static final EnumSet<Phase> YAY = EnumSet.of(Phase.BEFORE);
+
+ /**
+ * What is returned when the class being processed is of no interest to any patch.
+ */
+ private static final EnumSet<Phase> NAY = EnumSet.noneOf(Phase.class);
+ /**
+ * Legacy method - only called by outdated ModLauncher versions. Since we don't really use
+ * the reason, however, we can support it.
+ * @param classType the class to consider
+ * @param isEmpty if the class is empty at present (indicates no backing file found)
+ * @return the set of {@link Phase}s the plugin wishes to be called back with
+ * @see LilleroLoader#handlesClass(Type, boolean, String)
+ */
@Override
public EnumSet<Phase> handlesClass(Type classType, final boolean isEmpty) {
- throw new IllegalStateException("Outdated ModLauncher"); //mixin does it
+ return handlesClass(classType, isEmpty, "unspecified");
}
- private static final EnumSet<Phase> YAY = EnumSet.of(Phase.BEFORE);
- private static final EnumSet<Phase> NAY = EnumSet.noneOf(Phase.class);
-
+ /**
+ * Each class loaded is offered to the plugin for processing the plugin replies whether it's interested or not.
+ * The loader is only interested if the class's fully qualified name was earlier placed in the set.
+ * @param classType the class to consider
+ * @param isEmpty if the class is empty at present (indicates no backing file found)
+ * @param reason Reason for transformation request.
+ * "classloading" - cpw.mods.modlauncher.api.ITransformerActivity#CLASSLOADING_REASON
+ * "computing_frames" - cpw.mods.modlauncher.api.ITransformerActivity#COMPUTING_FRAMES_REASON
+ * or the name of an {@link ILaunchPluginService}
+ * @return the set of {@link Phase}s the plugin wishes to be called back with
+ */
@Override
public EnumSet<Phase> handlesClass(Type classType, final boolean isEmpty, final String reason) {
if (isEmpty) return NAY;
@@ -91,8 +164,16 @@ public class LilleroLoader implements ILaunchPluginService {
}
- // Process classes and inject methods
-
+ /**
+ * Each class loaded is offered to the plugin for processing.
+ * This is where the actual injection happens: the loader calls the {@link IInjector#inject(ClassNode, MethodNode)}
+ * method with the appropriate parameters, after finding them..
+ * @param phase The phase of the supplied class node
+ * @param classNode the classnode to process
+ * @param classType the name of the class
+ * @param reason Reason for transformation. "classloading" or the name of an {@link ILaunchPluginService}
+ * @return the {@link ComputeFlags} for this class
+ */
@Override
public int processClassWithFlags(Phase phase, ClassNode classNode, Type classType, String reason) {
LOGGER.debug(PATCHER, "Processing class {} in phase {} of {}", classType.getClassName(), phase.name(), reason);