001package io.ebean.enhance.entity;
002
003import io.ebean.enhance.asm.AnnotationVisitor;
004import io.ebean.enhance.asm.Attribute;
005import io.ebean.enhance.asm.FieldVisitor;
006import io.ebean.enhance.common.EnhanceConstants;
007
008import static io.ebean.enhance.Transformer.EBEAN_ASM_VERSION;
009
010/**
011 * Used to collect information about a field (specifically from field annotations).
012 */
013public final class LocalFieldVisitor extends FieldVisitor implements EnhanceConstants {
014
015  private final FieldMeta fieldMeta;
016
017  /**
018   * Constructor used for entity class enhancement.
019   *
020   * @param fv        the fieldVisitor used to write
021   * @param fieldMeta the fieldMeta data
022   */
023  public LocalFieldVisitor(FieldVisitor fv, FieldMeta fieldMeta) {
024    super(EBEAN_ASM_VERSION, fv);
025    this.fieldMeta = fieldMeta;
026  }
027
028  /**
029   * Return the field name.
030   */
031  public String name() {
032    return fieldMeta.name();
033  }
034
035  @Override
036  public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
037    fieldMeta.addAnnotationDesc(desc);
038    if (fv != null) {
039      if (!visible && desc.equals(L_JETBRAINS_NOTNULL)) {
040        fv.visitAnnotation(L_EBEAN_NOTNULL, true);
041        fieldMeta.setNotNull();
042      }
043      if (fieldMeta.isNullable() && annotationWithNullable(desc)) {
044        // looking for nullable=false attribute on Column or DbArray
045        return new FieldAnnotationVisitor(fieldMeta, fv.visitAnnotation(desc, visible));
046      }
047      return fv.visitAnnotation(desc, visible);
048    } else {
049      return null;
050    }
051  }
052
053  private boolean annotationWithNullable(String desc) {
054    return Javax.Column.equals(desc) || Jakarta.Column.equals(desc) || L_DBARRAY.equals(desc);
055  }
056
057  @Override
058  public void visitAttribute(Attribute attr) {
059    if (fv != null) {
060      fv.visitAttribute(attr);
061    }
062  }
063
064  @Override
065  public void visitEnd() {
066    if (fv != null) {
067      fv.visitEnd();
068    }
069  }
070
071}