From 285b82c251139c262c56170a2ddf91dc3fe015fa Mon Sep 17 00:00:00 2001 From: Kamil Patryk Kozakowski Date: Wed, 16 Jul 2025 19:05:57 +0200 Subject: [PATCH] cleanup --- src/TODO.md | 108 ------------ .../JdtResolvedCallGraph.java | 165 ------------------ .../callgraphexporter/domain/Method.java | 15 -- .../domain/MethodMetadata.java | 12 -- .../domain/MethodSignature.java | 9 - .../callgraphexporter/domain/Modifiers.java | 18 -- .../callgraphexporter/domain/TypeGroup.java | 26 --- .../callgraphexporter/domain/TypeKind.java | 9 - .../kamil/callgraphexporter/simple/Kamil.java | 12 -- .../callgraphexporter/simple/Kamil2.java | 8 - 10 files changed, 382 deletions(-) delete mode 100644 src/main/java/click/kamil/callgraphexporter/JdtResolvedCallGraph.java delete mode 100644 src/main/java/click/kamil/callgraphexporter/domain/Method.java delete mode 100644 src/main/java/click/kamil/callgraphexporter/domain/MethodMetadata.java delete mode 100644 src/main/java/click/kamil/callgraphexporter/domain/MethodSignature.java delete mode 100644 src/main/java/click/kamil/callgraphexporter/domain/Modifiers.java delete mode 100644 src/main/java/click/kamil/callgraphexporter/domain/TypeGroup.java delete mode 100644 src/main/java/click/kamil/callgraphexporter/domain/TypeKind.java delete mode 100644 src/main/java/click/kamil/callgraphexporter/simple/Kamil.java delete mode 100644 src/main/java/click/kamil/callgraphexporter/simple/Kamil2.java diff --git a/src/TODO.md b/src/TODO.md index 5e71d28..d41313b 100644 --- a/src/TODO.md +++ b/src/TODO.md @@ -51,111 +51,3 @@ public class DynamicStateMachineExample { } ``` - -1. define how java function can be implemented - 1.2. for this analyse bytecode manipulation such as project lombok -2. get a diagram -3. get a diagram with slicing, for example, slice by setValue on an ENUM field -> identify saga - - -1. make a list of all messages on message queues, how they're remapped and then who receives them - - - -NOTE -```java - -import com.github.javaparser.StaticJavaParser; -import com.github.javaparser.ast.CompilationUnit; -import com.github.javaparser.ast.body.MethodDeclaration; -import com.github.javaparser.ast.expr.MethodCallExpr; -import com.github.javaparser.ast.visitor.VoidVisitorAdapter; - -import java.io.File; -import java.io.FileInputStream; -import java.util.*; - -public class MethodCallGraphGenerator { - - static class MethodNode { - String className; - String methodName; - - public MethodNode(String className, String methodName) { - this.className = className; - this.methodName = methodName; - } - - @Override - public String toString() { - return className + "." + methodName; - } - - @Override - public int hashCode() { - return Objects.hash(className, methodName); - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof MethodNode other) { - return this.className.equals(other.className) && this.methodName.equals(other.methodName); - } - return false; - } - } - - static Map> callGraph = new HashMap<>(); - - public static void main(String[] args) throws Exception { - File sourceDir = new File("src"); // Change to your Java source directory - parseDirectory(sourceDir); - - generateDotFile("callgraph.dot"); - System.out.println("Call graph generated to callgraph.dot"); - } - - private static void parseDirectory(File dir) throws Exception { - for (File file : Objects.requireNonNull(dir.listFiles())) { - if (file.isDirectory()) { - parseDirectory(file); - } else if (file.getName().endsWith(".java")) { - parseFile(file); - } - } - } - - private static void parseFile(File file) throws Exception { - CompilationUnit cu = StaticJavaParser.parse(new FileInputStream(file)); - cu.findAll(MethodDeclaration.class).forEach(method -> { - String className = cu.getPrimaryTypeName().orElse("Unknown"); - MethodNode caller = new MethodNode(className, method.getNameAsString()); - - callGraph.putIfAbsent(caller, new HashSet<>()); - - method.accept(new VoidVisitorAdapter() { - @Override - public void visit(MethodCallExpr call, Void arg) { - super.visit(call, arg); - String calleeName = call.getNameAsString(); - MethodNode callee = new MethodNode("Unknown", calleeName); // Could be refined with better context - callGraph.get(caller).add(callee); - } - }, null); - }); - } - - private static void generateDotFile(String filename) throws Exception { - StringBuilder sb = new StringBuilder(); - sb.append("digraph G {\n"); - for (var caller : callGraph.keySet()) { - for (var callee : callGraph.get(caller)) { - sb.append(" \"").append(caller).append("\" -> \"").append(callee).append("\";\n"); - } - } - sb.append("}"); - java.nio.file.Files.writeString(new File(filename).toPath(), sb.toString()); - } -} - -``` \ No newline at end of file diff --git a/src/main/java/click/kamil/callgraphexporter/JdtResolvedCallGraph.java b/src/main/java/click/kamil/callgraphexporter/JdtResolvedCallGraph.java deleted file mode 100644 index 08b9a8e..0000000 --- a/src/main/java/click/kamil/callgraphexporter/JdtResolvedCallGraph.java +++ /dev/null @@ -1,165 +0,0 @@ -package click.kamil.callgraphexporter; - -import click.kamil.callgraphexporter.domain.MethodMetadata; -import click.kamil.callgraphexporter.domain.MethodSignature; -import click.kamil.callgraphexporter.domain.Modifiers; -import org.eclipse.jdt.core.JavaCore; -import org.eclipse.jdt.core.dom.*; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.util.*; - -public class JdtResolvedCallGraph { - - // Use signature as the unique key - static Map> callGraph = new HashMap<>(); - - // Optionally store metadata - static Map metadataMap = new HashMap<>(); - - public static void main(String[] args) throws IOException { - File sourceDir = new File("src/main/java/click/kamil/callgraphexporter/simple"); - - List javaFiles = new ArrayList<>(); - collectJavaFiles(sourceDir, javaFiles); - - for (File file : javaFiles) { - parseFileWithBinding(file, sourceDir); - } - - generateDotFile("callgraph.dot"); - System.out.println("Call graph saved to callgraph.dot"); - } - - private static void collectJavaFiles(File dir, List javaFiles) { - for (File file : Objects.requireNonNull(dir.listFiles())) { - if (file.isDirectory()) { - collectJavaFiles(file, javaFiles); - } else if (file.getName().endsWith(".java")) { - javaFiles.add(file); - } - } - } - - private static void parseFileWithBinding(File file, File sourceRoot) throws IOException { - String source = Files.readString(file.toPath()); - - ASTParser parser = ASTParser.newParser(AST.JLS21); - parser.setSource(source.toCharArray()); - parser.setKind(ASTParser.K_COMPILATION_UNIT); - parser.setResolveBindings(true); - parser.setBindingsRecovery(true); - - parser.setEnvironment( - null, - new String[]{sourceRoot.getAbsolutePath()}, - null, - true - ); - - parser.setUnitName(file.getName()); - - Map options = JavaCore.getOptions(); - options.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_17); - parser.setCompilerOptions(options); - - CompilationUnit cu = (CompilationUnit) parser.createAST(null); - - cu.accept(new ASTVisitor() { - @Override - public boolean visit(MethodDeclaration method) { - IMethodBinding binding = method.resolveBinding(); - if (binding == null) return super.visit(method); - - MethodSignature callerSig = toSignature(binding); - MethodMetadata callerMeta = toMetadata(binding, method); - metadataMap.put(callerSig, callerMeta); - callGraph.putIfAbsent(callerSig, new HashSet<>()); - - method.accept(new ASTVisitor() { - @Override - public boolean visit(MethodInvocation node) { - IMethodBinding calleeBinding = node.resolveMethodBinding(); - if (calleeBinding != null) { - MethodSignature calleeSig = toSignature(calleeBinding); - callGraph.get(callerSig).add(calleeSig); - // You can collect metadata for callees too if needed - } - return super.visit(node); - } - }); - - return super.visit(method); - } - }); - } - - // Fixed: matches your MethodSignature record with only methodName and paramTypes - private static MethodSignature toSignature(IMethodBinding binding) { - String methodName = binding.getName(); - - List paramTypes = new ArrayList<>(); - for (ITypeBinding param : binding.getParameterTypes()) { - paramTypes.add(param.getName()); - } - - return new MethodSignature(methodName, paramTypes); - } - - private static MethodMetadata toMetadata(IMethodBinding binding, MethodDeclaration method) { - String returnType = binding.getReturnType().getName(); - - Set exceptions = new HashSet<>(); - for (ITypeBinding ex : binding.getExceptionTypes()) { - exceptions.add(ex.getName()); - } - - Set modifiers = extractModifiers(binding, method); - List annotations = new ArrayList<>(); - - return new MethodMetadata(returnType, exceptions, modifiers, annotations, null); - } - - private static void generateDotFile(String filename) throws IOException { - StringBuilder sb = new StringBuilder("digraph G {\n"); - for (MethodSignature caller : callGraph.keySet()) { - String callerLabel = formatSignature(caller); - for (MethodSignature callee : callGraph.get(caller)) { - String calleeLabel = formatSignature(callee); - sb.append(" \"").append(callerLabel).append("\" -> \"").append(calleeLabel).append("\";\n"); - } - } - sb.append("}"); - Files.writeString(new File(filename).toPath(), sb.toString()); - } - - private static String formatSignature(MethodSignature sig) { - // Build a readable label (methodName + param list) - return sig.methodName() + sig.parameterTypes(); - } - - private static Set extractModifiers(IMethodBinding binding, MethodDeclaration method) { - Set result = new HashSet<>(); - int mods = binding.getModifiers(); - - if (Modifier.isPublic(mods)) result.add(Modifiers.PUBLIC); - if (Modifier.isPrivate(mods)) result.add(Modifiers.PRIVATE); - if (Modifier.isProtected(mods)) result.add(Modifiers.PROTECTED); - if (Modifier.isStatic(mods)) result.add(Modifiers.STATIC); - if (Modifier.isAbstract(mods)) result.add(Modifiers.ABSTRACT); - if (Modifier.isFinal(mods)) result.add(Modifiers.FINAL); - if (Modifier.isNative(mods)) result.add(Modifiers.NATIVE); - if (Modifier.isSynchronized(mods)) result.add(Modifiers.SYNCHRONIZED); - if (Modifier.isStrictfp(mods)) result.add(Modifiers.STRICTFP); - - for (Object mod : method.modifiers()) { - if (mod instanceof Modifier keyword) { - if (keyword.isDefault()) result.add(Modifiers.DEFAULT); - } - } - - return result; - } -} diff --git a/src/main/java/click/kamil/callgraphexporter/domain/Method.java b/src/main/java/click/kamil/callgraphexporter/domain/Method.java deleted file mode 100644 index 6e34adf..0000000 --- a/src/main/java/click/kamil/callgraphexporter/domain/Method.java +++ /dev/null @@ -1,15 +0,0 @@ -package click.kamil.callgraphexporter.domain; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -public class Method { - private MethodSignature signature; - private MethodMetadata metadata; -} diff --git a/src/main/java/click/kamil/callgraphexporter/domain/MethodMetadata.java b/src/main/java/click/kamil/callgraphexporter/domain/MethodMetadata.java deleted file mode 100644 index 241a23c..0000000 --- a/src/main/java/click/kamil/callgraphexporter/domain/MethodMetadata.java +++ /dev/null @@ -1,12 +0,0 @@ -package click.kamil.callgraphexporter.domain; - -import java.util.List; -import java.util.Set; - -public record MethodMetadata( - String returnType, - Set thrownExceptions, - Set modifiers, - List annotations, - String documentationComment // Optional: Javadoc -) {} \ No newline at end of file diff --git a/src/main/java/click/kamil/callgraphexporter/domain/MethodSignature.java b/src/main/java/click/kamil/callgraphexporter/domain/MethodSignature.java deleted file mode 100644 index dd7f275..0000000 --- a/src/main/java/click/kamil/callgraphexporter/domain/MethodSignature.java +++ /dev/null @@ -1,9 +0,0 @@ -package click.kamil.callgraphexporter.domain; - -import java.util.List; - -public record MethodSignature( - String methodName, - List parameterTypes -) { -} \ No newline at end of file diff --git a/src/main/java/click/kamil/callgraphexporter/domain/Modifiers.java b/src/main/java/click/kamil/callgraphexporter/domain/Modifiers.java deleted file mode 100644 index 9090284..0000000 --- a/src/main/java/click/kamil/callgraphexporter/domain/Modifiers.java +++ /dev/null @@ -1,18 +0,0 @@ -package click.kamil.callgraphexporter.domain; - -public enum Modifiers { - PUBLIC, - PROTECTED, - PRIVATE, - STATIC, - ABSTRACT, - FINAL, - NATIVE, - SYNCHRONIZED, - TRANSIENT, - VOLATILE, - STRICTFP, - DEFAULT, - SEALED, - NON_SEALED, -} diff --git a/src/main/java/click/kamil/callgraphexporter/domain/TypeGroup.java b/src/main/java/click/kamil/callgraphexporter/domain/TypeGroup.java deleted file mode 100644 index 3b84adb..0000000 --- a/src/main/java/click/kamil/callgraphexporter/domain/TypeGroup.java +++ /dev/null @@ -1,26 +0,0 @@ -package click.kamil.callgraphexporter.domain; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.List; - -@Getter -@Setter -@AllArgsConstructor -@NoArgsConstructor -public class TypeGroup { - private String packageName; - private String typeName; - private TypeKind typeKind; - private EnumSet modifiers = EnumSet.noneOf(Modifiers.class); - private List methods = new ArrayList<>(); - - public void addMethod(Method method) { - methods.add(method); - } -} diff --git a/src/main/java/click/kamil/callgraphexporter/domain/TypeKind.java b/src/main/java/click/kamil/callgraphexporter/domain/TypeKind.java deleted file mode 100644 index 966166d..0000000 --- a/src/main/java/click/kamil/callgraphexporter/domain/TypeKind.java +++ /dev/null @@ -1,9 +0,0 @@ -package click.kamil.callgraphexporter.domain; - -public enum TypeKind { - CLASS, - INTERFACE, - RECORD, - ENUM, - ANNOTATION -} diff --git a/src/main/java/click/kamil/callgraphexporter/simple/Kamil.java b/src/main/java/click/kamil/callgraphexporter/simple/Kamil.java deleted file mode 100644 index 32b3906..0000000 --- a/src/main/java/click/kamil/callgraphexporter/simple/Kamil.java +++ /dev/null @@ -1,12 +0,0 @@ -package click.kamil.callgraphexporter.simple; - -public class Kamil { - - void a(){ - b(); - } - void b(){ - c(); - } - void c(){} -} diff --git a/src/main/java/click/kamil/callgraphexporter/simple/Kamil2.java b/src/main/java/click/kamil/callgraphexporter/simple/Kamil2.java deleted file mode 100644 index 279b330..0000000 --- a/src/main/java/click/kamil/callgraphexporter/simple/Kamil2.java +++ /dev/null @@ -1,8 +0,0 @@ -package click.kamil.callgraphexporter.simple; - -public class Kamil2 { - void ka() { - new Kamil().b(); - } - -}