001package io.ebean.enhance.entity; 002 003import io.ebean.enhance.asm.ClassVisitor; 004import io.ebean.enhance.asm.Label; 005import io.ebean.enhance.asm.MethodVisitor; 006import io.ebean.enhance.asm.Opcodes; 007import io.ebean.enhance.common.ClassMeta; 008import io.ebean.enhance.common.EnhanceConstants; 009 010import java.util.List; 011 012/** 013 * Generate the _ebean_setEmbeddedLoaded() method. 014 */ 015public class MethodSetEmbeddedLoaded implements Opcodes, EnhanceConstants { 016 017 /** 018 * Generate the _ebean_setEmbeddedLoaded() method. 019 * 020 * <pre> 021 * public void _ebean_setEmbeddedLoaded() { 022 * // for each embedded bean field... 023 * entityBeanIntercept.setEmbeddedLoaded(embeddedBeanField); 024 * } 025 * </pre> 026 */ 027 public static void addMethod(ClassVisitor cv, ClassMeta classMeta) { 028 029 String className = classMeta.getClassName(); 030 031 MethodVisitor mv; 032 033 mv = cv.visitMethod(ACC_PUBLIC, "_ebean_setEmbeddedLoaded", NOARG_VOID, null, null); 034 mv.visitCode(); 035 036 Label labelBegin = null; 037 List<FieldMeta> allFields = classMeta.getAllFields(); 038 for (int i = 0; i < allFields.size(); i++) { 039 FieldMeta fieldMeta = allFields.get(i); 040 if (fieldMeta.isEmbedded()){ 041 042 Label l0 = new Label(); 043 if (labelBegin == null){ 044 labelBegin = l0; 045 } 046 047 mv.visitLabel(l0); 048 mv.visitLineNumber(0, l0); 049 mv.visitVarInsn(ALOAD, 0); 050 mv.visitFieldInsn(GETFIELD, className, INTERCEPT_FIELD, L_INTERCEPT); 051 mv.visitVarInsn(ALOAD, 0); 052 fieldMeta.appendSwitchGet(mv, classMeta, false); 053 mv.visitMethodInsn(INVOKEVIRTUAL, C_INTERCEPT, "setEmbeddedLoaded", "(Ljava/lang/Object;)V", false); 054 } 055 } 056 057 Label l2 = new Label(); 058 if (labelBegin == null){ 059 labelBegin = l2; 060 } 061 mv.visitLabel(l2); 062 mv.visitLineNumber(1, l2); 063 mv.visitInsn(RETURN); 064 Label l3 = new Label(); 065 mv.visitLabel(l3); 066 mv.visitLocalVariable("this", "L"+className+";", null, labelBegin, l3, 0); 067 mv.visitMaxs(2, 1); 068 mv.visitEnd(); 069 } 070}