/*
* Copyright 2001-2008 Geert Bevin (gbevin[remove] at uwyn dot com)
* Licensed under the Apache License, Version 2.0 (the "License")
* $Id: LazyLoadClassAdapter.java 3966 2008-07-31 13:16:56Z gbevin $
*/
package com.uwyn.rife.database.querymanagers.generic.instrument;
import static com.uwyn.rife.database.querymanagers.generic.instrument.LazyLoadAccessorsBytecodeTransformer.GQM_VAR_NAME;
import static com.uwyn.rife.database.querymanagers.generic.instrument.LazyLoadAccessorsBytecodeTransformer.LAZYLOADED_VAR_NAME;
import java.util.Map;
import com.uwyn.rife.asm.*;
class LazyLoadClassAdapter extends ClassAdapter implements Opcodes
{
private String mClassName = null;
private Map<String, String> mLazyLoadingMethods = null;
LazyLoadClassAdapter(Map<String, String> lazyLoadingMethods, ClassVisitor writer)
{
super(writer);
mLazyLoadingMethods = lazyLoadingMethods;
}
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions)
{
// retrieve the method from the previously detected lazy loading methods
String stored_desc = mLazyLoadingMethods.get(name);
// check if it's the same method by comparing the description
if (stored_desc != null &&
stored_desc.equals(desc))
{
return new LazyLoadMethodAdapter(mClassName, name, desc, super.visitMethod(access, name, desc, signature, exceptions));
}
return super.visitMethod(access, name, desc, signature, exceptions);
}
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces)
{
mClassName = name;
// add a member variable that will be used to store the GenericQueryManager instance in when the bean instance is retrieved
cv.visitField(ACC_PRIVATE | ACC_SYNTHETIC | ACC_TRANSIENT, GQM_VAR_NAME, "Lcom/uwyn/rife/database/querymanagers/generic/GenericQueryManager;", null, null);
// add a member variable that will be used to store the lazily loaded values of many to one properties
cv.visitField(ACC_PRIVATE | ACC_SYNTHETIC | ACC_TRANSIENT, LAZYLOADED_VAR_NAME, Type.getDescriptor(Map.class), null, null);
super.visit(version, access, name, signature, superName, interfaces);
}
}