< prev index next >

src/java.base/share/classes/com/sun/java/util/jar/pack/Driver.java

Print this page
rev 50498 : 8199871: Deprecate pack200 and unpack200 tools
Reviewed-by:


  39 import java.nio.file.Path;
  40 import java.util.ArrayList;
  41 import java.util.Arrays;
  42 import java.util.HashMap;
  43 import java.util.Iterator;
  44 import java.util.List;
  45 import java.util.ListIterator;
  46 import java.util.Map;
  47 import java.util.Properties;
  48 import java.util.ResourceBundle;
  49 import java.util.SortedMap;
  50 import java.util.TreeMap;
  51 import java.util.jar.JarFile;
  52 import java.util.jar.JarOutputStream;
  53 import java.util.jar.Pack200;
  54 import java.util.zip.GZIPInputStream;
  55 import java.util.zip.GZIPOutputStream;
  56 
  57 /** Command line interface for Pack200.
  58  */


  59 class Driver {
  60         private static final ResourceBundle RESOURCE =
  61                 ResourceBundle.getBundle("com.sun.java.util.jar.pack.DriverResource");

  62 
  63     public static void main(String[] ava) throws IOException {
  64         List<String> av = new ArrayList<>(Arrays.asList(ava));
  65 
  66         boolean doPack   = true;
  67         boolean doUnpack = false;
  68         boolean doRepack = false;
  69         boolean doZip = true;

  70         String logFile = null;
  71         String verboseProp = Utils.DEBUG_VERBOSE;
  72 
  73         {
  74             // Non-standard, undocumented "--unpack" switch enables unpack mode.
  75             String arg0 = av.isEmpty() ? "" : av.get(0);
  76             switch (arg0) {
  77                 case "--pack":
  78                 av.remove(0);
  79                     break;
  80                 case "--unpack":
  81                 av.remove(0);
  82                 doPack = false;
  83                 doUnpack = true;
  84                     break;
  85             }
  86         }
  87 




  88         // Collect engine properties here:
  89         Map<String,String> engProps = new HashMap<>();
  90         engProps.put(verboseProp, System.getProperty(verboseProp));
  91 
  92         String optionMap;
  93         String[] propTable;
  94         if (doPack) {
  95             optionMap = PACK200_OPTION_MAP;
  96             propTable = PACK200_PROPERTY_TO_OPTION;
  97         } else {
  98             optionMap = UNPACK200_OPTION_MAP;
  99             propTable = UNPACK200_PROPERTY_TO_OPTION;
 100         }
 101 
 102         // Collect argument properties here:
 103         Map<String,String> avProps = new HashMap<>();
 104         try {
 105             for (;;) {
 106                 String state = parseCommandOptions(av, optionMap, avProps);
 107                 // Translate command line options to Pack200 properties:


 378     }
 379 
 380     private static
 381     File createTempFile(String basefile, String suffix) throws IOException {
 382         File base = new File(basefile);
 383         String prefix = base.getName();
 384         if (prefix.length() < 3)  prefix += "tmp";
 385 
 386         File where = (base.getParentFile() == null && suffix.equals(".bak"))
 387                 ? new File(".").getAbsoluteFile()
 388                 : base.getParentFile();
 389 
 390         Path tmpfile = (where == null)
 391                 ? Files.createTempFile(prefix, suffix)
 392                 : Files.createTempFile(where.toPath(), prefix, suffix);
 393 
 394         return tmpfile.toFile();
 395     }
 396 
 397     private static






 398     void printUsage(boolean doPack, boolean full, PrintStream out) {
 399         String prog = doPack ? "pack200" : "unpack200";
 400         String[] packUsage = (String[])RESOURCE.getObject(DriverResource.PACK_HELP);
 401         String[] unpackUsage = (String[])RESOURCE.getObject(DriverResource.UNPACK_HELP);
 402         String[] usage = doPack? packUsage: unpackUsage;
 403         for (int i = 0; i < usage.length; i++) {
 404             out.println(usage[i]);
 405             if (!full) {
 406             out.println(MessageFormat.format(RESOURCE.getString(DriverResource.MORE_INFO), prog));
 407                 break;
 408             }
 409         }





 410     }
 411 
 412     private static
 413         String getZipComment(String jarfile) throws IOException {
 414         byte[] tail = new byte[1000];
 415         long filelen = new File(jarfile).length();
 416         if (filelen <= 0)  return "";
 417         long skiplen = Math.max(0, filelen - tail.length);
 418         try (InputStream in = new FileInputStream(new File(jarfile))) {
 419             in.skip(skiplen);
 420             in.read(tail);
 421             for (int i = tail.length-4; i >= 0; i--) {
 422                 if (tail[i+0] == 'P' && tail[i+1] == 'K' &&
 423                     tail[i+2] ==  5  && tail[i+3] ==  6) {
 424                     // Skip sig4, disks4, entries4, clen4, coff4, cmt2
 425                     i += 4+4+4+4+4+2;
 426                     if (i < tail.length)
 427                         return new String(tail, i, tail.length-i, "UTF8");
 428                     return "";
 429                 }




  39 import java.nio.file.Path;
  40 import java.util.ArrayList;
  41 import java.util.Arrays;
  42 import java.util.HashMap;
  43 import java.util.Iterator;
  44 import java.util.List;
  45 import java.util.ListIterator;
  46 import java.util.Map;
  47 import java.util.Properties;
  48 import java.util.ResourceBundle;
  49 import java.util.SortedMap;
  50 import java.util.TreeMap;
  51 import java.util.jar.JarFile;
  52 import java.util.jar.JarOutputStream;
  53 import java.util.jar.Pack200;
  54 import java.util.zip.GZIPInputStream;
  55 import java.util.zip.GZIPOutputStream;
  56 
  57 /** Command line interface for Pack200.
  58  */
  59 
  60 @SuppressWarnings({"removal"})
  61 class Driver {
  62     private static final ResourceBundle RESOURCE =
  63         ResourceBundle.getBundle("com.sun.java.util.jar.pack.DriverResource");
  64     private static boolean suppressDeprecateMsg = false;
  65 
  66     public static void main(String[] ava) throws IOException {
  67         List<String> av = new ArrayList<>(Arrays.asList(ava));
  68 
  69         boolean doPack   = true;
  70         boolean doUnpack = false;
  71         boolean doRepack = false;
  72         boolean doZip = true;
  73         suppressDeprecateMsg = av.remove("-XDsuppress-tool-removal-message");
  74         String logFile = null;
  75         String verboseProp = Utils.DEBUG_VERBOSE;
  76 
  77         {
  78             // Non-standard, undocumented "--unpack" switch enables unpack mode.
  79             String arg0 = av.isEmpty() ? "" : av.get(0);
  80             switch (arg0) {
  81                 case "--pack":
  82                 av.remove(0);
  83                     break;
  84                 case "--unpack":
  85                 av.remove(0);
  86                 doPack = false;
  87                 doUnpack = true;
  88                     break;
  89             }
  90         }
  91 
  92         if (!suppressDeprecateMsg) {
  93             printDeprecateWarning(doPack, System.out);
  94         }
  95 
  96         // Collect engine properties here:
  97         Map<String,String> engProps = new HashMap<>();
  98         engProps.put(verboseProp, System.getProperty(verboseProp));
  99 
 100         String optionMap;
 101         String[] propTable;
 102         if (doPack) {
 103             optionMap = PACK200_OPTION_MAP;
 104             propTable = PACK200_PROPERTY_TO_OPTION;
 105         } else {
 106             optionMap = UNPACK200_OPTION_MAP;
 107             propTable = UNPACK200_PROPERTY_TO_OPTION;
 108         }
 109 
 110         // Collect argument properties here:
 111         Map<String,String> avProps = new HashMap<>();
 112         try {
 113             for (;;) {
 114                 String state = parseCommandOptions(av, optionMap, avProps);
 115                 // Translate command line options to Pack200 properties:


 386     }
 387 
 388     private static
 389     File createTempFile(String basefile, String suffix) throws IOException {
 390         File base = new File(basefile);
 391         String prefix = base.getName();
 392         if (prefix.length() < 3)  prefix += "tmp";
 393 
 394         File where = (base.getParentFile() == null && suffix.equals(".bak"))
 395                 ? new File(".").getAbsoluteFile()
 396                 : base.getParentFile();
 397 
 398         Path tmpfile = (where == null)
 399                 ? Files.createTempFile(prefix, suffix)
 400                 : Files.createTempFile(where.toPath(), prefix, suffix);
 401 
 402         return tmpfile.toFile();
 403     }
 404 
 405     private static
 406     void printDeprecateWarning(boolean doPack, PrintStream out) {
 407         String prog = doPack ? "pack200" : "unpack200";
 408         out.println(MessageFormat.format(RESOURCE.getString(DriverResource.DEPRECATED), prog));
 409     }
 410 
 411     private static
 412     void printUsage(boolean doPack, boolean full, PrintStream out) {
 413         String prog = doPack ? "pack200" : "unpack200";
 414         String[] packUsage = (String[])RESOURCE.getObject(DriverResource.PACK_HELP);
 415         String[] unpackUsage = (String[])RESOURCE.getObject(DriverResource.UNPACK_HELP);
 416         String[] usage = doPack? packUsage: unpackUsage;
 417         for (int i = 0; i < usage.length; i++) {
 418             out.println(usage[i]);
 419             if (!full) {
 420             out.println(MessageFormat.format(RESOURCE.getString(DriverResource.MORE_INFO), prog));
 421                 break;
 422             }
 423         }
 424         // Print a warning at the end
 425         // The full help page is long, the beginning warning could be out of sight
 426         if (full && !suppressDeprecateMsg) {
 427             printDeprecateWarning(doPack, out);
 428         }
 429     }
 430 
 431     private static
 432         String getZipComment(String jarfile) throws IOException {
 433         byte[] tail = new byte[1000];
 434         long filelen = new File(jarfile).length();
 435         if (filelen <= 0)  return "";
 436         long skiplen = Math.max(0, filelen - tail.length);
 437         try (InputStream in = new FileInputStream(new File(jarfile))) {
 438             in.skip(skiplen);
 439             in.read(tail);
 440             for (int i = tail.length-4; i >= 0; i--) {
 441                 if (tail[i+0] == 'P' && tail[i+1] == 'K' &&
 442                     tail[i+2] ==  5  && tail[i+3] ==  6) {
 443                     // Skip sig4, disks4, entries4, clen4, coff4, cmt2
 444                     i += 4+4+4+4+4+2;
 445                     if (i < tail.length)
 446                         return new String(tail, i, tail.length-i, "UTF8");
 447                     return "";
 448                 }


< prev index next >