/*
 * $Id: MsOutlookDocConverter.java,v 1.6 2007/02/12 07:15:57 lawern Exp $
 *
 * Copyright (c) Siemens AG 2008 
 *           (c) Universität Paderborn 2008 
 * Licensed under EUPL 1.1. 
 *
 * $Log: MsOutlookDocConverter.java,v $
 * Revision 1.6  2007/02/12 07:15:57  lawern
 * Überarbeitung und Anpassung an Linux
 *
 * Revision 1.5  2006/06/06 20:36:04  marbobo
 * + Mögliche NPE abgefangen
 *
 * Revision 1.4  2006/04/07 09:48:31  korowa
 * Konvertierung ins PDF-Format hinzugefügt.Nur erlaubte Konvertierungen werden durchgeführt(DocConverter:conversions) bzw. zurückgeliefert.
 *
 * Revision 1.3  2006/03/23 11:36:43  marbobo
 * + Mögliche NPE abgefangen
 *
 * Revision 1.2  2004/06/27 17:12:47  marbobo
 * + Quellcode maintenance
 *
 * Revision 1.1  2004/04/22 07:24:49  lawern
 * MsOutlookDocConverter eingefügt.
 *
 *
 */
package vkc.converter;

import vkc.misc.VKCLogManager;
import vkc.misc.VKCProcess;

import vkc.util.FileUtils;
import vkc.util.VKCInputStream;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

import java.net.URL;

import java.util.ArrayList;
import java.util.Collection;

/**
 * Klasse zum Konvertieren von Textdokumenten.
 *
 * @author lawern
 */
public class MsOutlookDocConverter extends DocConverter {
	private static final boolean debug = false;

	public static String docSuffix = ".msg";

	private String[] cmdarr;

	private String[] env = null;

	private File dir = null;

	private File emlFile = null;

	private EmlDocConverter emlConverter = null;

	public MsOutlookDocConverter() {
	}

	/**
	 * Liefert den Suffix für temporäre Dateien zurück.
	 *
	 * @return docSuffix
	 */
	public String getDocSuffix() {
		return docSuffix;
	}

	/**
	 * Diese Methode konvertiert das übergebene Dokument in die in der
	 * Collection definierten Formate. Der Parameter conversions wird zur Zeit
	 * noch nicht ausgewertet.
	 *
	 * @param docFile URL des zu konvertierendes Dokument
	 * @param conversions Collection von VKCDocumentTypes welche die zu
	 *        erzeugenden Konvertierungen beschreibt.
	 */
	public void convert(URL docFile, Collection conversions) {
		if (debug) {
			System.out.println("MsOutlookDocConverter: " + docFile);
		}

		InputStream docStream = null;
		File tmpFile = null;

		try {
			//Datei von Url in temporäre Datei schreiben
			docStream = docFile.openStream();
			tmpFile = File.createTempFile("OutlookDoc", ".msg");

			if (!debug) {
				tmpFile.deleteOnExit();
			}

			FileUtils.saveInputStream(tmpFile, docStream, true);
			FileUtils.closeInputStream(docStream);

			//String docFileString = VKCUtils.getLocalPath(docFile);
			VKCProcess process = null;

			dir = new File(basePath).getAbsoluteFile();

			try {
				emlFile = File.createTempFile("EmlDoc", ".eml");
			} catch (java.io.IOException ioe) {
				VKCLogManager.errorLog(this, "3", "Can't create temp-file.", ioe);
			}

			// Kommando-Array mit Voreinstellung für den Konverter
			// initialisieren
            if (windows) {
                cmdarr = new String[8];
                cmdarr[0] = "cmd";
                cmdarr[1] = "/c";
                cmdarr[2] = "msgconvert";
                cmdarr[3] = tmpFile.getCanonicalPath();
                cmdarr[4] = ">";
                cmdarr[5] = emlFile.getCanonicalPath();
                cmdarr[6] = "2>";
                cmdarr[7] = "nul";
            } else {
                cmdarr = new String[3];
                cmdarr[0] = "sh";
                cmdarr[1] = "-c";
                cmdarr[2] = "./msgconvert.pl " 
                    + tmpFile.getCanonicalPath()
                    + " > " + emlFile.getCanonicalPath() 
                    + " 2> /dev/null";
            }

			process = new VKCProcess(cmdarr, env, dir);
			process.executeAndWaitWithTimeout(timeout * 60);

			FileUtils.deleteZeroByteFile(emlFile);

			if (!emlFile.exists()) {
				VKCLogManager.errorLog(this, "6", "EML conversion not generated.");
			} else {
				emlConverter = new EmlDocConverter();
				emlConverter.convert(emlFile.toURL(), conversions);

				//Eml-Datei löschen
				try {
					FileUtils.deleteFile(emlFile);
				} catch (Exception ex) {
					VKCLogManager.errorLog(this, "5", "Can't delete EML-file.", ex);
				}
			}
		} catch (IOException ioe) {
			if (tmpFile != null) {
				VKCLogManager.errorLog(this, "8", "Can't create temp-file: " + tmpFile.getPath(), ioe);
			} else {
				VKCLogManager.errorLog(this, "8", "Can't create temp-file: ", ioe);
			}

			FileUtils.closeInputStream(docStream);
		} finally {
			//temporäre Dokumentendatei löschen
			if (!debug) {
				if (tmpFile != null) {
					tmpFile.delete();
				}
			}
		}
	}

	/**
	 * Liefert nach dem Aufruf der convert-Methode den Stream der
	 * Tdf-Konvertierung.
	 *
	 * @return Stream der Tdf-Konvertierung oder <code>null</code> falls er
	 *         nicht existiert
	 */
	public VKCInputStream getTdfStream() {
		if (emlConverter != null && enableTdf) {
			return emlConverter.getTdfStream();
		}

		return null;
	}

	/**
	 * Liefert nach dem Aufruf der convert-Methode den Stream der
	 * HTML-Konvertierung.
	 *
	 * @return Stream der HTML-Konvertierung oder <code>null</code> falls er
	 *         nicht existiert
	 */
	public VKCInputStream getHtmlStream() {
		if (emlConverter != null && enableHtml) {
			return emlConverter.getHtmlStream();
		}

		return null;
	}

	/**
	 * Liefert nach dem Aufruf der convert-Methode den Stream der
	 * PDF-Konvertierung.
	 *
	 * @return Stream der PDF-Konvertierung oder <code>null</code> falls er
	 *         nicht existiert
	 */
	public VKCInputStream getPdfStream() {
		if (emlConverter != null && enablePdf) {
			return emlConverter.getPdfStream();
		}

		return null;
	}

	/**
	 * Gibt eine Liste zurueck, der alle HREFs einer Seite enthält.
	 *
	 * @return Link-Vektor
	 */
	public ArrayList getLinks() {
		if (emlConverter != null) {
			return emlConverter.getLinks();
		}

		return null;
	}

	/**
	 * Liefert den Titel des Dokuments zurück.
	 *
	 * @return Titel des Dokuments oder <code>null</code>
	 */
	public String getTitle() {
		if (emlConverter != null) {
			return emlConverter.getTitle();
		}

		return null;
	}

	/**
	 * Liefert eine Collection mit Objekten vom Typ TdfElement zurück, welche
	 * das Dokument beschreiben.
	 *
	 * @return Collection mit Objekten vom Typ TdfElement
	 */
	public Collection getElements() {
		if (emlConverter != null) {
			return emlConverter.getElements();
		}

		return null;
	}

	/**
	 * Löschen der TDF-Streams
	 */
	void closeTdfStream() {
		if (debug) {
			System.out.println("closeTdfStream");
		}

		decOpenStreams();
	}

	/**
	 * Löschen des Ascii-Streams
	 */
	void closeHtmlStream() {
		if (debug) {
			System.out.println("closeHtmlStream");
		}

		decOpenStreams();
	}

	/**
	 * Schließt das Konverter-Objekt und fügt es wieder in den Konverter-Pool
	 * ein.
	 */
	final void closeConverter() {
		//this-Referenz wieder in die Queue einfügen
	}
}