001package io.ebean.enhance.common;
002
003import io.ebean.enhance.asm.AnnotationVisitor;
004import io.ebean.enhance.asm.Opcodes;
005
006/**
007 * Reads the annotation information storing it in a AnnotationInfo.
008 */
009public class AnnotationInfoVisitor extends AnnotationVisitor {
010
011  private final AnnotationInfo info;
012
013  private final String prefix;
014
015  public AnnotationInfoVisitor(String prefix, AnnotationInfo info, AnnotationVisitor av) {
016    super(Opcodes.ASM7, av);
017    this.info = info;
018    this.prefix = prefix;
019  }
020
021  @Override
022  public void visit(String name, Object value) {
023    super.visit(name, value);
024    info.add(prefix, name, value);
025  }
026
027  @Override
028  public AnnotationVisitor visitAnnotation(String name, String desc) {
029    return create(name, super.visitAnnotation(name, desc));
030  }
031
032  @Override
033  public AnnotationVisitor visitArray(String name) {
034    return create(name, super.visitArray(name));
035  }
036
037  private AnnotationInfoVisitor create(String name, AnnotationVisitor underlying){
038    String newPrefix = prefix == null ? name: prefix+"."+name;
039    return new AnnotationInfoVisitor(newPrefix, info, underlying);
040  }
041
042  @Override
043  public void visitEnd() {
044    super.visitEnd();
045  }
046
047  @Override
048  public void visitEnum(String name, String desc, String value) {
049    super.visitEnum(name, desc, value);
050    info.addEnum(prefix, name, desc, value);
051  }
052
053}