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