Search in sources :

Example 21 with MethodVisitor

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

the class Cmp2Generator method createOpenEJB_addCmr.

/**
 * Generate the OpenEJB_addCmr logic for an individual
 * CMR field.  Each CMR field has a test against the
 * property name, which is passed to the wrappering
 * addCmr method.  This results in a series of
 * if blocks for each defined CMD property.
 *
 * @param mv       The method we're generating within.
 * @param cmrField The CMR field definition.
 */
private void createOpenEJB_addCmr(final MethodVisitor mv, final CmrField cmrField) {
    // if (${cmrField.name}.equals(arg1))
    mv.visitLdcInsn(cmrField.getName());
    mv.visitVarInsn(ALOAD, 1);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false);
    // if not equal jump to end
    final Label end = new Label();
    mv.visitJumpInsn(IFEQ, end);
    // collection already anchored in the CMR field.
    if (cmrField.getCmrStyle() != CmrStyle.SINGLE) {
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, implClassName, cmrField.getName(), cmrField.getDescriptor());
        mv.visitVarInsn(ASTORE, 3);
        mv.visitVarInsn(ALOAD, 3);
        final Label fieldNotNull = new Label();
        mv.visitJumpInsn(IFNONNULL, fieldNotNull);
        // lazy creation of the collection type if not already created.
        mv.visitTypeInsn(NEW, cmrField.getInitialValueType().getInternalName());
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, cmrField.getInitialValueType().getInternalName(), "<init>", "()V", false);
        mv.visitVarInsn(ASTORE, 3);
        mv.visitLabel(fieldNotNull);
        // ${cmrField.name}.add(arg2)
        mv.visitVarInsn(ALOAD, 3);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEINTERFACE, cmrField.getCmrStyle().getCollectionType().getInternalName(), "add", "(Ljava/lang/Object;)Z", true);
        mv.visitInsn(POP);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 3);
        // unconditionally set the CMR field to the collection.  This is either the
        // original one on entry, or a new one for first access.
        mv.visitFieldInsn(PUTFIELD, implClassName, cmrField.getName(), cmrField.getDescriptor());
        // return null;
        mv.visitInsn(ACONST_NULL);
        mv.visitInsn(ARETURN);
    } else {
        // push: this.${cmrField.name};
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, implClassName, cmrField.getName(), cmrField.getDescriptor());
        // this.${cmrField.name} = (${cmrField.type}) bean;
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitTypeInsn(CHECKCAST, cmrField.getType().getInternalName());
        mv.visitFieldInsn(PUTFIELD, implClassName, cmrField.getName(), cmrField.getDescriptor());
        // return pushed value above
        mv.visitInsn(ARETURN);
    }
    // end of if statement
    mv.visitLabel(end);
}
Also used : Label(org.apache.xbean.asm5.Label)

Example 22 with MethodVisitor

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

the class Cmp2Generator method createOpenEJB_isDeleted.

private void createOpenEJB_isDeleted() {
    final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "OpenEJB_isDeleted", "()Z", null, null);
    mv.visitCode();
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, implClassName, DELETED, "Z");
    mv.visitInsn(IRETURN);
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}
Also used : MethodVisitor(org.apache.xbean.asm5.MethodVisitor)

Example 23 with MethodVisitor

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

the class Cmp2Generator method createSelectMethod.

/**
 * Generate a concrete implementation of an abstract
 * ejbSelectxxxx method.
 *
 * @param selectMethod The abstract definition for the method we're generating.
 */
private void createSelectMethod(final Method selectMethod) {
    final Class<?> returnType = selectMethod.getReturnType();
    final Method executeMethod = EjbSelect.getSelectMethod(returnType);
    final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, selectMethod.getName(), Type.getMethodDescriptor(selectMethod), null, getExceptionTypes(selectMethod));
    mv.visitCode();
    // push deploymentInfo
    mv.visitFieldInsn(GETSTATIC, implClassName, "deploymentInfo", "Ljava/lang/Object;");
    // push method signature
    mv.visitLdcInsn(getSelectMethodSignature(selectMethod));
    // one of the primitives.
    if (!returnType.isPrimitive()) {
        mv.visitLdcInsn(returnType.getName());
    }
    // new Object[]
    mv.visitIntInsn(BIPUSH, selectMethod.getParameterTypes().length);
    mv.visitTypeInsn(ANEWARRAY, "java/lang/Object");
    // object[i] = arg${i}
    int i = 0;
    for (final Class<?> parameterType : selectMethod.getParameterTypes()) {
        // push arguement i on stack
        mv.visitInsn(DUP);
        bipush(mv, i);
        mv.visitVarInsn(Type.getType(parameterType).getOpcode(ILOAD), i + 1);
        // convert argument on stack to an Object
        Convert.toObjectFrom(mv, parameterType);
        // store it into the array
        mv.visitInsn(AASTORE);
        if (long.class.equals(parameterType) || double.class.equals(parameterType)) {
            // longs and doubles are double wide
            i = i + 2;
        } else {
            i++;
        }
    }
    // EjbSelect.execute_xxxx(deploymentInfo, signature, [returnType.] args[]);
    mv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(executeMethod.getDeclaringClass()), executeMethod.getName(), Type.getMethodDescriptor(executeMethod), false);
    // needs to match the type returned from the method call
    if (!Void.TYPE.equals(returnType)) {
        // stack already
        if (!returnType.isPrimitive()) {
            // convert return type
            Convert.fromObjectTo(mv, returnType);
        }
        // And generate the appropriate return for the type
        mv.visitInsn(Type.getReturnType(selectMethod).getOpcode(IRETURN));
    } else {
        // void return is just a RETURN.
        mv.visitInsn(RETURN);
    }
    // close method
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}
Also used : Method(java.lang.reflect.Method) MethodVisitor(org.apache.xbean.asm5.MethodVisitor)

Example 24 with MethodVisitor

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

the class Cmp2Generator method createOpenEJB_addCmr.

private void createOpenEJB_addCmr() {
    final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "OpenEJB_addCmr", "(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;", null, null);
    mv.visitCode();
    // if (deleted) return null;
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, implClassName, DELETED, "Z");
    final Label notDeleted = new Label();
    mv.visitJumpInsn(IFEQ, notDeleted);
    mv.visitInsn(ACONST_NULL);
    mv.visitInsn(ARETURN);
    mv.visitLabel(notDeleted);
    for (final CmrField cmrField : cmrFields) {
        // if ("${cmrField.name}".equals(name)) {
        // ${cmrField.name}.add((${cmrField.type})value);
        // return null;
        // }
        // 
        // OR
        // 
        // if ("${cmrField.name}".equals(name)) {
        // Object oldValue = ${cmrField.name};
        // ${cmrField.name} = (${cmrField.type}) bean;
        // return oldValue;
        // }
        createOpenEJB_addCmr(mv, cmrField);
    }
    // throw new IllegalArgumentException("Unknown cmr field " + name + " on entity bean of type " + getClass().getName());
    mv.visitTypeInsn(NEW, "java/lang/IllegalArgumentException");
    mv.visitInsn(DUP);
    mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
    mv.visitInsn(DUP);
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V", false);
    mv.visitLdcInsn("Unknown cmr field ");
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
    mv.visitVarInsn(ALOAD, 1);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
    mv.visitLdcInsn(" on entity bean of type ");
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;", false);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/IllegalArgumentException", "<init>", "(Ljava/lang/String;)V", false);
    mv.visitInsn(ATHROW);
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}
Also used : Label(org.apache.xbean.asm5.Label) MethodVisitor(org.apache.xbean.asm5.MethodVisitor)

Example 25 with MethodVisitor

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

the class Cmp2Generator method createConstructor.

private void createConstructor() {
    final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
    mv.visitCode();
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, beanClassName, "<init>", "()V", false);
    for (final CmrField cmrField : cmrFields) {
        initCmrFields(mv, cmrField);
    }
    mv.visitInsn(RETURN);
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}
Also used : MethodVisitor(org.apache.xbean.asm5.MethodVisitor)

Aggregations

MethodVisitor (org.apache.xbean.asm5.MethodVisitor)28 Label (org.apache.xbean.asm5.Label)7 MethodVisitor (jodd.asm5.MethodVisitor)6 ClassWriter (org.apache.xbean.asm5.ClassWriter)6 Method (java.lang.reflect.Method)3 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 EmptyClassVisitor (jodd.asm.EmptyClassVisitor)2 EmptyMethodVisitor (jodd.asm.EmptyMethodVisitor)2 Type (org.apache.xbean.asm5.Type)2 IOException (java.io.IOException)1 Field (java.lang.reflect.Field)1 MethodAdapter (jodd.asm.MethodAdapter)1 FieldVisitor (jodd.asm5.FieldVisitor)1 Label (jodd.asm5.Label)1 ProxettaException (jodd.proxetta.ProxettaException)1 ProxyGenerationException (org.apache.openejb.util.proxy.ProxyGenerationException)1