001: /*
002: * Copyright 2006-2007 Pentaho Corporation. All rights reserved.
003: * This software was developed by Pentaho Corporation and is provided under the terms
004: * of the Mozilla Public License, Version 1.1, or any later version. You may not use
005: * this file except in compliance with the license. If you need a copy of the license,
006: * please go to http://www.mozilla.org/MPL/MPL-1.1.txt.
007: *
008: * Software distributed under the Mozilla Public License is distributed on an "AS IS"
009: * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. Please refer to
010: * the license for the specific language governing your rights and limitations.
011: *
012: * Additional Contributor(s): Martin Schmid gridvision engineering GmbH
013: */
014: package org.pentaho.reportdesigner.crm.report.model.functions;
015:
016: import org.jetbrains.annotations.NotNull;
017: import org.objectweb.asm.ClassWriter;
018: import org.objectweb.asm.Label;
019: import org.objectweb.asm.MethodVisitor;
020: import org.objectweb.asm.Opcodes;
021: import org.objectweb.asm.Type;
022:
023: /**
024: * User: Martin
025: * Date: 26.07.2006
026: * Time: 21:02:40
027: */
028: @SuppressWarnings({"HardCodedStringLiteral"})
029: public class PropertyMethodEmitterReference extends
030: PropertyMethodEmitter {
031: public void emit(@NotNull
032: ClassWriter cw, @NotNull
033: String classPathName, @NotNull
034: Property property) {
035: String typeName = property.getTypeString();
036: String getterName = property.getGetterName();
037: String setterName = property.getSetterName();
038: String fieldName = property.getName();
039:
040: MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC,
041: getterName, "()" + typeName, null, null);
042: mv.visitCode();
043: mv.visitVarInsn(Opcodes.ALOAD, 0);
044: mv.visitFieldInsn(Opcodes.GETFIELD, classPathName, fieldName,
045: typeName);
046: mv.visitInsn(Opcodes.ARETURN);
047: mv.visitMaxs(1, 1);
048: mv.visitEnd();
049:
050: mv = cw.visitMethod(Opcodes.ACC_PUBLIC, setterName, "("
051: + typeName + ")V", null, null);
052: mv.visitCode();
053: mv.visitVarInsn(Opcodes.ALOAD, 0);
054: mv.visitFieldInsn(Opcodes.GETFIELD, classPathName, fieldName,
055: typeName);
056: mv.visitVarInsn(Opcodes.ASTORE, 2);
057: mv.visitVarInsn(Opcodes.ALOAD, 0);
058: mv.visitVarInsn(Opcodes.ALOAD, 1);
059: mv.visitFieldInsn(Opcodes.PUTFIELD, classPathName, fieldName,
060: typeName);
061: mv.visitVarInsn(Opcodes.ALOAD, 0);
062: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
063: "getUndo", "()L" + FunctionGenerator.UNDO_CLASS_PATH
064: + ";");
065: Label l0 = new Label();
066: mv.visitJumpInsn(Opcodes.IFNULL, l0);
067: mv.visitVarInsn(Opcodes.ALOAD, 0);
068: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
069: "getUndo", "()L" + FunctionGenerator.UNDO_CLASS_PATH
070: + ";");
071: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
072: FunctionGenerator.UNDO_CLASS_PATH, "isInProgress",
073: "()Z");
074: mv.visitJumpInsn(Opcodes.IFNE, l0);
075: mv.visitVarInsn(Opcodes.ALOAD, 0);
076: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
077: "getUndo", "()L" + FunctionGenerator.UNDO_CLASS_PATH
078: + ";");
079: mv.visitLdcInsn(fieldName);
080: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
081: FunctionGenerator.UNDO_CLASS_PATH, "startTransaction",
082: "(Ljava/lang/String;)V");
083: mv.visitVarInsn(Opcodes.ALOAD, 0);
084: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
085: "getUndo", "()L" + FunctionGenerator.UNDO_CLASS_PATH
086: + ";");
087: mv.visitTypeInsn(Opcodes.NEW,
088: FunctionGenerator.REFLECTION_UNDO_ENTRY_CLASS_PATH);
089: mv.visitInsn(Opcodes.DUP);
090: mv.visitVarInsn(Opcodes.ALOAD, 0);
091: mv.visitLdcInsn(setterName);
092: mv.visitLdcInsn(Type.getType(typeName));
093: mv.visitVarInsn(Opcodes.ALOAD, 2);
094: mv.visitVarInsn(Opcodes.ALOAD, 1);
095: mv
096: .visitMethodInsn(
097: Opcodes.INVOKESPECIAL,
098: FunctionGenerator.REFLECTION_UNDO_ENTRY_CLASS_PATH,
099: "<init>",
100: "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/Object;)V");
101: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
102: FunctionGenerator.UNDO_CLASS_PATH, "add", "(L"
103: + FunctionGenerator.UNDO_ENTRY_CLASS_PATH
104: + ";)V");
105: mv.visitVarInsn(Opcodes.ALOAD, 0);
106: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
107: "getUndo", "()L" + FunctionGenerator.UNDO_CLASS_PATH
108: + ";");
109: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
110: FunctionGenerator.UNDO_CLASS_PATH, "endTransaction",
111: "()V");
112: mv.visitLabel(l0);
113: mv.visitVarInsn(Opcodes.ALOAD, 0);
114: mv.visitLdcInsn(fieldName);
115: mv.visitVarInsn(Opcodes.ALOAD, 2);
116: mv.visitVarInsn(Opcodes.ALOAD, 1);
117: mv
118: .visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
119: "firePropertyChange",
120: "(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V");
121: mv.visitInsn(Opcodes.RETURN);
122: mv.visitMaxs(8, 3);
123: mv.visitEnd();
124: }
125: }
|