diff --git a/code/Exercise3/AmazingClass.java b/code/Exercise3/AmazingClass.java
new file mode 100644
index 0000000..6bbe7a0
--- /dev/null
+++ b/code/Exercise3/AmazingClass.java
@@ -0,0 +1,15 @@
+public class AmazingClass {
+
+
+ public void something() {
+ if(true){
+ while(true){
+ if(true){
+ if(true){
+
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/code/Exercise5/pom.xml b/code/Exercise5/pom.xml
new file mode 100644
index 0000000..39ebc8b
--- /dev/null
+++ b/code/Exercise5/pom.xml
@@ -0,0 +1,69 @@
+
+
+ 4.0.0
+
+ fr.istic.vv
+ javaparser-starter
+ 1.0
+
+
+ UTF-8
+ 9
+ 9
+
+
+
+
+ com.github.javaparser
+ javaparser-core
+ 3.16.2
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ 3.1.1
+
+
+
+ true
+ fr.istic.vv.Main
+
+
+
+
+
+
+
+ maven-assembly-plugin
+
+
+
+ true
+ fr.istic.vv.Main
+
+
+
+ jar-with-dependencies
+
+
+
+
+ make-my-jar-with-dependencies
+ package
+
+ single
+
+
+
+
+
+
+
+
\ 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
new file mode 100644
index 0000000..04df2d0
--- /dev/null
+++ b/code/Exercise5/src/main/java/fr/istic/vv/Main.java
@@ -0,0 +1,39 @@
+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;
+
+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");
+ System.exit(1);
+ }
+
+ File file = new File(args[0]);
+ if(!file.exists() || !file.isDirectory() || !file.canRead()) {
+ System.err.println("Provide a path to an existing readable directory");
+ System.exit(2);
+ }
+
+ 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;
+ });
+ }
+
+
+}
diff --git a/code/Exercise5/src/main/java/fr/istic/vv/PublicElementsPrinter.java b/code/Exercise5/src/main/java/fr/istic/vv/PublicElementsPrinter.java
new file mode 100644
index 0000000..7065232
--- /dev/null
+++ b/code/Exercise5/src/main/java/fr/istic/vv/PublicElementsPrinter.java
@@ -0,0 +1,48 @@
+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
new file mode 100644
index 0000000..15c0858
Binary files /dev/null and b/code/javaparser-starter/target/classes/fr/istic/vv/Main.class differ
diff --git a/code/javaparser-starter/target/classes/fr/istic/vv/PublicElementsPrinter.class b/code/javaparser-starter/target/classes/fr/istic/vv/PublicElementsPrinter.class
new file mode 100644
index 0000000..ef76036
Binary files /dev/null and b/code/javaparser-starter/target/classes/fr/istic/vv/PublicElementsPrinter.class differ
diff --git a/exercises/extending-pmd.md b/exercises/extending-pmd.md
index 2239dc6..1f26ac8 100644
--- a/exercises/extending-pmd.md
+++ b/exercises/extending-pmd.md
@@ -23,3 +23,37 @@ Use your rule with different projects and describe you findings below. See the [
## Answer
+
+
+```xml
+
+
+
+ Ruleset pour détecter 3 niveaux (ou plus) de if imbriqués.
+
+
+
+ Three or more nested `if` !
+
+ 3
+
+
+
+
+
+```
+
+en testant un programme Java, il détecte bien les imbrications de 'if' même s'ils ne sont pas directement imbriqués, séparés par un while par exemple