home *** CD-ROM | disk | FTP | other *** search
- package sun.rmi.rmic;
-
- import java.io.ByteArrayOutputStream;
- import java.io.DataOutputStream;
- import java.io.IOException;
- import java.security.DigestOutputStream;
- import java.security.MessageDigest;
- import java.security.NoSuchAlgorithmException;
- import java.util.Enumeration;
- import java.util.Hashtable;
- import java.util.Vector;
- import sun.tools.java.ClassDeclaration;
- import sun.tools.java.ClassDefinition;
- import sun.tools.java.ClassNotFound;
- import sun.tools.java.Constants;
- import sun.tools.java.Environment;
- import sun.tools.java.FieldDefinition;
- import sun.tools.java.Identifier;
- import sun.tools.java.Type;
- import sun.tools.javac.SourceField;
- import sun.tools.tree.LocalField;
-
- public class GenerateRemoteProxy extends ProxyNames implements Constants {
- Environment theEnv;
- ClassDefinition theCD;
- Identifier theClassName;
- Identifier theProxyName;
- Identifier thePkgName;
- // $FF: renamed from: p sun.rmi.rmic.ProxyStream
- ProxyStream field_0;
- private static final int STUB_VERSION_NUMBER = 1;
- private FieldDefinition[] remotemethods;
- private ClassDefinition[] remoteinterfaces;
-
- GenerateRemoteProxy(Environment var1, ClassDefinition var2, ProxyStream var3) {
- this.theEnv = var1;
- this.theCD = var2;
- this.field_0 = var3;
- this.theClassName = var2.getName();
- this.theProxyName = ProxyNames.proxyClassName(this.theClassName);
- this.thePkgName = this.theClassName.getQualifier();
- }
-
- private void printFormalArguments(Type[] var1, String[] var2, String var3, String var4) {
- if (var1.length != 0) {
- if (var1.length != var2.length) {
- throw new Error("internal error, printFormalArguments!");
- } else {
- for(int var5 = 0; var5 < var1.length; ++var5) {
- this.field_0.p(var1[var5].toString());
- this.field_0.p(" $" + var2[var5]);
- if (var5 < var1.length - 1) {
- this.field_0.p(var3);
- }
- }
-
- this.field_0.p(var4);
- }
- }
- }
-
- private void printActualArguments(String[] var1) {
- boolean var2 = true;
-
- for(int var3 = 0; var3 < var1.length; ++var3) {
- if (var2) {
- var2 = false;
- } else {
- this.field_0.p(", ");
- }
-
- this.field_0.p("$" + var1[var3]);
- }
-
- }
-
- private void printStubsConstructors() {
- Identifier var1 = this.theProxyName.getName();
- this.field_0.pln("// Constructors");
- this.field_0.pln("public " + var1 + "() {");
- this.field_0.pIln("super();");
- this.field_0.pOln("}");
- this.field_0.pln("public " + var1 + "(" + ProxyNames.remoteReference() + " rep) {");
- this.field_0.pIln("super(rep);");
- this.field_0.pOln("}");
- }
-
- private void printThrowSpec(ClassDeclaration[] var1) {
- for(int var2 = 0; var2 < var1.length; ++var2) {
- ClassDeclaration var3 = var1[var2];
- this.field_0.p(var3.getName().toString());
- if (var2 < var1.length - 1) {
- this.field_0.p(", ");
- }
- }
-
- }
-
- private void printCatchExceptions(Environment var1, ClassDeclaration[] var2) {
- ClassDefinition[] var3 = new ClassDefinition[var2.length];
- int var4 = 0;
-
- label59:
- for(int var5 = 0; var5 < var2.length; ++var5) {
- ClassDeclaration var6 = var2[var5];
- Object var7 = null;
-
- try {
- ClassDefinition var12 = var6.getClassDefinition(var1);
-
- for(int var8 = 0; var8 < var4; ++var8) {
- if (var3[var8].superClassOf(var1, var6)) {
- continue label59;
- }
- }
-
- int var9 = 0;
-
- while(var9 < var4) {
- if (var3[var9].subClassOf(var1, var6)) {
- --var4;
- var3[var9] = var3[var4];
- } else {
- ++var9;
- }
- }
-
- var3[var4++] = var12;
- } catch (ClassNotFound var10) {
- var1.error(0, "class.not.found", var6, (Object)null);
- }
- }
-
- boolean var11 = false;
-
- for(int var13 = 0; var13 < var4; ++var13) {
- ClassDeclaration var14 = var3[var13].getClassDeclaration();
- if (var14.getName() == Identifier.lookup("java.lang.Exception")) {
- var11 = true;
- }
-
- this.field_0.pln("} catch (" + var14.getName() + " ex) {");
- this.field_0.pIln("throw ex;");
- this.field_0.pO();
- }
-
- if (!var11) {
- this.field_0.pln("} catch (java.lang.Exception ex) {");
- this.field_0.pIln("throw new java.rmi.UnexpectedException(\"Unexpected exception\", ex);");
- }
-
- this.field_0.pOln("};");
- }
-
- private String nameFromType(Type var1, int var2) {
- String var3;
- if (var2 > 0) {
- var3 = "_" + var2;
- } else {
- var3 = new String();
- }
-
- switch (var1.getTypeCode()) {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- case 8:
- return "_" + var1.toString() + var3;
- case 9:
- Type var5 = var1.getElementType();
- return "_arrayOf_" + this.nameFromType(var5, -1) + var3;
- case 10:
- String var4 = var1.getClassName().getName().toString();
- return "_" + var4 + var3;
- case 11:
- case 12:
- case 13:
- throw new Error(var1.getTypeCode() + " type unexpected in marshalArgument");
- default:
- throw new Error("Unknown type code");
- }
- }
-
- private String[] getArgs(FieldDefinition var1) {
- if (var1 instanceof SourceField) {
- SourceField var8 = (SourceField)var1;
- Vector var9 = var8.getArguments();
- LocalField[] var10 = new LocalField[var9.size()];
- String[] var7 = new String[var10.length - 1];
- var9.copyInto(var10);
-
- for(int var6 = 1; var6 < var10.length; ++var6) {
- var7[var6 - 1] = var10[var6].getName().toString();
- }
-
- return var7;
- } else {
- Type var3 = var1.getType();
- Type[] var4 = var3.getArgumentTypes();
- String[] var2 = new String[var4.length];
-
- for(int var5 = 0; var5 < var4.length; ++var5) {
- var2[var5] = this.nameFromType(var4[var5], var5 + 1);
- }
-
- return var2;
- }
- }
-
- private void findRemoteInterfaces(Environment var1, ClassDefinition var2) {
- Hashtable var3 = new Hashtable(101);
- Vector var4 = new Vector();
-
- try {
- for(ClassDefinition var6 = var2; var6 != null && var6.getSuperClass() != null; var6 = var6.getSuperClass().getClassDefinition(var1)) {
- ClassDeclaration[] var7 = var6.getInterfaces();
-
- for(int var5 = 0; var5 < var7.length; ++var5) {
- ClassDefinition var8 = var7[var5].getClassDefinition(var1);
- if (!var4.contains(var8) && TopGRP.collectMethods(var1, var8, var3)) {
- var4.addElement(var8);
- }
- }
- }
- } catch (ClassNotFound var10) {
- var4.setSize(0);
- }
-
- this.remoteinterfaces = new ClassDefinition[var4.size()];
-
- for(int var11 = 0; var11 < var4.size(); ++var11) {
- this.remoteinterfaces[var11] = (ClassDefinition)var4.elementAt(var11);
- }
-
- String[] var14 = new String[var3.size()];
- int var15 = 0;
-
- String var9;
- int var12;
- for(Enumeration var16 = var3.keys(); var16.hasMoreElements(); var14[var12] = var9) {
- var9 = (String)var16.nextElement();
-
- for(var12 = var15; var12 > 0 && var9.compareTo(var14[var12 - 1]) < 0; --var12) {
- var14[var12] = var14[var12 - 1];
- }
-
- ++var15;
- }
-
- this.remotemethods = new FieldDefinition[var3.size()];
-
- for(int var13 = this.remotemethods.length - 1; var13 >= 0; --var13) {
- this.remotemethods[var13] = (FieldDefinition)var3.get(var14[var13]);
- }
-
- }
-
- private void printStubMethod(FieldDefinition var1, int var2) {
- Identifier var3 = var1.getName();
- Type var4 = var1.getType();
- Type[] var5 = var4.getArgumentTypes();
- String[] var6 = this.getArgs(var1);
- Type var7 = var4.getReturnType();
- ClassDeclaration[] var8 = var1.getExceptions(this.theEnv);
- this.field_0.pln("// Implementation of " + var3);
- this.field_0.p("public " + var7 + " " + var3 + "(");
- this.printFormalArguments(var5, var6, ", ", "");
- this.field_0.p(")");
- if (var8.length != 0) {
- this.field_0.p(" throws ");
- this.printThrowSpec(var8);
- }
-
- this.field_0.pln(" {");
- this.field_0.pIln("int opnum = " + var2 + ";");
- this.field_0.pln("java.rmi.server.RemoteRef sub = ref;");
- this.field_0.pln("java.rmi.server.RemoteCall call = sub.newCall((java.rmi.server.RemoteObject)this, operations, opnum, interfaceHash);");
- if (var6.length > 0) {
- this.field_0.pln("try {");
- this.field_0.pIln("java.io.ObjectOutput out = call.getOutputStream();");
- GenerateMarshaling.marshalArguments(this.field_0, "out", var5, var6);
- this.field_0.pOln("} catch (java.io.IOException ex) {");
- this.field_0.pIln("throw new java.rmi.MarshalException(\"Error marshaling arguments\", ex);");
- this.field_0.pOln("};");
- }
-
- this.field_0.pln("try {");
- this.field_0.pIln("sub.invoke(call);");
- this.field_0.pO();
- this.printCatchExceptions(this.theEnv, var8);
- if (var7.isType(11)) {
- this.field_0.pln("sub.done(call);");
- this.field_0.pln("return;");
- } else {
- this.field_0.pln(var7.toString() + " $result;");
- this.field_0.pln("try {");
- this.field_0.pIln("java.io.ObjectInput in = call.getInputStream();");
- boolean var9 = GenerateMarshaling.unmarshalArgument(this.field_0, "in", var7, "result");
- this.field_0.pOln(";");
- this.field_0.pln("} catch (java.io.IOException ex) {");
- this.field_0.pIln("throw new java.rmi.UnmarshalException(\"Error unmarshaling return\", ex);");
- if (var9) {
- this.field_0.pOln("} catch (java.lang.ClassNotFoundException ex) {");
- this.field_0.pIln("throw new java.rmi.UnmarshalException(\"Return value class not found\", ex);");
- }
-
- this.field_0.pOln("} catch (Exception ex) {");
- this.field_0.pIln("throw new java.rmi.UnexpectedException(\"Unexpected exception\", ex);");
- this.field_0.pOln("} finally {");
- this.field_0.pIln("sub.done(call);");
- this.field_0.pOln("}");
- this.field_0.pln("return $result;");
- }
-
- this.field_0.pOln("}");
- }
-
- public void printStubs() {
- this.field_0.pln("// Stub class generated by rmic, do not edit.");
- this.field_0.pln("// Contents subject to change without notice.");
- this.field_0.pln();
- if (this.theClassName.isQualified()) {
- this.field_0.pln("package " + this.theClassName.getQualifier() + ";");
- this.field_0.pln();
- }
-
- this.findRemoteInterfaces(this.theEnv, this.theCD);
- this.field_0.pln("public final class " + ProxyNames.proxyClassName(this.theClassName).getName());
- this.field_0.pIln("extends java.rmi.server.RemoteStub");
- this.field_0.p("implements ");
-
- for(int var1 = 0; var1 < this.remoteinterfaces.length; ++var1) {
- if (var1 > 0) {
- this.field_0.p(", ");
- }
-
- this.field_0.p(this.remoteinterfaces[var1].getName().toString());
- }
-
- this.field_0.pln();
- this.field_0.pOln("{");
- this.field_0.pI();
- this.printOperationDescriptor(this.remotemethods);
- this.printStubHash();
- this.printStubsConstructors();
- this.field_0.pln("// Methods from remote interfaces");
-
- for(int var2 = 0; var2 < this.remotemethods.length; ++var2) {
- this.field_0.pln();
- this.printStubMethod(this.remotemethods[var2], var2);
- }
-
- this.field_0.pOln("}");
- }
-
- private void printSkeletonFragment(FieldDefinition var1, int var2, String var3) {
- var1.getName();
- Type var4 = var1.getType();
- Type[] var5 = var4.getArgumentTypes();
- String[] var6 = this.getArgs(var1);
- Type var7 = var4.getReturnType();
- this.field_0.pln("case " + var2 + ": { // " + var1.getName().toString());
- this.field_0.pI();
- if (var6.length > 0) {
- this.printFormalArguments(var5, var6, ";\n", ";\n");
- this.field_0.pln("try {");
- this.field_0.pIln("java.io.ObjectInput in = call.getInputStream();");
- GenerateMarshaling.unmarshalArguments(this.field_0, "in", var5, var6);
- this.field_0.pOln("} catch (java.io.IOException ex) {");
- this.field_0.pIln("throw new java.rmi.UnmarshalException(\"Error unmarshaling arguments\", ex);");
- this.field_0.pOln("} finally {");
- this.field_0.pIln("call.releaseInputStream();");
- this.field_0.pOln("};");
- } else {
- this.field_0.pln("call.releaseInputStream();");
- }
-
- if (var7.isType(11)) {
- this.field_0.p("server." + var1.getName() + "(");
- this.printActualArguments(var6);
- this.field_0.pln(");");
- this.field_0.pln("try {");
- this.field_0.pIln("call.getResultStream(true);");
- this.field_0.pOln("} catch (java.io.IOException ex) {");
- this.field_0.pIln("throw new java.rmi.MarshalException(\"Error marshaling return\", ex);");
- this.field_0.pOln("};");
- } else {
- this.field_0.p(var7 + " $result = server." + var1.getName() + "(");
- this.printActualArguments(var6);
- this.field_0.pln(");");
- this.field_0.pln("try {");
- this.field_0.pIln("java.io.ObjectOutput out = call.getResultStream(true);");
- GenerateMarshaling.marshalArgument(this.field_0, "out", var7, "result");
- this.field_0.pln(";");
- this.field_0.pOln("} catch (java.io.IOException ex) {");
- this.field_0.pIln("throw new java.rmi.MarshalException(\"Error marshaling return\", ex);");
- this.field_0.pOln("};");
- }
-
- this.field_0.pln("break;");
- this.field_0.pln("}");
- this.field_0.pO();
- }
-
- public void printSkeleton() {
- ProxyNames.skeletonClassName(this.theClassName).getName();
- this.field_0.pln("// Skeleton class generated by rmic, do not edit.");
- this.field_0.pln("// Contents subject to change without notice.");
- this.field_0.pln();
- if (this.theClassName.isQualified()) {
- this.field_0.pln("package " + this.theClassName.getQualifier() + ";");
- this.field_0.pln();
- }
-
- this.findRemoteInterfaces(this.theEnv, this.theCD);
- this.field_0.pln();
- this.field_0.pln("public final class " + ProxyNames.skeletonClassName(this.theClassName).getName());
- this.field_0.pIln("extends java.lang.Object");
- this.field_0.pln("implements " + ProxyNames.skeleton());
- this.field_0.pOln("{");
- this.field_0.pI();
- this.printOperationDescriptor(this.remotemethods);
- this.printStubHash();
- this.printGetOperationsMethod();
- 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 {");
- this.field_0.pIln("// Exceptions pass through, to be caught, identified and marshalled");
- this.field_0.pln();
- this.field_0.pln("if (hash != interfaceHash)");
- this.field_0.pIln("throw new java.rmi.server.SkeletonMismatchException(\"Hash mismatch\");");
- this.field_0.pOln(this.theClassName + " server = (" + this.theClassName + ")obj;");
- this.field_0.p("switch (opnum) {");
-
- for(int var1 = 0; var1 < this.remotemethods.length; ++var1) {
- this.field_0.pln();
- this.printSkeletonFragment(this.remotemethods[var1], var1, "call");
- }
-
- this.field_0.pln("default:");
- this.field_0.pIln("throw new " + ProxyNames.remoteObjectException() + "(\"Method number out of range\");");
- this.field_0.pOln("}");
- this.field_0.pOln("}");
- this.field_0.pOln("}");
- }
-
- public void printOperationDescriptor(FieldDefinition[] var1) {
- this.field_0.pln("private static java.rmi.server.Operation[] operations = {");
- this.field_0.pI();
-
- for(int var2 = 0; var2 < var1.length; ++var2) {
- if (var2 > 0) {
- this.field_0.pln(", ");
- }
-
- this.field_0.p("new java.rmi.server.Operation(\"" + var1[var2].toString() + "\")");
- }
-
- this.field_0.pln();
- this.field_0.pOln("};");
- this.field_0.pln("");
- }
-
- public void printGetOperationsMethod() {
- this.field_0.pln("public java.rmi.server.Operation[] getOperations() { ");
- this.field_0.pI();
- this.field_0.pln("return operations;");
- this.field_0.pOln("}");
- this.field_0.pln();
- }
-
- public void printStubHash() {
- long var1 = this.computeStubHash();
- this.field_0.pln("private static final long interfaceHash = " + var1 + "L;");
- this.field_0.pln();
- }
-
- public long computeStubHash() {
- long var1 = 0L;
- ByteArrayOutputStream var3 = new ByteArrayOutputStream(512);
-
- try {
- MessageDigest var4 = MessageDigest.getInstance("SHA");
- DigestOutputStream var5 = new DigestOutputStream(var3, var4);
- DataOutputStream var6 = new DataOutputStream(var5);
- var6.writeInt(1);
-
- for(int var7 = 0; var7 < this.remotemethods.length; ++var7) {
- FieldDefinition var8 = this.remotemethods[var7];
- Identifier var9 = var8.getName();
- Type var10 = var8.getType();
- var6.writeUTF(var9.toString());
- var6.writeUTF(var10.getTypeSignature());
- ClassDeclaration[] var11 = var8.getExceptions(this.theEnv);
- this.sortClassDeclarations(var11);
-
- for(int var12 = 0; var12 < var11.length; ++var12) {
- var6.writeUTF(var11[var12].getName().toString());
- }
- }
-
- var6.flush();
- byte[] var15 = var4.digest();
-
- for(int var16 = 0; var16 < Math.min(8, var15.length); ++var16) {
- var1 += (long)(var15[var16] & 255) << var16 * 8;
- }
- } catch (IOException var13) {
- } catch (NoSuchAlgorithmException var14) {
- throw new SecurityException("error trying to compute hash: " + ((Throwable)var14).getMessage());
- }
-
- return var1;
- }
-
- public void sortClassDeclarations(ClassDeclaration[] var1) {
- for(int var2 = 1; var2 < var1.length; ++var2) {
- ClassDeclaration var3 = var1[var2];
- String var4 = var3.getName().toString();
-
- int var5;
- for(var5 = var2; var5 > 0 && var4.compareTo(var1[var5 - 1].getName().toString()) < 0; --var5) {
- var1[var5] = var1[var5 - 1];
- }
-
- var1[var5] = var3;
- }
-
- }
- }
-