package com.cloudbees.hudson.plugins.folder.computed; import hudson.Functions; import hudson.Util; import hudson.model.Actionable; import hudson.model.Result; import hudson.model.Run; import hudson.model.TopLevelItem; import java.io.File; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; import jenkins.model.Jenkins; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.Ancestor; import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponses; import org.kohsuke.stapler.StaplerFallback; import org.kohsuke.stapler.StaplerRequest; /** * A fake {@link Run} used to render last build information via Stapler and Jelly */ @Restricted(NoExternalUse.class) // used by stapler / jelly only public class PseudoRun<I extends TopLevelItem> extends Actionable implements StaplerFallback { private final FolderComputation<I> computation; PseudoRun(FolderComputation<I> computation) { this.computation = computation; } public String getDisplayName() { return "log"; } public RunUrl decompose(StaplerRequest req) { List<Ancestor> ancestors = req.getAncestors(); // find the first and last Run instances Ancestor f = null, l = null; for (Ancestor anc : ancestors) { if (anc.getObject() instanceof PseudoRun) { if (f == null) f = anc; l = anc; } } if (l == null) return null; // there was no Run object String base = l.getUrl(); return new RunUrl(base); } /** * Gets the string that says how long since this build has started. * * @return string like "3 minutes" "1 day" etc. */ @Nonnull public String getTimestampString() { long duration = new GregorianCalendar().getTimeInMillis() - computation.getTimestamp().getTimeInMillis(); return Util.getPastTimeString(duration); } /** * Returns the timestamp formatted in xs:dateTime. * * @return the timestamp formatted in xs:dateTime. */ @Nonnull public String getTimestampString2() { return Util.XS_DATETIME_FORMATTER.format(computation.getTimestamp()); } @CheckForNull public Result getResult() { return computation.getResult(); } @Nonnull public Calendar getTimestamp() { return computation.getTimestamp(); } @Nonnull public String getDurationString() { return computation.getDurationString(); } @Override public String getSearchUrl() { return computation.getSearchUrl(); } @Nonnull public File getLogFile() { return computation.getLogFile(); } @Override public Object getStaplerFallback() { return computation; } public HttpResponse doIndex(StaplerRequest request) { return HttpResponses.redirectViaContextPath(computation.getUrl()); } public HttpResponse doConsole(StaplerRequest request) { return HttpResponses.redirectViaContextPath(computation.getUrl() + "console"); } public HttpResponse doConsoleText(StaplerRequest request) { return HttpResponses.redirectViaContextPath(computation.getUrl() + "consoleText"); } @Restricted(NoExternalUse.class) public static final class RunUrl { private final String base; public RunUrl(String base) { this.base = base; } public String getBaseUrl() { return base; } /** * Returns the same page in the next build. */ public String getNextBuildUrl() { return null; } /** * Returns the same page in the previous build. */ public String getPreviousBuildUrl() { return null; } } }