package dev.peerat.parser.java.visitor; import java.util.Map; import java.util.Map.Entry; import java.util.function.BiPredicate; import java.util.function.Function; import java.util.function.Predicate; import dev.peerat.parser.Token; import dev.peerat.parser.java.Annotation; import dev.peerat.parser.java.value.Value; import dev.peerat.parser.visitor.VisitorBag; public class JavaAnnotationVisitor extends JavaVisitor{ private Predicate nameFilter; private Predicate keyFilter; private BiPredicate valueFilter; private Function> valueFilterVisitor; public JavaAnnotationVisitor(){ super(Annotation.class); } public JavaAnnotationVisitor nameFilter(Predicate validator){ this.nameFilter = (this.nameFilter == null) ? validator : this.nameFilter.and(validator); return this; } public JavaAnnotationVisitor noValues(){ //TODO return this; } public JavaAnnotationVisitor hasValues(){ //TODO return this; } public JavaAnnotationVisitor hasKey(Predicate validator){ this.keyFilter = (this.keyFilter == null) ? validator : this.keyFilter.and(validator); return this; } public JavaAnnotationVisitor valueFilter(BiPredicate validator){ this.valueFilter = (this.valueFilter == null) ? validator : this.valueFilter.and(validator); return this; } //unique ? public JavaAnnotationVisitor valueFilter(Function> visitor){ System.out.println("filter value visitor"); this.valueFilterVisitor = visitor; return this; } @Override public VisitorBag visitElement(Annotation element){ VisitorBag bag = new VisitorBag(); if(nameFilter != null){ if(!nameFilter.test(element.getName().getValue())) return bag; } if(keyFilter != null){ Map paramters = element.getParameters(); if(paramters == null) return bag; for(Token token : paramters.keySet()){ if(!keyFilter.test(token.getValue())) return bag; } } if(valueFilter != null){ Map paramters = element.getParameters(); if(paramters == null) return bag; for(Entry entry : paramters.entrySet()){ if(!valueFilter.test(entry.getKey().getValue(), entry.getValue())) return bag; } } if(this.valueFilterVisitor != null){ Map paramters = element.getParameters(); if(paramters == null) return bag; //ALL LIKE THIS? boolean findOne = false; for(Entry entry : paramters.entrySet()){ VisitorBag vbag = this.valueFilterVisitor.apply(entry.getKey().getValue()).visit(entry.getValue()); bag.merge(vbag); if(vbag.isValidated()) findOne = true; } if(!findOne) return bag; } bag.compute(element); return bag; } }