/*
 * Copyright (C) 2005-2011 Alfresco Software Limited.
 *
 * This file is part of Alfresco
 *
 * Alfresco 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 3 of the License, or
 * (at your option) any later version.
 *
 * Alfresco 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 Alfresco. If not, see 
* This service API is designed to support the public facing Sandbox APIs. * * @author janv */ public interface SandboxService { /** * Create author/user sandbox within a web project for the current user *
* If the author sandbox already exists for this web project then it will be returned * * @param wpStoreId web project store id * @return SandboxInfo the created user sandbox info */ @Auditable(parameters={"wpStoreId"}) public SandboxInfo createAuthorSandbox(String wpStoreId); /** * Create author/user sandbox within a web project for the given user *
* If the author sandbox already exists for this web project then it will be returned *
     * Current user must be a content manager for the web project
     *
     * @param wpStoreId     web project store id
     * @param userName      user name
     * @return SandboxInfo  the created user sandbox info
     */
    @Auditable(parameters={"wpStoreId", "userName"})
    public SandboxInfo createAuthorSandbox(String wpStoreId, String userName);
    
    /**
     * List the available sandboxes for the current user and given web project
     * 
     * @param wpStoreId           web project store id
     * @return List 
     * Current user must be a content manager for the web project
     * 
     * @param wpStoreId           web project store id
     * @param userName            user name
     * @return List 
     * eg. isSandboxType("test123--myusername", SandboxConstants.PROP_SANDBOX_AUTHOR_MAIN)
     * 
     * @param sbStoreId    sandbox store id
     * @param sandboxType  sandbox type (see SandboxConstants)
     * @return boolean     true, if sandbox exists with given type
     */
    @NotAuditable
    public boolean isSandboxType(String sbStoreId, QName sandboxType);
    
    /**
     * Get sandbox info
     * 
     * @param sbStoreId     sandbox store id
     * @return SandboxInfo  null if sandbox does not exist or is not visible to the current user
     */
    @NotAuditable
    public SandboxInfo getSandbox(String sbStoreId);
    
    /**
     * Gets author/user sandbox info for the current user
     *  
     * Returns null if the author sandbox can not be found
     * 
     * @param wpStoreId      web project store id
     * @return SandboxInfo   author sandbox info
     */
    @NotAuditable
    public SandboxInfo getAuthorSandbox(String wpStoreId);
    
    /**
     * Gets author/user sandbox info for the given user
     *  
     * Returns null if the user sandbox can not be found
     *  
     * Current user must be a content manager for the web project
     * 
     * @param wpStoreId      web project store id
     * @param userName       userName
     * @return SandboxInfo   author sandbox info
     */
    @NotAuditable
    public SandboxInfo getAuthorSandbox(String wpStoreId, String userName);
    
    /**
     * Gets staging sandbox info
     *  
     * Returns null if the staging sandbox can not be found
     * 
     * @param wpStoreId      web project store id
     * @return SandboxInfo   staging sandbox info
     */
    @NotAuditable
    public SandboxInfo getStagingSandbox(String wpStoreId);
    
    /**
     * Delete the sandbox
     *  
     * If the sandbox does not exist, will log a warning and succeed
     *  
     * Current user must be a content manager for the web project (associated with the sandbox)
     * 
     * @param sbStoreId  sandbox store id
     */
    @Auditable(parameters={"sbStoreId"})
    public void deleteSandbox(String sbStoreId);
    
    /**
     * List all changed assets for given sandbox (eg. for user sandbox compared to staging sandbox)
     *  
     * Note: This will list all new/modified/deleted assets from the sandbox root directory (eg. /www/avm_webapps) - ie. across all web apps
     * 
     * @param sbStoreId                 sandbox store id
     * @param  includeDeleted           if true, include deleted assets as well as new/modified assets
     * @return List 
     * Note: This will list new/modified/deleted assets for the given web app
     *
     * @param sbStoreId                 sandbox store id
     * @param webApp                    web app to filter by
     * @param  includeDeleted           if true, include deleted assets as well as new/modified assets
     * @return List 
     * Note: This will list new/modified/deleted assets from the directory and below. The destination path will be dervied.
     *
     * @param sbStoreId                 sandbox store id
     * @param relativePath              relative path to filter by (eg. /www/avm_webapps/ROOT/MyFolderToList)
     * @param  includeDeleted           if true, include deleted assets as well as new/modified assets
     * @return List 
     * Note: This will submit all new/modified/deleted assets from the sandbox root directory (eg. /www/avm_webapps) - ie. across all web apps
     *  
     * @param sbStoreId          sandbox store id
     * @param submitLabel        label for submitted snapshot
     * @param submitDescription  description for submitted snapshot
     */
    @Auditable(parameters={"sbStoreId", "submitLabel", "submitDescription"})
    public void submitAll(String sbStoreId, String submitLabel, String submitDescription);
    
    /**
     * Submit changed assets for given sandbox and web app (eg. in user sandbox)
     *  
     * Note: This will submit new/modified/deleted assets for the given web app
     * 
     * @param sbStoreId          sandbox store id
     * @param webApp             web app to filter by
     * @param submitLabel        label for submitted snapshot
     * @param submitDescription  description for submitted snapshot
     */
    @Auditable(parameters={"sbStoreId", "webApp", "submitLabel", "submitDescription"})
    public void submitWebApp(String sbStoreId, String webApp, String submitLabel, String submitDescription);
    
    /**
     * Submit changed asset(s) for given sandbox path (eg. in user sandbox)
     *  
     * Note: This will submit new/modified/deleted asset(s) for given path (either file or directory and below)
     * 
     * @param sbStoreId          sandbox store id
     * @param relativePath       relative path to filter by (eg. /www/avm_webapps or /www/avm_webapps/ROOT/MyFolderToSubmit)
     * @param submitLabel        label for submitted snapshot
     * @param submitDescription  description for submitted snapshot
     */
    @Auditable(parameters={"sbStoreId", "relativePath", "submitLabel", "submitDescription"})
    public void submit(String sbStoreId, String relativePath, String submitLabel, String submitDescription);
    
    /**
     * Submit list of changed assets for given sandbox (eg. in user sandbox)
     * 
     * @param sbStoreId          sandbox store id
     * @param assetPaths         list of assets, as relative paths (eg. /www/avm_webapps/ROOT/MyFolderToSubmit)
     * @param submitLabel        label for submitted snapshot
     * @param submitDescription  description for submitted snapshot
     */
    @Auditable(parameters={"sbStoreId", "relativePath", "submitLabel", "submitDescription"})
    public void submitList(String sbStoreId, List 
     * Note: This will revert all new/modified/deleted assets from the sandbox store root directory (eg. /www/avm_webapps) - ie. across all web apps
     *
     * @param sbStoreId  sandbox store id
     */
    @Auditable(parameters={"sbStoreId"})
    public void revertAll(String sbStoreId);
    
    /**
     * Revert changed assets for given sandbox and web app (eg. in user sandbox)
     *  
     * Note: This will revert new/modified/deleted assets for the given web app
     * 
     * @param sbStoreId  sandbox store id
     * @param webApp     web app to filter by
     */
    @Auditable(parameters={"sbStoreId", "webApp"})
    public void revertWebApp(String sbStoreId, String webApp);
    
    /**
     * Revert changed asset(s) for given sandbox path (eg. in user sandbox)
     *  
     * Note: This will revert new/modified/deleted asset(s) for given path (either file or directory and below)
     * 
     * @param sbStoreId     sandbox store id
     * @param relativePath  relative path to filter by (eg. /www/avm_webapps/ROOT/MyFolderToRevert)
     */
    @NotAuditable
    public void revert(String sbStoreId, String relativePath);
    
    /**
     * Revert list of changed assets for given sandbox (eg. in user sandbox)
     * 
     * @param sbStoreId      sandbox store id
     * @param assetPaths     list of assets, as relative paths (eg. /www/avm_webapps/ROOT/MyFolderToRevert)
     */
    @NotAuditable
    public void revertList(String sbStoreId, List 
     * Current user must be a content manager for the web project
     * 
     * @param sbStoreId  staging sandbox store id
     * @param version    version
     */
    @NotAuditable
    public void revertSnapshot(String sbStoreId, int version);
    
    /**
     * List all snapshots (sandbox versions) for the given sandbox (ie. for staging sandbox)
     *  
     * Current user must be a content manager for the web project
     *  
     * @param sbStoreId                 staging sandbox store id
     * @param includeSystemGenerated    if false will ignore system generated snapshots else true to get all snapshots
     * @return List 
     * Current user must be a content manager for the web project
     * 
     * @param sbStoreId                 staging sandbox store id
     * @param from                      from date
     * @param to                        to date
     * @param includeSystemGenerated    if false will ignore system generated snapshots else true to get all snapshots
     * @return List