package javacodebook.io.readzip;

import java.io.*;
import java.util.*;
import java.util.zip.*;

public class ZipReader {

    private ZipFile zipFile;
    private File targetDir;

    public ZipReader(File f, File targetDir) throws IOException {
        zipFile = new ZipFile(f);
        this.targetDir = targetDir;
    }

    public void showZipEntries(boolean unzip) throws IOException {
        Enumeration entries = zipFile.entries();
        while(entries.hasMoreElements()) {
            ZipEntry entry = (ZipEntry)entries.nextElement();
            if(unzip)
                extractFile(entry);
            else
                System.out.println(entry.getName());
        }
    }

    //Einen Eintrag aus dem Zip-Archiv extrahieren und mit entsprechenden
    //Unterverzeichnissen in das Zielverzeichnis schreiben
    private void extractFile(ZipEntry entry) throws IOException {
        //Neues File relativ zum Zielverzeichnis anlegen
        File newFile = new File(targetDir, entry.getName());
        if(entry.isDirectory()) {
            //Zielverzeichnis && alle übergeordneten Verzeichnisse anlegen
            newFile.mkdirs();
        } else {
            //Der Eintrag im Zip-Archiv wird über einen Stream ausgelesen
            FileOutputStream out = new FileOutputStream(newFile);
            InputStream in = zipFile.getInputStream(entry);
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while((bytesRead = in.read(buffer)) > 0)
                out.write(buffer, 0, bytesRead);
            in.close();
            out.close();
        }
    }

    public static void main(String[] args) throws Exception {
        if(args.length < 1)
            printUsage();
        File f = new File(args[0]);
        boolean unzip = false;
        File targetDir = null;
        if(args.length == 2 && "-x".equals(args[1])) {
            unzip = true;
            System.out.println("Zielverzeichnis: ");
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            targetDir = new File(in.readLine());
            if(!targetDir.isDirectory()) {
                System.out.println("Ziel ist kein Verzeichnis");
                System.exit(0);
            }
            System.out.println("Archiv wird nach " + targetDir.getAbsolutePath()
                + " entpackt");
        }
        ZipReader zipReader = new ZipReader(f, targetDir);
        zipReader.showZipEntries(unzip);

    }

    private static void printUsage() {
        System.out.println("Aufruf: java javacodebook.io.readzip.ZipReader Dateiname [-x]");
        System.exit(0);
    }
}
