package hudson.staging;
import hudson.maven.MavenEmbedder;
import hudson.maven.MavenUtil;
import hudson.model.AbstractBuild;
import hudson.model.Action;
import hudson.model.Result;
import hudson.util.StreamTaskListener;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import org.apache.commons.lang.time.DurationFormatUtils;
import org.apache.maven.artifact.manager.WagonManager;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
import org.apache.maven.artifact.repository.DefaultArtifactRepository;
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
import org.apache.maven.embedder.PlexusLoggerAdapter;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.framework.io.LargeText;
public class DeployAction implements Action {
private static Logger LOGGER = Logger.getLogger(DeployAction.class
.getName());
private final AbstractBuild<?, ?> build;
private final String version;
private Thread worker;
private String repositoryId;
private String repositoryUrl;
public DeployAction(AbstractBuild<?, ?> build, String version, String repositoryId, String repositoryUrl) {
this.build = build;
this.version = version;
this.repositoryId = repositoryId;
this.repositoryUrl = repositoryUrl;
}
public String getDisplayName() {
return "Upload";
}
public String getIconFileName() {
return "package.gif";
}
public String getUrlName() {
return "upload";
}
public AbstractBuild<?, ?> getBuild() {
return build;
}
public String getRepositoryId() {
return repositoryId;
}
public void setRepositoryId(String repositoryId) {
this.repositoryId = repositoryId;
}
public String getRepositoryUrl() {
return repositoryUrl;
}
public void setRepositoryUrl(String repositoryUrl) {
this.repositoryUrl = repositoryUrl;
}
public void doDeploy(StaplerRequest req, StaplerResponse rsp)
throws ServletException, IOException {
req.bindParameters(this);
worker = new Thread(new Runnable() {
public void run() {
deploy();
}
});
worker.start();
req.getView(this, "index").forward(req, rsp);
}
public void doCancel(StaplerRequest req, StaplerResponse rsp) throws ServletException, IOException {
cancel();
req.getView(this, "index").forward(req, rsp);
}
public Result getResult() {
return result;
}
private Result result;
public File getLogFile() {
return new File(build.getRootDir(), "staging-upload.log");
}
public void cancel() {
if (worker != null) {
worker.interrupt();
}
}
public void deploy() {
StreamTaskListener listener = null;
try {
long start = System.currentTimeMillis();
listener = new StreamTaskListener(getLogFile());
try {
MavenEmbedder embedder = MavenUtil.createEmbedder(listener,
(File)null, null);
embedder.setInteractiveMode(false);
try {
ArtifactRepositoryLayout layout = (ArtifactRepositoryLayout) embedder
.getContainer().lookup(
ArtifactRepositoryLayout.ROLE, "default");
ArtifactRepositoryFactory factory = (ArtifactRepositoryFactory) embedder
.lookup(ArtifactRepositoryFactory.ROLE);
ArtifactRepository targetRepository = factory
.createDeploymentArtifactRepository(repositoryId,
repositoryUrl, layout, false);
ArtifactRepository sourceRepository = factory
.createDeploymentArtifactRepository("source",
new File(build.getRootDir(), "staging")
.toURI().toURL().toExternalForm(),
layout, false);
WagonManager wagonManager = (WagonManager) embedder
.lookup(WagonManager.ROLE);
SCPRepositoryCopier copier = new SCPRepositoryCopier();
copier.setWagonManager(wagonManager);
copier.enableLogging(new PlexusLoggerAdapter(embedder.getLogger()));
copier.copy((DefaultArtifactRepository) sourceRepository,
(DefaultArtifactRepository) targetRepository,
version);
listener.getLogger().println("Upload completed in " + DurationFormatUtils.formatDurationWords(System.currentTimeMillis()-start, true,true));
} finally {
if (embedder != null)
embedder.stop();
}
result = Result.SUCCESS;
} catch (Exception e) {
e.printStackTrace(listener.error(e.getMessage()));
listener.getLogger().println("Upload stopped after " + DurationFormatUtils.formatDurationWords(System.currentTimeMillis()-start, true,true));
result = Result.ABORTED;
}
worker = null;
build.save();
} catch (IOException e) {
result = Result.FAILURE;
LOGGER.log(Level.SEVERE, "Failed to write " + getLogFile(), e);
} finally {
if (listener != null)
listener.close();
}
}
/**
* Handles incremental log output.
*/
public void doProgressiveLog(StaplerRequest req, StaplerResponse rsp)
throws IOException {
new LargeText(getLogFile(), !isRunning()).doProgressText(req, rsp);
}
/**
* Is this task still running?
*/
public boolean isRunning() {
return worker != null;
}
}