Search in sources :

Example 6 with MethodVisitor

use of org.apache.xbean.asm9.MethodVisitor in project tomee by apache.

the class Cmp2Generator method createUnsetEntityContext.

public void createUnsetEntityContext() {
    final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "unsetEntityContext", "()V", null, null);
    mv.visitCode();
    mv.visitInsn(RETURN);
    mv.visitMaxs(0, 1);
    mv.visitEnd();
}
Also used : MethodVisitor(org.apache.xbean.asm9.MethodVisitor)

Example 7 with MethodVisitor

use of org.apache.xbean.asm9.MethodVisitor in project tomee by apache.

the class Cmp2Generator method createSimplePrimaryKeyGetter.

/**
 * Create a simple internal method for obtaining the
 * primary key.  There are 2 possibilities for handling
 * the primary key here:
 *
 * 1)  There is a defined primary key field.  The
 * contents of that field are returned.
 *
 * 2)  The primary key is provided by the container.
 * This is a long value stored in a private, generated
 * field.  This field is returned as a generated
 * wrappered Long.
 *
 * 3)  A primary key class has been provided.  An instance
 * of this class is instantiated, and code is generated
 * that will copy all of the CMP fields from the EJB
 * into the primary key instance.
 */
private void createSimplePrimaryKeyGetter() {
    final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "OpenEJB_getPrimaryKey", "()Ljava/lang/Object;", null, null);
    mv.visitCode();
    // the primary key is identifed as a field.  We just return that value directly.
    if (pkField != null) {
        // push the pk field
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, implClassName, pkField.getName(), pkField.getDescriptor());
        // return the pk field (from the stack)
        mv.visitInsn(pkField.getType().getOpcode(IRETURN));
    } else if (Object.class.equals(primKeyClass)) {
        // this is a container-generated primary key.  It's a long value stored in
        // a generated field.  We return that value, wrappered in a Long instance.
        // push the pk field
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, implClassName, UNKNOWN_PK_NAME, UNKNOWN_PK_TYPE.getDescriptor());
        // return the pk field (from the stack)
        mv.visitInsn(UNKNOWN_PK_TYPE.getOpcode(IRETURN));
    } else {
        // We have a primary key class defined.  For every field that matches one of the
        // defined CMP fields, we generate code to copy that value into the corresponding
        // field of the primary key class.
        final String pkImplName = primKeyClass.getName().replace('.', '/');
        // new Pk();
        mv.visitTypeInsn(NEW, pkImplName);
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, pkImplName, "<init>", "()V", false);
        mv.visitVarInsn(ASTORE, 1);
        mv.visitVarInsn(ALOAD, 1);
        // copy each field from the ejb to the pk class
        for (final Field field : primKeyClass.getFields()) {
            final CmpField cmpField = cmpFields.get(field.getName());
            // only process the cmp fields
            if (cmpField == null) {
                continue;
            }
            // check again since generated code is so hard to debug
            if (!cmpField.getType().getClassName().equals(field.getType().getName())) {
                throw new IllegalArgumentException("Primary key " + cmpField.getName() + " is type " + cmpField.getType().getClassName() + " but CMP field is type " + field.getType().getName());
            }
            // push the value from the cmp bean
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, implClassName, cmpField.getName(), cmpField.getDescriptor());
            // set matching field in the pk class to the value on the stack
            mv.visitFieldInsn(PUTFIELD, pkImplName, cmpField.getName(), cmpField.getDescriptor());
            mv.visitVarInsn(ALOAD, 1);
        }
        // return the Pk();
        mv.visitInsn(ARETURN);
    }
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}
Also used : Field(java.lang.reflect.Field) MethodVisitor(org.apache.xbean.asm9.MethodVisitor)

Example 8 with MethodVisitor

use of org.apache.xbean.asm9.MethodVisitor in project tomee by apache.

the class Cmp2Generator method createSetter.

/**
 * Generate a concrete setter field for a CMP field.
 * At this point, we're just generating a simple
 * accessor for the field, given the type.  The
 * JPA engine when it makes this implementation class
 * a managed class define whatever additional logic
 * might be required.
 *
 * @param cmpField The CMP field backing this setter method.
 */
private void createSetter(final CmpField cmpField) {
    final String methodName = setterName(cmpField.getName());
    final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, methodName, "(" + cmpField.getDescriptor() + ")V", null, null);
    mv.visitCode();
    mv.visitVarInsn(ALOAD, 0);
    mv.visitVarInsn(cmpField.getType().getOpcode(ILOAD), 1);
    mv.visitFieldInsn(PUTFIELD, implClassName, cmpField.getName(), cmpField.getDescriptor());
    mv.visitInsn(RETURN);
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}
Also used : MethodVisitor(org.apache.xbean.asm9.MethodVisitor)

Example 9 with MethodVisitor

use of org.apache.xbean.asm9.MethodVisitor in project tomee by apache.

the class Cmp2Generator method createEjbPassivate.

public void createEjbPassivate() {
    final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "ejbPassivate", "()V", null, null);
    mv.visitCode();
    mv.visitInsn(RETURN);
    mv.visitMaxs(0, 1);
    mv.visitEnd();
}
Also used : MethodVisitor(org.apache.xbean.asm9.MethodVisitor)

Example 10 with MethodVisitor

use of org.apache.xbean.asm9.MethodVisitor in project tomee by apache.

the class Cmp2Generator method createCmrSetter.

/**
 * Generate a setter method for a CMR field.  The
 * setter method will delegate the setting responsibility
 * to the accessor object store the associated Cmr field.
 *
 * @param cmrField The field we're generating the setter for.
 */
private void createCmrSetter(final CmrField cmrField) {
    // no back reference.  We don't generate a getter method for this
    if (cmrField.isSynthetic()) {
        return;
    }
    final String methodName = setterName(cmrField.getName());
    final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, methodName, "(" + cmrField.getProxyDescriptor() + ")V", null, null);
    mv.visitCode();
    // the Set with the new values from the new value source.
    if (cmrField.getCmrStyle() != CmrStyle.SINGLE) {
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, implClassName, cmrField.getName() + "Cmr", cmrField.getAccessorDescriptor());
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, implClassName, cmrField.getName(), cmrField.getDescriptor());
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, cmrField.getAccessorInternalName(), "set", cmrField.getCmrStyle().getSetterDescriptor(), false);
        mv.visitInsn(RETURN);
    } else {
        // this is a single value.  We pass the existing value and the old value to
        // the accessor, then must cast the accessor return value to the target type
        // so we can store it in the real CMR field.
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, implClassName, cmrField.getName() + "Cmr", cmrField.getAccessorDescriptor());
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, implClassName, cmrField.getName(), cmrField.getDescriptor());
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKEVIRTUAL, cmrField.getAccessorInternalName(), "set", cmrField.getCmrStyle().getSetterDescriptor(), false);
        mv.visitTypeInsn(CHECKCAST, cmrField.getType().getInternalName());
        mv.visitFieldInsn(PUTFIELD, implClassName, cmrField.getName(), cmrField.getDescriptor());
        mv.visitInsn(RETURN);
    }
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}
Also used : MethodVisitor(org.apache.xbean.asm9.MethodVisitor)

Aggregations

MethodVisitor (org.apache.xbean.asm9.MethodVisitor)30 Label (org.apache.xbean.asm9.Label)7 MethodVisitor (jodd.asm5.MethodVisitor)6 MethodVisitor (org.apache.xbean.asm6.MethodVisitor)6 ClassWriter (org.apache.xbean.asm9.ClassWriter)6 Method (java.lang.reflect.Method)5 Type (org.apache.xbean.asm9.Type)4 IOException (java.io.IOException)2 ArrayList (java.util.ArrayList)2 Arrays.asList (java.util.Arrays.asList)2 HashMap (java.util.HashMap)2 List (java.util.List)2 Map (java.util.Map)2 ZipEntry (java.util.zip.ZipEntry)2 EmptyClassVisitor (jodd.asm.EmptyClassVisitor)2 EmptyMethodVisitor (jodd.asm.EmptyMethodVisitor)2 ProxyGenerationException (org.apache.openejb.util.proxy.ProxyGenerationException)2 AnnotationVisitor (org.apache.xbean.asm6.AnnotationVisitor)2 ClassWriter (org.apache.xbean.asm6.ClassWriter)2 AnnotationVisitor (org.apache.xbean.asm9.AnnotationVisitor)2