home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 1999 March / maximum-cd-1999-03.iso / Feature / Lotus / ORGANIZE / COMPNENT / LTOUIN21.ZIP / sunw / demo / classfile / EncapsulatedEventAdaptorClassFile.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-03-12  |  9.3 KB  |  336 lines

  1. package sunw.demo.classfile;
  2.  
  3. import java.io.IOException;
  4. import java.io.OutputStream;
  5. import java.lang.reflect.Method;
  6. import sun.beans.ole.event.EncapsulatedEventAdaptorGenerator;
  7.  
  8. public final class EncapsulatedEventAdaptorClassFile {
  9.    private static String superClassName = "sun.beans.ole.event.EncapsulatedEventAdaptor";
  10.    private String listenerName;
  11.    private Class listenerClass;
  12.    private String adaptorName;
  13.    private ClassFile classFile;
  14.    private Method[] listenerMethods;
  15.    private StringConstant listenerNameConst;
  16.    private FieldConstant methodsField;
  17.    private FieldConstant clazzField;
  18.    private MethodConstant fireMethod;
  19.    private MethodConstant crackedFireMethod;
  20.    private MethodConstant forNameMethod;
  21.    private MethodConstant getMethodsMethod;
  22.    // $FF: synthetic field
  23.    static Class class$java$util$EventObject;
  24.  
  25.    public EncapsulatedEventAdaptorClassFile(String var1, OutputStream var2) throws IOException, ClassNotFoundException {
  26.       this.adaptorName = var1;
  27.       this.listenerName = EncapsulatedEventAdaptorGenerator.getBaseNameFromAdaptorName(var1);
  28.       this.listenerClass = Class.forName(this.listenerName);
  29.       this.listenerMethods = this.listenerClass.getMethods();
  30.       this.classFile = new ClassFile(var1, superClassName);
  31.       this.generateClassSundries();
  32.       this.generateInitializer();
  33.       this.generateConstructor();
  34.       this.generateListenerMethods();
  35.       this.write(var2);
  36.    }
  37.  
  38.    public EncapsulatedEventAdaptorClassFile(String var1, Class var2, OutputStream var3) throws IOException, ClassNotFoundException {
  39.       this.adaptorName = var1;
  40.       this.listenerName = var2.getName();
  41.       this.listenerClass = var2;
  42.       this.listenerMethods = var2.getMethods();
  43.       this.classFile = new ClassFile(var1, superClassName);
  44.       this.generateClassSundries();
  45.       this.generateInitializer();
  46.       this.generateConstructor();
  47.       this.generateListenerMethods();
  48.       this.write(var3);
  49.    }
  50.  
  51.    // $FF: synthetic method
  52.    static Class class$(String var0) {
  53.       try {
  54.          return Class.forName(var0);
  55.       } catch (ClassNotFoundException var2) {
  56.          throw new NoClassDefFoundError(((Throwable)var2).getMessage());
  57.       }
  58.    }
  59.  
  60.    private boolean debug() {
  61.       return false;
  62.    }
  63.  
  64.    private void generateClassSundries() {
  65.       this.classFile.addInterface(ClassFile.fullyQualifiedForm(this.listenerName));
  66.       this.listenerNameConst = this.classFile.addStringConstant(this.listenerName);
  67.       this.classFile.addFieldDesc(new FieldDesc("methods", "[Ljava/lang/reflect/Method;", (short)10, this.classFile, (Attribute[])null));
  68.       this.methodsField = this.classFile.addFieldConstant(this.adaptorName, "methods", "[Ljava/lang/reflect/Method;");
  69.       this.getMethodsMethod = this.classFile.addMethodConstant("java/lang/Class", "getMethods", "()[Ljava/lang/reflect/Method;");
  70.       this.forNameMethod = this.classFile.addMethodConstant("java/lang/Class", "forName", "(Ljava/lang/String;)Ljava/lang/Class;");
  71.       this.classFile.addFieldDesc(new FieldDesc("clazz", "Ljava/lang/Class;", (short)10, this.classFile, (Attribute[])null));
  72.       this.clazzField = this.classFile.addFieldConstant(this.adaptorName, "clazz", "Ljava/lang/Class;");
  73.       this.fireMethod = this.classFile.addMethodConstant(this.adaptorName, "fire", "(Ljava/util/EventObject;Ljava/lang/reflect/Method;)V");
  74.       this.crackedFireMethod = this.classFile.addMethodConstant(this.adaptorName, "fire", "([Ljava/lang/Object;Ljava/lang/reflect/Method;)V");
  75.       Code var1 = new Code(this.classFile, (short)1, (short)2);
  76.       var1.addOpShort((byte)-78, this.clazzField.getConstantPoolIndex());
  77.       var1.addOp((byte)-80);
  78.       Code[] var2 = new Code[]{var1};
  79.       this.classFile.addMethodDesc(new MethodDesc("getListenerClass", "()Ljava/lang/Class;", (short)1, this.classFile, var2));
  80.    }
  81.  
  82.    private void generateConstructor() {
  83.       Code var1 = new Code(this.classFile, (short)1, (short)2);
  84.       Code[] var2 = new Code[]{var1};
  85.       MethodConstant var3 = this.classFile.addMethodConstant(ClassFile.fullyQualifiedForm(superClassName), "<init>", "()V");
  86.       var1.addOp((byte)42);
  87.       var1.addOpShort((byte)-73, ((ConstantPoolEntry)var3).getConstantPoolIndex());
  88.       var1.addOp((byte)-79);
  89.       this.classFile.addMethodDesc(new MethodDesc("<init>", "()V", (short)1, this.classFile, var2));
  90.    }
  91.  
  92.    private void generateCrackedListenerMethodStub(Method var1, Class[] var2, Class[] var3, int var4) {
  93.       Code var5 = new Code(this.classFile, (short)(var2.length * 2 + 1), (short)9);
  94.       String var7 = "";
  95.       var5.addOp((byte)42);
  96.       if (var2.length <= 255) {
  97.          var5.addOp1((byte)16, (byte)var2.length);
  98.       } else {
  99.          short var9 = this.classFile.addIntegerConstant(var2.length).getConstantPoolIndex();
  100.          if (var9 <= 255) {
  101.             var5.addOp1((byte)18, (byte)var9);
  102.          } else {
  103.             var5.addOpShort((byte)19, var9);
  104.          }
  105.       }
  106.  
  107.       var5.addOpShort((byte)-67, this.classFile.addClassConstant("java.lang.Object").getConstantPoolIndex());
  108.       int var12 = 1;
  109.  
  110.       boolean var8;
  111.       for(int var10 = 0; var10 < var2.length; var12 += var8 ? 2 : 1) {
  112.          var5.addOp((byte)89);
  113.          if (var12 <= 255) {
  114.             var5.addOp1((byte)16, (byte)var10);
  115.          } else {
  116.             short var11 = this.classFile.addIntegerConstant(var10).getConstantPoolIndex();
  117.             if (var11 < 255) {
  118.                var5.addOp1((byte)18, (byte)var11);
  119.             } else {
  120.                var5.addOpShort((byte)19, var11);
  121.             }
  122.          }
  123.  
  124.          String var13 = this.processParam(var5, var2[var10], var12);
  125.          var5.addOp((byte)83);
  126.          var8 = var13.equals("J") || var13.equals("D");
  127.          var7 = var7 + var13;
  128.          ++var10;
  129.       }
  130.  
  131.       var5.addOpShort((byte)-78, this.methodsField.getConstantPoolIndex());
  132.       if (var4 <= 255) {
  133.          var5.addOp1((byte)16, (byte)var4);
  134.       } else {
  135.          short var14 = this.classFile.addIntegerConstant(var4).getConstantPoolIndex();
  136.          if (var14 <= 255) {
  137.             var5.addOp1((byte)18, (byte)var14);
  138.          } else {
  139.             var5.addOpShort((byte)19, var14);
  140.          }
  141.       }
  142.  
  143.       var5.addOp((byte)50);
  144.       var5.addOpShort((byte)-74, this.crackedFireMethod.getConstantPoolIndex());
  145.       var5.addOp((byte)-79);
  146.       Attribute[] var6;
  147.       if (var3 != null && var3.length > 0) {
  148.          var6 = new Attribute[]{null, new Exceptions(var3, this.classFile)};
  149.       } else {
  150.          var6 = new Attribute[1];
  151.       }
  152.  
  153.       var6[0] = var5;
  154.       this.classFile.addMethodDesc(new MethodDesc(var1.getName(), "(" + var7 + ")V", (short)(var1.getModifiers() & -1025), this.classFile, var6));
  155.    }
  156.  
  157.    private void generateInitializer() {
  158.       Code var1 = new Code(this.classFile, (short)0, (short)3);
  159.       Code[] var2 = new Code[]{var1};
  160.       short var3 = this.listenerNameConst.getConstantPoolIndex();
  161.       if (var3 <= 255) {
  162.          var1.addOp1((byte)18, (byte)var3);
  163.       } else {
  164.          var1.addOpShort((byte)19, var3);
  165.       }
  166.  
  167.       var1.addOpShort((byte)-72, this.forNameMethod.getConstantPoolIndex());
  168.       var1.addOp((byte)89);
  169.       var1.addOpShort((byte)-77, this.clazzField.getConstantPoolIndex());
  170.       var1.addOpShort((byte)-74, this.getMethodsMethod.getConstantPoolIndex());
  171.       var1.addOpShort((byte)-77, this.methodsField.getConstantPoolIndex());
  172.       var1.addOp((byte)-79);
  173.       this.classFile.addMethodDesc(new MethodDesc("<clinit>", "()V", (short)10, this.classFile, var2));
  174.    }
  175.  
  176.    private void generateListenerMethods() {
  177.       for(int var1 = 0; var1 < this.listenerMethods.length; ++var1) {
  178.          if (!Void.TYPE.equals(this.listenerMethods[var1].getReturnType())) {
  179.             System.err.println("Detected unexpected method signature: " + this.listenerMethods[var1] + " in interface: " + this.listenerName);
  180.          } else {
  181.             Class[] var2 = this.listenerMethods[var1].getParameterTypes();
  182.             Class[] var3 = this.listenerMethods[var1].getExceptionTypes();
  183.             if (var2 != null && var2.length == 1 && (class$java$util$EventObject != null ? class$java$util$EventObject : (class$java$util$EventObject = class$("java.util.EventObject"))).isAssignableFrom(var2[0])) {
  184.                this.generateSimpleListenerMethodStub(this.listenerMethods[var1], var2[0], var3, var1);
  185.             } else {
  186.                this.generateCrackedListenerMethodStub(this.listenerMethods[var1], var2, var3, var1);
  187.             }
  188.          }
  189.       }
  190.  
  191.    }
  192.  
  193.    private void generateSimpleListenerMethodStub(Method var1, Class var2, Class[] var3, int var4) {
  194.       Code var5 = new Code(this.classFile, (short)2, (short)4);
  195.       var5.addOp((byte)42);
  196.       var5.addOp((byte)43);
  197.       var5.addOpShort((byte)-78, this.methodsField.getConstantPoolIndex());
  198.       if (var4 <= 255) {
  199.          var5.addOp1((byte)16, (byte)var4);
  200.       } else {
  201.          short var7 = this.classFile.addIntegerConstant(var4).getConstantPoolIndex();
  202.          if (var7 <= 255) {
  203.             var5.addOp1((byte)18, (byte)var7);
  204.          } else {
  205.             var5.addOpShort((byte)19, var7);
  206.          }
  207.       }
  208.  
  209.       var5.addOp((byte)50);
  210.       var5.addOpShort((byte)-74, this.fireMethod.getConstantPoolIndex());
  211.       var5.addOp((byte)-79);
  212.       Attribute[] var6;
  213.       if (var3 != null && var3.length > 0) {
  214.          var6 = new Attribute[]{null, new Exceptions(var3, this.classFile)};
  215.       } else {
  216.          var6 = new Attribute[1];
  217.       }
  218.  
  219.       var6[0] = var5;
  220.       this.classFile.addMethodDesc(new MethodDesc(var1.getName(), "(" + ClassFile.fieldType(var2.getName()) + ")V", (short)(var1.getModifiers() & -1025), this.classFile, var6));
  221.    }
  222.  
  223.    private String processParam(Code var1, Class var2, int var3) {
  224.       ClassConstant var4 = null;
  225.       MethodConstant var5 = null;
  226.       byte var6 = 25;
  227.       byte var7 = 0;
  228.       boolean var8 = true;
  229.       Class var9 = var2;
  230.  
  231.       String var12;
  232.       for(var12 = ""; var9.isArray(); var12 = var12 + "[") {
  233.          var9 = var9.getComponentType();
  234.       }
  235.  
  236.       boolean var10 = var9.isPrimitive();
  237.       boolean var11 = var2.isArray();
  238.       if (var10) {
  239.          if (var9.equals(Long.TYPE)) {
  240.             var12 = var12 + "J";
  241.             if (!var11) {
  242.                var4 = this.classFile.addClassConstant("java/lang/Long");
  243.                var5 = this.classFile.addMethodConstant("java/lang/Long", "<init>", "(J)V");
  244.                var6 = 22;
  245.                var8 = false;
  246.             }
  247.          } else if (var9.equals(Float.TYPE)) {
  248.             var12 = var12 + "F";
  249.             if (!var11) {
  250.                var4 = this.classFile.addClassConstant("java/lang/Float");
  251.                var5 = this.classFile.addMethodConstant("java/lang/Float", "<init>", "(F)V");
  252.                var6 = 23;
  253.             }
  254.          } else if (var9.equals(Double.TYPE)) {
  255.             var12 = var12 + "D";
  256.             if (!var11) {
  257.                var4 = this.classFile.addClassConstant("java/lang/Double");
  258.                var5 = this.classFile.addMethodConstant("java/lang/Double", "<init>", "(D)V");
  259.                var6 = 24;
  260.                var8 = false;
  261.             }
  262.          } else {
  263.             var6 = 21;
  264.             if (var9.equals(Boolean.TYPE)) {
  265.                var12 = var12 + "Z";
  266.                if (!var11) {
  267.                   var4 = this.classFile.addClassConstant("java/lang/Boolean");
  268.                   var5 = this.classFile.addMethodConstant("java/lang/Boolean", "<init>", "(Z)V");
  269.                   var7 = -111;
  270.                }
  271.             } else if (var9.equals(Character.TYPE)) {
  272.                var12 = var12 + "C";
  273.                if (!var11) {
  274.                   var4 = this.classFile.addClassConstant("java/lang/Character");
  275.                   var5 = this.classFile.addMethodConstant("java/lang/Character", "<init>", "(C)V");
  276.                   var7 = -110;
  277.                }
  278.             } else if (var9.equals(Byte.TYPE)) {
  279.                var12 = var12 + "B";
  280.                if (!var11) {
  281.                   var4 = this.classFile.addClassConstant("java/lang/Byte");
  282.                   var5 = this.classFile.addMethodConstant("java/lang/Character", "<init>", "(C)V");
  283.                   var7 = -111;
  284.                }
  285.             } else if (var9.equals(Short.TYPE)) {
  286.                var12 = var12 + "S";
  287.                if (!var11) {
  288.                   var4 = this.classFile.addClassConstant("java/lang/Short");
  289.                   var5 = this.classFile.addMethodConstant("java/lang/Short", "<init>", "(S)V");
  290.                   var7 = -109;
  291.                }
  292.             } else if (var9.equals(Integer.TYPE)) {
  293.                var12 = var12 + "I";
  294.                if (!var11) {
  295.                   var4 = this.classFile.addClassConstant("java/lang/Integer");
  296.                   var5 = this.classFile.addMethodConstant("java/lang/Integer", "<init>", "(I)V");
  297.                }
  298.             }
  299.          }
  300.       } else {
  301.          var12 = var12 + ClassFile.fieldType(var9.getName());
  302.       }
  303.  
  304.       if (var3 < 255) {
  305.          var1.addOp1(var6, (byte)var3);
  306.       } else {
  307.          var1.addOp((byte)-60);
  308.          var1.addOpShort(var6, (short)var3);
  309.       }
  310.  
  311.       if (var10 && !var11) {
  312.          if (var7 != 0) {
  313.             var1.addOp(var7);
  314.          }
  315.  
  316.          var1.addOpShort((byte)-69, ((ConstantPoolEntry)var4).getConstantPoolIndex());
  317.          if (var8) {
  318.             var1.addOp((byte)90);
  319.             var1.addOp((byte)95);
  320.          } else {
  321.             var1.addOp((byte)91);
  322.             var1.addOp((byte)91);
  323.             var1.addOp((byte)87);
  324.          }
  325.  
  326.          var1.addOpShort((byte)-73, ((ConstantPoolEntry)var5).getConstantPoolIndex());
  327.       }
  328.  
  329.       return var12;
  330.    }
  331.  
  332.    private void write(OutputStream var1) throws IOException {
  333.       this.classFile.write(var1);
  334.    }
  335. }
  336.