//------------------------------------------------------------------------------
//Copyright (c) 2005, 2007 IBM Corporation 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:
//IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.search.utils;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;


public class JarCreator {

	
	public static final String INDEX_JAR = "index.jar"; //$NON-NLS-1$

	public static void main(String[] args)
	{
		jarFolder(args[0]);
	}

	public static void jarFolder(String foldername)
	{
		try
		{
			System.out.println("attempting to jar stuff"); //$NON-NLS-1$
			File jarDir = new File(foldername);
			File jarFile = new File(foldername + File.separator +INDEX_JAR);

			jarFiles(jarDir, jarFile);
		}
		catch (Exception e1)
		{
			System.out.println("Exception in the jar thingy"); //$NON-NLS-1$
			e1.printStackTrace();
		}
	}
	
	
	/**
	 * method to jar the specified dir into a jar file. non-sub-folders will be jared.
	 * @param jarDir
	 * @param jarFile
	 * @throws IOException
	 */
	public static void jarFiles(File jarDir, File jarFile) throws IOException
	{
		File[] files = jarDir.listFiles();
		if (jarFile.exists())
		{
			jarFile.delete();
		}
		BufferedOutputStream bStream = new BufferedOutputStream(new FileOutputStream(jarFile));
		ZipOutputStream zipperStream = new ZipOutputStream(bStream);

		byte[] bytes = new byte[4096];
		for (int i=0; i<files.length; i++)
		{
			File currentFile = files[i];
			if ( currentFile.isDirectory() )
			{
				continue;
			}
			ZipEntry currEntry = new ZipEntry(currentFile.getName());
			zipperStream.putNextEntry(currEntry);
			BufferedInputStream biStream = new BufferedInputStream(new FileInputStream(currentFile));
			while (biStream.available() > 0)
			{
				int num = biStream.read(bytes);
				zipperStream.write(bytes, 0, num);
			}
			biStream.close();
			zipperStream.closeEntry();
		}
		zipperStream.close();
		bStream.close();
	}
}
