Skip to content

Commit a069684

Browse files
authored
⬆️ upgrade codetf (#431)
1 parent 964f558 commit a069684

File tree

9 files changed

+95
-17
lines changed

9 files changed

+95
-17
lines changed

core-codemods/src/main/java/io/codemodder/codemods/SensitiveDataLoggingCodemod.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.github.javaparser.ast.CompilationUnit;
1111
import com.github.javaparser.ast.stmt.Statement;
1212
import io.codemodder.*;
13+
import io.codemodder.codetf.CodeTFAiMetadata;
1314
import io.codemodder.javaparser.JavaParserChanger;
1415
import io.codemodder.plugins.llm.OpenAIService;
1516
import io.codemodder.plugins.llm.StandardModel;
@@ -79,7 +80,9 @@ public CodemodFileScanningResult visit(
7980
changes.add(change);
8081
}
8182
}
82-
return CodemodFileScanningResult.from(changes, List.of());
83+
return CodemodFileScanningResult.from(
84+
// TODO update tokens to be an accurate number
85+
changes, List.of(), new CodeTFAiMetadata(service.providerName(), MODEL.id(), 0));
8386
}
8487

8588
private SensitivityAndFixAnalysis performSensitivityAnalysis(
@@ -100,9 +103,7 @@ private SensitivityAndFixAnalysis performSensitivityAnalysis(
100103
.formatted(startLine, codeSnippet);
101104

102105
return service.getResponseForPrompt(
103-
List.of(new ChatRequestUserMessage(prompt)),
104-
StandardModel.GPT_4O_2024_05_13,
105-
SensitivityAndFixAnalysisDTO.class);
106+
List.of(new ChatRequestUserMessage(prompt)), MODEL, SensitivityAndFixAnalysisDTO.class);
106107
}
107108

108109
/**
@@ -154,6 +155,8 @@ private static String snippet(final List<String> lines, final int line) {
154155
*/
155156
private static final int CONTEXT = 10;
156157

158+
private static final StandardModel MODEL = StandardModel.GPT_4O_2024_05_13;
159+
157160
/** The results of the sensitivity analysis. */
158161
private interface SensitivityAndFixAnalysis {
159162

framework/codemodder-base/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ dependencies {
2121
api(libs.java.security.toolkit)
2222
api(libs.commons.lang3)
2323

24-
api("io.codemodder:codetf-java:4.0.0")
24+
api("io.codemodder:codetf-java:4.1.3")
2525
api(libs.slf4j.api)
2626
api(libs.javaparser.core)
2727
api(libs.javaparser.symbolsolver.core)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.codemodder;
2+
3+
import io.codemodder.codetf.CodeTFAiMetadata;
4+
import io.codemodder.codetf.UnfixedFinding;
5+
import java.util.List;
6+
7+
record AICodemodFileScanningResult(
8+
List<CodemodChange> changes,
9+
List<UnfixedFinding> unfixedFindings,
10+
CodeTFAiMetadata codeTFAiMetadata)
11+
implements CodemodFileScanningResult, AIMetadataProvider {}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package io.codemodder;
2+
3+
import io.codemodder.codetf.CodeTFAiMetadata;
4+
5+
/** Marks a class so that it can provide {@link CodeTFAiMetadata} to its consumers. */
6+
interface AIMetadataProvider {
7+
8+
/**
9+
* @return the {@link CodeTFAiMetadata} describing how a class used an AI service.
10+
*/
11+
CodeTFAiMetadata codeTFAiMetadata();
12+
}

framework/codemodder-base/src/main/java/io/codemodder/CodemodFileScanningResult.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.codemodder;
22

3+
import io.codemodder.codetf.CodeTFAiMetadata;
34
import io.codemodder.codetf.UnfixedFinding;
45
import java.util.List;
56

@@ -22,6 +23,17 @@ public List<UnfixedFinding> unfixedFindings() {
2223
};
2324
}
2425

26+
/**
27+
* Creates a new instance of {@link CodemodFileScanningResult} from the given values, including AI
28+
* usage metadata
29+
*/
30+
static CodemodFileScanningResult from(
31+
final List<CodemodChange> changes,
32+
final List<UnfixedFinding> unfixedFindings,
33+
CodeTFAiMetadata codeTFAiMetadata) {
34+
return new AICodemodFileScanningResult(changes, unfixedFindings, codeTFAiMetadata);
35+
}
36+
2537
/** Creates an empty instance of {@link CodemodFileScanningResult}. */
2638
static CodemodFileScanningResult none() {
2739
return from(List.of(), List.of());

framework/codemodder-base/src/main/java/io/codemodder/DefaultCodemodExecutor.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,11 +157,22 @@ public CodeTFResult execute(final List<Path> filePaths) {
157157

158158
// run the codemod on the file
159159
CodemodFileScanningResult codemodFileScanningResult = codemodRunner.run(context);
160+
final CodeTFAiMetadata codeTFAiMetadata;
161+
if (codemodFileScanningResult instanceof AIMetadataProvider aiMetadataProvider) {
162+
codeTFAiMetadata = aiMetadataProvider.codeTFAiMetadata();
163+
} else {
164+
codeTFAiMetadata = null;
165+
}
160166
List<CodemodChange> codemodChanges = codemodFileScanningResult.changes();
161167
if (!codemodChanges.isEmpty()) {
162168
synchronized (this) {
163169
FilesUpdateResult updateResult =
164-
updateFiles(codeChanger, filePath, beforeFileContents, codemodChanges);
170+
updateFiles(
171+
codeChanger,
172+
filePath,
173+
beforeFileContents,
174+
codemodChanges,
175+
codeTFAiMetadata);
165176
unscannableFiles.addAll(updateResult.filesFailedToChange());
166177
changeset.addAll(updateResult.changeset());
167178
}
@@ -201,6 +212,8 @@ public CodeTFResult execute(final List<Path> filePaths) {
201212
codeChanger.getSummary(),
202213
codeChanger.getDescription(),
203214
detectionTool,
215+
// TODO augment CodeTF with failure metadata
216+
null,
204217
unscannableFiles.stream()
205218
.map(file -> getRelativePath(projectDir, file))
206219
.collect(Collectors.toSet()),
@@ -223,7 +236,8 @@ private FilesUpdateResult updateFiles(
223236
final CodeChanger codeChanger,
224237
final Path filePath,
225238
final String beforeFileContents,
226-
final List<CodemodChange> codemodChanges)
239+
final List<CodemodChange> codemodChanges,
240+
final CodeTFAiMetadata codeTFAiMetadata)
227241
throws IOException {
228242

229243
List<Path> filesFailedToChange = List.of();
@@ -272,7 +286,9 @@ private FilesUpdateResult updateFiles(
272286

273287
// create a changeset for this file change + its downstream dependency changes
274288
List<CodeTFChangesetEntry> changeset = new ArrayList<>();
275-
changeset.add(new CodeTFChangesetEntry(getRelativePath(projectDir, filePath), diff, changes));
289+
changeset.add(
290+
new CodeTFChangesetEntry(
291+
getRelativePath(projectDir, filePath), diff, changes, codeTFAiMetadata));
276292
changeset.addAll(dependencyChangesetEntries);
277293

278294
// update the cache

plugins/codemodder-plugin-llm/src/main/java/io/codemodder/plugins/llm/OpenAIService.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ public class OpenAIService {
2323
private final ModelMapper modelMapper;
2424
private boolean serviceAvailable = true;
2525

26+
private final String providerName;
27+
2628
private static OpenAIClientBuilder builder(final KeyCredential key) {
2729
HttpClientOptions clientOptions = new HttpClientOptions();
2830
clientOptions.setReadTimeout(Duration.ofSeconds(TIMEOUT_SECONDS));
@@ -32,20 +34,27 @@ private static OpenAIClientBuilder builder(final KeyCredential key) {
3234
.credential(key);
3335
}
3436

35-
OpenAIService(final boolean serviceAvailable) {
36-
this.serviceAvailable = serviceAvailable;
37+
OpenAIService() {
38+
this.serviceAvailable = false;
3739
this.modelMapper = null;
3840
this.api = null;
41+
this.providerName = null;
3942
}
4043

41-
OpenAIService(final ModelMapper mapper, final KeyCredential key) {
44+
OpenAIService(final ModelMapper mapper, final KeyCredential key, final String providerName) {
4245
this.modelMapper = mapper;
4346
this.api = builder(key).buildClient();
47+
this.providerName = providerName;
4448
}
4549

46-
OpenAIService(final ModelMapper mapper, final KeyCredential key, final String endpoint) {
50+
OpenAIService(
51+
final ModelMapper mapper,
52+
final KeyCredential key,
53+
final String endpoint,
54+
final String providerName) {
4755
this.modelMapper = mapper;
4856
this.api = builder(key).endpoint(endpoint).buildClient();
57+
this.providerName = providerName;
4958
}
5059

5160
/**
@@ -56,7 +65,9 @@ private static OpenAIClientBuilder builder(final KeyCredential key) {
5665
*/
5766
public static OpenAIService fromOpenAI(final String token) {
5867
return new OpenAIService(
59-
new EnvironmentBasedModelMapper(), new KeyCredential(Objects.requireNonNull(token)));
68+
new EnvironmentBasedModelMapper(),
69+
new KeyCredential(Objects.requireNonNull(token)),
70+
"openai");
6071
}
6172

6273
/**
@@ -70,11 +81,12 @@ public static OpenAIService fromAzureOpenAI(final String token, final String end
7081
return new OpenAIService(
7182
new EnvironmentBasedModelMapper(),
7283
new AzureKeyCredential(Objects.requireNonNull(token)),
73-
Objects.requireNonNull(endpoint));
84+
Objects.requireNonNull(endpoint),
85+
"azure-openai");
7486
}
7587

7688
public static OpenAIService noServiceAvailable() {
77-
return new OpenAIService(false);
89+
return new OpenAIService();
7890
}
7991

8092
/**
@@ -86,6 +98,10 @@ public boolean isServiceAvailable() {
8698
return serviceAvailable;
8799
}
88100

101+
public String providerName() {
102+
return providerName;
103+
}
104+
89105
/**
90106
* Gets the completion for the given messages.
91107
*

plugins/codemodder-plugin-llm/src/main/java/io/codemodder/plugins/llm/SarifToLLMForBinaryVerificationAndFixingCodemod.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.github.difflib.DiffUtils;
1010
import com.github.difflib.patch.Patch;
1111
import io.codemodder.*;
12+
import io.codemodder.codetf.CodeTFAiMetadata;
1213
import java.io.IOException;
1314
import java.io.UncheckedIOException;
1415
import java.nio.file.Files;
@@ -106,7 +107,9 @@ public CodemodFileScanningResult onFileFound(
106107
// Report all the changes at the line number of the first change.
107108
int line = patch.getDeltas().get(0).getSource().getPosition() + 1; // Position is 0-based.
108109
List<CodemodChange> changes = List.of(CodemodChange.from(line, fix.getFixDescription()));
109-
return CodemodFileScanningResult.withOnlyChanges(changes);
110+
// TODO update tokens to be an accurate number
111+
return CodemodFileScanningResult.from(
112+
changes, List.of(), new CodeTFAiMetadata(openAI.providerName(), model.id(), 0));
110113
} catch (IOException e) {
111114
logger.error("failed to process: {}", context.path(), e);
112115
throw new UncheckedIOException(e);

plugins/codemodder-plugin-llm/src/main/java/io/codemodder/plugins/llm/SarifToLLMForMultiOutcomeCodemod.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.github.difflib.DiffUtils;
1111
import com.github.difflib.patch.Patch;
1212
import io.codemodder.*;
13+
import io.codemodder.codetf.CodeTFAiMetadata;
1314
import java.io.IOException;
1415
import java.io.UncheckedIOException;
1516
import java.nio.file.Files;
@@ -83,7 +84,11 @@ public CodemodFileScanningResult onFileFound(
8384
Optional<CodemodChange> change = processResult(context, result);
8485
change.ifPresent(changes::add);
8586
}
86-
return CodemodFileScanningResult.withOnlyChanges(List.copyOf(changes));
87+
return CodemodFileScanningResult.from(
88+
List.copyOf(changes),
89+
List.of(),
90+
// TODO use the actual token count
91+
new CodeTFAiMetadata(openAI.providerName(), codeChangingModel.id(), 0));
8792
}
8893

8994
private Optional<CodemodChange> processResult(

0 commit comments

Comments
 (0)