package org.jvnet.hudson.plugins.shelveproject; import hudson.Extension; import hudson.model.Hudson; import hudson.model.RootAction; import hudson.security.Permission; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; import org.kohsuke.stapler.HttpRedirect; import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.ExportedBean; import javax.servlet.ServletException; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Date; import java.util.LinkedList; import java.util.List; import java.util.logging.Logger; @ExportedBean(defaultVisibility = 999) @Extension public class ShelvedProjectsAction implements RootAction { final static Logger LOGGER = Logger.getLogger( ShelvedProjectsAction.class.getName() ); public String getIconFileName() { if ( Hudson.getInstance().hasPermission( Permission.CREATE ) ) { return "edit-delete.gif"; } else { return null; } } public String getDisplayName() { return "Shelved Projects"; } public String getUrlName() { return "/shelvedProjects"; } @SuppressWarnings({"unchecked"}) @Exported public List<ShelvedProject> getShelvedProjects() { Hudson.getInstance().checkPermission( Permission.CREATE ); final File shelvedProjectsDir = new File( Hudson.getInstance().getRootDir(), "shelvedProjects" ); shelvedProjectsDir.mkdirs(); final Collection<File> shelvedProjectsArchives = FileUtils.listFiles( shelvedProjectsDir, new String[]{"zip"}, false ); List<ShelvedProject> projects = new LinkedList<ShelvedProject>(); for ( File archive : shelvedProjectsArchives ) { projects.add( getShelvedProjectFromArchive( archive ) ); } return projects; } private ShelvedProject getShelvedProjectFromArchive( File archive ) { ShelvedProject shelvedProject = new ShelvedProject(); shelvedProject.setProjectName( StringUtils.substringBeforeLast( archive.getName(), "-" ) ); shelvedProject.setTimestamp( Long.valueOf( StringUtils.substringBefore( StringUtils.substringAfterLast( archive.getName(), "-" ), "." ) ) ); shelvedProject.setArchive( archive ); shelvedProject.setFormatedDate( formatDate( shelvedProject.getTimestamp() ) ); return shelvedProject; } @SuppressWarnings({"UnusedDeclaration"}) public HttpResponse doUnshelveProject( @QueryParameter(required = true) String project, StaplerRequest request, StaplerResponse response ) throws IOException, ServletException { Hudson.getInstance().checkPermission( Permission.CREATE ); LOGGER.info( "Unshelving archived project [" + project + "]." ); // Unshelving the project could take some time, so add it as a task Hudson.getInstance().getQueue().schedule( new UnshelveProjectTask( new File( project ) ), 0 ); return createRedirectToMainPage(); } public String formatDate( long timestamp ) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat( "EEE, d MMM yyyy HH:mm:ss Z" ); return simpleDateFormat.format( new Date( timestamp ) ); } private HttpRedirect createRedirectToMainPage() { return new HttpRedirect( Hudson.getInstance().getRootUrl() ); } }