View Javadoc
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  }