Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,31 +9,32 @@
import com.datadog.debugger.instrumentation.InstrumentationResult;
import com.datadog.debugger.probe.ProbeDefinition;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ClassesToRetransformFinder {
private static final Logger LOGGER = LoggerFactory.getLogger(ClassesToRetransformFinder.class);
private static final Pattern COMMA_PATTERN = Pattern.compile(",");

private final ConcurrentMap<String, List<String>> classNamesBySourceFile =
new ConcurrentHashMap<>();
private final ConcurrentMap<String, String> classNamesBySourceFile = new ConcurrentHashMap<>();

public void register(String sourceFile, String className) {
// store only the class name that are different from SourceFile name
// (Inner or non-public Top-Level classes)
classNamesBySourceFile.compute(
sourceFile,
(key, list) -> {
if (list == null) {
list = new ArrayList<>();
(key, classNames) -> {
if (classNames == null) {
return className;
}
list.add(className);
return list;
return classNames + "," + className;
});
}

Expand Down Expand Up @@ -89,13 +90,11 @@ Trie getAllChangedClasses(ConfigurationComparer comparer) {

private void processAdditionalClasses(String sourceFile, Trie changedClasses) {
sourceFile = stripPackagePath(sourceFile);
// need to clone the list to avoid concurrent modification during iteration
List<String> additionalClasses =
classNamesBySourceFile.computeIfPresent(
sourceFile, (k, classNames) -> new ArrayList<>(classNames));
if (additionalClasses == null) {
String classNames = classNamesBySourceFile.get(sourceFile);
if (classNames == null) {
return;
}
List<String> additionalClasses = Arrays.asList(COMMA_PATTERN.split(classNames));
for (String additionalClass : additionalClasses) {
additionalClass = normalizeFilePath(additionalClass);
changedClasses.insert(reverseStr(additionalClass));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,6 @@
public class InnerHelper {

public static class MyInner {}

public static class MySecondInner {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,12 +58,22 @@ void transformInner() throws IllegalClassFormatException {
null,
null,
getClassFileBytes(InnerHelper.MyInner.class));
sourceFileTrackingTransformer.transform(
null,
getInternalName(InnerHelper.MySecondInner.class),
null,
null,
getClassFileBytes(InnerHelper.MySecondInner.class));
changedClasses =
finder.getAllLoadedChangedClasses(
new Class[] {InnerHelper.class, InnerHelper.MyInner.class}, comparer);
assertEquals(2, changedClasses.size());
new Class[] {
InnerHelper.class, InnerHelper.MyInner.class, InnerHelper.MySecondInner.class
},
comparer);
assertEquals(3, changedClasses.size());
assertEquals(InnerHelper.class, changedClasses.get(0));
assertEquals(InnerHelper.MyInner.class, changedClasses.get(1));
assertEquals(InnerHelper.MySecondInner.class, changedClasses.get(2));
}

private ConfigurationComparer createComparer(String sourceFile) {
Expand Down