feisty meow concerns codebase 2.140
PackTar.java
Go to the documentation of this file.
1package org.gffs.compression;
2
3import java.io.File;
4import java.io.FileInputStream;
5import java.io.FileOutputStream;
6import java.io.IOException;
7import java.util.Iterator;
8
9import org.apache.commons.compress.archivers.ArchiveEntry;
10import org.apache.commons.compress.archivers.ArchiveOutputStream;
11import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
12import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
13import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
14import org.apache.commons.io.FileUtils;
15import org.apache.commons.io.IOUtils;
16import org.apache.commons.io.filefilter.IOFileFilter;
17import org.apache.commons.io.filefilter.TrueFileFilter;
18import org.apache.commons.logging.Log;
19import org.apache.commons.logging.LogFactory;
20
21public class PackTar
22{
23 static private Log _logger = LogFactory.getLog(PackTar.class);
24
28 public static String stripOutPrefix(String prefix, String longName) throws IOException
29 {
30 int indy = longName.indexOf(prefix, 0);
31 if (indy < 0)
32 throw new IOException("failure to find prefix in string, prefix=" + prefix + " and string=" + longName);
33 return longName.substring(indy + prefix.length());
34 }
35
42 public static void compressArchive(ArchiveOutputStream tarOut, String prefix, File source) throws IOException
43 {
44 _logger.debug("entered into compress archive on source " + source + " prefix " + prefix + " and tarout " + tarOut);
45
46 if (!source.exists()) {
47 // Don't unpack into an existing directory.
48 String msg = "Directory " + source.getAbsolutePath() + " doesn't exist yet. Cannot pack.";
49 _logger.error(msg);
50 throw new IOException(msg);
51 }
52
53 // traverse the whole tree of the directory (or just write this directly if it's a file).
54 if (source.isFile()) {
55 String choppedName = stripOutPrefix(prefix, source.getPath());
56 if (_logger.isDebugEnabled())
57 _logger.debug("adding a file to the archive (chopped): " + choppedName);
58 ArchiveEntry f = tarOut.createArchiveEntry(source, choppedName);
59 tarOut.putArchiveEntry(f);
60 IOUtils.copy(new FileInputStream(source), tarOut);
61 tarOut.closeArchiveEntry();
62 } else if (source.isDirectory()) {
63 // traverse the directory tree at just this height and add everything recursively.
64
65 if (_logger.isDebugEnabled())
66 _logger.debug("iterating over a directory to add its contents to the archive: " + source);
67
68 Iterator<File> spidey = FileUtils.iterateFiles(source, new IOFileFilter()
69 {
70 @Override
71 public boolean accept(File arg0)
72 {
73 return true;
74 }
75
76 @Override
77 public boolean accept(File arg0, String arg1)
78 {
79 return true;
80 }
81 }, TrueFileFilter.INSTANCE);
82
83 File item = null;
84 while (spidey.hasNext()) {
85 item = spidey.next();
86
87 if (_logger.isTraceEnabled())
88 _logger.debug("recursing on item: " + item);
89
90 compressArchive(tarOut, prefix, item);
91 }
92 } else {
93 String msg = "source is not a file or directory although it exists. unknown how to process.";
94 _logger.error(msg);
95 throw new IOException(msg);
96 }
97
98 }
99
103 public static String findAppropriatePrefix(String toChop)
104 {
105 if (toChop.endsWith("/"))
106 return toChop; // already ready.
107 else
108 return toChop + "/"; // add a slash on the end.
109 }
110
111 public synchronized static void compressTarGZ(File tarFile, File dest) throws IOException
112 {
113 TarArchiveOutputStream tarOut = new TarArchiveOutputStream(new GzipCompressorOutputStream(new FileOutputStream(tarFile)));
114 compressArchive(tarOut, findAppropriatePrefix(dest.getPath()), dest);
115 tarOut.close();
116 }
117
118 public synchronized static void compressTar(File tarFile, File dest) throws IOException
119 {
120 TarArchiveOutputStream tarOut = new TarArchiveOutputStream(new FileOutputStream(tarFile));
121 compressArchive(tarOut, findAppropriatePrefix(dest.getPath()), dest);
122 tarOut.close();
123 }
124
125 public synchronized static void compressZip(File zipFile, File dest) throws IOException
126 {
127 ZipArchiveOutputStream tarOut = new ZipArchiveOutputStream(new FileOutputStream(zipFile));
128 compressArchive(tarOut, findAppropriatePrefix(dest.getPath()), dest);
129 tarOut.close();
130 }
131
132 static public void main(String[] args) throws Throwable
133 {
134 // future: could use our cool code above to handle any archive type they pass.
135 if (args.length != 2) {
136 System.err.println("USAGE: PackTar {tar.gz file} {source location}");
137 System.exit(1);
138 }
139
140 try {
141 PackTar.compressTarGZ(new File(args[0]), new File(args[1]));
142 } catch (Throwable t) {
143 _logger.error("failed to compress tar file " + args[0] + " from " + args[1]);
144 System.exit(1);
145 }
146
147 System.out.println("successfully compressed archive file " + args[0] + " from " + args[1]);
148 }
149
150}
static void main(String[] args)
Definition PackTar.java:132
static void compressArchive(ArchiveOutputStream tarOut, String prefix, File source)
Definition PackTar.java:42
static synchronized void compressZip(File zipFile, File dest)
Definition PackTar.java:125
static String findAppropriatePrefix(String toChop)
Definition PackTar.java:103
static synchronized void compressTarGZ(File tarFile, File dest)
Definition PackTar.java:111
static synchronized void compressTar(File tarFile, File dest)
Definition PackTar.java:118
static String stripOutPrefix(String prefix, String longName)
Definition PackTar.java:28