package hudson.plugins.perforce.browsers; import com.tek42.perforce.model.Changelist; import hudson.Extension; import hudson.Util; import hudson.model.Descriptor; import hudson.model.Descriptor.FormException; import hudson.plugins.perforce.PerforceChangeLogEntry; import hudson.plugins.perforce.PerforceRepositoryBrowser; import hudson.scm.RepositoryBrowser; import hudson.util.FormValidation; import java.io.IOException; import java.net.URL; import javax.servlet.ServletException; import net.sf.json.JSONObject; import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.StaplerRequest; /** * {@link RepositoryBrowser} for Perforce's Perfbrowse. * * @author Nick James */ public class Perfbrowse extends PerforceRepositoryBrowser { /** * The URL of the Perfbrowse server script, e.g. * <tt>http://perforce/perfbrowse.cgi</tt> */ public final URL url; public final String p4Describe = "?@describe+"; public final String p4FileLog = "?@filelog+"; public final String p4Diff = "?@diff+"; @DataBoundConstructor public Perfbrowse(URL url) { this.url = url; } @Override public URL getDiffLink(Changelist.FileEntry file) throws IOException { if(file.getAction() != Changelist.FileEntry.Action.EDIT && file.getAction() != Changelist.FileEntry.Action.INTEGRATE) return null; int r = new Integer(file.getRevision()); if(r <= 1) return null; return new URL(url + p4Diff + file.getFilename() + "+" + r + "+" + file.getAction()); } @Override public URL getFileLink(Changelist.FileEntry file) throws IOException { return new URL(url + p4FileLog + file.getFilename()); } @Override public URL getChangeSetLink(PerforceChangeLogEntry change) throws IOException { return new URL(url + p4Describe + change.getChangeNumber()); } @Extension public static class DescriptorImpl extends Descriptor<RepositoryBrowser<?>> { @Override public String getDisplayName() { return "Perfbrowse"; } public FormValidation doCheck(@QueryParameter final String value) throws IOException, ServletException { return new FormValidation.URLCheck() { @Override protected FormValidation check() throws IOException, ServletException { String url = Util.fixEmpty(value); if (url == null) { // nothing entered yet return FormValidation.ok(); } if(!url.startsWith("http://") && !url.startsWith("https://")) { return FormValidation.errorWithMarkup("The URL should contain <tt>http://</tt> or <tt>https://</tt>"); } if (!url.endsWith(".cgi")) { return FormValidation.errorWithMarkup("The URL should end with a CGI script, usually <tt>perfbrowse.cgi</tt>"); } return FormValidation.ok(); } }.check(); } @Override public Perfbrowse newInstance(StaplerRequest req, JSONObject formData) throws FormException { return req.bindParameters(Perfbrowse.class, "perfbrowse."); } } private static final long serialVersionUID = 1L; }