package net.argius.filetool;

import java.io.*;

import org.apache.tools.tar.*;

/**
 * Tarアーカイバ。
 * AntAPIを使用してTAR形式のアーカイブを作成する。
 */
public final class TarArchiver implements Archiver {

    private TarOutputStream tos;
    private boolean includesDirectory;

    /**
     * TarArchiverの生成。
     * @param os 出力先ストリーム
     */
    public TarArchiver(OutputStream os) {
        this.tos = new TarOutputStream(os);
        this.includesDirectory = true;
    }

    /**
     * includesDirectoryの設定。
     * @param includesDirectory includesDirectory
     */
    public void setIncludesDirectory(boolean includesDirectory) {
        this.includesDirectory = includesDirectory;
    }

    /* (overridden)
     * @see net.argius.filetool.compress.Archiver#addEntry(net.argius.filetool.compress.ArchiverEntry, java.io.InputStream, int, long)
     */
    public void addEntry(ArchiveEntry ae, InputStream is, long length) throws IOException {
        if (ae.isDirectory()) {
            // ディレクトリ
            if (includesDirectory) {
                TarEntry entry = new TarEntry(ae.getName());
                entry.setMode(TarEntry.DEFAULT_DIR_MODE);
                entry.setModTime(ae.getLastModified());
                tos.putNextEntry(entry);
                tos.closeEntry();
            }
        } else {
            // ファイル
            TarEntry entry = new TarEntry(ae.getName());
            entry.setSize(length);
            entry.setModTime(ae.getLastModified());
            tos.putNextEntry(entry);
            IOUtilities.transferAll(is, tos);
            tos.closeEntry();
        }
    }

    /* (overridden)
     * @see java.io.Closeable#close()
     */
    public void close() throws IOException {
        tos.close();
    }

}
