/*
 * $Id: VKCDatabase.java,v 1.130 2005/09/22 01:25:26 marbobo Exp $
 *
 * Copyright (c) Siemens AG 2008 
 *           (c) Universität Paderborn 2008 
 * Licensed under EUPL 1.1. 
 *
 * $Log: VKCDatabase.java,v $
 * Revision 1.130  2005/09/22 01:25:26  marbobo
 * + Unnötige Variablen entfernt
 *
 * Revision 1.129  2005/09/05 22:44:16  marbobo
 * - Unnötige Methode entfernt
 *
 * Revision 1.128  2005/08/26 14:52:55  jonyp
 * move2Trash functionality
 *
 * Revision 1.127  2005/08/19 15:10:46  jonyp
 * Trash Functionality
 *
 * Revision 1.126  2005/02/08 16:16:07  bigmac
 * Quotabehandlung überarbeitet
 *
 * Revision 1.125  2004/12/06 10:46:13  jonyp
 * addes oracle specific default constants
 *
 * Revision 1.124  2004/11/24 09:25:51  lawern
 * Hibernate ist VKC-Geschichte!
 *
 * Revision 1.123  2004/11/19 13:58:33  koppy
 * Konstanten für die Treiber eingeführt
 *
 * Revision 1.122  2004/11/09 14:35:40  marbobo
 * + Umstellung von authorId auf publisherId
 * + Hinzufügen von AuthorName für Dokumente
 * + Nötwendige Änderungen betreffend AuthorName und PublisherId
 *
 * Revision 1.121  2004/11/05 01:55:58  marbobo
 * - hasPublishedDocuments()
 *
 * Revision 1.120  2004/10/31 18:19:35  marbobo
 * + Bei den Kopier- und Verschiebefunktionen   Benutzerrechte berücksichtigen
 * + Der Benutzer der Kopier- und Verschiebefunktionen ausführt bekommt standardmäßig alle Rechte
 *
 * Revision 1.119  2004/10/31 02:58:29  marbobo
 * + Bei den Kopierfunktionen (unvollständig)  Benutzerrechte berücksichtigen
 *
 * Revision 1.118  2004/08/05 07:06:14  koppy
 * + getDbUrl()
 *
 * Revision 1.117  2004/07/20 15:16:04  jonyp
 * changed due to move of VKCQuotaInfo from util to view.bean
 *
 * Revision 1.116  2004/04/06 00:02:31  marbobo
 * + getQuotaInfos() ( wegen Percormance-Speedup beim sortieren 
 * nach Quota und Anzah Pub. Dokumente )
 *
 * Revision 1.115  2004/03/31 13:51:29  bigmac
 * *** empty log message ***
 *
 * Revision 1.114  2004/03/16 16:02:05  teng
 * Funktionen bzgl. Mailing sind weg
 *
 * Revision 1.113  2004/03/15 13:40:02  bigmac
 * Anpassungen an PermissionManager und weitere Refactorings
 *
 * Revision 1.112  2004/03/15 10:35:50  bigmac
 * Weitere Refactorings ...
 *
 * Revision 1.111  2004/03/13 20:46:15  bigmac
 * Weitere Refactorings ...
 *
 * Revision 1.110  2004/03/12 15:44:16  bigmac
 * Methoden für (lokale) zusätzliche Attribute aus VKCDynAttributeSerializer 
 * nach VKCAddAttributeSerializer verschoben
 * 
 * Unbenutze private Methoden projektweit entsorgt
 *
 * Revision 1.109  2004/03/11 20:17:18  bigmac
 * Anpassungen an VKCUserSerializer
 *
 * Revision 1.108  2004/03/10 13:18:22  bigmac
 * saveAdditionalDocumentFormats() verschoben nach VKCDocumentFormatSerializer
 *
 * Revision 1.107  2004/03/09 18:40:36  bigmac
 * Anpassungen an VKCSysParameterSerializer
 *
 * Revision 1.106  2004/03/08 18:21:16  bigmac
 * saveDefaultAcl() und getDefaultCalAcl()  nach VKCAclSerializer verschoben
 * Anpassungen an VKCLanguageSerializer und VKCLanguagePackSerializer
 *
 * Revision 1.105  2004/03/08 16:20:47  teng
 * getTemplateURL() wird geloescht
 *
 * Revision 1.104  2004/03/07 20:05:56  bigmac
 * einige Methoden aus der VKCDataBase in die entsprechenden 
 * Serializer verschoben, ein paar Refactorings durchgeführt und 
 * tote Code-Teile entfernt
 *
 * Revision 1.103  2004/03/07 16:53:21  bigmac
 * Anpassungen an VKCAclSerializer
 *
 * Revision 1.102  2004/03/07 13:45:46  bigmac
 * Anpassungen an VKCDocumentTypeSerializer, VKCDocumentClassSerializer, VKCDocumentStatusSerializer
 *
 * Revision 1.101  2004/03/04 10:23:01  jonyp
 * added deleteAcl
 *
 * Revision 1.100  2004/03/02 23:05:44  bigmac
 * Anpassungen an VKCDocumentSerializer und VKCCategorySerializer
 *
 * Revision 1.99  2004/03/02 17:43:50  bigmac
 * Anpassungen an VKCGroupSerializer
 *
 * Revision 1.98  2004/02/24 13:31:21  bigmac
 * Signatur von saveProxyUsers() erweitert
 *
 * Revision 1.97  2004/02/20 16:35:18  bigmac
 * Anpassungen bzgl. Dokumentstati und Dokumentklassen
 *
 * Revision 1.96  2004/02/17 17:06:53  vchris
 * Änderungen bzgl. Projektmgmt
 *
 * Revision 1.95  2004/02/10 16:25:15  vchris
 * Erweiterungen für Projektmanagement
 *
 * Revision 1.93  2004/02/09 21:19:21  bigmac
 * Signaturen für retrieveCategoryProjectSteps und saveCategoryProjectSteps geändert
 *
 * Revision 1.92  2004/02/09 13:17:03  bigmac
 * + getUserInfos(VKCCategory category, String permTokens)
 *
 * Revision 1.91  2004/01/27 15:54:45  bigmac
 * + getProjectInfos()
 *
 * Revision 1.90  2004/01/17 02:41:21  koppy
 * copyCategory um die Möglichkeit des rekursiven Kopierens erweitert
 *
 */
package vkc.db;

import java.sql.Connection;

import vkc.db.entities.VKCCategory;
import vkc.db.entities.VKCUser;

import vkc.exception.DBException;

import vkc.view.bean.VKCQuotaInfo;

import vkc.util.treeview.TreeView;

import java.util.HashMap;
import java.util.Set;

/**
 * Interface für das Speichern der VKC Entitätsobjekte in eine Datenbank
 *
 * @author koppy
 * @version 1.0
 */
public interface VKCDatabase {
    // Datenbankunabhängiger Typ
    public static final int GENERIC 	= 1;
    
    public static final String FIREBIRD_DRIVER 	= "org.firebirdsql.jdbc.FBDriver";
    public static final String ORACLE_DRIVER	= "oracle.jdbc.driver.OracleDriver";
    public static final String POSTGRES_DRIVER	= "org.postgresql.Driver";
    
    /**
     * Exception Message für überschrittene Quota
     */
    public static final String QUOTA_EXCEEDED = "Quota exceeded!";
    
    /**
     * Gibt den Zeitpunkt zurück an dem die Struktur-Pfade zuletzt modifiziert
     * wurden.
     *
     * @return Zeitpunkt an dem die Struktur-Pfade zuletzt modifiziert wurden
     */
    public long getStructureChangedAt();

    public void setStructureChangedAt(long time);

    public Connection getConnection() throws DBException;

    /**
     * Baut den Navigator-Baum auf
     *
     * @param tree der aufzubauende Baum
     *
     * @throws DBException
     */
    public void buildTree(TreeView tree) throws DBException;

    /**
     * Verschiebt die Kategorien und Dokumente, deren IDs als Set von
     * <i>Integer-Objekten</i> übergeben werden,  in die Kategorie mit der ID
     * <i>targetCategoryId</i>
     *
     * @param source Quell-Kategorie
     * @param target Ziel-Kategorie
     * @param categoryIds Set von Kategorie-IDs (Typ:Integer),
     * @param documentIds Set von Dokumenten-IDs (Typ:Integer)
     * @param user Benutzer der diese Operation ausführt
     */
    public void move(VKCCategory source, VKCCategory target, Set categoryIds, Set documentIds, VKCUser user) throws DBException;

    /**
     * Kopiert die Kategorien und Dokumente, deren IDs als Set von
     * <i>Integer-Objekten</i> übergeben werden,  in die Kategorie mit der ID
     * <i>targetCategoryId</i>
     *
     * @param target Ziel-Kategorie
     * @param categoryIds Set von Kategorie-IDs (Typ:Integer),
     * @param documentIds Set von Dokumenten-IDs (Typ:Integer)
     * @param user Benutzer der diese Operation ausführt
     * 
     */
    public void copy(VKCCategory target, Set categoryIds, Set documentIds, VKCUser user) throws DBException;

    /**
      * Kopiert ein Dokument in die Ziel-Kategorie
      *
      * @param target Zielkategorie
      * @param docId Dokument, welches kopiert werden soll
      * @param newName Hier kann ein Name angegeben werden, wenn das Dokument gleichzeitig umbenannt werden soll.
      * @param user Benutzer der diese Operation ausführt
      */
    public void copyDocument(VKCCategory target, Integer docId, String newName, VKCUser user) throws DBException;

    /**
      * Kopiert eine Kategorie ohne Unterverzeichnisse aber mit Dokumenten in die Ziel-Kategorie
      *
      * @param target Zielkategorie
      * @param catId Kategorie, welche kopiert werden soll
      * @param newName Hier kann ein Name angegeben werden, wenn die Kategorie gleichzeitig umbenannt werden soll.
      * @param rekursiv falls DOCH alle Unterverzeichnisse rekursiv kopiert werden sollen
      * @param user Benutzer der diese Operation ausführt
      */
    public VKCCategory copyCategory(VKCCategory target, Integer catId, String newName, boolean rekursiv, VKCUser user) throws DBException;

	public VKCCategory copyCategory(Connection connection, VKCCategory target, Integer catId, String newName, boolean rekursiv, VKCUser user) throws DBException;

    /**
     * Löscht die Kategorien und Dokumente, deren IDs als Set von
     * <i>Integer-Objekten</i> übergeben werden
     *
     * @param source Quell-Kategorie
     * @param categoryIds Set von Kategorie-IDs (Typ:Integer),
     * @param documentIds Set von Dokumenten-IDs (Typ:Integer)
     * @param deletor VKCUser, welcher die Dateien löschen möchte
     */
    public void delete(Integer sourceCategoryId, Set categoryIds, Set documentIds, VKCUser deletor) throws DBException;

    /**
     * Ermittelt die MB der publizierten Dokumente eines Users
     *
     * @param user
     * @return MB of published documents
     * @throws DBException
     */
    public VKCQuotaInfo getQuotaInfo(Integer userId) throws DBException;
    
    public VKCQuotaInfo getQuotaInfo(Integer userId, boolean force) throws DBException;
    
	public HashMap getQuotaInfos() throws DBException;
    
	/**
	 * Returns the dbUrl associated with the VKCDatabase
     * @return
     */
    public String getDbUrl();
}