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);
}
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();
}
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();
}
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();
}
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();
}
Aggregations