/*
 * $Id: VKCExternalUtils.java,v 1.6 2008/11/03 08:59:43 korowa Exp $
 *
 * Copyright (c) Siemens AG 2008 
 *           (c) Universität Paderborn 2008 
 * Licensed under EUPL 1.1. 
 * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
 * THIS SOFTWARE OR ITS DERIVATIVES.
 *
 * $Log: VKCExternalUtils.java,v $
 * Revision 1.6  2008/11/03 08:59:43  korowa
 * ein testfall hinzugefügt
 *
 * Revision 1.5  2006/09/13 09:32:46  lawern
 * allgemeine Überarbeitung
 *
 * Revision 1.4  2006/08/24 14:52:55  marbobo
 * + Refactoring
 *
 * Revision 1.3  2006/08/24 01:01:33  marbobo
 * + Behandlung von dyn. Attributen
 * + Bugfixes
 *
 * Revision 1.2  2006/08/23 18:37:15  marbobo
 * + kleine Anpassung
 *
 * Revision 1.1  2006/08/21 13:37:02  marlin
 * Instanzierung des Strukturtemplates eingebaut
 *
 * Revision 1.1  2006/08/17 13:01:14  lawern
 * Erster unvollständiger Schnellschuss für die Externe API.
 *
 */
package vkc.external;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.util.HashMap;
import java.util.Properties;

import vkc.db.GenericDBImpl;
import vkc.db.VKCDatabase;
import vkc.db.entities.VKCCategory;
import vkc.db.entities.VKCDynaAttribute;
import vkc.exception.DBException;
import vkc.util.FileUtils;
import vkc.util.ObjectCloner;
import vkc.util.VKCCoder;
import vkc.view.WebShare;

/**
 * Die Klasse enthält Methoden zur Initialisierung und Methoden, die semantisch
 * in keine der anderen Klassen dieses Packages passen.
 * 
 * @author Andreas Fölker
 */
public class VKCExternalUtils {
	public final static String DYN_ATTR_PWS_STA_ID = "PWS_STA_ID";

	private static VKCDatabase database = null;

	/**
	 * Initialisierung des VKC-Systems. Diese Methode muss aufgerufen werden,
	 * wenn VKC nicht als Webapplikation innerhalb eines Webservers läuft und
	 * ist insbesondere zu Testzwecken erforderlich.
	 * 
	 * @param webpath
	 *            Der absolute Pfad zur Webapplikation (z.B.
	 *            C:/Projekte/VKC/defaultroot)
	 * @return Das VKC Datenbankobject, das als Argument für andere Methoden
	 *         benötigt wird.
	 */
	public static void init(String webpath) throws Exception {
		Properties props = new Properties();
		FileInputStream in = new FileInputStream(webpath
				+ "/WEB-INF/vkc.properties");
		props.load(in);
		in.close();

		database = GenericDBImpl.getInstance(props);

		// Kopie aus StartupServlet.init(...) (da private)
		byte[] b = FileUtils.getFileAsByteArray(new File(webpath
				+ "/WEB-INF/license.dat"));
		ByteArrayInputStream bin = new ByteArrayInputStream(VKCCoder
				.base64Decode(new String(b)).getBytes());
		ObjectInputStream ois = new ObjectInputStream(bin);
		String s = (String) ois.readObject();
		HashMap systemParameters = (HashMap) ObjectCloner.toObject(s);
		WebShare.setPermanentSystemParameters(systemParameters);
		s = (String) ois.readObject();
		HashMap tabViews = (HashMap) ObjectCloner.toObject(s);
		WebShare.setPermanentTabViews(tabViews);

		WebShare.init(webpath);

		// Classifier usw. brauchen etwas mehr Zeit zur Initialisierung.
		// Zeit wird benötigt, damit keine Exceptions auftreten
		try {
			Thread.sleep(10000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * Erzeugt ein neues Projekt aus dem Strukturtemplate-Archiv. Die
	 * Dokumenten-ID des Strukturtemplate-Archivs muss als dynamisches Attribut
	 * 'PWS_STA_ID' an der Rootkategorie existieren.
	 * 
	 * @param user
	 *            Das User-Objekt
	 * @param projectName
	 *            Der Name der neuen Kategorie / Projekts. Falls schon eine
	 *            Kategorie mit dem Namen existiert, wird der Name automatisch
	 *            mit einem Suffix versehen.
	 * @return Das VKC Datenbankobject, das als Argument für andere Methoden
	 *         benötigt wird.
	 * @throws VKCExternalException
	 *             Exception, falls kein Strukturtemplatearchiv gefunden wird.
	 * @throws DBException
	 *             VKC interne Datenbank Exception
	 * @throws Exception,
	 *             falls das Template-Archive nicht gefunden wird
	 */
	public static VKCCategoryDAO createProjectFromTemplate(VKCUserDAO user,
			String projectName) throws VKCExternalException, DBException {
		// Root-Kategorie und daran als dyn. Attribut hängende ID des
		// Template-Verzeichnisses holen
		VKCCategoryDAO rootCategorie = VKCCategoryDAO
				.retrieveVKCRootCategoryDAO(user);

		// Prüfung auf Vorhandensein des Template-Archivs
		VKCDynaAttribute attr = rootCategorie.internalCategory
				.getDynaAttribute(DYN_ATTR_PWS_STA_ID);
		if (attr == null) {
			throw new VKCExternalException(VKCExternalException.STA_NOT_FOUND);
		}

		// Kategorie kopieren
		VKCCategory templateInstance = database.copyCategory(
				rootCategorie.internalCategory, Integer.getInteger(attr
						.getValue()), projectName, true, user.getIntUser());
		return new VKCCategoryDAO(templateInstance);
	}

	public static void main(String[] args) throws Exception {
		// Initialisierung
		VKCExternalUtils.init("C:/VKC/VKC3/defaultroot");

		// Administrator Benutzerobjekt holen
		VKCUserDAO user = VKCUserDAO.login("Admin", "AdminPwd");

		// Neues Projekt aus Template anlegen
		//VKCExternalUtils.createProjectFromTemplate(user, "Projekt X");
        VKCCategoryDAO parent = VKCCategoryDAO.retrieveVKCCategoryDAO(1, user);
        
        VKCCategoryDAO cat = new VKCCategoryDAO("Name","Description",1);
        
        cat.save(user);
        
        parent.addSubCategory(cat, user);
        cat.removePublicPermission(user);
        
        cat.addUserPermission(user, user, true, true, true, true, false, true);
        cat.save(user);
        
        VKCCategoryDAO cat2 = new VKCCategoryDAO("Name","Description",cat.getCategoryId());
        cat2.save(user);
        cat.addSubCategory(cat2, user);
        cat2.addUserPermission(user, user, true, true, true, true, false, true);
        cat2.save(user);
       
		/*
		 * VKCCategoryDAO rootCategorie =
		 * VKCCategoryDAO.retrieveVKCRootCategoryDAO(user);
		 * 
		 * 
		 * VKCDynaAttribute attr =
		 * rootCategorie.intCat.getDynaAttribute("PWS_STA_ID");
		 * System.out.println(attr.getValue());
		 * 
		 * VKCCategoryDAO subCat =
		 * VKCCategoryDAO.retrieveVKCCategoryDAO(Integer.parseInt(attr.getValue()),
		 * user); System.out.println(subCat.intCat.getName());
		 * 
		 * //VKCCategory copyCat = database.copyCategory(rootCategorie.intCat,
		 * new Integer(3), "Project_z", true, user.getIntUser()); /* if( attr !=
		 * null){ // Das zu setzende Attribut existiert bereits -> UPDATE
		 * attr.setValue( dynAttrValue );
		 * 
		 * }else{ // Exisitert noch nicht -> INSERT attr = new
		 * VKCDynaAttribute(); attr.setName( dynAttrKey ); attr.setValue(
		 * dynAttrValue ); doc.getDynaAttributes().add(attr); }
		 */

	}

}
