
com.undefinedlabs.scope.rules.AbstractScopeAgentRule Maven / Gradle / Ivy
package com.undefinedlabs.scope.rules;
import static net.bytebuddy.matcher.ElementMatchers.any;
import com.undefinedlabs.scope.agent.ScopeAppliedRulesManager;
import com.undefinedlabs.scope.agent.ScopeTransformers;
import java.util.Map;
import net.bytebuddy.agent.builder.AgentBuilder;
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher;
public abstract class AbstractScopeAgentRule implements ScopeAgentRule {
protected ElementMatcher classLoaderMatcher() {
return any();
}
protected abstract ElementMatcher super TypeDescription> typeMatcher();
protected abstract Map extends ElementMatcher super MethodDescription>, String>
transformers();
@Override
public AgentBuilder instrument(final AgentBuilder parentAgentBuilder) {
if (ScopeAppliedRulesManager.INSTANCE.isAlreadyApplied(getClass().getName())) {
return parentAgentBuilder;
}
AgentBuilder.Identified.Extendable agentBuilder =
parentAgentBuilder
.type(typeMatcher(), classLoaderMatcher())
.transform(ScopeTransformers.defaultTransformers());
for (final Map.Entry extends ElementMatcher super MethodDescription>, String> transformer :
transformers().entrySet()) {
agentBuilder =
agentBuilder.transform(
new AgentBuilder.Transformer.ForAdvice()
.include(ClassLoader.getSystemClassLoader())
.advice(transformer.getKey(), transformer.getValue()));
}
ScopeAppliedRulesManager.INSTANCE.storeApplied(getClass().getName());
return agentBuilder;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy