/* * Copyright 2001-2008 Geert Bevin <gbevin[remove] at uwyn dot com> * Licensed under the Apache License, Version 2.0 (the "License") * $Id: MetaDataDefaultConstructorAdapter.java 3918 2008-04-14 17:35:35Z gbevin $ */ package com.uwyn.rife.site.instrument; import com.uwyn.rife.asm.*; import com.uwyn.rife.site.MetaDataBeanAware; class MetaDataDefaultConstructorAdapter extends MethodAdapter implements Opcodes { private String mBaseInternalName = null; private String mMetaDataInternalName = null; MetaDataDefaultConstructorAdapter(String baseInternalName, String metaDataInternalName, MethodVisitor visitor) { super(visitor); mBaseInternalName = baseInternalName; mMetaDataInternalName = metaDataInternalName; } public void visitMethodInsn(int opcode, String owner, String name, String desc) { super.visitMethodInsn(opcode, owner, name, desc); if (INVOKESPECIAL == opcode && "<init>".equals(name) && "()V".equals(desc)) { mv.visitVarInsn(ALOAD, 0); mv.visitTypeInsn(NEW, mMetaDataInternalName); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, mMetaDataInternalName, "<init>", "()V"); mv.visitFieldInsn(PUTFIELD, mBaseInternalName, MetaDataClassAdapter.DELEGATE_VAR_NAME, "L"+mMetaDataInternalName+";"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, mBaseInternalName, MetaDataClassAdapter.DELEGATE_VAR_NAME, "L"+mMetaDataInternalName+";"); mv.visitTypeInsn(INSTANCEOF, Type.getInternalName(MetaDataBeanAware.class)); Label not_aware = new Label(); mv.visitJumpInsn(IFEQ, not_aware); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, mBaseInternalName, MetaDataClassAdapter.DELEGATE_VAR_NAME, "L"+mMetaDataInternalName+";"); mv.visitTypeInsn(CHECKCAST, Type.getInternalName(MetaDataBeanAware.class)); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(MetaDataBeanAware.class), "setMetaDataBean", "(Ljava/lang/Object;)V"); mv.visitLabel(not_aware); } } }