package net.bytebuddy.build.gradle; import groovy.lang.Closure; import net.bytebuddy.dynamic.scaffold.inline.MethodNameTransformer; import org.gradle.api.GradleException; import org.gradle.api.Project; import org.gradle.api.Task; import java.util.ArrayList; import java.util.List; import java.util.Set; /** * Representation of a Gradle configuration for Byte Buddy. */ public class ByteBuddyExtension { /** * The current project. */ private final Project project; /** * A list of registered transformations. */ private final List<Transformation> transformations; /** * The initialization or {@code null} if no initialization was defined by a user. */ private Initialization initialization; /** * The suffix to use for rebased methods or {@code null} if a random suffix should be used. */ private String suffix; /** * {@code true} if the plugin should fail upon discovering a live runtime initializer. */ private boolean failOnLiveInitializer; /** * A list of task names for which to apply a transformation or {@code null} if the task should apply to all tasks. */ private Set<String> tasks; /** * Creates a new Byte Buddy extension. * * @param project The current project. */ public ByteBuddyExtension(Project project) { this.project = project; transformations = new ArrayList<Transformation>(); failOnLiveInitializer = true; } /** * Adds a transformation to apply. * * @param closure The closure for configuring the transformation. */ public void transformation(Closure<?> closure) { Transformation transformation = (Transformation) project.configure(new Transformation(), closure); transformations.add(transformation); } /** * Adds an initialization to apply. * * @param closure The closure for configuring the initialization. */ public void initialization(Closure<?> closure) { if (initialization != null) { throw new GradleException("Initialization is already set"); } initialization = (Initialization) project.configure(new Initialization(), closure); } /** * Returns a list of transformations to apply. * * @return A list of transformations to apply. */ public List<Transformation> getTransformations() { return transformations; } /** * Returns the initialization to use. * * @return The initialization to use. */ public Initialization getInitialization() { return initialization == null ? Initialization.makeDefault() : initialization; } /** * Returns the method name transformer to use. * * @return The method name transformer to use. */ public MethodNameTransformer getMethodNameTransformer() { return suffix == null || suffix.isEmpty() ? MethodNameTransformer.Suffixing.withRandomSuffix() : new MethodNameTransformer.Suffixing(suffix); } /** * Sets the suffix to apply upon rebased methods. * * @param suffix The suffix to apply upon rebased methods. */ public void setSuffix(String suffix) { this.suffix = suffix; } /** * Returns {@code true} if the build should fail upon discovering a live runtime initializer. * * @return {@code true} if the build should fail upon discovering a live runtime initializer. */ public boolean isFailOnLiveInitializer() { return failOnLiveInitializer; } /** * Determines if the build should fail upon discovering a live runtime initializer. * * @param failOnLiveInitializer {@code true} if the build should fail upon discovering a live runtime initializer. */ public void setFailOnLiveInitializer(boolean failOnLiveInitializer) { this.failOnLiveInitializer = failOnLiveInitializer; } /** * Sets the initialization that should be used. * * @param initialization The initialization to be used. */ public void setInitialization(Initialization initialization) { this.initialization = initialization; } /** * Determines if a task is subject to transformation. * * @param task The task to consider. * @return {@code true} if this task should be followed up by a transformation. */ public boolean implies(Task task) { return tasks == null || tasks.contains(task.getName()); } /** * Sets an explicit list of tasks for which a transformation should be applied. * * @param tasks The tasks to explicitly append a transformation to. */ public void setTasks(Set<String> tasks) { this.tasks = tasks; } }