Search in sources :

Example 1 with Type

use of org.apache.xbean.asm9.Type 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 2 with Type

use of org.apache.xbean.asm9.Type 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 3 with Type

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

the class CmrField method createSignature.

private static String createSignature(final Type type, final Type... genericTypes) {
    final StringBuilder builder = new StringBuilder();
    builder.append("L").append(type.getInternalName());
    if (genericTypes.length > 0) {
        builder.append("<");
        for (final Type genericType : genericTypes) {
            builder.append(genericType.getDescriptor());
        }
        builder.append(">");
    }
    builder.append(";");
    return builder.toString();
}
Also used : Type(org.apache.xbean.asm9.Type)

Example 4 with Type

use of org.apache.xbean.asm9.Type 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)

Example 5 with Type

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

the class Cmp2Generator method createGetter.

/**
 * Generate a concrete getter 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 getter method.
 */
private void createGetter(final CmpField cmpField) {
    final String methodName = cmpField.getGetterMethod().getName();
    final MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, methodName, "()" + cmpField.getDescriptor(), null, null);
    mv.visitCode();
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, implClassName, cmpField.getName(), cmpField.getDescriptor());
    mv.visitInsn(cmpField.getType().getOpcode(IRETURN));
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}
Also used : MethodVisitor(org.apache.xbean.asm9.MethodVisitor)

Aggregations

MethodVisitor (org.apache.xbean.asm9.MethodVisitor)11 Type (org.apache.xbean.asm9.Type)7 Method (java.lang.reflect.Method)4 Label (org.apache.xbean.asm9.Label)4 ArrayList (java.util.ArrayList)3 Test (org.junit.Test)3 MatchEntry (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry)3 MatchEntryBuilder (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntryBuilder)3 Icmpv4TypeCaseBuilder (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4TypeCaseBuilder)3 Icmpv6TypeCaseBuilder (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6TypeCaseBuilder)3 TcpSrcCaseBuilder (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpSrcCaseBuilder)3 Icmpv4TypeBuilder (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv4.type._case.Icmpv4TypeBuilder)3 Icmpv6TypeBuilder (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv6.type._case.Icmpv6TypeBuilder)3 TcpSrcBuilder (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tcp.src._case.TcpSrcBuilder)3 Type (jodd.asm5.Type)2 AnnotationVisitor (org.apache.xbean.asm9.AnnotationVisitor)2 Dscp (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Dscp)2 Ipv4Address (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address)2 MacAddress (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress)2 EtherType (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType)2