Java Code Examples for org.apache.commons.compress.archivers.tar.TarArchiveEntry#isLink()

The following examples show how to use org.apache.commons.compress.archivers.tar.TarArchiveEntry#isLink() . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: FileUtil.java    From lucene-solr with Apache License 2.0 4 votes vote down vote up
private static void unpackEntries(TarArchiveInputStream tis,
                                  TarArchiveEntry entry, File outputDir) throws IOException {
  String targetDirPath = outputDir.getCanonicalPath() + File.separator;
  File outputFile = new File(outputDir, entry.getName());
  if (!outputFile.getCanonicalPath().startsWith(targetDirPath)) {
    throw new IOException("expanding " + entry.getName()
        + " would create entry outside of " + outputDir);
  }

  if (entry.isDirectory()) {
    File subDir = new File(outputDir, entry.getName());
    if (!subDir.mkdirs() && !subDir.isDirectory()) {
      throw new IOException("Mkdirs failed to create tar internal dir "
          + outputDir);
    }

    for (TarArchiveEntry e : entry.getDirectoryEntries()) {
      unpackEntries(tis, e, subDir);
    }

    return;
  }

  if (entry.isSymbolicLink()) {
    // Create symbolic link relative to tar parent dir
    Files.createSymbolicLink(FileSystems.getDefault()
            .getPath(outputDir.getPath(), entry.getName()),
        FileSystems.getDefault().getPath(entry.getLinkName()));
    return;
  }

  if (!outputFile.getParentFile().exists()) {
    if (!outputFile.getParentFile().mkdirs()) {
      throw new IOException("Mkdirs failed to create tar internal dir "
          + outputDir);
    }
  }

  if (entry.isLink()) {
    File src = new File(outputDir, entry.getLinkName());
    HardLink.createHardLink(src, outputFile);
    return;
  }

  int count;
  byte data[] = new byte[2048];
  try (BufferedOutputStream outputStream = new BufferedOutputStream(
      new FileOutputStream(outputFile));) {

    while ((count = tis.read(data)) != -1) {
      outputStream.write(data, 0, count);
    }

    outputStream.flush();
  }
}
 
Example 2
Source File: CompressedTarFunction.java    From bazel with Apache License 2.0 4 votes vote down vote up
@Override
public Path decompress(DecompressorDescriptor descriptor)
    throws InterruptedException, IOException {
  if (Thread.interrupted()) {
    throw new InterruptedException();
  }
  Optional<String> prefix = descriptor.prefix();
  boolean foundPrefix = false;
  Set<String> availablePrefixes = new HashSet<>();

  try (InputStream decompressorStream = getDecompressorStream(descriptor)) {
    TarArchiveInputStream tarStream = new TarArchiveInputStream(decompressorStream);
    TarArchiveEntry entry;
    while ((entry = tarStream.getNextTarEntry()) != null) {
      StripPrefixedPath entryPath = StripPrefixedPath.maybeDeprefix(entry.getName(), prefix);
      foundPrefix = foundPrefix || entryPath.foundPrefix();

      if (prefix.isPresent() && !foundPrefix) {
        Optional<String> suggestion =
            CouldNotFindPrefixException.maybeMakePrefixSuggestion(entryPath.getPathFragment());
        if (suggestion.isPresent()) {
          availablePrefixes.add(suggestion.get());
        }
      }

      if (entryPath.skip()) {
        continue;
      }

      Path filePath = descriptor.repositoryPath().getRelative(entryPath.getPathFragment());
      FileSystemUtils.createDirectoryAndParents(filePath.getParentDirectory());
      if (entry.isDirectory()) {
        FileSystemUtils.createDirectoryAndParents(filePath);
      } else {
        if (entry.isSymbolicLink() || entry.isLink()) {
          PathFragment targetName = PathFragment.create(entry.getLinkName());
          targetName = maybeDeprefixSymlink(targetName, prefix, descriptor.repositoryPath());
          if (entry.isSymbolicLink()) {
            if (filePath.exists()) {
              filePath.delete();
            }
            FileSystemUtils.ensureSymbolicLink(filePath, targetName);
          } else {
            Path targetPath = descriptor.repositoryPath().getRelative(targetName);
            if (filePath.equals(targetPath)) {
              // The behavior here is semantically different, depending on whether the underlying
              // filesystem is case-sensitive or case-insensitive. However, it is effectively the
              // same: we drop the link entry.
              // * On a case-sensitive filesystem, this is a hardlink to itself, such as GNU tar
              //   creates when given repeated files. We do nothing since the link already exists.
              // * On a case-insensitive filesystem, we may be extracting a differently-cased
              //   hardlink to the same file (such as when extracting an archive created on a
              //   case-sensitive filesystem). GNU tar, for example, will drop the new link entry.
              //   BSD tar on MacOS X (by default case-insensitive) errors and aborts extraction.
            } else {
              if (filePath.exists()) {
                filePath.delete();
              }
              FileSystemUtils.createHardLink(filePath, targetPath);
            }
          }
        } else {
          try (OutputStream out = filePath.getOutputStream()) {
            ByteStreams.copy(tarStream, out);
          }
          filePath.chmod(entry.getMode());

          // This can only be done on real files, not links, or it will skip the reader to
          // the next "real" file to try to find the mod time info.
          Date lastModified = entry.getLastModifiedDate();
          filePath.setLastModifiedTime(lastModified.getTime());
        }
      }
      if (Thread.interrupted()) {
        throw new InterruptedException();
      }
    }

    if (prefix.isPresent() && !foundPrefix) {
      throw new CouldNotFindPrefixException(prefix.get(), availablePrefixes);
    }
  }

  return descriptor.repositoryPath();
}