package nebula.data.db.dao;
import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
public class DAODump implements Opcodes {
public byte[] dump() throws Exception {
String clsDao = "nebula/data/db/dao/OrderDAO1";
String clsDOHeader = "nebula/data/Order";
String clsDODetail = "nebula/data/OrderDetail";
ClassWriter cw = new ClassWriter(0);
FieldVisitor fv;
MethodVisitor mv;
AnnotationVisitor av0;
cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, clsDao, "Ljava/lang/Object;Lnebula/data/db/dao/DAO<Lnebula/data/Order;>;", "java/lang/Object",
new String[] { "nebula/data/db/dao/DAO" });
cw.visitSource("OrderDAO.java", null);
{
fv = cw.visitField(0, "conn", "Ljava/sql/Connection;", null, null);
fv.visitEnd();
}
{
mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
mv.visitCode();
Label l0 = new Label();
mv.visitLabel(l0);
mv.visitLineNumber(13, l0);
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
mv.visitInsn(RETURN);
Label l1 = new Label();
mv.visitLabel(l1);
mv.visitLocalVariable("this", "Lnebula/data/db/dao/OrderDAO;", null, l0, l1, 0);
mv.visitMaxs(1, 1);
mv.visitEnd();
}
dumpQuery(clsDao, clsDOHeader, clsDODetail, cw);
dumpGet(clsDao, clsDOHeader, clsDODetail, cw);
{
mv = cw.visitMethod(ACC_PUBLIC, "setConn", "(Ljava/sql/Connection;)V", null, null);
mv.visitCode();
Label l0 = new Label();
mv.visitLabel(l0);
mv.visitLineNumber(95, l0);
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, 1);
mv.visitFieldInsn(PUTFIELD, clsDao, "conn", "Ljava/sql/Connection;");
Label l1 = new Label();
mv.visitLabel(l1);
mv.visitLineNumber(96, l1);
mv.visitInsn(RETURN);
Label l2 = new Label();
mv.visitLabel(l2);
mv.visitLocalVariable("this", "Lnebula/data/db/dao/OrderDAO;", null, l0, l2, 0);
mv.visitLocalVariable("conn", "Ljava/sql/Connection;", null, l0, l2, 1);
mv.visitMaxs(2, 2);
mv.visitEnd();
}
{
mv = cw.visitMethod(ACC_PUBLIC + ACC_BRIDGE + ACC_SYNTHETIC, "get", "(I)Ljava/lang/Object;", null, new String[] { "java/sql/SQLException" });
mv.visitCode();
Label l0 = new Label();
mv.visitLabel(l0);
mv.visitLineNumber(1, l0);
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ILOAD, 1);
mv.visitMethodInsn(INVOKEVIRTUAL, clsDao, "get", "(I)Lnebula/data/Order;");
mv.visitInsn(ARETURN);
mv.visitMaxs(2, 2);
mv.visitEnd();
}
cw.visitEnd();
return cw.toByteArray();
}
private void dumpQuery(String clsDao, String clsDOHeader, String clsDODetail, ClassWriter cw) {
MethodVisitor mv;
int tConn = 0;
int tPstm = 1;
int tResultSet = 2;
int tDataList = 3;
int tDOHeader = 4;
int tId = 5;
int tDOIterator = 6;
int tDODetail = 7;
{
mv = cw.visitMethod(ACC_PUBLIC, "query", "()Ljava/util/List;", "()Ljava/util/List<Lnebula/data/Order;>;", new String[] { "java/sql/SQLException" });
mv.visitCode();
mv.visitTypeInsn(NEW, "java/util/ArrayList");
mv.visitInsn(DUP);
mv.visitMethodInsn(INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V");
mv.visitVarInsn(ASTORE, tDataList);
mv.visitVarInsn(ALOAD, tConn);
mv.visitFieldInsn(GETFIELD, clsDao, "conn", "Ljava/sql/Connection;");
mv.visitLdcInsn("select * from NOrder order by id");
mv.visitMethodInsn(INVOKEINTERFACE, "java/sql/Connection", "prepareStatement", "(Ljava/lang/String;)Ljava/sql/PreparedStatement;");
mv.visitVarInsn(ASTORE, tPstm);
execQuery(mv, tPstm, tResultSet);
Label checkHasRecord = new Label();
mv.visitJumpInsn(GOTO, checkHasRecord);
Label whenHasRecord = new Label();
mv.visitLabel(whenHasRecord);
{
makeDOHeader(clsDOHeader, mv, tDOHeader);
fillDOHeader(clsDOHeader, mv, tResultSet, tDOHeader);
addDataToList(mv, tDataList, tDOHeader);
}
mv.visitLabel(checkHasRecord);
mv.visitVarInsn(ALOAD, tResultSet);
mv.visitMethodInsn(INVOKEINTERFACE, "java/sql/ResultSet", "next", "()Z");
mv.visitJumpInsn(IFNE, whenHasRecord);
mv.visitVarInsn(ALOAD, tConn);
mv.visitFieldInsn(GETFIELD, clsDao, "conn", "Ljava/sql/Connection;");
mv.visitLdcInsn("select * from NOrder_Detail order by order_id,seq");
mv.visitMethodInsn(INVOKEINTERFACE, "java/sql/Connection", "prepareStatement", "(Ljava/lang/String;)Ljava/sql/PreparedStatement;");
mv.visitVarInsn(ASTORE, tPstm);
execQuery(mv, tPstm, tResultSet);
mv.visitVarInsn(ALOAD, tResultSet);
mv.visitMethodInsn(INVOKEINTERFACE, "java/sql/ResultSet", "next", "()Z");
Label whenHasnotRecord = new Label();
mv.visitJumpInsn(IFEQ, whenHasnotRecord);
{
getKeyToVar(mv, tResultSet, tId);
mv.visitVarInsn(ALOAD, tDataList);
mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "iterator", "()Ljava/util/Iterator;");
mv.visitVarInsn(ASTORE, tDOIterator);
Label checkHasMoreDetailRecord = new Label();
mv.visitJumpInsn(GOTO, checkHasMoreDetailRecord);
Label whenHasMoreDetailRecord = new Label();
mv.visitLabel(whenHasMoreDetailRecord);
{
mv.visitVarInsn(ALOAD, tDOIterator);
mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;");
mv.visitTypeInsn(CHECKCAST, clsDOHeader);
mv.visitVarInsn(ASTORE, tDOHeader);
Label checkHasMoreDO = new Label();
mv.visitJumpInsn(GOTO, checkHasMoreDO);
Label whenHasMoreDO = new Label();
mv.visitLabel(whenHasMoreDO);
makeDOHeader(clsDODetail, mv, tDODetail);
fillDODetail(clsDODetail, mv, tResultSet, tDODetail);
addDetailToHeader(clsDOHeader, mv, tDOHeader, tDODetail);
mv.visitVarInsn(ALOAD, tResultSet);
mv.visitMethodInsn(INVOKEINTERFACE, "java/sql/ResultSet", "next", "()Z");
Label whenHasMoreRecord = new Label();
mv.visitJumpInsn(IFNE, whenHasMoreRecord);
mv.visitJumpInsn(GOTO, whenHasnotRecord);
mv.visitLabel(whenHasMoreRecord);
getKeyToVar(mv, tResultSet, tId);
mv.visitLabel(checkHasMoreDO);
mv.visitVarInsn(ILOAD, tId);
mv.visitVarInsn(ALOAD, tDOHeader);
mv.visitMethodInsn(INVOKEVIRTUAL, clsDOHeader, "getId", "()I");
mv.visitJumpInsn(IF_ICMPEQ, whenHasMoreDO);
}
mv.visitLabel(checkHasMoreDetailRecord);
mv.visitVarInsn(ALOAD, tDOIterator);
mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z");
mv.visitJumpInsn(IFNE, whenHasMoreDetailRecord);
}
mv.visitLabel(whenHasnotRecord);
mv.visitVarInsn(ALOAD, tDataList);
mv.visitInsn(ARETURN);
mv.visitMaxs(tDataList, 8);
mv.visitEnd();
}
}
private void addDataToList(MethodVisitor mv, int tDataList, int tDOHeader) {
mv.visitVarInsn(ALOAD, tDataList);
mv.visitVarInsn(ALOAD, tDOHeader);
mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "add", "(Ljava/lang/Object;)Z");
mv.visitInsn(POP);
}
private void getKeyToVar(MethodVisitor mv, int tResultSet, int tId) {
mv.visitVarInsn(ALOAD, tResultSet);
mv.visitInsn(ICONST_1);
mv.visitMethodInsn(INVOKEINTERFACE, "java/sql/ResultSet", "getInt", "(I)I");
mv.visitVarInsn(ISTORE, tId);
}
private void addDetailToHeader(String clsDOHeader, MethodVisitor mv, int tDOHeader, int tDODetail) {
mv.visitVarInsn(ALOAD, tDOHeader);
mv.visitMethodInsn(INVOKEVIRTUAL, clsDOHeader, "getDetails", "()Ljava/util/List;");
mv.visitVarInsn(ALOAD, tDODetail);
mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "add", "(Ljava/lang/Object;)Z");
mv.visitInsn(POP);
}
private void makeDOHeader(String clsDOHeader, MethodVisitor mv, int tDOHeader) {
mv.visitTypeInsn(NEW, clsDOHeader);
mv.visitInsn(DUP);
mv.visitMethodInsn(INVOKESPECIAL, clsDOHeader, "<init>", "()V");
mv.visitVarInsn(ASTORE, tDOHeader);
}
private void fillDOHeader(String clsDOHeader, MethodVisitor mv, int tResultSet, int tDOHeader) {
mv.visitVarInsn(ALOAD, tDOHeader);
mv.visitVarInsn(ALOAD, tResultSet);
mv.visitInsn(ICONST_1);
mv.visitMethodInsn(INVOKEINTERFACE, "java/sql/ResultSet", "getInt", "(I)I");
mv.visitMethodInsn(INVOKEVIRTUAL, clsDOHeader, "setId", "(I)V");
}
private void dumpGet(String clsDao, String clsDOHeader, String clsDODetail, ClassWriter cw) {
MethodVisitor mv;
int tThis = 0;
int pID = 1;
int tPstm = 2;
int tResultSet = 3;
int tDOHeader = 4;
int tDODetail = 5;
//
// 0mv.visitLocalVariable("this", "Lnebula/data/db/dao/OrderDAO;", null, l0, l23, 0);
// 1mv.visitLocalVariable("id", "I", null, l0, l23, 1);
// 2mv.visitLocalVariable("psmt", "Ljava/sql/PreparedStatement;", null, l2, l23, 2);
// 3mv.visitLocalVariable("res", "Ljava/sql/ResultSet;", null, l4, l23, 3);
// 4mv.visitLocalVariable("o", "Lnebula/data/Order;", null, l1, l23, 4);
// 5mv.visitLocalVariable("od", "Lnebula/data/OrderDetail;", null, l16, l14, 5);
{
mv = cw.visitMethod(ACC_PUBLIC, "get", "(I)Lnebula/data/Order;", null, new String[] { "java/sql/SQLException" });
mv.visitCode();
Label l0 = new Label();
mv.visitLabel(l0);
mv.visitLineNumber(61, l0);
makeDOHeader(clsDOHeader, mv, tDOHeader);
mv.visitVarInsn(ALOAD, tThis);
mv.visitFieldInsn(GETFIELD, clsDao, "conn", "Ljava/sql/Connection;");
mv.visitLdcInsn("select * from NOrder where id=? order by id");
mv.visitMethodInsn(INVOKEINTERFACE, "java/sql/Connection", "prepareStatement", "(Ljava/lang/String;)Ljava/sql/PreparedStatement;");
mv.visitVarInsn(ASTORE, tPstm);
setGetKeyParameter(mv, pID, tPstm);
execQuery(mv, tPstm, tResultSet);
mv.visitVarInsn(ALOAD, tResultSet);
mv.visitMethodInsn(INVOKEINTERFACE, "java/sql/ResultSet", "next", "()Z");
Label l5 = new Label();
mv.visitJumpInsn(IFEQ, l5);
fillDOHeader(clsDOHeader, mv, tResultSet, tDOHeader);
mv.visitLabel(l5);
mv.visitLineNumber(73, l5);
mv.visitFrame(Opcodes.F_APPEND, tResultSet, new Object[] { "java/sql/PreparedStatement", "java/sql/ResultSet", clsDOHeader }, tThis, null);
mv.visitVarInsn(ALOAD, tThis);
mv.visitFieldInsn(GETFIELD, clsDao, "conn", "Ljava/sql/Connection;");
mv.visitLdcInsn("select * from NOrder_Detail where order_id=? order by order_id,seq");
mv.visitMethodInsn(INVOKEINTERFACE, "java/sql/Connection", "prepareStatement", "(Ljava/lang/String;)Ljava/sql/PreparedStatement;");
mv.visitVarInsn(ASTORE, tPstm);
setGetKeyParameter(mv, pID, tPstm);
execQuery(mv, tPstm, tResultSet);
mv.visitVarInsn(ALOAD, tResultSet);
mv.visitMethodInsn(INVOKEINTERFACE, "java/sql/ResultSet", "next", "()Z");
Label l12 = new Label();
mv.visitJumpInsn(IFEQ, l12);
Label l14 = new Label();
mv.visitJumpInsn(GOTO, l14);
Label l15 = new Label();
mv.visitLabel(l15);
mv.visitLineNumber(79, l15);
mv.visitFrame(Opcodes.F_SAME, tThis, null, tThis, null);
makeDOHeader(clsDODetail, mv, tDODetail);
fillDODetail(clsDODetail, mv, tResultSet, tDODetail);
addDetailToHeader(clsDOHeader, mv, tDOHeader, tDODetail);
mv.visitLabel(l14);
mv.visitLineNumber(78, l14);
mv.visitFrame(Opcodes.F_SAME, tThis, null, tThis, null);
mv.visitVarInsn(ALOAD, tResultSet);
mv.visitMethodInsn(INVOKEINTERFACE, "java/sql/ResultSet", "next", "()Z");
mv.visitJumpInsn(IFNE, l15);
mv.visitLabel(l12);
mv.visitLineNumber(90, l12);
mv.visitFrame(Opcodes.F_SAME, tThis, null, tThis, null);
mv.visitVarInsn(ALOAD, tDOHeader);
mv.visitInsn(ARETURN);
mv.visitMaxs(tResultSet, 6);
mv.visitEnd();
}
}
private void execQuery(MethodVisitor mv, int tPstm, int tResultSet) {
mv.visitVarInsn(ALOAD, tPstm);
mv.visitMethodInsn(INVOKEINTERFACE, "java/sql/PreparedStatement", "executeQuery", "()Ljava/sql/ResultSet;");
mv.visitVarInsn(ASTORE, tResultSet);
}
private void setGetKeyParameter(MethodVisitor mv, int pID, int tPstm) {
mv.visitVarInsn(ALOAD, tPstm);
mv.visitInsn(ICONST_1);
mv.visitVarInsn(ILOAD, pID);
mv.visitMethodInsn(INVOKEINTERFACE, "java/sql/PreparedStatement", "setInt", "(II)V");
}
private void fillDODetail(String clsDODetail, MethodVisitor mv, int tResultSet, int tDODetail) {
mv.visitVarInsn(ALOAD, tDODetail);
mv.visitVarInsn(ALOAD, tResultSet);
mv.visitInsn(ICONST_2);
mv.visitMethodInsn(INVOKEINTERFACE, "java/sql/ResultSet", "getInt", "(I)I");
mv.visitMethodInsn(INVOKEVIRTUAL, clsDODetail, "setSeq", "(I)V");
mv.visitVarInsn(ALOAD, tDODetail);
mv.visitVarInsn(ALOAD, tResultSet);
mv.visitInsn(ICONST_3);
mv.visitMethodInsn(INVOKEINTERFACE, "java/sql/ResultSet", "getInt", "(I)I");
mv.visitMethodInsn(INVOKEVIRTUAL, clsDODetail, "setPrice", "(I)V");
mv.visitVarInsn(ALOAD, tDODetail);
mv.visitVarInsn(ALOAD, tResultSet);
mv.visitInsn(ICONST_4);
mv.visitMethodInsn(INVOKEINTERFACE, "java/sql/ResultSet", "getInt", "(I)I");
mv.visitMethodInsn(INVOKEVIRTUAL, clsDODetail, "setCount", "(I)V");
mv.visitVarInsn(ALOAD, tDODetail);
mv.visitVarInsn(ALOAD, tResultSet);
mv.visitInsn(ICONST_5);
mv.visitMethodInsn(INVOKEINTERFACE, "java/sql/ResultSet", "getInt", "(I)I");
mv.visitMethodInsn(INVOKEVIRTUAL, clsDODetail, "setAmount", "(I)V");
}
}