/*******************************************************************************
 * Copyright (c) 2007 compeople AG and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 * 	compeople AG (Stefan Liebig) - initial API and implementation
 *  IBM Corporation - bug fixes and enhancements
 *******************************************************************************/
package org.eclipse.equinox.internal.p2.sar;

import java.io.*;
import java.util.zip.*;

/**
 * Helper class for converting Zips/Jars to Sars and vice versa.
 */
public class SarUtil {

	private static final int BUFFER_SIZE = 8 * 1024;
	private static final boolean DEBUG = SarConstants.DEBUG;

	/**
	 * 
	 */
	private SarUtil() {
		// utility class
	}

	/**
	 * Normalize the given zip/jar.
	 * 
	 * @param zipSource
	 * @param zipTarget
	 * @throws IOException
	 */
	public static void normalize(File zipSource, File zipTarget) throws IOException {
		File tempSar = File.createTempFile("temp", ".sar");
		try {
			zipToSar(zipSource, tempSar);
			sarToZip(tempSar, zipTarget);
		} finally {
			tempSar.delete();
		}
	}

	/**
	 * Normalize the given zip/jar.
	 * 
	 * @param zipSource
	 * @param zipTarget
	 * @throws IOException
	 */
	public static void normalize(InputStream zipSource, OutputStream zipTarget) throws IOException {
		DirectByteArrayOutputStream tempSar = new DirectByteArrayOutputStream();
		zipToSar(zipSource, tempSar);
		sarToZip(tempSar.getInputStream(), zipTarget);
	}

	/**
	 * @param zipFile
	 * @throws IOException
	 */
	public static void zipToSar(File zipFile, File sarFile) throws IOException {
		InputStream zipInputStream = new BufferedInputStream(new FileInputStream(zipFile));
		OutputStream sarOutputStream = new BufferedOutputStream(new FileOutputStream(sarFile));
		SarUtil.zipToSar(zipInputStream, sarOutputStream);
	}

	/**
	 * @param zippedInputStream
	 * @param saredOutputStream
	 * @throws IOException
	 */
	public static void zipToSar(InputStream zippedInputStream, OutputStream saredOutputStream) throws IOException {
		zipToSar(zippedInputStream, true, saredOutputStream, true);
	}

	/**
	 * @param zippedInputStream
	 * @param closeIn
	 * @param saredOutputStream
	 * @param closeOut
	 * @throws IOException
	 */
	public static void zipToSar(InputStream zippedInputStream, boolean closeIn, OutputStream saredOutputStream, boolean closeOut) throws IOException {
		zipToSarNoClose(zippedInputStream, saredOutputStream);

		if (closeIn)
			zippedInputStream.close();
		if (closeOut)
			saredOutputStream.close();
	}

	/**
	 * @param sarFile
	 * @param zipFile
	 * @throws IOException
	 */
	public static void sarToZip(File sarFile, File zipFile) throws IOException {
		InputStream saredInputStream = new BufferedInputStream(new FileInputStream(sarFile));
		OutputStream zippedOutputStream = new BufferedOutputStream(new FileOutputStream(zipFile));

		sarToZip(saredInputStream, zippedOutputStream);
	}

	/**
	 * @param saredInputStream
	 * @param zippedOutputStream
	 * @throws IOException
	 */
	public static void sarToZip(InputStream saredInputStream, OutputStream zippedOutputStream) throws IOException {
		sarToZip(saredInputStream, true, zippedOutputStream, true);
	}

	/**
	 * @param saredInputStream
	 * @param closeIn
	 * @param zippedOutputStream
	 * @param closeOut
	 * @throws IOException
	 */
	public static void sarToZip(InputStream saredInputStream, boolean closeIn, OutputStream zippedOutputStream, boolean closeOut) throws IOException {
		sarToZipNoClose(saredInputStream, zippedOutputStream);

		if (closeIn)
			saredInputStream.close();
		if (closeOut)
			zippedOutputStream.close();
	}

	/**
	 * @param zippedInputStream
	 * @param saredOutputStream
	 * @throws IOException
	 */
	private static void zipToSarNoClose(InputStream zippedInputStream, OutputStream saredOutputStream) throws IOException {

		ZipInputStream zipInputStream = new ZipInputStream(zippedInputStream);
		SarOutputStream sarOutputStream = new SarOutputStream(saredOutputStream);

		ZipEntry zipEntry;
		byte[] buf = new byte[BUFFER_SIZE];
		while ((zipEntry = zipInputStream.getNextEntry()) != null) {
			boolean isZip = isZip(zipEntry);
			SarEntry sarEntry = new SarEntry(zipEntry, isZip);
			sarOutputStream.putNextEntry(sarEntry);
			if (isZip) {
				zipToSarNoClose(zipInputStream, sarOutputStream);
			} else {
				int read;
				while ((read = zipInputStream.read(buf)) != -1) {
					if (DEBUG) {
						System.out.println("Content: " + new String(buf, 0, read));
					}
					sarOutputStream.write(buf, 0, read);
				}
			}
			zipInputStream.closeEntry();
			sarOutputStream.closeEntry();
		}
		sarOutputStream.finish();
	}

	/**
	 * @param saredInputStream
	 * @param zippedOutputStream
	 * @throws IOException
	 */
	private static void sarToZipNoClose(InputStream saredInputStream, OutputStream zippedOutputStream) throws IOException {

		SarInputStream sarInputStream = new SarInputStream(saredInputStream);
		ZipOutputStream zipOutputStream = new ZipOutputStream(zippedOutputStream);

		SarEntry sarEntry;
		byte[] buf = new byte[BUFFER_SIZE];
		while ((sarEntry = sarInputStream.getNextEntry()) != null) {
			ZipEntry zipEntry = new ZipEntry(sarEntry);
			zipOutputStream.putNextEntry(zipEntry);
			if (sarEntry.isZip()) {
				sarToZipNoClose(sarInputStream, zipOutputStream);
			} else {
				int read;
				while ((read = sarInputStream.read(buf)) != -1) {
					if (DEBUG) {
						System.out.println("Content: " + new String(buf, 0, read));
					}
					zipOutputStream.write(buf, 0, read);
				}
			}
			sarInputStream.closeEntry();
			zipOutputStream.closeEntry();
		}

		zipOutputStream.finish();
	}

	private static boolean isZip(ZipEntry zipEntry) {
		String name = zipEntry.getName().toLowerCase();
		return name.endsWith(".zip") || name.endsWith(".jar");
	}
}
