package hudson.plugins.sfee; import hudson.Extension; import hudson.MarkupText; import hudson.MarkupText.SubText; import hudson.model.AbstractBuild; import hudson.scm.ChangeLogAnnotator; import hudson.scm.ChangeLogSet.Entry; import java.util.regex.Pattern; @Extension public class LinkAnnotator extends ChangeLogAnnotator { @Override public void annotate(AbstractBuild<?, ?> build, Entry change, MarkupText text) { String site = getServer(); if (site == null) return; // Plugin not configured String url = "http://" + getServer() + "/sf/go/"; for (LinkMarkup markup : MARKUPS) markup.process(text, url); } static final class LinkMarkup { private final Pattern pattern; private final String href; LinkMarkup(String pattern, String href) { pattern = NUM_PATTERN.matcher(pattern).replaceAll("(\\\\d+)"); // \\\\d becomes \\d when in the expanded text -----^ pattern = ANYWORD_PATTERN.matcher(pattern).replaceAll( "((?:\\\\w|[._-])+)"); this.pattern = Pattern.compile(pattern); this.href = href; } void process(MarkupText text, String url) { for (SubText st : text.findTokens(pattern)) { st.surroundWith("<a href='" + url + href + "'>", "</a>"); } } private static final Pattern NUM_PATTERN = Pattern.compile("NUM"); private static final Pattern ANYWORD_PATTERN = Pattern.compile("ANYWORD"); } private String getServer() { SourceForgeSite site = SourceForgeSite.DESCRIPTOR.getSite(); return site != null ? site.getSite() : null; } static final LinkMarkup[] MARKUPS = new LinkMarkup[] { new LinkMarkup( "(artf|task|rel)NUM", "$1$2"), }; }