package org.jenkinsci.plugins.quarantine; import org.jenkinsci.plugins.quarantine.QuarantineTestDataPublisher.Data; import hudson.model.BuildBadgeAction; import hudson.model.Hudson; import hudson.model.ProminentProjectAction; import hudson.model.User; import hudson.tasks.junit.TestAction; import org.acegisecurity.Authentication; import org.apache.commons.lang.StringUtils; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.ExportedBean; import java.io.IOException; import java.util.Collections; import java.util.Date; import javax.servlet.ServletException; @ExportedBean(defaultVisibility = 2) public class QuarantineTestAction extends TestAction implements BuildBadgeAction, ProminentProjectAction { private boolean quarantined; private String quarantinedBy; private Date quarantineDate; private String reason; private String testObjectId; protected Data owner; QuarantineTestAction(Data owner, String testObjectId) { this.owner = owner; this.testObjectId = testObjectId; } public void doQuarantine(StaplerRequest req, StaplerResponse resp) throws ServletException, IOException { Authentication authentication = Hudson.getAuthentication(); String name = authentication.getName(); String reason = (String) req.getSubmittedForm().get("reason"); if (StringUtils.isEmpty(reason)) reason = null; quarantine(name, reason); owner.save(); resp.forwardToPreviousPage(req); } public void doRelease(StaplerRequest req, StaplerResponse resp) throws ServletException, IOException { release(); owner.save(); resp.forwardToPreviousPage(req); } public String getDisplayName() { return Messages.QuarantineTestAction_DisplayName(); } public String getIconFileName() { return null; } public String getUrlName() { return "quarantine"; } public String getNoun() { return Messages.QuarantineTestAction_Noun(); } @Exported public boolean isQuarantined() { return quarantined; } public String quarantinedByName() { User user = User.get(quarantinedBy, false, Collections.emptyMap()); if (user != null) { return user.getDisplayName(); } else { return quarantinedBy; } } public String getReason() { return reason; } public Date getDate() { return quarantineDate; } public boolean hasReason() { return !StringUtils.isEmpty(reason); } public String getLatestResultUrl() { String url = ""; hudson.tasks.test.TestResult tr = owner.getResultForTestId(testObjectId); if (tr != null) { url = tr.getOwner().getParent().getUrl() + "lastCompletedBuild/testReport" + tr.getUrl(); } return url; } /** * Whether this is the latest result. As it does not make sense to enable * quarantining on an old result, use this to not even display the option to * quarantine it */ public boolean isLatestResult() { return owner.isLatestResult(); } public boolean isUserAnonymous() { return Hudson.getAuthentication().getName().equals("anonymous"); } public void quarantine(String quarantinedBy, String reason, Date date) { this.quarantined = true; this.quarantinedBy = quarantinedBy; this.reason = reason; this.quarantineDate = date; owner.addQuarantine(testObjectId, this); } public void quarantine(String quarantinedBy, String reason) { quarantine(quarantinedBy, reason, new Date()); } public void quarantine(QuarantineTestAction action) { quarantine(action.quarantinedByName(), action.getReason(), action.getDate()); } public void release() { this.quarantined = false; this.quarantinedBy = null; this.quarantineDate = null; // we remember the reason to show it if someone puts this test back in // quarantine. } @Override public String toString() { return "QuarantineTestAction(quarantined=" + quarantined + ",quarantinedBy=" + quarantinedBy + ",reason=" + reason + ")"; } }