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.pentaho.reportdesigner.lib.client.util.UncaughtExcpetionsModel;
022:
023: /**
024: * User: Martin
025: * Date: 26.07.2006
026: * Time: 20:52:59
027: */
028: @SuppressWarnings({"HardCodedStringLiteral"})
029: public class PropertyMethodEmitterPrimitive 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: String referenceTypeString = property.getReferenceTypeString();
040:
041: if (referenceTypeString != null) {
042: if ("I".equals(typeName) || "Z".equals(typeName)
043: || "B".equals(typeName) || "C".equals(typeName)
044: || "S".equals(typeName)) {
045: createForInteger(cw, getterName, typeName,
046: classPathName, fieldName, setterName,
047: referenceTypeString);
048: } else if ("D".equals(typeName)) {
049: createForDouble(cw, getterName, typeName,
050: classPathName, fieldName, setterName,
051: referenceTypeString);
052: } else if ("F".equals(typeName)) {
053: createForFloat(cw, getterName, typeName, classPathName,
054: fieldName, setterName, referenceTypeString);
055: } else if ("J".equals(typeName)) {
056: createForLong(cw, getterName, typeName, classPathName,
057: fieldName, setterName, referenceTypeString);
058: } else {
059: //noinspection ThrowableInstanceNeverThrown
060: UncaughtExcpetionsModel.getInstance().addException(
061: new Throwable("Unsupported type "
062: + classPathName + ", "
063: + property.getName() + ", " + typeName
064: + ", " + referenceTypeString));
065: }
066: }
067:
068: }
069:
070: private void createForInteger(@NotNull
071: ClassWriter cw, @NotNull
072: String getterName, @NotNull
073: String typeName, @NotNull
074: String classPathName, @NotNull
075: String fieldName, @NotNull
076: String setterName, @NotNull
077: String referenceTypeString) {
078: MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC,
079: getterName, "()" + typeName, null, null);
080: mv.visitCode();
081: mv.visitVarInsn(Opcodes.ALOAD, 0);
082: mv.visitFieldInsn(Opcodes.GETFIELD, classPathName, fieldName,
083: typeName);
084: mv.visitInsn(Opcodes.IRETURN);
085: mv.visitMaxs(1, 1);
086: mv.visitEnd();
087:
088: mv = cw.visitMethod(Opcodes.ACC_PUBLIC, setterName, "("
089: + typeName + ")V", null, null);
090: mv.visitCode();
091: mv.visitVarInsn(Opcodes.ALOAD, 0);
092: mv.visitFieldInsn(Opcodes.GETFIELD, classPathName, fieldName,
093: typeName);
094: mv.visitVarInsn(Opcodes.ISTORE, 2);
095: mv.visitVarInsn(Opcodes.ALOAD, 0);
096: mv.visitVarInsn(Opcodes.ILOAD, 1);
097: mv.visitFieldInsn(Opcodes.PUTFIELD, classPathName, fieldName,
098: typeName);
099: mv.visitVarInsn(Opcodes.ALOAD, 0);
100: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
101: "getUndo", "()L" + FunctionGenerator.UNDO_CLASS_PATH
102: + ";");
103: Label l0 = new Label();
104: mv.visitJumpInsn(Opcodes.IFNULL, l0);
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, "isInProgress",
111: "()Z");
112: mv.visitJumpInsn(Opcodes.IFNE, l0);
113: mv.visitVarInsn(Opcodes.ALOAD, 0);
114: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
115: "getUndo", "()L" + FunctionGenerator.UNDO_CLASS_PATH
116: + ";");
117: mv.visitLdcInsn(fieldName);
118: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
119: FunctionGenerator.UNDO_CLASS_PATH, "startTransaction",
120: "(Ljava/lang/String;)V");
121: mv.visitVarInsn(Opcodes.ALOAD, 0);
122: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
123: "getUndo", "()L" + FunctionGenerator.UNDO_CLASS_PATH
124: + ";");
125: mv.visitTypeInsn(Opcodes.NEW,
126: FunctionGenerator.REFLECTION_UNDO_ENTRY_CLASS_PATH);
127: mv.visitInsn(Opcodes.DUP);
128: mv.visitVarInsn(Opcodes.ALOAD, 0);
129: mv.visitLdcInsn(setterName);
130: mv.visitFieldInsn(Opcodes.GETSTATIC, referenceTypeString,
131: "TYPE", "Ljava/lang/Class;");
132: mv.visitVarInsn(Opcodes.ILOAD, 2);
133: mv.visitMethodInsn(Opcodes.INVOKESTATIC, referenceTypeString,
134: "valueOf", "(" + typeName + ")L" + referenceTypeString
135: + ";");
136: mv.visitVarInsn(Opcodes.ILOAD, 1);
137: mv.visitMethodInsn(Opcodes.INVOKESTATIC, referenceTypeString,
138: "valueOf", "(" + typeName + ")L" + referenceTypeString
139: + ";");
140: mv
141: .visitMethodInsn(
142: Opcodes.INVOKESPECIAL,
143: FunctionGenerator.REFLECTION_UNDO_ENTRY_CLASS_PATH,
144: "<init>",
145: "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/Object;)V");
146: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
147: FunctionGenerator.UNDO_CLASS_PATH, "add", "(L"
148: + FunctionGenerator.UNDO_ENTRY_CLASS_PATH
149: + ";)V");
150: mv.visitVarInsn(Opcodes.ALOAD, 0);
151: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
152: "getUndo", "()L" + FunctionGenerator.UNDO_CLASS_PATH
153: + ";");
154: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
155: FunctionGenerator.UNDO_CLASS_PATH, "endTransaction",
156: "()V");
157: mv.visitLabel(l0);
158: mv.visitVarInsn(Opcodes.ALOAD, 0);
159: mv.visitLdcInsn(fieldName);
160: mv.visitVarInsn(Opcodes.ILOAD, 2);
161: mv.visitMethodInsn(Opcodes.INVOKESTATIC, referenceTypeString,
162: "valueOf", "(" + typeName + ")L" + referenceTypeString
163: + ";");
164: mv.visitVarInsn(Opcodes.ILOAD, 1);
165: mv.visitMethodInsn(Opcodes.INVOKESTATIC, referenceTypeString,
166: "valueOf", "(" + typeName + ")L" + referenceTypeString
167: + ";");
168: mv
169: .visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
170: "firePropertyChange",
171: "(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V");
172: mv.visitInsn(Opcodes.RETURN);
173: mv.visitMaxs(8, 3);
174: mv.visitEnd();
175: }
176:
177: private void createForFloat(@NotNull
178: ClassWriter cw, @NotNull
179: String getterName, @NotNull
180: String typeName, @NotNull
181: String classPathName, @NotNull
182: String fieldName, @NotNull
183: String setterName, @NotNull
184: String referenceTypeString) {
185: MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC,
186: getterName, "()" + typeName, null, null);
187: mv.visitCode();
188: mv.visitVarInsn(Opcodes.ALOAD, 0);
189: mv.visitFieldInsn(Opcodes.GETFIELD, classPathName, fieldName,
190: typeName);
191: mv.visitInsn(Opcodes.FRETURN);
192: mv.visitMaxs(1, 1);
193: mv.visitEnd();
194:
195: mv = cw.visitMethod(Opcodes.ACC_PUBLIC, setterName, "("
196: + typeName + ")V", null, null);
197: mv.visitCode();
198: mv.visitVarInsn(Opcodes.ALOAD, 0);
199: mv.visitFieldInsn(Opcodes.GETFIELD, classPathName, fieldName,
200: typeName);
201: mv.visitVarInsn(Opcodes.FSTORE, 2);
202: mv.visitVarInsn(Opcodes.ALOAD, 0);
203: mv.visitVarInsn(Opcodes.FLOAD, 1);
204: mv.visitFieldInsn(Opcodes.PUTFIELD, classPathName, fieldName,
205: typeName);
206: mv.visitVarInsn(Opcodes.ALOAD, 0);
207: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
208: "getUndo", "()L" + FunctionGenerator.UNDO_CLASS_PATH
209: + ";");
210: Label l0 = new Label();
211: mv.visitJumpInsn(Opcodes.IFNULL, l0);
212: mv.visitVarInsn(Opcodes.ALOAD, 0);
213: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
214: "getUndo", "()L" + FunctionGenerator.UNDO_CLASS_PATH
215: + ";");
216: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
217: FunctionGenerator.UNDO_CLASS_PATH, "isInProgress",
218: "()Z");
219: mv.visitJumpInsn(Opcodes.IFNE, l0);
220: mv.visitVarInsn(Opcodes.ALOAD, 0);
221: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
222: "getUndo", "()L" + FunctionGenerator.UNDO_CLASS_PATH
223: + ";");
224: mv.visitLdcInsn(fieldName);
225: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
226: FunctionGenerator.UNDO_CLASS_PATH, "startTransaction",
227: "(Ljava/lang/String;)V");
228: mv.visitVarInsn(Opcodes.ALOAD, 0);
229: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
230: "getUndo", "()L" + FunctionGenerator.UNDO_CLASS_PATH
231: + ";");
232: mv.visitTypeInsn(Opcodes.NEW,
233: FunctionGenerator.REFLECTION_UNDO_ENTRY_CLASS_PATH);
234: mv.visitInsn(Opcodes.DUP);
235: mv.visitVarInsn(Opcodes.ALOAD, 0);
236: mv.visitLdcInsn(setterName);
237: mv.visitFieldInsn(Opcodes.GETSTATIC, referenceTypeString,
238: "TYPE", "Ljava/lang/Class;");
239: mv.visitVarInsn(Opcodes.FLOAD, 2);
240: mv.visitMethodInsn(Opcodes.INVOKESTATIC, referenceTypeString,
241: "valueOf", "(" + typeName + ")L" + referenceTypeString
242: + ";");
243: mv.visitVarInsn(Opcodes.FLOAD, 1);
244: mv.visitMethodInsn(Opcodes.INVOKESTATIC, referenceTypeString,
245: "valueOf", "(" + typeName + ")L" + referenceTypeString
246: + ";");
247: mv
248: .visitMethodInsn(
249: Opcodes.INVOKESPECIAL,
250: FunctionGenerator.REFLECTION_UNDO_ENTRY_CLASS_PATH,
251: "<init>",
252: "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/Object;)V");
253: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
254: FunctionGenerator.UNDO_CLASS_PATH, "add", "(L"
255: + FunctionGenerator.UNDO_ENTRY_CLASS_PATH
256: + ";)V");
257: mv.visitVarInsn(Opcodes.ALOAD, 0);
258: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
259: "getUndo", "()L" + FunctionGenerator.UNDO_CLASS_PATH
260: + ";");
261: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
262: FunctionGenerator.UNDO_CLASS_PATH, "endTransaction",
263: "()V");
264: mv.visitLabel(l0);
265: mv.visitVarInsn(Opcodes.ALOAD, 0);
266: mv.visitLdcInsn(fieldName);
267: mv.visitVarInsn(Opcodes.FLOAD, 2);
268: mv.visitMethodInsn(Opcodes.INVOKESTATIC, referenceTypeString,
269: "valueOf", "(" + typeName + ")L" + referenceTypeString
270: + ";");
271: mv.visitVarInsn(Opcodes.FLOAD, 1);
272: mv.visitMethodInsn(Opcodes.INVOKESTATIC, referenceTypeString,
273: "valueOf", "(" + typeName + ")L" + referenceTypeString
274: + ";");
275: mv
276: .visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
277: "firePropertyChange",
278: "(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V");
279: mv.visitInsn(Opcodes.RETURN);
280: mv.visitMaxs(8, 3);
281: mv.visitEnd();
282: }
283:
284: private void createForDouble(@NotNull
285: ClassWriter cw, @NotNull
286: String getterName, @NotNull
287: String typeName, @NotNull
288: String classPathName, @NotNull
289: String fieldName, @NotNull
290: String setterName, @NotNull
291: String referenceTypeString) {
292: MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC,
293: getterName, "()" + typeName, null, null);
294: mv.visitCode();
295: mv.visitVarInsn(Opcodes.ALOAD, 0);
296: mv.visitFieldInsn(Opcodes.GETFIELD, classPathName, fieldName,
297: typeName);
298: mv.visitInsn(Opcodes.DRETURN);
299: mv.visitMaxs(2, 1);
300: mv.visitEnd();
301:
302: mv = cw.visitMethod(Opcodes.ACC_PUBLIC, setterName, "("
303: + typeName + ")V", null, null);
304: mv.visitCode();
305: mv.visitVarInsn(Opcodes.ALOAD, 0);
306: mv.visitFieldInsn(Opcodes.GETFIELD, classPathName, fieldName,
307: typeName);
308: mv.visitVarInsn(Opcodes.DSTORE, 3);
309: mv.visitVarInsn(Opcodes.ALOAD, 0);
310: mv.visitVarInsn(Opcodes.DLOAD, 1);
311: mv.visitFieldInsn(Opcodes.PUTFIELD, classPathName, fieldName,
312: typeName);
313: mv.visitVarInsn(Opcodes.ALOAD, 0);
314: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
315: "getUndo", "()L" + FunctionGenerator.UNDO_CLASS_PATH
316: + ";");
317: Label l0 = new Label();
318: mv.visitJumpInsn(Opcodes.IFNULL, l0);
319: mv.visitVarInsn(Opcodes.ALOAD, 0);
320: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
321: "getUndo", "()L" + FunctionGenerator.UNDO_CLASS_PATH
322: + ";");
323: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
324: FunctionGenerator.UNDO_CLASS_PATH, "isInProgress",
325: "()Z");
326: mv.visitJumpInsn(Opcodes.IFNE, l0);
327: mv.visitVarInsn(Opcodes.ALOAD, 0);
328: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
329: "getUndo", "()L" + FunctionGenerator.UNDO_CLASS_PATH
330: + ";");
331: mv.visitLdcInsn(fieldName);
332: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
333: FunctionGenerator.UNDO_CLASS_PATH, "startTransaction",
334: "(Ljava/lang/String;)V");
335: mv.visitVarInsn(Opcodes.ALOAD, 0);
336: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
337: "getUndo", "()L" + FunctionGenerator.UNDO_CLASS_PATH
338: + ";");
339: mv.visitTypeInsn(Opcodes.NEW,
340: FunctionGenerator.REFLECTION_UNDO_ENTRY_CLASS_PATH);
341: mv.visitInsn(Opcodes.DUP);
342: mv.visitVarInsn(Opcodes.ALOAD, 0);
343: mv.visitLdcInsn(setterName);
344: mv.visitFieldInsn(Opcodes.GETSTATIC, referenceTypeString,
345: "TYPE", "Ljava/lang/Class;");
346: mv.visitVarInsn(Opcodes.DLOAD, 3);
347: mv.visitMethodInsn(Opcodes.INVOKESTATIC, referenceTypeString,
348: "valueOf", "(" + typeName + ")L" + referenceTypeString
349: + ";");
350: mv.visitVarInsn(Opcodes.DLOAD, 1);
351: mv.visitMethodInsn(Opcodes.INVOKESTATIC, referenceTypeString,
352: "valueOf", "(" + typeName + ")L" + referenceTypeString
353: + ";");
354: mv
355: .visitMethodInsn(
356: Opcodes.INVOKESPECIAL,
357: FunctionGenerator.REFLECTION_UNDO_ENTRY_CLASS_PATH,
358: "<init>",
359: "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/Object;)V");
360: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
361: FunctionGenerator.UNDO_CLASS_PATH, "add", "(L"
362: + FunctionGenerator.UNDO_ENTRY_CLASS_PATH
363: + ";)V");
364: mv.visitVarInsn(Opcodes.ALOAD, 0);
365: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
366: "getUndo", "()L" + FunctionGenerator.UNDO_CLASS_PATH
367: + ";");
368: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
369: FunctionGenerator.UNDO_CLASS_PATH, "endTransaction",
370: "()V");
371: mv.visitLabel(l0);
372: mv.visitVarInsn(Opcodes.ALOAD, 0);
373: mv.visitLdcInsn(fieldName);
374: mv.visitVarInsn(Opcodes.DLOAD, 3);
375: mv.visitMethodInsn(Opcodes.INVOKESTATIC, referenceTypeString,
376: "valueOf", "(" + typeName + ")L" + referenceTypeString
377: + ";");
378: mv.visitVarInsn(Opcodes.DLOAD, 1);
379: mv.visitMethodInsn(Opcodes.INVOKESTATIC, referenceTypeString,
380: "valueOf", "(" + typeName + ")L" + referenceTypeString
381: + ";");
382: mv
383: .visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
384: "firePropertyChange",
385: "(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V");
386: mv.visitInsn(Opcodes.RETURN);
387: mv.visitMaxs(9, 5);
388: mv.visitEnd();
389: }
390:
391: private void createForLong(@NotNull
392: ClassWriter cw, @NotNull
393: String getterName, @NotNull
394: String typeName, @NotNull
395: String classPathName, @NotNull
396: String fieldName, @NotNull
397: String setterName, @NotNull
398: String referenceTypeString) {
399: MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC,
400: getterName, "()" + typeName, null, null);
401: mv.visitCode();
402: mv.visitVarInsn(Opcodes.ALOAD, 0);
403: mv.visitFieldInsn(Opcodes.GETFIELD, classPathName, fieldName,
404: typeName);
405: mv.visitInsn(Opcodes.LRETURN);
406: mv.visitMaxs(2, 1);
407: mv.visitEnd();
408:
409: mv = cw.visitMethod(Opcodes.ACC_PUBLIC, setterName, "("
410: + typeName + ")V", null, null);
411: mv.visitCode();
412: mv.visitVarInsn(Opcodes.ALOAD, 0);
413: mv.visitFieldInsn(Opcodes.GETFIELD, classPathName, fieldName,
414: typeName);
415: mv.visitVarInsn(Opcodes.LSTORE, 3);
416: mv.visitVarInsn(Opcodes.ALOAD, 0);
417: mv.visitVarInsn(Opcodes.LLOAD, 1);
418: mv.visitFieldInsn(Opcodes.PUTFIELD, classPathName, fieldName,
419: typeName);
420: mv.visitVarInsn(Opcodes.ALOAD, 0);
421: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
422: "getUndo", "()L" + FunctionGenerator.UNDO_CLASS_PATH
423: + ";");
424: Label l0 = new Label();
425: mv.visitJumpInsn(Opcodes.IFNULL, l0);
426: mv.visitVarInsn(Opcodes.ALOAD, 0);
427: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
428: "getUndo", "()L" + FunctionGenerator.UNDO_CLASS_PATH
429: + ";");
430: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
431: FunctionGenerator.UNDO_CLASS_PATH, "isInProgress",
432: "()Z");
433: mv.visitJumpInsn(Opcodes.IFNE, l0);
434: mv.visitVarInsn(Opcodes.ALOAD, 0);
435: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
436: "getUndo", "()L" + FunctionGenerator.UNDO_CLASS_PATH
437: + ";");
438: mv.visitLdcInsn(fieldName);
439: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
440: FunctionGenerator.UNDO_CLASS_PATH, "startTransaction",
441: "(Ljava/lang/String;)V");
442: mv.visitVarInsn(Opcodes.ALOAD, 0);
443: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
444: "getUndo", "()L" + FunctionGenerator.UNDO_CLASS_PATH
445: + ";");
446: mv.visitTypeInsn(Opcodes.NEW,
447: FunctionGenerator.REFLECTION_UNDO_ENTRY_CLASS_PATH);
448: mv.visitInsn(Opcodes.DUP);
449: mv.visitVarInsn(Opcodes.ALOAD, 0);
450: mv.visitLdcInsn(setterName);
451: mv.visitFieldInsn(Opcodes.GETSTATIC, referenceTypeString,
452: "TYPE", "Ljava/lang/Class;");
453: mv.visitVarInsn(Opcodes.LLOAD, 3);
454: mv.visitMethodInsn(Opcodes.INVOKESTATIC, referenceTypeString,
455: "valueOf", "(" + typeName + ")L" + referenceTypeString
456: + ";");
457: mv.visitVarInsn(Opcodes.LLOAD, 1);
458: mv.visitMethodInsn(Opcodes.INVOKESTATIC, referenceTypeString,
459: "valueOf", "(" + typeName + ")L" + referenceTypeString
460: + ";");
461: mv
462: .visitMethodInsn(
463: Opcodes.INVOKESPECIAL,
464: FunctionGenerator.REFLECTION_UNDO_ENTRY_CLASS_PATH,
465: "<init>",
466: "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/Object;)V");
467: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
468: FunctionGenerator.UNDO_CLASS_PATH, "add", "(L"
469: + FunctionGenerator.UNDO_ENTRY_CLASS_PATH
470: + ";)V");
471: mv.visitVarInsn(Opcodes.ALOAD, 0);
472: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
473: "getUndo", "()L" + FunctionGenerator.UNDO_CLASS_PATH
474: + ";");
475: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
476: FunctionGenerator.UNDO_CLASS_PATH, "endTransaction",
477: "()V");
478: mv.visitLabel(l0);
479: mv.visitVarInsn(Opcodes.ALOAD, 0);
480: mv.visitLdcInsn(fieldName);
481: mv.visitVarInsn(Opcodes.LLOAD, 3);
482: mv.visitMethodInsn(Opcodes.INVOKESTATIC, referenceTypeString,
483: "valueOf", "(" + typeName + ")L" + referenceTypeString
484: + ";");
485: mv.visitVarInsn(Opcodes.LLOAD, 1);
486: mv.visitMethodInsn(Opcodes.INVOKESTATIC, referenceTypeString,
487: "valueOf", "(" + typeName + ")L" + referenceTypeString
488: + ";");
489: mv
490: .visitMethodInsn(Opcodes.INVOKEVIRTUAL, classPathName,
491: "firePropertyChange",
492: "(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V");
493: mv.visitInsn(Opcodes.RETURN);
494: mv.visitMaxs(9, 5);
495: mv.visitEnd();
496: }
497: }
|