home *** CD-ROM | disk | FTP | other *** search
/ Symantec Visual Cafe for Java 2.5 / symantec-visual-cafe-2.5-database-dev-edition.iso / VPage / Java.bin / CLASSES.ZIP / sun / rmi / rmic / GenerateRemoteProxy.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-07-08  |  13.8 KB  |  534 lines

  1. package sun.rmi.rmic;
  2.  
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.DataOutputStream;
  5. import java.io.IOException;
  6. import java.security.DigestOutputStream;
  7. import java.security.MessageDigest;
  8. import java.security.NoSuchAlgorithmException;
  9. import java.util.Enumeration;
  10. import java.util.Hashtable;
  11. import java.util.Vector;
  12. import sun.tools.java.ClassDeclaration;
  13. import sun.tools.java.ClassDefinition;
  14. import sun.tools.java.ClassNotFound;
  15. import sun.tools.java.Constants;
  16. import sun.tools.java.Environment;
  17. import sun.tools.java.FieldDefinition;
  18. import sun.tools.java.Identifier;
  19. import sun.tools.java.Type;
  20. import sun.tools.javac.SourceField;
  21. import sun.tools.tree.LocalField;
  22.  
  23. public class GenerateRemoteProxy extends ProxyNames implements Constants {
  24.    Environment theEnv;
  25.    ClassDefinition theCD;
  26.    Identifier theClassName;
  27.    Identifier theProxyName;
  28.    Identifier thePkgName;
  29.    // $FF: renamed from: p sun.rmi.rmic.ProxyStream
  30.    ProxyStream field_0;
  31.    private static final int STUB_VERSION_NUMBER = 1;
  32.    private FieldDefinition[] remotemethods;
  33.    private ClassDefinition[] remoteinterfaces;
  34.  
  35.    GenerateRemoteProxy(Environment var1, ClassDefinition var2, ProxyStream var3) {
  36.       this.theEnv = var1;
  37.       this.theCD = var2;
  38.       this.field_0 = var3;
  39.       this.theClassName = var2.getName();
  40.       this.theProxyName = ProxyNames.proxyClassName(this.theClassName);
  41.       this.thePkgName = this.theClassName.getQualifier();
  42.    }
  43.  
  44.    private void printFormalArguments(Type[] var1, String[] var2, String var3, String var4) {
  45.       if (var1.length != 0) {
  46.          if (var1.length != var2.length) {
  47.             throw new Error("internal error, printFormalArguments!");
  48.          } else {
  49.             for(int var5 = 0; var5 < var1.length; ++var5) {
  50.                this.field_0.p(var1[var5].toString());
  51.                this.field_0.p(" $" + var2[var5]);
  52.                if (var5 < var1.length - 1) {
  53.                   this.field_0.p(var3);
  54.                }
  55.             }
  56.  
  57.             this.field_0.p(var4);
  58.          }
  59.       }
  60.    }
  61.  
  62.    private void printActualArguments(String[] var1) {
  63.       boolean var2 = true;
  64.  
  65.       for(int var3 = 0; var3 < var1.length; ++var3) {
  66.          if (var2) {
  67.             var2 = false;
  68.          } else {
  69.             this.field_0.p(", ");
  70.          }
  71.  
  72.          this.field_0.p("$" + var1[var3]);
  73.       }
  74.  
  75.    }
  76.  
  77.    private void printStubsConstructors() {
  78.       Identifier var1 = this.theProxyName.getName();
  79.       this.field_0.pln("// Constructors");
  80.       this.field_0.pln("public " + var1 + "() {");
  81.       this.field_0.pIln("super();");
  82.       this.field_0.pOln("}");
  83.       this.field_0.pln("public " + var1 + "(" + ProxyNames.remoteReference() + " rep) {");
  84.       this.field_0.pIln("super(rep);");
  85.       this.field_0.pOln("}");
  86.    }
  87.  
  88.    private void printThrowSpec(ClassDeclaration[] var1) {
  89.       for(int var2 = 0; var2 < var1.length; ++var2) {
  90.          ClassDeclaration var3 = var1[var2];
  91.          this.field_0.p(var3.getName().toString());
  92.          if (var2 < var1.length - 1) {
  93.             this.field_0.p(", ");
  94.          }
  95.       }
  96.  
  97.    }
  98.  
  99.    private void printCatchExceptions(Environment var1, ClassDeclaration[] var2) {
  100.       ClassDefinition[] var3 = new ClassDefinition[var2.length];
  101.       int var4 = 0;
  102.  
  103.       label59:
  104.       for(int var5 = 0; var5 < var2.length; ++var5) {
  105.          ClassDeclaration var6 = var2[var5];
  106.          Object var7 = null;
  107.  
  108.          try {
  109.             ClassDefinition var12 = var6.getClassDefinition(var1);
  110.  
  111.             for(int var8 = 0; var8 < var4; ++var8) {
  112.                if (var3[var8].superClassOf(var1, var6)) {
  113.                   continue label59;
  114.                }
  115.             }
  116.  
  117.             int var9 = 0;
  118.  
  119.             while(var9 < var4) {
  120.                if (var3[var9].subClassOf(var1, var6)) {
  121.                   --var4;
  122.                   var3[var9] = var3[var4];
  123.                } else {
  124.                   ++var9;
  125.                }
  126.             }
  127.  
  128.             var3[var4++] = var12;
  129.          } catch (ClassNotFound var10) {
  130.             var1.error(0, "class.not.found", var6, (Object)null);
  131.          }
  132.       }
  133.  
  134.       boolean var11 = false;
  135.  
  136.       for(int var13 = 0; var13 < var4; ++var13) {
  137.          ClassDeclaration var14 = var3[var13].getClassDeclaration();
  138.          if (var14.getName() == Identifier.lookup("java.lang.Exception")) {
  139.             var11 = true;
  140.          }
  141.  
  142.          this.field_0.pln("} catch (" + var14.getName() + " ex) {");
  143.          this.field_0.pIln("throw ex;");
  144.          this.field_0.pO();
  145.       }
  146.  
  147.       if (!var11) {
  148.          this.field_0.pln("} catch (java.lang.Exception ex) {");
  149.          this.field_0.pIln("throw new java.rmi.UnexpectedException(\"Unexpected exception\", ex);");
  150.       }
  151.  
  152.       this.field_0.pOln("};");
  153.    }
  154.  
  155.    private String nameFromType(Type var1, int var2) {
  156.       String var3;
  157.       if (var2 > 0) {
  158.          var3 = "_" + var2;
  159.       } else {
  160.          var3 = new String();
  161.       }
  162.  
  163.       switch (var1.getTypeCode()) {
  164.          case 0:
  165.          case 1:
  166.          case 2:
  167.          case 3:
  168.          case 4:
  169.          case 5:
  170.          case 6:
  171.          case 7:
  172.          case 8:
  173.             return "_" + var1.toString() + var3;
  174.          case 9:
  175.             Type var5 = var1.getElementType();
  176.             return "_arrayOf_" + this.nameFromType(var5, -1) + var3;
  177.          case 10:
  178.             String var4 = var1.getClassName().getName().toString();
  179.             return "_" + var4 + var3;
  180.          case 11:
  181.          case 12:
  182.          case 13:
  183.             throw new Error(var1.getTypeCode() + " type unexpected in marshalArgument");
  184.          default:
  185.             throw new Error("Unknown type code");
  186.       }
  187.    }
  188.  
  189.    private String[] getArgs(FieldDefinition var1) {
  190.       if (var1 instanceof SourceField) {
  191.          SourceField var8 = (SourceField)var1;
  192.          Vector var9 = var8.getArguments();
  193.          LocalField[] var10 = new LocalField[var9.size()];
  194.          String[] var7 = new String[var10.length - 1];
  195.          var9.copyInto(var10);
  196.  
  197.          for(int var6 = 1; var6 < var10.length; ++var6) {
  198.             var7[var6 - 1] = var10[var6].getName().toString();
  199.          }
  200.  
  201.          return var7;
  202.       } else {
  203.          Type var3 = var1.getType();
  204.          Type[] var4 = var3.getArgumentTypes();
  205.          String[] var2 = new String[var4.length];
  206.  
  207.          for(int var5 = 0; var5 < var4.length; ++var5) {
  208.             var2[var5] = this.nameFromType(var4[var5], var5 + 1);
  209.          }
  210.  
  211.          return var2;
  212.       }
  213.    }
  214.  
  215.    private void findRemoteInterfaces(Environment var1, ClassDefinition var2) {
  216.       Hashtable var3 = new Hashtable(101);
  217.       Vector var4 = new Vector();
  218.  
  219.       try {
  220.          for(ClassDefinition var6 = var2; var6 != null && var6.getSuperClass() != null; var6 = var6.getSuperClass().getClassDefinition(var1)) {
  221.             ClassDeclaration[] var7 = var6.getInterfaces();
  222.  
  223.             for(int var5 = 0; var5 < var7.length; ++var5) {
  224.                ClassDefinition var8 = var7[var5].getClassDefinition(var1);
  225.                if (!var4.contains(var8) && TopGRP.collectMethods(var1, var8, var3)) {
  226.                   var4.addElement(var8);
  227.                }
  228.             }
  229.          }
  230.       } catch (ClassNotFound var10) {
  231.          var4.setSize(0);
  232.       }
  233.  
  234.       this.remoteinterfaces = new ClassDefinition[var4.size()];
  235.  
  236.       for(int var11 = 0; var11 < var4.size(); ++var11) {
  237.          this.remoteinterfaces[var11] = (ClassDefinition)var4.elementAt(var11);
  238.       }
  239.  
  240.       String[] var14 = new String[var3.size()];
  241.       int var15 = 0;
  242.  
  243.       String var9;
  244.       int var12;
  245.       for(Enumeration var16 = var3.keys(); var16.hasMoreElements(); var14[var12] = var9) {
  246.          var9 = (String)var16.nextElement();
  247.  
  248.          for(var12 = var15; var12 > 0 && var9.compareTo(var14[var12 - 1]) < 0; --var12) {
  249.             var14[var12] = var14[var12 - 1];
  250.          }
  251.  
  252.          ++var15;
  253.       }
  254.  
  255.       this.remotemethods = new FieldDefinition[var3.size()];
  256.  
  257.       for(int var13 = this.remotemethods.length - 1; var13 >= 0; --var13) {
  258.          this.remotemethods[var13] = (FieldDefinition)var3.get(var14[var13]);
  259.       }
  260.  
  261.    }
  262.  
  263.    private void printStubMethod(FieldDefinition var1, int var2) {
  264.       Identifier var3 = var1.getName();
  265.       Type var4 = var1.getType();
  266.       Type[] var5 = var4.getArgumentTypes();
  267.       String[] var6 = this.getArgs(var1);
  268.       Type var7 = var4.getReturnType();
  269.       ClassDeclaration[] var8 = var1.getExceptions(this.theEnv);
  270.       this.field_0.pln("// Implementation of " + var3);
  271.       this.field_0.p("public " + var7 + " " + var3 + "(");
  272.       this.printFormalArguments(var5, var6, ", ", "");
  273.       this.field_0.p(")");
  274.       if (var8.length != 0) {
  275.          this.field_0.p(" throws ");
  276.          this.printThrowSpec(var8);
  277.       }
  278.  
  279.       this.field_0.pln(" {");
  280.       this.field_0.pIln("int opnum = " + var2 + ";");
  281.       this.field_0.pln("java.rmi.server.RemoteRef sub = ref;");
  282.       this.field_0.pln("java.rmi.server.RemoteCall call = sub.newCall((java.rmi.server.RemoteObject)this, operations, opnum, interfaceHash);");
  283.       if (var6.length > 0) {
  284.          this.field_0.pln("try {");
  285.          this.field_0.pIln("java.io.ObjectOutput out = call.getOutputStream();");
  286.          GenerateMarshaling.marshalArguments(this.field_0, "out", var5, var6);
  287.          this.field_0.pOln("} catch (java.io.IOException ex) {");
  288.          this.field_0.pIln("throw new java.rmi.MarshalException(\"Error marshaling arguments\", ex);");
  289.          this.field_0.pOln("};");
  290.       }
  291.  
  292.       this.field_0.pln("try {");
  293.       this.field_0.pIln("sub.invoke(call);");
  294.       this.field_0.pO();
  295.       this.printCatchExceptions(this.theEnv, var8);
  296.       if (var7.isType(11)) {
  297.          this.field_0.pln("sub.done(call);");
  298.          this.field_0.pln("return;");
  299.       } else {
  300.          this.field_0.pln(var7.toString() + " $result;");
  301.          this.field_0.pln("try {");
  302.          this.field_0.pIln("java.io.ObjectInput in = call.getInputStream();");
  303.          boolean var9 = GenerateMarshaling.unmarshalArgument(this.field_0, "in", var7, "result");
  304.          this.field_0.pOln(";");
  305.          this.field_0.pln("} catch (java.io.IOException ex) {");
  306.          this.field_0.pIln("throw new java.rmi.UnmarshalException(\"Error unmarshaling return\", ex);");
  307.          if (var9) {
  308.             this.field_0.pOln("} catch (java.lang.ClassNotFoundException ex) {");
  309.             this.field_0.pIln("throw new java.rmi.UnmarshalException(\"Return value class not found\", ex);");
  310.          }
  311.  
  312.          this.field_0.pOln("} catch (Exception ex) {");
  313.          this.field_0.pIln("throw new java.rmi.UnexpectedException(\"Unexpected exception\", ex);");
  314.          this.field_0.pOln("} finally {");
  315.          this.field_0.pIln("sub.done(call);");
  316.          this.field_0.pOln("}");
  317.          this.field_0.pln("return $result;");
  318.       }
  319.  
  320.       this.field_0.pOln("}");
  321.    }
  322.  
  323.    public void printStubs() {
  324.       this.field_0.pln("// Stub class generated by rmic, do not edit.");
  325.       this.field_0.pln("// Contents subject to change without notice.");
  326.       this.field_0.pln();
  327.       if (this.theClassName.isQualified()) {
  328.          this.field_0.pln("package " + this.theClassName.getQualifier() + ";");
  329.          this.field_0.pln();
  330.       }
  331.  
  332.       this.findRemoteInterfaces(this.theEnv, this.theCD);
  333.       this.field_0.pln("public final class " + ProxyNames.proxyClassName(this.theClassName).getName());
  334.       this.field_0.pIln("extends java.rmi.server.RemoteStub");
  335.       this.field_0.p("implements ");
  336.  
  337.       for(int var1 = 0; var1 < this.remoteinterfaces.length; ++var1) {
  338.          if (var1 > 0) {
  339.             this.field_0.p(", ");
  340.          }
  341.  
  342.          this.field_0.p(this.remoteinterfaces[var1].getName().toString());
  343.       }
  344.  
  345.       this.field_0.pln();
  346.       this.field_0.pOln("{");
  347.       this.field_0.pI();
  348.       this.printOperationDescriptor(this.remotemethods);
  349.       this.printStubHash();
  350.       this.printStubsConstructors();
  351.       this.field_0.pln("// Methods from remote interfaces");
  352.  
  353.       for(int var2 = 0; var2 < this.remotemethods.length; ++var2) {
  354.          this.field_0.pln();
  355.          this.printStubMethod(this.remotemethods[var2], var2);
  356.       }
  357.  
  358.       this.field_0.pOln("}");
  359.    }
  360.  
  361.    private void printSkeletonFragment(FieldDefinition var1, int var2, String var3) {
  362.       var1.getName();
  363.       Type var4 = var1.getType();
  364.       Type[] var5 = var4.getArgumentTypes();
  365.       String[] var6 = this.getArgs(var1);
  366.       Type var7 = var4.getReturnType();
  367.       this.field_0.pln("case " + var2 + ": { // " + var1.getName().toString());
  368.       this.field_0.pI();
  369.       if (var6.length > 0) {
  370.          this.printFormalArguments(var5, var6, ";\n", ";\n");
  371.          this.field_0.pln("try {");
  372.          this.field_0.pIln("java.io.ObjectInput in = call.getInputStream();");
  373.          GenerateMarshaling.unmarshalArguments(this.field_0, "in", var5, var6);
  374.          this.field_0.pOln("} catch (java.io.IOException ex) {");
  375.          this.field_0.pIln("throw new java.rmi.UnmarshalException(\"Error unmarshaling arguments\", ex);");
  376.          this.field_0.pOln("} finally {");
  377.          this.field_0.pIln("call.releaseInputStream();");
  378.          this.field_0.pOln("};");
  379.       } else {
  380.          this.field_0.pln("call.releaseInputStream();");
  381.       }
  382.  
  383.       if (var7.isType(11)) {
  384.          this.field_0.p("server." + var1.getName() + "(");
  385.          this.printActualArguments(var6);
  386.          this.field_0.pln(");");
  387.          this.field_0.pln("try {");
  388.          this.field_0.pIln("call.getResultStream(true);");
  389.          this.field_0.pOln("} catch (java.io.IOException ex) {");
  390.          this.field_0.pIln("throw new java.rmi.MarshalException(\"Error marshaling return\", ex);");
  391.          this.field_0.pOln("};");
  392.       } else {
  393.          this.field_0.p(var7 + " $result = server." + var1.getName() + "(");
  394.          this.printActualArguments(var6);
  395.          this.field_0.pln(");");
  396.          this.field_0.pln("try {");
  397.          this.field_0.pIln("java.io.ObjectOutput out = call.getResultStream(true);");
  398.          GenerateMarshaling.marshalArgument(this.field_0, "out", var7, "result");
  399.          this.field_0.pln(";");
  400.          this.field_0.pOln("} catch (java.io.IOException ex) {");
  401.          this.field_0.pIln("throw new java.rmi.MarshalException(\"Error marshaling return\", ex);");
  402.          this.field_0.pOln("};");
  403.       }
  404.  
  405.       this.field_0.pln("break;");
  406.       this.field_0.pln("}");
  407.       this.field_0.pO();
  408.    }
  409.  
  410.    public void printSkeleton() {
  411.       ProxyNames.skeletonClassName(this.theClassName).getName();
  412.       this.field_0.pln("// Skeleton class generated by rmic, do not edit.");
  413.       this.field_0.pln("// Contents subject to change without notice.");
  414.       this.field_0.pln();
  415.       if (this.theClassName.isQualified()) {
  416.          this.field_0.pln("package " + this.theClassName.getQualifier() + ";");
  417.          this.field_0.pln();
  418.       }
  419.  
  420.       this.findRemoteInterfaces(this.theEnv, this.theCD);
  421.       this.field_0.pln();
  422.       this.field_0.pln("public final class " + ProxyNames.skeletonClassName(this.theClassName).getName());
  423.       this.field_0.pIln("extends java.lang.Object");
  424.       this.field_0.pln("implements " + ProxyNames.skeleton());
  425.       this.field_0.pOln("{");
  426.       this.field_0.pI();
  427.       this.printOperationDescriptor(this.remotemethods);
  428.       this.printStubHash();
  429.       this.printGetOperationsMethod();
  430.       this.field_0.pln("public void dispatch(java.rmi.Remote obj, java.rmi.server.RemoteCall call, int opnum, long hash) throws java.rmi.RemoteException, Exception {");
  431.       this.field_0.pIln("// Exceptions pass through, to be caught, identified and marshalled");
  432.       this.field_0.pln();
  433.       this.field_0.pln("if (hash != interfaceHash)");
  434.       this.field_0.pIln("throw new java.rmi.server.SkeletonMismatchException(\"Hash mismatch\");");
  435.       this.field_0.pOln(this.theClassName + " server = (" + this.theClassName + ")obj;");
  436.       this.field_0.p("switch (opnum) {");
  437.  
  438.       for(int var1 = 0; var1 < this.remotemethods.length; ++var1) {
  439.          this.field_0.pln();
  440.          this.printSkeletonFragment(this.remotemethods[var1], var1, "call");
  441.       }
  442.  
  443.       this.field_0.pln("default:");
  444.       this.field_0.pIln("throw new " + ProxyNames.remoteObjectException() + "(\"Method number out of range\");");
  445.       this.field_0.pOln("}");
  446.       this.field_0.pOln("}");
  447.       this.field_0.pOln("}");
  448.    }
  449.  
  450.    public void printOperationDescriptor(FieldDefinition[] var1) {
  451.       this.field_0.pln("private static java.rmi.server.Operation[] operations = {");
  452.       this.field_0.pI();
  453.  
  454.       for(int var2 = 0; var2 < var1.length; ++var2) {
  455.          if (var2 > 0) {
  456.             this.field_0.pln(", ");
  457.          }
  458.  
  459.          this.field_0.p("new java.rmi.server.Operation(\"" + var1[var2].toString() + "\")");
  460.       }
  461.  
  462.       this.field_0.pln();
  463.       this.field_0.pOln("};");
  464.       this.field_0.pln("");
  465.    }
  466.  
  467.    public void printGetOperationsMethod() {
  468.       this.field_0.pln("public java.rmi.server.Operation[] getOperations() { ");
  469.       this.field_0.pI();
  470.       this.field_0.pln("return operations;");
  471.       this.field_0.pOln("}");
  472.       this.field_0.pln();
  473.    }
  474.  
  475.    public void printStubHash() {
  476.       long var1 = this.computeStubHash();
  477.       this.field_0.pln("private static final long interfaceHash = " + var1 + "L;");
  478.       this.field_0.pln();
  479.    }
  480.  
  481.    public long computeStubHash() {
  482.       long var1 = 0L;
  483.       ByteArrayOutputStream var3 = new ByteArrayOutputStream(512);
  484.  
  485.       try {
  486.          MessageDigest var4 = MessageDigest.getInstance("SHA");
  487.          DigestOutputStream var5 = new DigestOutputStream(var3, var4);
  488.          DataOutputStream var6 = new DataOutputStream(var5);
  489.          var6.writeInt(1);
  490.  
  491.          for(int var7 = 0; var7 < this.remotemethods.length; ++var7) {
  492.             FieldDefinition var8 = this.remotemethods[var7];
  493.             Identifier var9 = var8.getName();
  494.             Type var10 = var8.getType();
  495.             var6.writeUTF(var9.toString());
  496.             var6.writeUTF(var10.getTypeSignature());
  497.             ClassDeclaration[] var11 = var8.getExceptions(this.theEnv);
  498.             this.sortClassDeclarations(var11);
  499.  
  500.             for(int var12 = 0; var12 < var11.length; ++var12) {
  501.                var6.writeUTF(var11[var12].getName().toString());
  502.             }
  503.          }
  504.  
  505.          var6.flush();
  506.          byte[] var15 = var4.digest();
  507.  
  508.          for(int var16 = 0; var16 < Math.min(8, var15.length); ++var16) {
  509.             var1 += (long)(var15[var16] & 255) << var16 * 8;
  510.          }
  511.       } catch (IOException var13) {
  512.       } catch (NoSuchAlgorithmException var14) {
  513.          throw new SecurityException("error trying to compute hash: " + ((Throwable)var14).getMessage());
  514.       }
  515.  
  516.       return var1;
  517.    }
  518.  
  519.    public void sortClassDeclarations(ClassDeclaration[] var1) {
  520.       for(int var2 = 1; var2 < var1.length; ++var2) {
  521.          ClassDeclaration var3 = var1[var2];
  522.          String var4 = var3.getName().toString();
  523.  
  524.          int var5;
  525.          for(var5 = var2; var5 > 0 && var4.compareTo(var1[var5 - 1].getName().toString()) < 0; --var5) {
  526.             var1[var5] = var1[var5 - 1];
  527.          }
  528.  
  529.          var1[var5] = var3;
  530.       }
  531.  
  532.    }
  533. }
  534.