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 }
|