From 749bb02e574ffbdacd1663e7a5fc7fc263dcfe3a Mon Sep 17 00:00:00 2001 From: tuanvu Date: Fri, 12 Dec 2025 12:58:32 +0100 Subject: [PATCH] push ex4 and ex5 --- .../main/java/fr/istic/vv/GetterChecker.java | 16 ++++-- .../src/main/java/fr/istic/vv/Main.java | 14 +++-- code/Exercise5/pom.xml | 8 +++ .../fr/istic/vv/CyclomaticComplexity.java | 43 ++++++++++++++++ .../src/main/java/fr/istic/vv/Main.java | 25 ++++----- .../fr/istic/vv/PublicElementsPrinter.java | 48 ------------------ .../target/classes/fr/istic/vv/Main.class | Bin 3457 -> 0 bytes .../fr/istic/vv/PublicElementsPrinter.class | Bin 4317 -> 0 bytes exercises/using-pmd.md | 16 +++--- 9 files changed, 91 insertions(+), 79 deletions(-) create mode 100644 code/Exercise5/src/main/java/fr/istic/vv/CyclomaticComplexity.java delete mode 100644 code/Exercise5/src/main/java/fr/istic/vv/PublicElementsPrinter.java delete mode 100644 code/javaparser-starter/target/classes/fr/istic/vv/Main.class delete mode 100644 code/javaparser-starter/target/classes/fr/istic/vv/PublicElementsPrinter.class diff --git a/code/Exercise4/src/main/java/fr/istic/vv/GetterChecker.java b/code/Exercise4/src/main/java/fr/istic/vv/GetterChecker.java index ee9cb54..e1116e4 100644 --- a/code/Exercise4/src/main/java/fr/istic/vv/GetterChecker.java +++ b/code/Exercise4/src/main/java/fr/istic/vv/GetterChecker.java @@ -4,7 +4,14 @@ import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.body.*; import com.github.javaparser.ast.visitor.VoidVisitorWithDefaults; +import java.io.PrintWriter; + public class GetterChecker extends VoidVisitorWithDefaults { + private final PrintWriter out; + public GetterChecker(PrintWriter out) { + this.out = out; + } + @Override public void visit(CompilationUnit unit, Void arg) { for(TypeDeclaration type : unit.getTypes()) { @@ -16,13 +23,14 @@ public class GetterChecker extends VoidVisitorWithDefaults { public void visit(final ClassOrInterfaceDeclaration n, final Void arg) { if (!n.isPublic()) return; - System.out.println(n.getNameAsString()); + + out.println(n.getNameAsString()); for (FieldDeclaration field : n.getFields()) { if (!field.isPrivate()) continue; for (VariableDeclarator variable : field.getVariables()) { boolean hasGetter = false; String fieldName = variable.getNameAsString(); - System.out.println("---------------"+fieldName+"---------------"); + out.println("---------------"+fieldName+"---------------"); String getterName1 = "get" + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1); for (MethodDeclaration method : n.getMethods()) { @@ -32,10 +40,10 @@ public class GetterChecker extends VoidVisitorWithDefaults { } } if (!hasGetter) { - System.out.println(" Missing getter for field: " + fieldName); + out.println(" Missing getter for field: " + fieldName); } } } - super.visit(n, arg); + out.println(" "); } } \ No newline at end of file diff --git a/code/Exercise4/src/main/java/fr/istic/vv/Main.java b/code/Exercise4/src/main/java/fr/istic/vv/Main.java index 1d69996..ccee91f 100644 --- a/code/Exercise4/src/main/java/fr/istic/vv/Main.java +++ b/code/Exercise4/src/main/java/fr/istic/vv/Main.java @@ -10,6 +10,7 @@ import com.github.javaparser.utils.SourceRoot; import java.io.File; import java.io.IOException; +import java.io.PrintWriter; import java.nio.file.Path; import java.nio.file.Paths; @@ -28,10 +29,13 @@ public class Main { } SourceRoot root = new SourceRoot(file.toPath()); - GetterChecker checker = new GetterChecker(); - root.parse("", (localPath, absolutePath, result) -> { - result.ifSuccessful(unit -> unit.accept(checker, null)); - return SourceRoot.Callback.Result.DONT_SAVE; - }); + + try (PrintWriter writer = new PrintWriter("result_exercise4.txt")) { + GetterChecker checker = new GetterChecker(writer); + root.parse("", (localPath, absolutePath, result) -> { + result.ifSuccessful(unit -> unit.accept(checker, null)); + return SourceRoot.Callback.Result.DONT_SAVE; + }); + } } } diff --git a/code/Exercise5/pom.xml b/code/Exercise5/pom.xml index 39ebc8b..e8d2b2f 100644 --- a/code/Exercise5/pom.xml +++ b/code/Exercise5/pom.xml @@ -63,6 +63,14 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + 21 + 21 + + diff --git a/code/Exercise5/src/main/java/fr/istic/vv/CyclomaticComplexity.java b/code/Exercise5/src/main/java/fr/istic/vv/CyclomaticComplexity.java new file mode 100644 index 0000000..7153457 --- /dev/null +++ b/code/Exercise5/src/main/java/fr/istic/vv/CyclomaticComplexity.java @@ -0,0 +1,43 @@ +package fr.istic.vv; + + +import com.github.javaparser.ast.Node; +import com.github.javaparser.ast.body.MethodDeclaration; +import com.github.javaparser.ast.expr.ConditionalExpr; +import com.github.javaparser.ast.stmt.*; +import com.github.javaparser.ast.visitor.VoidVisitorAdapter; + +import java.io.PrintWriter; + + +public class CyclomaticComplexity extends VoidVisitorAdapter { + private PrintWriter out; + + public CyclomaticComplexity(PrintWriter out) { + this.out = out; + } + + @Override + public void visit(MethodDeclaration method, Void arg) { + System.out.println("Found method: " + method.getDeclarationAsString()); + int cc = 1; + for (Node node : method.findAll(Node.class)) { + if (node instanceof IfStmt + || node instanceof ForStmt + || node instanceof WhileStmt + || node instanceof DoStmt + || node instanceof CatchClause + || node instanceof ConditionalExpr) { + cc++; + } else if (node instanceof SwitchEntry) { + SwitchEntry se = (SwitchEntry) node; + if (!(se.getLabels().isEmpty())) { + cc++; + } + } + } + String resultLine = method.getNameAsString()+ ": " + cc; + out.println(resultLine); + out.flush(); + } +} \ No newline at end of file diff --git a/code/Exercise5/src/main/java/fr/istic/vv/Main.java b/code/Exercise5/src/main/java/fr/istic/vv/Main.java index 04df2d0..9c3c0c7 100644 --- a/code/Exercise5/src/main/java/fr/istic/vv/Main.java +++ b/code/Exercise5/src/main/java/fr/istic/vv/Main.java @@ -1,20 +1,13 @@ package fr.istic.vv; -import com.github.javaparser.Problem; -import com.github.javaparser.ast.CompilationUnit; -import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; -import com.github.javaparser.ast.body.MethodDeclaration; -import com.github.javaparser.ast.visitor.VoidVisitor; -import com.github.javaparser.ast.visitor.VoidVisitorAdapter; + import com.github.javaparser.utils.SourceRoot; import java.io.File; import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; +import java.io.PrintWriter; public class Main { - public static void main(String[] args) throws IOException { if(args.length == 0) { System.err.println("Should provide the path to the source code"); @@ -28,12 +21,12 @@ public class Main { } SourceRoot root = new SourceRoot(file.toPath()); - PublicElementsPrinter printer = new PublicElementsPrinter(); - root.parse("", (localPath, absolutePath, result) -> { - result.ifSuccessful(unit -> unit.accept(printer, null)); - return SourceRoot.Callback.Result.DONT_SAVE; - }); + try (PrintWriter writer = new PrintWriter("result_exercise5.txt")) { + CyclomaticComplexity checker = new CyclomaticComplexity(writer); + root.parse("", (localPath, absolutePath, result) -> { + result.ifSuccessful(unit -> unit.accept(checker, null)); + return SourceRoot.Callback.Result.DONT_SAVE; + }); + } } - - } diff --git a/code/Exercise5/src/main/java/fr/istic/vv/PublicElementsPrinter.java b/code/Exercise5/src/main/java/fr/istic/vv/PublicElementsPrinter.java deleted file mode 100644 index 7065232..0000000 --- a/code/Exercise5/src/main/java/fr/istic/vv/PublicElementsPrinter.java +++ /dev/null @@ -1,48 +0,0 @@ -package fr.istic.vv; - -import com.github.javaparser.ast.CompilationUnit; -import com.github.javaparser.ast.body.*; -import com.github.javaparser.ast.visitor.VoidVisitorWithDefaults; - - -// This class visits a compilation unit and -// prints all public enum, classes or interfaces along with their public methods -public class PublicElementsPrinter extends VoidVisitorWithDefaults { - - @Override - public void visit(CompilationUnit unit, Void arg) { - for(TypeDeclaration type : unit.getTypes()) { - type.accept(this, null); - } - } - - public void visitTypeDeclaration(TypeDeclaration declaration, Void arg) { - if(!declaration.isPublic()) return; - System.out.println(declaration.getFullyQualifiedName().orElse("[Anonymous]")); - for(MethodDeclaration method : declaration.getMethods()) { - method.accept(this, arg); - } - // Printing nested types in the top level - for(BodyDeclaration member : declaration.getMembers()) { - if (member instanceof TypeDeclaration) - member.accept(this, arg); - } - } - - @Override - public void visit(ClassOrInterfaceDeclaration declaration, Void arg) { - visitTypeDeclaration(declaration, arg); - } - - @Override - public void visit(EnumDeclaration declaration, Void arg) { - visitTypeDeclaration(declaration, arg); - } - - @Override - public void visit(MethodDeclaration declaration, Void arg) { - if(!declaration.isPublic()) return; - System.out.println(" " + declaration.getDeclarationAsString(true, true)); - } - -} diff --git a/code/javaparser-starter/target/classes/fr/istic/vv/Main.class b/code/javaparser-starter/target/classes/fr/istic/vv/Main.class deleted file mode 100644 index 15c08582a5727a6e8d2622f5aa03ba9130b320f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3457 zcmb7H>sAy;5dK;g2G$V}1VxQ53TAgvMocs&t3(BiB+GSi4VuLC?lv$oJF}S!k=)G9 z++*&^F;9@6i9aAm&+!3r@(y{CoSan8EV$sH%O9qzy7;>AHZ?^qF@U{ z^Ng+Oj;rUjg#~Sd>!yMTNw4t*t{L2%)y8tyMBZhnJEfbt+s{xFPh=S)16DyqQG*5* zwWwogO6#T=^@=%RPw|`~7+TU+o*P+i>+*M57;)!xNA9inngMet&(9=jQmnK{cd3bB%HE$9UibLT{?#ND}=Yx!%(^6b2b<^2Tg#Xbd3RK!wY zPQ`x27?hIqU=Xslco?uKg?vE8L3B|H#C4sL9f=PovI-6{s4E!H>jve!8*!QMm|P`Q z^x!a6hR!%HC6y|3S#I>I(B#He-5Jzvs-9&pN_n4(V^Xf5+p z9EIsxA$N#2Wx5#}SII9~B@fwDEQWZMfzgS8)Pio(!75V8 zur1?KhDLa)+z09nUd$DE*HMPwswqYoV?t%&H5-@woD_~{xSOwQSNUKI7%r)J8PmjO zo|nCd;aoM*mkBSghc@GxdD+9X0qSF3QP@PAD|l7GD@5(bMz7*ET&1?4&tyD`z;R|g zgCSNX*#-_0*#>ar733IBgu7UOb5}`S2Ct$3Vot;0*yz;N%-QS^!^tYyvfdQ2r@@e; zA!r9X!pcYpdCsv6&lQ1Io$VJ-(k&c7WreB7teriJrIqL)NORPJM#sD=!iFrUaqQG%`D4TeNG?vSV?MX3c0ZgidHkp76!{GIrl_MmhyCT(8hed{)q4O{7qHIu=%G*%w@ObE+ zHsk#$wY-m1OyMF0_8|$@Jz|2_A@QUcpGe)$RTN>8?q>|WkK*6@izF?4Nwkn9dvF5KQMGZM6WQCDENtC-=kH@ZonvX666|sVE_?Y z(L0#_D)dXEFFig`n_NcyAGFwlDE*b&Kr^<|Uo}vm?>73?fJQWtRx_=osqMa*e`p;c z$<^fjU(s|2tt}l(*c15^o%hf^ovb;wj3?7QOGw`+Lc~i*lbyX}bOfUWVHoWg!#IJOAaE0yBp(^lpnn>+|BL+!y0@551BMqso^d#95to2putf-O#7akp}!2%uFf;VxUzU{QSL9!3< mF>d;+Pw@r5!q>F7o8-6XLHli;oV>U2-I)%2k00?fI{pVq^5fqC diff --git a/code/javaparser-starter/target/classes/fr/istic/vv/PublicElementsPrinter.class b/code/javaparser-starter/target/classes/fr/istic/vv/PublicElementsPrinter.class deleted file mode 100644 index ef760365c9f3a3435a48571cebea5ccd4acaac64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4317 zcmbtXSz8=M6g>q)dNOGf!~_i4$u^K>Viq+Sj3xvWC6Gu&CB|3`4Rq+~9=m%mxbOSE z8-4e|r}%(heDI5}{tMsy6~Yj6#D*pQS_dfs}!%qg91a?gM zDLV-5Oloc}buK^Q*qMIE%35w1obzorw0r|Gf#Vr3o0_)6nfyfRiky=<=?9jdl0lf7 zvjaQy{M49dPmUGdpQPa#Yf9#wFc4VPYrA%MQlL56Jth$A^CqnXnz7nM3swoN8?s$% zIG>%c{0nlzu>{(Nyo_|lq;IQnG#LwLY@+QPYUpuVphbHna56bm+w(pzo3kAm+MfFa zJxmWNW+_Ly)0#}Wdn|!FahHKMf$kNhiB9wqplF;#yZj zf%QcMEy2jd6)O{_4eS&+SlgiqZ*o4Rh@P=Bj-)SCGl4GbHn9hL8GV__SUIAfsTYbW zNmLq+$d~Rh#irXt5B3QdGcp*~jx({w$s*4n3hb++b!EhvlhU6SXsrxA(L!<(I8+C% z8g=GgdwKQ}Cd%L=w~5u;bCPg(jD|8ZdsgN&ih+9t)|MwKBd7JNh=M?0J;|$jU#WvC z*wv%I;MrbEcc{_Ow`7*p(}jK$19+Ggti6G}hdWA=gWzOY_HP^ zjN%Cc7X7{ilH^qlI%j!R;tdyzO1beHPF(%es(l2ATl0IW%QnkIp{;HP;2BsQ!j?-)(Wq1~L zGZ>Rg&4f~CH6ek+jS6U)f2<#_R_?5zlq-DU+J+Tdv7}J3BMpnB&yhhe;t#6xbxLMR zduP>Z5y+Xi5BCf7Hjt5dK0*e z7ff8mJS&>%UgGVkpimU5)W^r8^H85=QL(h~>hqF`m+^`~M^?^SeV&_czsY-QAJS#(dOCd7x&o}h4UeeS;e^;Ti zCp}aTz4E}V1@?ggTgUb>>gD~6HDIf2U}x3)=t0#e1W?qw{i`EB5uz}EVv?70P!*ulJRX2}66!+G21ufb7@Pr+wP&u@rd z=Svd}pg$|qHGDS<27KPZ5sxdZjK(O#D2#5jjjMCu^c7C!g#daw5C(eue@FCt?<4(R=pI7nxkxMCF!;U4aM znD)xI!psrQ9OX<0nr?Br#egtyr@?=(4DNtd8nSH@;5dz%a6%CfyCMQU38b$fcKuhJ zMY_cY7unabgU~Q(8^0t$~$rs}ri!EU8 zcf1HNyox}xj=)-Nxu0=3fQ@ufrDK6a=OT$tlDMLG>x@XKlxv2Fx1J)KSEFrvIHk5t zP^6nUwt&}`bW(+WZ2S)?etG8r diff --git a/exercises/using-pmd.md b/exercises/using-pmd.md index 91de432..c394bc1 100644 --- a/exercises/using-pmd.md +++ b/exercises/using-pmd.md @@ -4,11 +4,13 @@ Pick a Java project from Github (see the [instructions](../sujet.md) for suggest ## Answer -We clone the project `commons-math` +Nous avons cloné le projet `commons-math` https://github.com/apache/commons-math -We found a problem that it's not worth to change + +On a trouvé un problème qu’il ne vaut pas la peine de changer : `./commons-math/commons-math-core/src/main/java/org/apache/commons/math4/core/jdkmath/AccurateMath.java:396: UselessParentheses: Useless parentheses around `0.5 * t`.` -And here is the code that PMD a indiqué: + +Et voici le code que PMD a indiqué: ``` if (x >= LOG_MAX_VALUE) { // Avoid overflow (MATH-905). @@ -16,9 +18,9 @@ And here is the code that PMD a indiqué: return (0.5 * t) * t; ``` -As we can see the parentheses didn't cause any harm here but it is a true positive +Comme on peut le voir, les parenthèses ne causent aucun problème ici, mais c’est un vrai positif. -For a false positive, we found this one: +Pour un faux positif, nous avons trouvé celui-ci: `./commons-math/commons-math-legacy-core/src/test/java/org/apache/commons/math4/legacy/core/IntegerSequenceTest.java:255: UnusedLocalVariable: Avoid unused local variables such as 'inc'.` ``` @@ -33,4 +35,6 @@ For a false positive, we found this one: ``` -Because the purpose of the test is to trigger the bug when create object. \ No newline at end of file + + +Parce que le but du test est de déclencher le bug lors de la création de l’objet. \ No newline at end of file