package be.jeffcheasey88.peeratcode.parser.java; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.function.BiFunction; import java.util.function.Function; import be.jeffcheasey88.peeratcode.parser.java.CleanerPool.Cleaner; public class JavaParser{ public static void main(String[] args) throws Exception { File file = new File("C:\\Users\\jeffc\\eclipse-workspace\\peer-at-code-backend\\src\\be\\jeffcheasey88\\peeratcode\\routes\\PuzzleResponse.java"); BufferedReader reader = new BufferedReader(new FileReader(file)); JavaParser parser = new JavaParser(); parser.parse(reader); System.out.println("build-----------------"); parser.build(new BufferedWriter(new FileWriter(new File("/home/buildClazzFromParser.txt")))); reader = new BufferedReader(new FileReader(new File("/home/buildClazzFromParser.txt"))); String line; while((line = reader.readLine()) != null) System.out.println(line); reader.close(); } public static void mainee(String[] args) throws Exception { File dir = new File(""); show(dir); } public static void mainf(String[] args) throws Exception{ String variable = "var myName = \"Test\";"; String clazz = "package test; public class Test{ "+variable+" }"; BufferedWriter writer = new BufferedWriter(new FileWriter(new File("/home/tmp.txt"))); writer.write(clazz); writer.flush(); writer.close(); BufferedReader reader = new BufferedReader(new FileReader(new File("/home/tmp.txt"))); JavaParser parser = new JavaParser(); parser.parse(reader); System.out.println("SHOW-----------------"); } private static void show(File dir) throws Exception{ if(dir.isFile()){ if(!dir.getName().endsWith(".java")) return; System.out.println("| "+dir.getAbsolutePath()); BufferedReader reader = new BufferedReader(new FileReader(dir)); try { JavaParser parser = new JavaParser(); parser.parse(reader); Class clazz = parser.getClazz(); System.out.println(clazz.getName()); // for(Variable variable : clazz.getVariables()){ // variable.show(1); // } }catch(Exception e) {} }else{ for(File file : dir.listFiles()) show(file); } } private Package pack; private List imports; private Class clazz; //later, maybe put string in the element private CleanerPool cleaner; public JavaParser(){} public void parse(BufferedReader reader) throws Exception{ String content = ""; int index; cleaner = new CleanerPool( new Cleaner("CONSTANT_STRING",'"','"'), new Cleaner("CONSTANT_CHAR",'\'','\'')); String line; while((line = reader.readLine()) != null){ line = cleaner.clean(line); index = line.indexOf("//"); if(index >= 0) line = line.substring(0, index); content+=line+" "; } System.out.println(content); this.pack = new Package(); index = this.pack.parse(content); content = content.substring(index); this.imports = new ArrayList<>(); while(Import.isImport(content)){ Import imp = new Import(); index = imp.parse(content); this.imports.add(imp); content = content.substring(index); } this.clazz = new Class(); index = this.clazz.parse(content, cleaner, null); content = content.substring(index); } public E find(Function search, Function, Boolean> deep){ return (E)this.clazz.find(search, deep, new ArrayList<>()); } public E find(BiFunction, Boolean> search){ return (E) this.clazz.find(search, new ArrayList<>()); } public Package getPackage(){ return this.pack; } public List getImports(){ return this.imports; } public Class getClazz(){ return this.clazz; } public void build(BufferedWriter writer) throws Exception{ writer.write("package "+this.pack.getName()+";\n"); writer.write("\n"); for(Import element : this.imports) writer.write("import "+element.getName()+";\n"); writer.write("\n"); ArrayBuffer buffer = new ArrayBuffer(String.class); buffer.add(""); this.clazz.build(buffer, 0); Iterator lines = buffer.iterator(); while(lines.hasNext()){ String line = lines.next(); line = this.cleaner.unzip(line, (s,p) -> s); writer.write(line+"\n"); } writer.flush(); writer.close(); } public static int getModifier(String modifier){ switch(modifier){ case "public": return Modifier.PUBLIC; case "private": return Modifier.PRIVATE; case "protected": return Modifier.PROTECTED; case "static": return Modifier.STATIC; case "final": return Modifier.FINAL; case "synchronized": return Modifier.SYNCHRONIZED; case "volatile": return Modifier.VOLATILE; case "transient": return Modifier.TRANSIENT; case "native": return Modifier.NATIVE; case "abstract": return Modifier.ABSTRACT; case "strictfp": return Modifier.STRICT; default: break; } return 0; } }