package com.limegroup.gnutella.downloader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import java.lang.reflect.InvocationTargetException; import com.limegroup.gnutella.ErrorService; import com.limegroup.gnutella.URN; import com.limegroup.gnutella.tigertree.HashTree; import com.limegroup.gnutella.util.PrivilegedAccessor; public class TestFile { private static final int A_INT=0x4F1BBCDC; private static URN myHash = null; private static HashTree myTree = null; static { hash(); tree(); } public static byte getByte(int i) { //Generates a consistent stream of psuedorandom bytes //This has cycles, but its ok. Stolen from HashFunction. int bits = 7; long prod = (long)i * (long)A_INT; long ret = prod << 32; ret = ret >>> (32 + (32 - bits)); return (byte)ret; } public static int length() { return 1000000; //1MB; //return 100000; //100 KB; } public static synchronized URN hash() { if( myHash == null ) { try { File tmpFile = File.createTempFile("tst", "tmp"); writeFile(tmpFile); myHash = URN.createSHA1Urn(tmpFile); } catch ( InterruptedException e) { ErrorService.error(e); } catch ( IOException e ) { ErrorService.error(e); } } return myHash; } public static synchronized HashTree tree() { if( myTree == null ) { try { URN hash = hash(); File tmpFile = File.createTempFile("tst2", "tmp"); writeFile(tmpFile); InputStream is = new FileInputStream(tmpFile); myTree = createHashTree(tmpFile, hash); } catch(IOException e) { ErrorService.error(e); } catch(Throwable t) { ErrorService.error(t); } } return myTree; } private static void writeFile(File tmpFile) throws IOException { tmpFile.deleteOnExit(); RandomAccessFile raf = new RandomAccessFile(tmpFile, "rw"); for(int i=0; i<TestFile.length(); i++) raf.writeByte(TestFile.getByte(i)); raf.close(); } private static HashTree createHashTree(File file, URN sha1) throws Throwable { Object ret = null; try { ret = PrivilegedAccessor.invokeMethod( HashTree.class, "createHashTree", new Object[] { new Long(file.length()), new FileInputStream(file), sha1 }, new Class[] { long.class, InputStream.class, URN.class } ); } catch(InvocationTargetException ite) { throw ite.getCause(); } return (HashTree)ret; } public static void main(String[] args) { System.out.println( hash().toString() ); } }