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
014  private final String prefix;
015
016  public AnnotationInfoVisitor(String prefix, AnnotationInfo info, AnnotationVisitor av) {
017    super(EBEAN_ASM_VERSION, av);
018    this.info = info;
019    this.prefix = prefix;
020    if (prefix != null) {
021      info.getArrayEntry(prefix); // register as empty
022    }
023  }
024
025  @Override
026  public void visit(String name, Object value) {
027    super.visit(name, value);
028    info.add(prefix, name, value);
029  }
030
031  @Override
032  public AnnotationVisitor visitAnnotation(String name, String desc) {
033    return create(name, super.visitAnnotation(name, desc));
034  }
035
036  @Override
037  public AnnotationVisitor visitArray(String name) {
038    return create(name, super.visitArray(name));
039  }
040
041  private AnnotationInfoVisitor create(String name, AnnotationVisitor underlying){
042    String newPrefix = prefix == null ? name: prefix+"."+name;
043    return new AnnotationInfoVisitor(newPrefix, info, underlying);
044  }
045
046  @Override
047  public void visitEnum(String name, String desc, String value) {
048    super.visitEnum(name, desc, value);
049    info.addEnum(prefix, name, value);
050  }
051
052}