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}