Package org.apache.continuum.buildagent.manager

Source Code of org.apache.continuum.buildagent.manager.DefaultBuildAgentPurgeManager

package org.apache.continuum.buildagent.manager;

/*
* 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.commons.io.FileUtils;
import org.apache.commons.io.comparator.LastModifiedFileComparator;
import org.apache.commons.io.filefilter.AgeFileFilter;
import org.apache.commons.io.filefilter.AndFileFilter;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.io.filefilter.NotFileFilter;
import org.apache.commons.io.filefilter.WildcardFileFilter;
import org.apache.continuum.buildagent.configuration.BuildAgentConfigurationService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.Arrays;

/**
* @plexus.component role="org.apache.continuum.buildagent.manager.BuildAgentPurgeManager" role-hint="default"
*/
public class DefaultBuildAgentPurgeManager
    implements BuildAgentPurgeManager
{
    private static final Logger logger = LoggerFactory.getLogger( DefaultBuildAgentPurgeManager.class );

    /**
     * @plexus.requirement
     */
    private BuildAgentConfigurationService buildAgentConfigurationService;

    public void executeDirectoryPurge( String directoryType, int daysOlder, int retentionCount, boolean deleteAll )
        throws Exception
    {
        StringBuilder log = new StringBuilder().append(
            "Executing directory purge with the following settings[directoryType=" ).
            append( directoryType ).append( ",daysOlder=" ).
            append( daysOlder ).append( ", retentionCount=" ).
            append( retentionCount ).append( ", deleteAll=" ).
            append( deleteAll ).append( "]" );
        logger.info( log.toString() );

        File directory = null;

        if ( "working".equals( directoryType ) || "releases".equals( directoryType ) )
        {
            directory = buildAgentConfigurationService.getWorkingDirectory();
        }
        else
        {
            logger.warn( "Cannot execute purge: DirectoryType: " + directoryType + " is not valid." );
            return;
        }
        if ( deleteAll )
        {
            purgeAll( directory, directoryType );
        }
        else
        {
            purgeFiles( directory, directoryType, daysOlder, retentionCount );
        }

        logger.info( "Directory purge execution done" );
    }

    private void purgeAll( File directory, String directoryType )
        throws Exception
    {
        AndFileFilter filter = new AndFileFilter();
        filter.addFileFilter( DirectoryFileFilter.DIRECTORY );
        filter.addFileFilter( createFileFilterForDirectoryType( directoryType ) );

        File[] files = directory.listFiles( (FileFilter) filter );
        if ( files == null )
        {
            return;
        }
        for ( File file : files )
        {
            try
            {
                FileUtils.deleteDirectory( file );
            }
            catch ( IOException e )
            {
                logger.warn( "Unable to purge " + directoryType + " directory: " + file.getName() );
            }
        }
    }

    private void purgeFiles( File directory, String directoryType, int daysOlder, int retentionCount )
    {
        AndFileFilter filter = new AndFileFilter();
        filter.addFileFilter( DirectoryFileFilter.DIRECTORY );
        filter.addFileFilter( createFileFilterForDirectoryType( directoryType ) );

        File[] files = directory.listFiles( (FileFilter) filter );

        if ( files == null )
        {
            return;
        }

        //calculate to include files not in the dayold category
        int countToPurge = files.length - retentionCount;

        if ( daysOlder > 0 )
        {
            long cutoff = System.currentTimeMillis() - ( 24 * 60 * 26 * 1000 * daysOlder );
            filter.addFileFilter( new AgeFileFilter( cutoff ) );
        }

        files = directory.listFiles( (FileFilter) filter );

        if ( files == null )
        {
            return;
        }

        Arrays.sort( files, LastModifiedFileComparator.LASTMODIFIED_COMPARATOR );

        for ( File file : files )
        {
            if ( countToPurge - 1 < 0 )
            {
                break;
            }
            try
            {
                FileUtils.deleteDirectory( file );
                countToPurge--;
            }
            catch ( IOException e )
            {
                logger.warn( "Unable to purge " + directoryType + " directory: " + file.getName() );
            }
        }

    }

    private IOFileFilter createFileFilterForDirectoryType( String directoryType )
    {
        WildcardFileFilter releasesFilter = new WildcardFileFilter( "releases-*" );

        if ( "working".equals( directoryType ) )
        {
            return new NotFileFilter( releasesFilter );
        }
        else if ( "releases".equals( directoryType ) )
        {
            return releasesFilter;
        }
        else
        {
            return null;
        }
    }

    public void setBuildAgentConfigurationService( BuildAgentConfigurationService buildAgentConfigurationService )
    {
        this.buildAgentConfigurationService = buildAgentConfigurationService;
    }
}
TOP

Related Classes of org.apache.continuum.buildagent.manager.DefaultBuildAgentPurgeManager

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.