package org.apache.continuum.purge;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import org.apache.continuum.model.repository.DirectoryPurgeConfiguration;
import org.apache.continuum.model.repository.RepositoryPurgeConfiguration;
import org.apache.maven.continuum.model.project.Schedule;

/**
 * @author Maria Catherine Tan
 * @version $Id$
 * @since 25 jul 07
 */
public interface ContinuumPurgeManager
{   
    String ROLE = ContinuumPurgeManager.class.getName();
    
    /**
     * Purge repositories and directories 
     * @param schedule
     * @throws ContinuumPurgeManagerException
     */
    void purge( Schedule schedule )
        throws ContinuumPurgeManagerException;
    
    /**
     * Purge repository
     * @param repoPurgeConfig
     * @throws ContinuumPurgeManagerException
     */
    void purgeRepository( RepositoryPurgeConfiguration repoPurgeConfig )
        throws ContinuumPurgeManagerException;
    
    /**
     * Purge directory 
     * @param dirPurgeConfig
     * @throws ContinuumPurgeManagerException
     */
    void purgeDirectory( DirectoryPurgeConfiguration dirPurgeConfig )
        throws ContinuumPurgeManagerException;
    
    /**
     * Check if the repository is already in the purging queue
     * 
     * @param repositoryId the id of the repository purge configuration
     * @return true if the repository is in the purging queue, otherwise false
     * @throws ContinuumPurgeManagerException
     */
    boolean isRepositoryInPurgeQueue( int repositoryId )
        throws ContinuumPurgeManagerException;
    
    /**
     * Check if the repository is being used by a project that is currently building
     * 
     * @param repositoryId the id of the local repository
     * @return true if the repository is in use, otherwise false
     * @throws ContinuumPurgeManagerException
     */
    boolean isRepositoryInUse( int repositoryId )
        throws ContinuumPurgeManagerException;

    /**
     * Remove local repository from the purge queue
     * 
     * @param repositoryId the id of the local repository
     * @throws ContinuumPurgeManagerException
     */
    void removeRepositoryFromPurgeQueue( int repositoryId )
        throws ContinuumPurgeManagerException;
    
    /**
     * Remove local repository from the purge queue
     * 
     * @param purgeConfigId the id of the purge configuration
     * @return true if the purge configuration was successfully removed from the purge queue, otherwise false
     * @throws ContinuumPurgeManagerException
     */
    boolean removeFromPurgeQueue( int purgeConfigId )
        throws ContinuumPurgeManagerException;
    
    /**
     * Remove local repositories from the purge queue
     * 
     * @param purgeConfigIds the ids of the purge configuration
     * @return true if the purge configurations were successfully removed from the purge queue, otherwise false
     * @throws ContinuumPurgeManagerException
     */
    boolean removeFromPurgeQueue( int[] purgeConfigIds )
        throws ContinuumPurgeManagerException;
}
