src/share/classes/com/sun/tools/javap/JavapTask.java

changeset 88
05684554f040
parent 87
fd1d361ae294
child 90
6be961ee2290
     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  }

mercurial