Skip to content

Commit 286fa0f

Browse files
committed
The gradlew/mvnw path must be made absolute
Signed-off-by: Rahul Krishna <i.m.ralk@gmail.com>
1 parent 6ac75e7 commit 286fa0f

File tree

3 files changed

+201
-275
lines changed

3 files changed

+201
-275
lines changed

src/main/java/com/ibm/cldk/CodeAnalyzer.java

+140-131
Original file line numberDiff line numberDiff line change
@@ -82,158 +82,167 @@ public class CodeAnalyzer implements Runnable {
8282
private static final String outputFileName = "analysis.json";
8383

8484
public static Gson gson = new GsonBuilder()
85-
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
86-
.setPrettyPrinting()
87-
.disableHtmlEscaping()
88-
.create();
89-
/**
90-
* The entry point of application.
91-
*
92-
* @param args the input arguments
93-
*/
94-
public static void main(String[] args) {
95-
int exitCode = new CommandLine(new CodeAnalyzer()).execute(args);
96-
System.exit(exitCode);
97-
}
85+
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
86+
.setPrettyPrinting()
87+
.disableHtmlEscaping()
88+
.create();
89+
/**
90+
* The entry point of application.
91+
*
92+
* @param args the input arguments
93+
*/
94+
public static void main(String[] args) {
95+
int exitCode = new CommandLine(new CodeAnalyzer()).execute(args);
96+
System.exit(exitCode);
97+
}
9898

99-
@Override
100-
public void run() {
101-
// Set log level based on quiet option
102-
Log.setVerbosity(verbose);
103-
try {
104-
analyze();
105-
} catch (Exception e) {
106-
throw new RuntimeException(e);
99+
@Override
100+
public void run() {
101+
// Set log level based on quiet option
102+
Log.setVerbosity(verbose);
103+
try {
104+
analyze();
105+
} catch (Exception e) {
106+
throw new RuntimeException(e);
107+
}
107108
}
108-
}
109109

110-
private static void analyze() throws Exception {
111-
112-
JsonObject combinedJsonObject = new JsonObject();
113-
Map<String, JavaCompilationUnit> symbolTable;
114-
projectRootPom = projectRootPom == null ? input : projectRootPom;
115-
// First of all if, sourceAnalysis is provided, we will analyze the source code instead of the project.
116-
if (sourceAnalysis != null) {
117-
// Construct symbol table for source code
118-
Log.debug("Single file analysis.");
119-
Pair<Map<String, JavaCompilationUnit>, Map<String, List<Problem>>> symbolTableExtractionResult = SymbolTable.extractSingle(sourceAnalysis);
120-
symbolTable = symbolTableExtractionResult.getLeft();
121-
} else {
122-
// download library dependencies of project for type resolution
123-
String dependencies = null;
124-
try {if (BuildProject.downloadLibraryDependencies(input, projectRootPom)) {
125-
dependencies = String.valueOf(BuildProject.libDownloadPath);
110+
private static void analyze() throws Exception {
111+
112+
JsonObject combinedJsonObject = new JsonObject();
113+
Map<String, JavaCompilationUnit> symbolTable;
114+
projectRootPom = projectRootPom == null ? input : projectRootPom;
115+
// First of all if, sourceAnalysis is provided, we will analyze the source code instead of the project.
116+
if (sourceAnalysis != null) {
117+
// Construct symbol table for source code
118+
Log.debug("Single file analysis.");
119+
Pair<Map<String, JavaCompilationUnit>, Map<String, List<Problem>>> symbolTableExtractionResult = SymbolTable.extractSingle(sourceAnalysis);
120+
symbolTable = symbolTableExtractionResult.getLeft();
126121
} else {
127-
Log.warn("Failed to download library dependencies of project");
128-
}
129-
} catch (IllegalStateException illegalStateException) {
130-
Log.warn("Failed to download library dependencies of project");
131-
}
122+
// download library dependencies of project for type resolution
123+
String dependencies = null;
124+
try {if (BuildProject.downloadLibraryDependencies(input, projectRootPom)) {
125+
dependencies = String.valueOf(BuildProject.libDownloadPath);
126+
} else {
127+
Log.warn("Failed to download library dependencies of project");
128+
}
129+
} catch (IllegalStateException illegalStateException) {
130+
Log.warn("Failed to download library dependencies of project");
131+
}
132132

133-
boolean analysisFileExists = output != null && Files.exists(Paths.get(output + File.separator + outputFileName));
133+
boolean analysisFileExists = output != null && Files.exists(Paths.get(output + File.separator + outputFileName));
134134

135-
// if target files are specified, compute symbol table information for the given files
136-
if (targetFiles != null) {
137-
Log.info(targetFiles.size() + "target files specified for analysis: " + targetFiles);
135+
// if target files are specified, compute symbol table information for the given files
136+
if (targetFiles != null) {
137+
Log.info(targetFiles.size() + "target files specified for analysis: " + targetFiles);
138138

139-
// if target files specified for analysis level 2, downgrade to analysis level 1
140-
if (analysisLevel > 1) {
141-
Log.warn("Incremental analysis is supported at analysis level 1 only; " +
142-
"performing analysis level 1 for target files");
143-
analysisLevel = 1;
144-
}
139+
// if target files specified for analysis level 2, downgrade to analysis level 1
140+
if (analysisLevel > 1) {
141+
Log.warn("Incremental analysis is supported at analysis level 1 only; " +
142+
"performing analysis level 1 for target files");
143+
analysisLevel = 1;
144+
}
145145

146-
// Previous code was pointing to toList, which has been introduced in Java 16
147-
// symbolTable = SymbolTable.extract(Paths.get(input), targetFiles.stream().map(Paths::get).toList()).getLeft();
148-
// extract symbol table for the specified files
149-
symbolTable = SymbolTable.extract(Paths.get(input), targetFiles.stream().map(Paths::get).collect(Collectors.toList())).getLeft();
150-
151-
// if analysis file exists, update it with new symbol table information for the specified fiels
152-
if (analysisFileExists) {
153-
// read symbol table information from existing analysis file
154-
Map<String, JavaCompilationUnit> existingSymbolTable = readSymbolTableFromFile(
155-
new File(output, outputFileName));
156-
if (existingSymbolTable != null) {
157-
// for each file, tag its symbol table information as "updated" and update existing symbol table
158-
for (String targetFile : targetFiles) {
159-
String targetPathAbs = Paths.get(targetFile).toAbsolutePath().toString();
160-
JavaCompilationUnit javaCompilationUnit = symbolTable.get(targetPathAbs);
161-
javaCompilationUnit.setModified(true);
162-
existingSymbolTable.put(targetPathAbs, javaCompilationUnit);
146+
// Previous code was pointing to toList, which has been introduced in Java 16
147+
// symbolTable = SymbolTable.extract(Paths.get(input), targetFiles.stream().map(Paths::get).toList()).getLeft();
148+
// extract symbol table for the specified files
149+
symbolTable = SymbolTable.extract(Paths.get(input), targetFiles.stream().map(Paths::get).collect(Collectors.toList())).getLeft();
150+
151+
// if analysis file exists, update it with new symbol table information for the specified fiels
152+
if (analysisFileExists) {
153+
// read symbol table information from existing analysis file
154+
Map<String, JavaCompilationUnit> existingSymbolTable = readSymbolTableFromFile(
155+
new File(output, outputFileName));
156+
if (existingSymbolTable != null) {
157+
// for each file, tag its symbol table information as "updated" and update existing symbol table
158+
for (String targetFile : targetFiles) {
159+
String targetPathAbs = Paths.get(targetFile).toAbsolutePath().toString();
160+
JavaCompilationUnit javaCompilationUnit = symbolTable.get(targetPathAbs);
161+
javaCompilationUnit.setModified(true);
162+
existingSymbolTable.put(targetPathAbs, javaCompilationUnit);
163+
}
163164
}
165+
symbolTable = existingSymbolTable;
164166
}
165-
symbolTable = existingSymbolTable;
166167
}
167-
}
168168

169-
else {
170-
// construct symbol table for project, write parse problems to file in output directory if specified
171-
Pair<Map<String, JavaCompilationUnit>, Map<String, List<Problem>>> symbolTableExtractionResult =
172-
SymbolTable.extractAll(Paths.get(input));
169+
else {
170+
// construct symbol table for project, write parse problems to file in output directory if specified
171+
Pair<Map<String, JavaCompilationUnit>, Map<String, List<Problem>>> symbolTableExtractionResult =
172+
SymbolTable.extractAll(Paths.get(input));
173173

174-
symbolTable = symbolTableExtractionResult.getLeft();
175-
}
174+
symbolTable = symbolTableExtractionResult.getLeft();
175+
}
176176

177-
if (analysisLevel > 1) {
178-
// Save SDG, and Call graph as JSON
179-
// If noBuild is not true, and build is also not provided, we will use "auto" as the build command
180-
build = build == null ? "auto" : build;
181-
// Is noBuild is true, we will not build the project
182-
build = noBuild ? null : build;
183-
List<Dependency> sdgEdges = SystemDependencyGraph.construct(input, dependencies, build);
184-
combinedJsonObject.add("system_dependency_graph", gson.toJsonTree(sdgEdges));
177+
if (analysisLevel > 1) {
178+
// Save SDG, and Call graph as JSON
179+
// If noBuild is not true, and build is also not provided, we will use "auto" as the build command
180+
build = build == null ? "auto" : build;
181+
// Is noBuild is true, we will not build the project
182+
build = noBuild ? null : build;
183+
String sdgAsJSONString = SystemDependencyGraph.construct(input, dependencies, build);
184+
JsonElement sdgAsJSONElement = gson.fromJson(sdgAsJSONString, JsonElement.class);
185+
JsonObject sdgAsJSONObject = sdgAsJSONElement.getAsJsonObject();
186+
JsonElement edges = sdgAsJSONObject.get("edges");
187+
188+
// We don't really need these fields, so we'll remove it.
189+
sdgAsJSONObject.remove("nodes");
190+
sdgAsJSONObject.remove("creator");
191+
sdgAsJSONObject.remove("version");
192+
// Remove the 'edges' element and move the list of edges up one level
193+
combinedJsonObject.add("system_dependency_graph", edges);
194+
}
185195
}
196+
// Cleanup library dependencies directory
197+
BuildProject.cleanLibraryDependencies();
198+
199+
// Convert the JavaCompilationUnit to JSON and add to consolidated json object
200+
String symbolTableJSONString = gson.toJson(symbolTable);
201+
JsonElement symbolTableJSON = gson.fromJson(symbolTableJSONString, JsonElement.class);
202+
combinedJsonObject.add("symbol_table", symbolTableJSON);
203+
204+
// Add version number to the output JSON
205+
try {
206+
String[] versions = new VersionProvider().getVersion();
207+
if (versions.length > 0) {
208+
combinedJsonObject.addProperty("version", versions[0]);
209+
} else {
210+
combinedJsonObject.addProperty("version", "unknown");
211+
}
212+
} catch (Exception e) {
213+
combinedJsonObject.addProperty("version", "error retrieving version");
214+
}
215+
String consolidatedJSONString = gson.toJson(combinedJsonObject);
216+
emit(consolidatedJSONString);
186217
}
187-
// Cleanup library dependencies directory
188-
BuildProject.cleanLibraryDependencies();
189-
190-
// Convert the JavaCompilationUnit to JSON and add to consolidated json object
191-
String symbolTableJSONString = gson.toJson(symbolTable);
192-
JsonElement symbolTableJSON = gson.fromJson(symbolTableJSONString, JsonElement.class);
193-
combinedJsonObject.add("symbol_table", symbolTableJSON);
194-
195-
// Add version number to the output JSON
196-
try {
197-
String[] versions = new VersionProvider().getVersion();
198-
if (versions.length > 0) {
199-
combinedJsonObject.addProperty("version", versions[0]);
218+
219+
private static void emit(String consolidatedJSONString) throws IOException {
220+
if (output == null) {
221+
System.out.println(consolidatedJSONString);
200222
} else {
201-
combinedJsonObject.addProperty("version", "unknown");
223+
Path outputPath = Paths.get(output);
224+
if (!Files.exists(outputPath)) {
225+
Files.createDirectories(outputPath);
226+
}
227+
// If output is not null, export to a file
228+
File file = new File(output, "analysis.json");
229+
try (FileWriter fileWriter = new FileWriter(file)) {
230+
fileWriter.write(consolidatedJSONString);
231+
Log.done("Analysis output saved at " + output);
232+
} catch (IOException e) {
233+
Log.error("Error writing to file: " + e.getMessage());
234+
}
202235
}
203-
} catch (Exception e) {
204-
combinedJsonObject.addProperty("version", "error retrieving version");
205236
}
206-
String consolidatedJSONString = gson.toJson(combinedJsonObject);
207-
emit(consolidatedJSONString);
208-
}
209237

210-
private static void emit(String consolidatedJSONString) throws IOException {
211-
if (output == null) {
212-
System.out.println(consolidatedJSONString);
213-
} else {
214-
Path outputPath = Paths.get(output);
215-
if (!Files.exists(outputPath)) {
216-
Files.createDirectories(outputPath);
217-
}
218-
// If output is not null, export to a file
219-
File file = new File(output, "analysis.json");
220-
try (FileWriter fileWriter = new FileWriter(file)) {
221-
fileWriter.write(consolidatedJSONString);
222-
Log.done("Analysis output saved at " + output);
238+
private static Map<String, JavaCompilationUnit> readSymbolTableFromFile(File analysisJsonFile) {
239+
Type symbolTableType = new TypeToken<Map<String, JavaCompilationUnit>>() {}.getType();
240+
try (FileReader reader = new FileReader(analysisJsonFile)) {
241+
JsonObject jsonObject = JsonParser.parseReader(reader).getAsJsonObject();
242+
return gson.fromJson(jsonObject.get("symbol_table"), symbolTableType);
223243
} catch (IOException e) {
224-
Log.error("Error writing to file: " + e.getMessage());
244+
Log.error("Error reading analysis file: " + e.getMessage());
225245
}
246+
return null;
226247
}
227-
}
228-
229-
private static Map<String, JavaCompilationUnit> readSymbolTableFromFile(File analysisJsonFile) {
230-
Type symbolTableType = new TypeToken<Map<String, JavaCompilationUnit>>() {}.getType();
231-
try (FileReader reader = new FileReader(analysisJsonFile)) {
232-
JsonObject jsonObject = JsonParser.parseReader(reader).getAsJsonObject();
233-
return gson.fromJson(jsonObject.get("symbol_table"), symbolTableType);
234-
} catch (IOException e) {
235-
Log.error("Error reading analysis file: " + e.getMessage());
236-
}
237-
return null;
238-
}
239248
}

0 commit comments

Comments
 (0)