1 package com.atlassian.sal.core.lifecycle;
2
3 import com.atlassian.sal.api.lifecycle.LifecycleAware;
4 import org.objectweb.asm.ClassWriter;
5 import org.objectweb.asm.MethodVisitor;
6 import org.objectweb.asm.Opcodes;
7
8 public class LegacyLifecycleAwareGenerator implements Opcodes {
9
10 private static byte[] generateByteCode() {
11 final ClassWriter cw = new ClassWriter(0);
12
13 cw.visit(V1_6,
14 ACC_PUBLIC + ACC_SUPER,
15 "com/atlassian/sal/core/lifecycle/LegacyLifecycleAware",
16 null,
17 "java/lang/Object",
18 new String[]{"com/atlassian/sal/api/lifecycle/LifecycleAware"});
19
20 final MethodVisitor ctor = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
21 ctor.visitCode();
22 ctor.visitVarInsn(ALOAD, 0);
23 ctor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
24 ctor.visitInsn(RETURN);
25 ctor.visitMaxs(1, 1);
26 ctor.visitEnd();
27
28 final MethodVisitor onStart = cw.visitMethod(ACC_PUBLIC, "onStart", "()V", null, null);
29 onStart.visitCode();
30 onStart.visitInsn(RETURN);
31 onStart.visitMaxs(0, 1);
32 onStart.visitEnd();
33
34 cw.visitEnd();
35
36 return cw.toByteArray();
37 }
38
39 private static class DynamicClassLoader extends ClassLoader {
40 public Class<?> define(String className, byte[] bytecode) {
41 return super.defineClass(className, bytecode, 0, bytecode.length);
42 }
43 }
44
45 @SuppressWarnings("unchecked")
46 public static LifecycleAware newInstance() throws Exception {
47 final DynamicClassLoader loader = new DynamicClassLoader();
48 return (LifecycleAware) loader.define("com.atlassian.sal.core.lifecycle.LegacyLifecycleAware", generateByteCode())
49 .newInstance();
50 }
51 }