package org.jvnet.hudson.plugins.shelveproject;
import hudson.FilePath;
import hudson.model.AbstractProject;
import hudson.model.Hudson;
import hudson.model.Queue;
import java.io.File;
import java.io.FileFilter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ShelveProjectExecutable
implements Queue.Executable
{
private final static Logger LOGGER = Logger.getLogger( ShelveProjectExecutable.class.getName() );
private final AbstractProject project;
private final Queue.Task parentTask;
public ShelveProjectExecutable( Queue.Task parentTask, AbstractProject project )
{
this.parentTask = parentTask;
this.project = project;
}
public Queue.Task getParent()
{
return parentTask;
}
public void run()
{
if ( archiveProject() )
{
deleteProject();
}
}
private boolean archiveProject()
{
LOGGER.info( "Creating archive for project [" + project.getName() + "]." );
try
{
final File projectRoot = project.getRootDir();
OutputStream outputStream1 = createOutputStream( Hudson.getInstance().getRootDir(), project.getName() );
new FilePath( projectRoot ).zip( outputStream1, new FileFilter()
{
public boolean accept( File file )
{
return true;
}
} );
outputStream1.close();
return true;
}
catch ( Exception e )
{
LOGGER.log( Level.SEVERE, "Could not archive project [" + project.getName() + "].", e );
return false;
}
}
private OutputStream createOutputStream( final File rootDir, final String projectName )
throws FileNotFoundException
{
final File baseDir = new File( rootDir, "shelvedProjects" );
baseDir.mkdirs();
final File archive = new File( baseDir, projectName + "-" + System.currentTimeMillis() + ".zip" );
return new FileOutputStream( archive );
}
private void deleteProject()
{
LOGGER.info( "Deleting project [" + project.getName() + "]." );
try
{
project.delete();
}
catch ( Exception e )
{
LOGGER.log( Level.SEVERE, "Could not delete project [" + project.getName() + "].", e );
}
}
@Override
public String toString()
{
return "Shelving " + project.getName();
}
}