1.1 --- a/src/share/classes/com/sun/tools/javap/JavapTask.java Mon Aug 04 15:09:02 2008 -0700 1.2 +++ b/src/share/classes/com/sun/tools/javap/JavapTask.java Mon Aug 04 17:54:15 2008 -0700 1.3 @@ -27,11 +27,15 @@ 1.4 1.5 import java.io.EOFException; 1.6 import java.io.FileNotFoundException; 1.7 +import java.io.FilterInputStream; 1.8 +import java.io.InputStream; 1.9 import java.io.IOException; 1.10 import java.io.OutputStream; 1.11 import java.io.PrintWriter; 1.12 import java.io.StringWriter; 1.13 import java.io.Writer; 1.14 +import java.security.DigestInputStream; 1.15 +import java.security.MessageDigest; 1.16 import java.text.MessageFormat; 1.17 import java.util.ArrayList; 1.18 import java.util.Arrays; 1.19 @@ -199,6 +203,12 @@ 1.20 } 1.21 }, 1.22 1.23 + new Option(false, "-sysinfo") { 1.24 + void process(JavapTask task, String opt, String arg) { 1.25 + task.options.sysInfo = true; 1.26 + } 1.27 + }, 1.28 + 1.29 new Option(false, "-Xold") { 1.30 void process(JavapTask task, String opt, String arg) throws BadArgs { 1.31 // -Xold is only supported as first arg when invoked from 1.32 @@ -494,8 +504,27 @@ 1.33 Attribute.Factory attributeFactory = new Attribute.Factory(); 1.34 attributeFactory.setCompat(options.compat); 1.35 attributeFactory.setJSR277(options.jsr277); 1.36 - ClassFile cf = ClassFile.read(fo.openInputStream(), attributeFactory); 1.37 + 1.38 + InputStream in = fo.openInputStream(); 1.39 + SizeInputStream sizeIn = null; 1.40 + MessageDigest md = null; 1.41 + if (options.sysInfo || options.verbose) { 1.42 + md = MessageDigest.getInstance("MD5"); 1.43 + in = new DigestInputStream(in, md); 1.44 + in = sizeIn = new SizeInputStream(in); 1.45 + } 1.46 + 1.47 + ClassFile cf = ClassFile.read(in, attributeFactory); 1.48 + 1.49 + if (options.sysInfo || options.verbose) { 1.50 + classWriter.setFile(fo.toUri()); 1.51 + classWriter.setLastModified(fo.getLastModified()); 1.52 + classWriter.setDigest("MD5", md.digest()); 1.53 + classWriter.setFileSize(sizeIn.size()); 1.54 + } 1.55 + 1.56 classWriter.write(cf); 1.57 + 1.58 } catch (ConstantPoolException e) { 1.59 diagnosticListener.report(createDiagnostic("err.bad.constant.pool", className, e.getLocalizedMessage())); 1.60 ok = false; 1.61 @@ -665,4 +694,31 @@ 1.62 Map<Locale, ResourceBundle> bundles; 1.63 1.64 private static final String progname = "javap"; 1.65 + 1.66 + private static class SizeInputStream extends FilterInputStream { 1.67 + SizeInputStream(InputStream in) { 1.68 + super(in); 1.69 + } 1.70 + 1.71 + int size() { 1.72 + return size; 1.73 + } 1.74 + 1.75 + @Override 1.76 + public int read(byte[] buf, int offset, int length) throws IOException { 1.77 + int n = super.read(buf, offset, length); 1.78 + if (n > 0) 1.79 + size += n; 1.80 + return n; 1.81 + } 1.82 + 1.83 + @Override 1.84 + public int read() throws IOException { 1.85 + int b = super.read(); 1.86 + size += 1; 1.87 + return b; 1.88 + } 1.89 + 1.90 + private int size; 1.91 + } 1.92 }