static public int zipDirectory(final Configuration conf, final ZipOutputStream zos, final String baseName,
	    final String root, final Path itemToZip) throws IOException {
		LOG.info(String.format("zipDirectory: %s %s %s", baseName, root, itemToZip));
		LocalFileSystem localFs = FileSystem.getLocal(conf);
		int count = 0;

		final FileStatus itemStatus = localFs.getFileStatus(itemToZip);
		if(itemStatus.isDir()) {
			final FileStatus[] statai = localFs.listStatus(itemToZip);

			// Add a directory entry to the zip file
			final String zipDirName = relativePathForZipEntry(itemToZip.toUri().getPath(), baseName, root);
			final ZipEntry dirZipEntry = new ZipEntry(zipDirName + Path.SEPARATOR_CHAR);
			LOG.info(String.format("Adding directory %s to zip", zipDirName));
			zos.putNextEntry(dirZipEntry);
			zos.closeEntry();
			count++;

			if(statai == null || statai.length == 0) {
				LOG.info(String.format("Skipping empty directory %s", itemToZip));
				return count;
			}
			for(FileStatus status : statai) {
				count += zipDirectory(conf, zos, baseName, root, status.getPath());
			}
			LOG.info(String.format("Wrote %d entries for directory %s", count, itemToZip));
			return count;
		}

		final String inZipPath = relativePathForZipEntry(itemToZip.toUri().getPath(), baseName, root);

		if(inZipPath.length() == 0) {
			LOG.warn(String.format("Skipping empty zip file path for %s (%s %s)", itemToZip, root, baseName));
			return 0;
		}

		// Take empty files in case the place holder is needed
		FSDataInputStream in = null;
		try {
			in = localFs.open(itemToZip);
			final ZipEntry ze = new ZipEntry(inZipPath);
			ze.setTime(itemStatus.getModificationTime());
			// Comments confuse looking at the zip file
			// ze.setComment(itemToZip.toString());
			zos.putNextEntry(ze);

			IOUtils.copyBytes(in, zos, conf, false);
			zos.closeEntry();
			LOG.info(String.format("Wrote %d entries for file %s", count, itemToZip));
			return 1;
		} finally {
			in.close();
		}

	}
static public int zipDirectory ( final Configuration conf , final ZipOutputStream zos , final String baseName , final String root , final Path itemToZip ) throws IOException { LOG . info ( String . format ( "zipDirectory: %s %s %s" , baseName , root , itemToZip ) ) ; LocalFileSystem localFs = FileSystem . getLocal ( conf ) ; int count = 0 ; final FileStatus itemStatus = localFs . getFileStatus ( itemToZip ) ; if ( itemStatus . isDir ( ) ) { final FileStatus [ ] statai = localFs . listStatus ( itemToZip ) ; final String zipDirName = relativePathForZipEntry ( itemToZip . toUri ( ) . getPath ( ) , baseName , root ) ; final ZipEntry dirZipEntry = new ZipEntry ( zipDirName + Path . SEPARATOR_CHAR ) ; LOG . info ( String . format ( "Adding directory %s to zip" , zipDirName ) ) ; zos . putNextEntry ( dirZipEntry ) ; zos . closeEntry ( ) ; count ++ ; if ( statai == null || statai . length == 0 ) { LOG . info ( String . format ( "Skipping empty directory %s" , itemToZip ) ) ; return count ; } for ( FileStatus status : statai ) { count += zipDirectory ( conf , zos , baseName , root , status . getPath ( ) ) ; } LOG . info ( String . format ( "Wrote %d entries for directory %s" , count , itemToZip ) ) ; return count ; } final String inZipPath = relativePathForZipEntry ( itemToZip . toUri ( ) . getPath ( ) , baseName , root ) ; if ( inZipPath . length ( ) == 0 ) { LOG . warn ( String . format ( "Skipping empty zip file path for %s (%s %s)" , itemToZip , root , baseName ) ) ; return 0 ; } FSDataInputStream in = null ; try { in = localFs . open ( itemToZip ) ; final ZipEntry ze = new ZipEntry ( inZipPath ) ; ze . setTime ( itemStatus . getModificationTime ( ) ) ; zos . putNextEntry ( ze ) ; IOUtils . copyBytes ( in , zos , conf , false ) ; zos . closeEntry ( ) ; LOG . info ( String . format ( "Wrote %d entries for file %s" , count , itemToZip ) ) ; return 1 ; } finally { in . close ( ) ; } }
Write a file to a zip output stream, removing leading path name components from the actual file name when creating
the zip file entry.

The entry placed in the zip file is <code>baseName</code>/ <code>relativePath</code>, where
<code>relativePath</code> is constructed by removing a leading <code>root</code> from the path for
<code>itemToZip</code>.

If <code>itemToZip</code> is an empty directory, it is ignored. If <code>itemToZip</code> is a directory, the
contents of the directory are added recursively.

@param zos
The zip output stream
@param baseName
The base name to use for the file name entry in the zip file
@param root
The path to remove from <code>itemToZip</code> to make a relative path name
@param itemToZip
The path to the file to be added to the zip file
@return the number of entries added
@throws IOException