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}