//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 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.publishing.util;

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.io.StringWriter;
import java.net.URL;
import java.util.Properties;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import org.eclipse.core.runtime.Platform;
import org.eclipse.epf.common.xml.XSLTProcessor;
import org.eclipse.epf.library.layout.util.XmlElement;
import org.eclipse.epf.library.layout.util.XmlHelper;
import org.eclipse.epf.library.util.ResourceHelper;
import org.eclipse.epf.publishing.PublishingPlugin;

/**
 * utility class for publishing service
 * 
 * @author Jinhua Xi
 * @since 1.0
 *
 */
public class PublishingUtil {

	/**
	 * 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);

		String currentName = ""; //$NON-NLS-1$
		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();

	}


	/**
	 * generate the html content for the given xml docuemnt and the xslt path
	 * @param xmlElement XmlElement
	 * @param xslPath String
	 * @return String
	 */
	public static String getHtml(XmlElement xmlElement, String xslPath)
	{
		try
		{
			URL url = new URL(PublishingPlugin.getDefault().getInstallURL(), xslPath);
			if ( url == null )
			{
				System.out.println("Unable to get xsl template " + xslPath); //$NON-NLS-1$
				return null;
			}

			String xsl_uri = Platform.resolve(url).getPath();

			StringBuffer xml = new StringBuffer();
			xml.append(XmlHelper.XML_HEADER).append(xmlElement.toXml());

			Properties xslParams = PublishingPlugin.getDefault().getProperties("/xsl/resources.properties"); //$NON-NLS-1$
			
			// geenrate the html
			StringWriter sw = new StringWriter();
			XSLTProcessor.transform(xsl_uri, xml.toString(), xslParams, sw);
			sw.flush();
			
			// urls are encoded in xslt output, decode it
			return ResourceHelper.decodeUrlsInContent(sw.getBuffer().toString());
		}
		catch (Exception ex)
		{
			ex.printStackTrace();
		}

		return null;
	}

}
