/*
 * $Id: ArchiveCategoryTemplateParser.java,v 1.17 2007/11/16 14:47:31 marbobo Exp $
 * 
 * Copyright (c) Siemens AG 2008 
 *           (c) Universität Paderborn 2008 
 * Licensed under EUPL 1.1. 
 *
 * $Log: ArchiveCategoryTemplateParser.java,v $
 * Revision 1.17  2007/11/16 14:47:31  marbobo
 * + Jetzt werden beim Archivieren auch alle Versionen für ein Dokument angezeigt
 *
 * Revision 1.16  2006/10/04 03:14:29  marbobo
 * + Vollständige Unterstützung für Templates implementiert
 * + Alles von Virtoweb auf ProCoBa umgestellt
 *
 * Revision 1.15  2006/04/11 19:45:04  marbobo
 * + Komprimierung auf 7z-Format umgestellt
 *
 * Revision 1.14  2006/03/29 00:06:38  marbobo
 * + Bugfix
 *
 * Revision 1.13  2005/07/28 19:58:54  marbobo
 * + Bugfix bei Dateigrößeanzeige
 *
 * Revision 1.12  2005/03/15 22:32:41  marbobo
 * + Unicode-Unterstützung
 *
 * Revision 1.11  2004/11/10 15:02:45  koppy
 * Projektweite Überarbeitung von Error-Logs, Stacktraces,..
 *
 * Revision 1.10  2004/07/20 08:33:14  jonyp
 * added copyright info + cvs log
 *
 * Revision 1.9  2004/05/09 16:25:53  marbobo
 * + Internationalisierung
 *
 * Revision 1.8  2004/04/27 18:56:24  marbobo
 * + Virtuelle Dokumente archivieren
 *
 * Revision 1.7  2004/04/15 20:37:54  marbobo
 * + Archivierung von Projekten hinzugefügt
 *
 * Revision 1.6  2004/03/11 20:17:19  bigmac
 * Anpassungen an VKCUserSerializer
 *
 * Revision 1.5  2004/03/05 16:53:52  teng
 * Templatepfade fuer Index und Xml-Dateien werden inner dieser Klasse definiert.
 *
 * Revision 1.3  2004/02/12 18:01:12  teng
 * jetzt wird dokumentiert und geraeumt
 */
package vkc.misc;

import vkc.db.entities.VKCDocument;
import vkc.db.entities.VKCCategory;
import vkc.db.entities.VKCUser;
import vkc.util.ServletUtils;
import vkc.util.VKCStringUtils;
import vkc.view.bean.ResourceInfo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * Eine Klasse kann benutzt werden, aus der Template-Datei die Index- und/oder XML-Datei fuer eine Kategorie zu erzeugen. 
 * Fuer jede Kategorie muss eine neue Instanz dieser Klasse durch <code>getTemplateParser(String, String, String)</code> erzeugt werden
 *
 */
public class ArchiveCategoryTemplateParser {
	TemplateParser parser = null;

	/**
	 * feststellen, ob <code>setContextData()</code> schon mal aufgerufen wird
	 */
	private boolean contextDataReady = false;

	/**
	 * Template fuer die Index-Datei
	 */
	private String indexTemplate = "templates/${template.name}/velocitytemplates/common/ArchiveCategoryIndex.html";

    /**
     * Template fuer die Index-Datei
     */
    private String documentIndexTemplate = "templates/${template.name}/velocitytemplates/common/ArchiveDocumentIndex.html";

    /**
	 * Template fuer die Projectcontact-Datei
	 */
	private String projectcontactTemplate = "templates/${template.name}/velocitytemplates/common/ProjectContactIndex.html";

	/**
	 * Template fuer die Projectstate-Datei
	 */
	private String projectstateTemplate = "templates/${template.name}/velocitytemplates/common/ProjectStateIndex.html";

	/**
	 * Template fuer die XML-Datei
	 */
	private String xmlTemplate = "templates/${template.name}/velocitytemplates/common/ArchiveCategoryIndex.xml";

	/**
	 * link to the index file in the parent path
	 */
	private String parentPath = ArchiveCategory.indexFileName;

	/**
	 * Folgende Liste werden benutzt, die Daten fuer <code>context</code> vorzubereiten
	 */
	private ArrayList parentCats = new ArrayList();

	private ArrayList parentPaths = new ArrayList();

	private ArrayList subCats = new ArrayList();

	private ArrayList subCatPaths = new ArrayList();

	private ArrayList docs = new ArrayList();

	private ArrayList virtualdocs = new ArrayList();
	
	private HashMap docFilenames = new HashMap();
	
	private ResourceInfo resources = new ResourceInfo();

	private VKCStringUtils vkcStringUtils = new VKCStringUtils();

	private VKCCategory currentCat = new VKCCategory();

	private VKCUser user = new VKCUser();

	public ArchiveCategoryTemplateParser() throws Exception {
		parser = TemplateParser.getTemplateParser();
	}

	/**
	 * Index-Datei erzeugen.
	 * @param newfile Name der Indexdatei
	 * @param includeVersion bei true, werden die Dokumente aller Versionen erzeugt 
	 */
	public void createIndexFile(String newfile, boolean includeVersion) {
		if (parser != null) {
			if (!contextDataReady) {
				setData();
			}

			parser.setContextData("includeVersion", "" + includeVersion);

			try {
				parser.createFile(ServletUtils.replacePathVars(indexTemplate, user), VKCStringUtils.decodeXmlEntities(newfile));
			} catch (Exception ex) {
				VKCLogManager.errorLog(this, "", ex.getMessage(), ex);
			}
		}
	}

    /**
     * Index-Datei erzeugen.
     * @param newfile Name der Indexdatei
     * @param includeVersion bei true, werden die Dokumente aller Versionen erzeugt 
     */
    public void createDocumentIndexFile(String newfile, List documentVersions) {
        if (parser != null) {
            if (!contextDataReady) {
                setData();
            }

            parser.setContextData("documentVersions", documentVersions);

            try {
                parser.createFile(ServletUtils.replacePathVars(documentIndexTemplate, user), VKCStringUtils.decodeXmlEntities(newfile));
            } catch (Exception ex) {
                VKCLogManager.errorLog(this, "", ex.getMessage(), ex);
            }
        }
    }

	/**
	 * Projectcontact-Datei erzeugen.
	 * @param newfile Name der Projectcontactdatei
	 */
	public void createProjectContactFile(String newfile) {
		if (parser != null) {
			if (!contextDataReady) {
				setData();
			}

			try {
				parser.createFile(ServletUtils.replacePathVars(projectcontactTemplate, user), VKCStringUtils.decodeXmlEntities(newfile));
			} catch (Exception ex) {
				VKCLogManager.errorLog(this, "", ex.getMessage(), ex);
			}
		}
	}

	/**
	 * Projectstate-Datei erzeugen.
	 * @param newfile Name der Projectstatedatei
	 */
	public void createProjectStateFile(String newfile) {
		if (parser != null) {
			if (!contextDataReady) {
				setData();
			}

			try {
				parser.createFile(ServletUtils.replacePathVars(projectstateTemplate, user), VKCStringUtils.decodeXmlEntities(newfile));
			} catch (Exception ex) {
				VKCLogManager.errorLog(this, "", ex.getMessage(), ex);
			}
		}
	}

	/**
	 * 
	 * @param newfile Dateiname, unter dem diese XML-Datei erzeugt werden soll 
	 */
	public void createXMLFile(String newfile) {
		if (parser != null && xmlTemplate != null) {
			if (!contextDataReady) {
				setData();
			}

			try {
				parser.createFile(ServletUtils.replacePathVars(xmlTemplate, user), VKCStringUtils.decodeXmlEntities(newfile));
			} catch (Exception ex) {
				VKCLogManager.errorLog(this, "", ex.getMessage(), ex);
			}
		}
	}

	/**
	 * die Daten vorbereiten. 
	 *
	 */
	public void setData() {
		if (parser != null) {
			parser.setContextData("virtualdocuments", virtualdocs);
			parser.setContextData("documents", docs);
			parser.setContextData("documentfilenames", docFilenames);
			parser.setContextData("parentcats", parentCats);
			parser.setContextData("parentpaths", parentPaths);
			parser.setContextData("subcategories", subCats);
			parser.setContextData("subcatpaths", subCatPaths);
			parser.setContextData("resources", resources);
			parser.setContextData("vkcstringutils", vkcStringUtils);
			parser.setContextData("currentcat", currentCat);
			parser.setContextData("user", user);
		}

		contextDataReady = true;
	}

	public void addParentCategory(VKCCategory cat) {
		parentCats.add(cat);
		parentPath = "../" + parentPath;
		parentPaths.add(0, parentPath);
	}

	/**
	 * 
	 * @param cat Eine Unterkategorie
	 * @param pathName Pfadname der Kategorie cat
	 */
	public void addSubCategory(VKCCategory cat, String pathName) {
		subCats.add(cat);
		subCatPaths.add(pathName);
	}

	public void setCurrentCategory(VKCCategory cat) {
		currentCat = cat;
	}

	public void addDocument(VKCDocument doc) {
		docs.add(doc);
	}

	public void addVirtualDocument(VKCDocument doc) {
		virtualdocs.add(doc);
	}

	public void addDocumentFilename(Integer id, String value) {
		docFilenames.put(id, value);
	}

	public void setResources(ResourceInfo info) {
		resources = info;
	}

	public void setUser(VKCUser user) {
		this.user = user;
	}
}