/*
 * Copyright (C) 2009 eXo Platform SAS.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package org.exoplatform.services.jcr.ext.backup;

import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
import org.exoplatform.services.jcr.config.RepositoryEntry;
import org.exoplatform.services.jcr.config.WorkspaceEntry;
import org.exoplatform.services.jcr.ext.backup.impl.BackupMessage;
import org.exoplatform.services.jcr.ext.backup.impl.JobRepositoryRestore;
import org.exoplatform.services.jcr.ext.backup.impl.JobWorkspaceRestore;

import java.io.File;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.jcr.RepositoryException;

/**
 * Created by The eXo Platform SARL .<br>
 * 
 * @author Gennady Azarenkov
 * @version $Id: $
 */

public interface BackupManager
{

   /**
    * The full backup only the type of backup.
    */
   static final int FULL_BACKUP_ONLY = 0;

   /**
    * The full and incremental backup the type of backup.
    */
   static final int FULL_AND_INCREMENTAL = 1;

   /**
    * Getting current backups.
    *
    * @return Set
    *           return the set of current backups 
    */
   Set<BackupChain> getCurrentBackups();

   /**
    * Getting current repository backups.
    *
    * @return Set
    *           return the set of current backups 
    */
   Set<RepositoryBackupChain> getCurrentRepositoryBackups();

   /**
    * Getting list of restores.
    *
    * @return List
    *           return the list of backups
    */
   List<JobWorkspaceRestore> getRestores();

   /**
    * Getting last restore by repository and workspace name.
    *
    * @param repositoryName
    *          String,  the repository name
    * @param workspaceName
    *          String, the workspace name
    * @return JobWorkspaceRestore
    *           return the job to restore
    */
   JobWorkspaceRestore getLastRestore(String repositoryName, String workspaceName);

   /**
    * Getting list of repository restores.
    *
    * @return List
    *           return the list of backups
    */
   List<JobRepositoryRestore> getRepositoryRestores();

   /**
    * Getting last repository restore by repository name.
    *
    * @param repositoryName
    *          String,  the repository name
    * @return JobWorkspaceRestore
    *           return the job to restore
    */
   JobRepositoryRestore getLastRepositoryRestore(String repositoryName);

   /**
    * Getting all backup logs .
    *
    * @return BackupChainLog[]
    *           return the all backup logs
    */
   BackupChainLog[] getBackupsLogs();

   /**
    * Getting all repository backup logs.
    *
    * @return RepositoryBackupChainLog[]
    *           return the all repository backup logs
    */
   RepositoryBackupChainLog[] getRepositoryBackupsLogs();

   /**
    * Starting backup.
    *
    * @param config
    *          BackupConfig, the backup configuration
    * @return BackupChain
    *           return the backup chain
    * @throws BackupOperationException BackupOperationException
    *           will be generate the exception BackupOperationException
    * @throws BackupConfigurationException
    *           will be generate the exception BackupConfigurationException
    * @throws RepositoryException
    *           will be generate the exception RepositoryException
    * @throws RepositoryConfigurationException
    *           will be generate the exception RepositoryConfigurationException
    */
   BackupChain startBackup(BackupConfig config) throws BackupOperationException, BackupConfigurationException,
      RepositoryException, RepositoryConfigurationException;

   /**
    * Stop backup.
    *
    * @param backup
    *          BackupChain, the backup chain 
    */
   void stopBackup(BackupChain backup);

   /**
    * Finding current backup by repository and workspace.
    *
    * @param reposytore
    *          String, the repository name
    * @param workspace
    *          String, the workspace name
    * @return BackupChain
    *           return the current backup 
    */
   BackupChain findBackup(String reposytore, String workspace);

   /**
    * Finding current backup by identifier.
    *
    * @param backupId
    *          String the backup identifier
    * @return BackupChain
    *           return the current backup
    */
   BackupChain findBackup(String backupId);

   /**
    * Restore from backup.
    *
    * @param log
    *          BackupChainLog, the backup log
    * @param repositoryName
    *          String, repository name
    * @param workspaceEntry
    *          WorkspaceEntry, the workspace entry
    * @param asynchronous
    *          boolean, in 'true' then asynchronous restore.   
    * @throws BackupOperationException
    *           will be generate the exception BackupOperationException 
    * @throws BackupConfigurationException
    *           will be generate the exception BackupConfigurationException 
    * @throws RepositoryException
    *           will be generate the exception RepositoryException 
    * @throws RepositoryConfigurationException
    *           will be generate the exception RepositoryConfigurationException 
    */
   void restore(BackupChainLog log, String repositoryName, WorkspaceEntry workspaceEntry, boolean asynchronous)
      throws BackupOperationException, BackupConfigurationException, RepositoryException,
      RepositoryConfigurationException;

   /**
    * Getting the backup messages.
    *
    * @return BackupMessage[]
    *           return the backup messages
    */
   BackupMessage[] getMessages();

   /**
    * Getting backup directory.
    *
    * @return File
    *           return the backup directory
    */
   File getBackupDirectory();

   /**
    * Getting full backup type.
    *
    * @return Sting
    *           return FQN to full backup type 
    */
   String getFullBackupType();

   /**
    * Getting incremental backup type.
    *
    * @return String
    *         return FQN to full backup type
    */
   String getIncrementalBackupType();

   /**
    * Getting default incremental job period.
    *
    * @return long
    *           return the default incremental job period 
    */
   long getDefaultIncrementalJobPeriod();

   /**
    * Starting repository backup.
    *
    * @param config
    *          RepositoryBackupConfig, the backup configuration to repository
    * @return RepositoryBackupChain
    *           return the repository backup chain
    * @throws BackupOperationException BackupOperationException
    *           will be generate the exception BackupOperationException
    * @throws BackupConfigurationException
    *           will be generate the exception BackupConfigurationException
    * @throws RepositoryException
    *           will be generate the exception RepositoryException
    * @throws RepositoryConfigurationException
    *           will be generate the exception RepositoryConfigurationException
    */
   RepositoryBackupChain startBackup(RepositoryBackupConfig config) throws BackupOperationException,
      BackupConfigurationException, RepositoryException, RepositoryConfigurationException;

   /**
    * Stop backup.
    *
    * @param backup
    *          RepositoryBackupChain, the repositroy backup chain 
    */
   void stopBackup(RepositoryBackupChain backup);

   /**
    * Repository restore from backup.
    *
    * @param log
    *          RepositoryBackupChainLog, the repository backup log
    * @param repositoryEntry
    *          RepositoryEntry, the repository entry
    * @param workspaceNamesCorrespondMap
    *          the map with correspondence workspace name in RepositoryEntry and RepositoryBackupChainLog.
    * @param asynchronous
    *          boolean, in 'true' then asynchronous restore.   
    * @throws BackupOperationException
    *           will be generate the exception BackupOperationException 
    * @throws BackupConfigurationException
    *           will be generate the exception BackupConfigurationException 
    * @throws RepositoryException
    *           will be generate the exception RepositoryException 
    * @throws RepositoryConfigurationException
    *           will be generate the exception RepositoryConfigurationException 
    */
   void restore(RepositoryBackupChainLog log, RepositoryEntry repositoryEntry,
      Map<String, String> workspaceNamesCorrespondMap, boolean asynchronous) throws BackupOperationException,
      BackupConfigurationException, RepositoryException, RepositoryConfigurationException;

   /**
    * Repository restore from backup.
    *
    * @param log
    *          RepositoryBackupChainLog, the repository backup log
    * @param repositoryEntry
    *          RepositoryEntry, the repository entry
    * @param asynchronous
    *          boolean, in 'true' then asynchronous restore.   
    * @throws BackupOperationException
    *           will be generate the exception BackupOperationException 
    * @throws BackupConfigurationException
    *           will be generate the exception BackupConfigurationException 
    * @throws RepositoryException
    *           will be generate the exception RepositoryException 
    * @throws RepositoryConfigurationException
    *           will be generate the exception RepositoryConfigurationException 
    */
   void restore(RepositoryBackupChainLog log, RepositoryEntry repositoryEntry, boolean asynchronous)
      throws BackupOperationException, BackupConfigurationException, RepositoryException,
      RepositoryConfigurationException;
   
   /**
    * Repository restore from backup.
    *
    * @param log
    *          RepositoryBackupChainLog, the repository backup log
    * @param repositoryEntry
    *          RepositoryEntry, the repository entry
    * @param asynchronous
    *          boolean, in 'true' then asynchronous restore.   
    * @param removeJobOnceOver
    *          boolean, in 'true' then restore job well remove after restore.
    * @throws BackupOperationException
    *           will be generate the exception BackupOperationException 
    * @throws BackupConfigurationException
    *           will be generate the exception BackupConfigurationException 
    * @throws RepositoryException
    *           will be generate the exception RepositoryException 
    * @throws RepositoryConfigurationException
    *           will be generate the exception RepositoryConfigurationException 
    */
   void restore(RepositoryBackupChainLog log, RepositoryEntry repositoryEntry, boolean asynchronous, boolean removeJobOnceOver)
            throws BackupOperationException, BackupConfigurationException, RepositoryException,
            RepositoryConfigurationException;

   /**
    * Finding current backup by repository.
    *
    * @param repository
    *          String, the repository name
    * @return RepositoryBackupChain
    *           return the current backup to repository 
    */
   RepositoryBackupChain findRepositoryBackup(String repository);
   
   /**
    * Finding current backup by id.
    *
    * @param id
    *          String, the repository name
    * @return RepositoryBackupChain
    *           return the current backup to repository 
    */
   RepositoryBackupChain findRepositoryBackupId(String id);
   
}
