use of com.newrelic.weave.weavepackage.language.LanguageAdapter in project newrelic-java-agent by newrelic.
the class WeavePackage method processWeaveBytes.
/**
* Processes all classes in the package. Part of package initialization.
* @param weavePackageBytes list of all class bytes in the package
* @return list of weave violations found during package initialization
*/
protected final List<WeaveViolation> processWeaveBytes(List<byte[]> weavePackageBytes) {
List<WeaveViolation> violations = new ArrayList<>();
for (LanguageAdapter adapter : RegisteredLanguageAdapters.getLanguageAdapters()) {
try {
LanguageAdapterResult result = adapter.adapt(weavePackageBytes);
weavePackageBytes = result.getAdaptedBytes();
violations.addAll(result.getViolations());
} catch (Throwable ignored) {
}
}
// read weave annotations on each class bytes and put in appropriate map
for (byte[] weaveClassBytes : weavePackageBytes) {
ClassNode weaveNode = WeaveUtils.convertToClassNode(weaveClassBytes);
WeaveClassInfo weave = new WeaveClassInfo(weaveNode);
violations.addAll(weave.getViolations());
final boolean isClassAnnotationMatch = !weave.getRequiredClassAnnotations().isEmpty();
final boolean isMethodAnnotationMatch = !weave.getRequiredMethodAnnotations().isEmpty();
if (isClassAnnotationMatch || isMethodAnnotationMatch) {
if (isClassAnnotationMatch) {
for (String requiredAnnotation : weave.getRequiredClassAnnotations()) {
if (weave.getMatchType().equals(Interface)) {
baseAnnotationWeaves.put(requiredAnnotation, weaveNode);
}
allClassAnnotationWeaves.put(requiredAnnotation, weaveNode);
}
requiredClassAnnotationsLookup.put(weaveNode.name, weave.getRequiredClassAnnotations());
}
if (isMethodAnnotationMatch) {
for (String requiredAnnotation : weave.getRequiredMethodAnnotations()) {
if (!isClassAnnotationMatch) {
allMethodAnnotationWeaves.put(requiredAnnotation, weaveNode);
} else if (!allMethodAnnotationWeaves.containsKey(requiredAnnotation)) {
allMethodAnnotationWeaves.put(requiredAnnotation, weaveNode);
}
}
requiredMethodAnnotationsLookup.put(weaveNode.name, weave.getRequiredMethodAnnotations());
}
} else if (null == weave.getMatchType()) {
if (weave.isSkipIfPresent()) {
skipIfPresentClasses.add(weave.getOriginalName());
} else {
utilClasses.put(weaveNode.name, weaveNode);
}
} else {
if (!weaveNode.name.equals(weave.getOriginalName())) {
renames.put(weaveNode.name, weave.getOriginalName());
}
// check if added and merge
weaveMatches.put(weave.getOriginalName(), weave.getMatchType());
switch(weave.getMatchType()) {
case BaseClass:
case Interface:
baseWeaves.put(weave.getOriginalName(), weaveNode);
break;
case ExactClass:
default:
exactWeaves.put(weave.getOriginalName(), weaveNode);
break;
}
}
}
// preprocess
this.preprocessAllWeaveCode();
this.packageViolations.addAll(violations);
if (isBootstrapClassName(this.exactWeaves.keySet()) || isBootstrapClassName(this.baseWeaves.keySet())) {
this.weavesBootstrap = true;
}
return violations;
}
Aggregations