src/share/classes/sun/tools/jar/Main.java

Print this page

        

*** 72,82 **** boolean cflag, uflag, xflag, tflag, vflag, flag0, Mflag, iflag; static final String MANIFEST = JarFile.MANIFEST_NAME; static final String MANIFEST_DIR = "META-INF/"; static final String VERSION = "1.0"; - static final char SEPARATOR = File.separatorChar; static final String INDEX = JarIndex.INDEX_NAME; private static ResourceBundle rsrc; /** --- 72,81 ----
*** 225,247 **** tmpFile.delete(); throw new IOException(getMsg("error.write.file")); } tmpFile.delete(); } ! } else if (xflag || tflag) { ! InputStream in; if (fname != null) { ! in = new FileInputStream(fname); } else { ! in = new FileInputStream(FileDescriptor.in); ! } ! if (xflag) { ! extract(new BufferedInputStream(in), files); ! } else { list(new BufferedInputStream(in), files); } in.close(); } else if (iflag) { genIndex(rootjar, files); } } catch (IOException e) { fatalError(e); --- 224,259 ---- tmpFile.delete(); throw new IOException(getMsg("error.write.file")); } tmpFile.delete(); } ! } else if (tflag) { ! replaceFSC(files); if (fname != null) { ! list(fname, files); } else { ! InputStream in = new FileInputStream(FileDescriptor.in); ! try{ list(new BufferedInputStream(in), files); + } finally { + in.close(); } + } + } else if (xflag) { + replaceFSC(files); + if (fname != null && files != null) { + extract(fname, files); + } else { + InputStream in = (fname == null) + ? new FileInputStream(FileDescriptor.in) + : new FileInputStream(fname); + try { + extract(new BufferedInputStream(in), files); + } finally { in.close(); + } + } } else if (iflag) { genIndex(rootjar, files); } } catch (IOException e) { fatalError(e);
*** 758,788 **** "error.incorrect.length", f.getPath())); } e.setCrc(crc32.getValue()); } /* * Extracts specified entries from JAR file. */ void extract(InputStream in, String files[]) throws IOException { ZipInputStream zis = new ZipInputStream(in); ZipEntry e; // Set of all directory entries specified in archive. Disallows // null entries. Disallows all entries if using pre-6.0 behavior. ! Set<ZipEntry> dirs = new HashSet<ZipEntry>() { ! public boolean add(ZipEntry e) { ! return ((e == null || useExtractionTime) ? false : super.add(e)); ! }}; ! while ((e = zis.getNextEntry()) != null) { if (files == null) { dirs.add(extractFile(zis, e)); - } else { String name = e.getName(); ! for (int i = 0; i < files.length; i++) { ! String file = files[i].replace(File.separatorChar, '/'); if (name.startsWith(file)) { dirs.add(extractFile(zis, e)); break; } } --- 770,819 ---- "error.incorrect.length", f.getPath())); } e.setCrc(crc32.getValue()); } + void replaceFSC(String files[]) { + if (files != null) { + for (String file : files) { + file = file.replace(File.separatorChar, '/'); + } + } + } + + Set<ZipEntry> newDirSet() { + return new HashSet<ZipEntry>() { + public boolean add(ZipEntry e) { + return ((e == null || useExtractionTime) ? false : super.add(e)); + }}; + } + + void updateLastModifiedTime(Set<ZipEntry> zes) throws IOException { + for (ZipEntry ze : zes) { + long lastModified = ze.getTime(); + if (lastModified != -1) { + File f = new File(ze.getName().replace('/', File.separatorChar)); + f.setLastModified(lastModified); + } + } + } + /* * Extracts specified entries from JAR file. */ void extract(InputStream in, String files[]) throws IOException { ZipInputStream zis = new ZipInputStream(in); ZipEntry e; // Set of all directory entries specified in archive. Disallows // null entries. Disallows all entries if using pre-6.0 behavior. ! Set<ZipEntry> dirs = newDirSet(); while ((e = zis.getNextEntry()) != null) { if (files == null) { dirs.add(extractFile(zis, e)); } else { String name = e.getName(); ! for (String file : files) { if (name.startsWith(file)) { dirs.add(extractFile(zis, e)); break; } }
*** 791,815 **** // Update timestamps of directories specified in archive with their // timestamps as given in the archive. We do this after extraction, // instead of during, because creating a file in a directory changes // that directory's timestamp. ! for (ZipEntry dirEntry : dirs) { ! long lastModified = dirEntry.getTime(); ! if (lastModified != -1) { ! File dir = new File(dirEntry.getName().replace('/', File.separatorChar)); ! dir.setLastModified(lastModified); } } } /* * Extracts next entry from JAR file, creating directories as needed. If * the entry is for a directory which doesn't exist prior to this * invocation, returns that entry, otherwise returns null. */ ! ZipEntry extractFile(ZipInputStream zis, ZipEntry e) throws IOException { ZipEntry rc = null; String name = e.getName(); File f = new File(e.getName().replace('/', File.separatorChar)); if (e.isDirectory()) { if (f.exists()) { --- 822,866 ---- // Update timestamps of directories specified in archive with their // timestamps as given in the archive. We do this after extraction, // instead of during, because creating a file in a directory changes // that directory's timestamp. ! updateLastModifiedTime(dirs); } + + /* + * Extracts specified entries from JAR file, via ZipFile. + */ + void extract(String fname, String files[]) throws IOException { + ZipFile zf = new ZipFile(fname); + Set<ZipEntry> dirs = newDirSet(); + Enumeration<? extends ZipEntry> zes = zf.entries(); + while (zes.hasMoreElements()) { + ZipEntry e = zes.nextElement(); + InputStream is; + if (files == null) { + dirs.add(extractFile(zf.getInputStream(e), e)); + } else { + String name = e.getName(); + for (String file : files) { + if (name.startsWith(file)) { + dirs.add(extractFile(zf.getInputStream(e), e)); + break; } } + } + } + zf.close(); + updateLastModifiedTime(dirs); + } /* * Extracts next entry from JAR file, creating directories as needed. If * the entry is for a directory which doesn't exist prior to this * invocation, returns that entry, otherwise returns null. */ ! ZipEntry extractFile(InputStream is, ZipEntry e) throws IOException { ZipEntry rc = null; String name = e.getName(); File f = new File(e.getName().replace('/', File.separatorChar)); if (e.isDirectory()) { if (f.exists()) {
*** 836,852 **** throw new IOException(formatMsg( "error.create.dir", d.getPath())); } } OutputStream os = new FileOutputStream(f); ! byte[] b = new byte[512]; int len; ! while ((len = zis.read(b, 0, b.length)) != -1) { os.write(b, 0, len); } ! zis.closeEntry(); os.close(); if (vflag) { if (e.getMethod() == ZipEntry.DEFLATED) { output(formatMsg("out.inflated", name)); } else { output(formatMsg("out.extracted", name)); --- 887,909 ---- throw new IOException(formatMsg( "error.create.dir", d.getPath())); } } OutputStream os = new FileOutputStream(f); ! byte[] b = new byte[8192]; int len; ! try { ! while ((len = is.read(b, 0, b.length)) != -1) { os.write(b, 0, len); } ! } finally { ! if (is instanceof ZipInputStream) ! ((ZipInputStream)is).closeEntry(); ! else ! is.close(); os.close(); + } if (vflag) { if (e.getMethod() == ZipEntry.DEFLATED) { output(formatMsg("out.inflated", name)); } else { output(formatMsg("out.extracted", name));
*** 867,897 **** */ void list(InputStream in, String files[]) throws IOException { ZipInputStream zis = new ZipInputStream(in); ZipEntry e; while ((e = zis.getNextEntry()) != null) { - String name = e.getName(); /* * In the case of a compressed (deflated) entry, the entry size * is stored immediately following the entry data and cannot be * determined until the entry is fully read. Therefore, we close * the entry first before printing out its attributes. */ zis.closeEntry(); ! if (files == null) { ! printEntry(e); ! } else { ! for (int i = 0; i < files.length; i++) { ! String file = files[i].replace(File.separatorChar, '/'); ! if (name.startsWith(file)) { ! printEntry(e); ! break; } } } } - } /** * Output the class index table to the INDEX.LIST file of the * root jar file. */ --- 924,955 ---- */ void list(InputStream in, String files[]) throws IOException { ZipInputStream zis = new ZipInputStream(in); ZipEntry e; while ((e = zis.getNextEntry()) != null) { /* * In the case of a compressed (deflated) entry, the entry size * is stored immediately following the entry data and cannot be * determined until the entry is fully read. Therefore, we close * the entry first before printing out its attributes. */ zis.closeEntry(); ! printEntry(e, files); } } + + /* + * Lists contents of JAR file, via ZipFile. + */ + void list(String fname, String files[]) throws IOException { + ZipFile zf = new ZipFile(fname); + Enumeration<? extends ZipEntry> zes = zf.entries(); + while (zes.hasMoreElements()) { + printEntry(zes.nextElement(), files); } + zf.close(); } /** * Output the class index table to the INDEX.LIST file of the * root jar file. */
*** 972,988 **** jarfiles = (String[])jars.toArray(new String[njars]); JarIndex index = new JarIndex(jarfiles); dumpIndex(rootjar, index); } /* * Prints entry information. */ void printEntry(ZipEntry e) throws IOException { if (vflag) { ! StringBuffer sb = new StringBuffer(); String s = Long.toString(e.getSize()); for (int i = 6 - s.length(); i > 0; --i) { sb.append(' '); } sb.append(s).append(' ').append(new Date(e.getTime()).toString()); --- 1030,1062 ---- jarfiles = (String[])jars.toArray(new String[njars]); JarIndex index = new JarIndex(jarfiles); dumpIndex(rootjar, index); } + /* + * Prints entry information, if requested. + */ + void printEntry(ZipEntry e, String[] files) throws IOException { + if (files == null) { + printEntry(e); + } else { + String name = e.getName(); + for (String file : files) { + if (name.startsWith(file)) { + printEntry(e); + return; + } + } + } + } /* * Prints entry information. */ void printEntry(ZipEntry e) throws IOException { if (vflag) { ! StringBuilder sb = new StringBuilder(); String s = Long.toString(e.getSize()); for (int i = 6 - s.length(); i > 0; --i) { sb.append(' '); } sb.append(s).append(' ').append(new Date(e.getTime()).toString());