< prev index next >

test/lib/jdk/test/lib/util/JarUtils.java

Print this page
rev 52026 : 8205654: serviceability/dcmd/framework/HelpTest.java timed out
8218705: Test sun/tools/jcmd/TestJcmdDefaults.java fails on Linux
Reviewed-by: sspitsyn, dholmes

*** 22,51 **** --- 22,94 ---- */ package jdk.test.lib.util; import java.io.ByteArrayOutputStream; + import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; + import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.InvalidPathException; import java.nio.file.Path; import java.nio.file.Paths; + import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; + import java.util.List; import java.util.Map; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; + import java.util.stream.Stream; /** * Common library for various test jar file utility functions. */ public final class JarUtils { + private JarUtils() { } + + /** + * Creates a JAR file. + * + * Equivalent to {@code jar cfm <jarfile> <manifest> -C <dir> file...} + * + * The input files are resolved against the given directory. Any input + * files that are directories are processed recursively. + */ + public static void createJarFile(Path jarfile, Manifest man, Path dir, Path... files) + throws IOException + { + // create the target directory + Path parent = jarfile.getParent(); + if (parent != null) { + Files.createDirectories(parent); + } + + List<Path> entries = findAllRegularFiles(dir, files); + + try (OutputStream out = Files.newOutputStream(jarfile); + JarOutputStream jos = new JarOutputStream(out)) { + if (man != null) { + JarEntry je = new JarEntry(JarFile.MANIFEST_NAME); + jos.putNextEntry(je); + man.write(jos); + jos.closeEntry(); + } + + for (Path entry : entries) { + String name = toJarEntryName(entry); + jos.putNextEntry(new JarEntry(name)); + Files.copy(dir.resolve(entry), jos); + jos.closeEntry(); + } + } + } /** * Create jar file with specified files. If a specified file does not exist, * a new jar entry will be created with the file name itself as the content. */
*** 192,197 **** --- 235,262 ---- } else { throw new RuntimeException("Unknown type " + content.getClass()); } } } + + /** + * Maps a file path to the equivalent name in a JAR file + */ + private static String toJarEntryName(Path file) { + Path normalized = file.normalize(); + return normalized.subpath(0, normalized.getNameCount()) // drop root + .toString() + .replace(File.separatorChar, '/'); + } + + private static List<Path> findAllRegularFiles(Path dir, Path[] files) throws IOException { + List<Path> entries = new ArrayList<>(); + for (Path file : files) { + try (Stream<Path> stream = Files.find(dir.resolve(file), Integer.MAX_VALUE, + (p, attrs) -> attrs.isRegularFile())) { + stream.map(dir::relativize) + .forEach(entries::add); + } + } + return entries; + } }
< prev index next >