/[classpath]/classpath/gnu/java/rmi/server/RMIHashes.java
ViewVC logotype

Diff of /classpath/gnu/java/rmi/server/RMIHashes.java

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.2 by mark, Tue Jan 22 22:26:57 2002 UTC revision 1.3 by cbj, Thu Mar 21 05:40:11 2002 UTC
# Line 39  package gnu.java.rmi.server; Line 39  package gnu.java.rmi.server;
39    
40  import java.lang.reflect.Method;  import java.lang.reflect.Method;
41  import java.lang.Class;  import java.lang.Class;
42  import gnu.java.security.provider.SHA;  import gnu.java.io.NullOutputStream;
43    import gnu.java.lang.reflect.TypeSignature;
44    import java.security.MessageDigest;
45    import java.security.DigestOutputStream;
46    import java.io.DataOutputStream;
47    import java.io.ByteArrayOutputStream;
48    
49  public class RMIHashes  public class RMIHashes
50  {  {
51      //There're other places using DigestOutputStream to generate hash in classpath, but I think the way I used
52      //here is more efficient, anyway, you can switch to DigestOutputStream by doing like "//or:" comments say.
53      
54      //or:add this statement: private static final NullOutputStream nullOutputStream = new NullOutputStream ();
55    public static long getMethodHash(Method meth)    public static long getMethodHash(Method meth)
56    {    {
57      return meth.hashCode ();      //Object Serialization Spec 8.3
58        try
59        {
60            MessageDigest md = MessageDigest.getInstance ("SHA");
61            //or:remove this statement: DigestOutputStream digest_out = new DigestOutputStream (nullOutputStream, md);
62            ByteArrayOutputStream digest_out = new ByteArrayOutputStream();
63            DataOutputStream data_out = new DataOutputStream (digest_out);
64            
65            StringBuffer sbuf = new StringBuffer();
66            sbuf.append(meth.getName());
67            sbuf.append('(');
68            Class params[] = meth.getParameterTypes();
69            for(int i = 0; i < params.length; i++)
70                sbuf.append(TypeSignature.getEncodingOfClass(params[i]));
71            sbuf.append(')');
72            Class rcls = meth.getReturnType();
73            if(rcls != Void.TYPE)
74                sbuf.append(TypeSignature.getEncodingOfClass(rcls));
75            else
76                sbuf.append('V');
77            
78            data_out.writeUTF (sbuf.toString());
79            data_out.flush();
80            data_out.close ();
81    
82            md.update(digest_out.toByteArray()); //or:remove this statement
83            byte[] sha = md.digest ();
84            long result = 0;
85            int len = sha.length < 8 ? sha.length : 8;
86            for (int i=0; i < len; i++)
87                result += (long)(sha[i] & 0xFF) << (8 * i);
88            return result;
89        }catch(Exception _){
90            return -1L;
91            }
92    }    }
93    
94    public static long getInterfaceHash(Class clazz)    public static long getInterfaceHash(Class clazz)
# Line 53  public class RMIHashes Line 96  public class RMIHashes
96      return clazz.hashCode ();      return clazz.hashCode ();
97    }    }
98  }  }
99    

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.3

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26