package hudson.plugins.backlog; 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.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * {@link ChangeLogAnnotator} that picks up Backlog issue KEY. * * @author dragon3 */ @Extension public class BacklogChangelogAnnotator extends ChangeLogAnnotator { private static final Log LOG = LogFactory.getLog(BacklogChangelogAnnotator.class); public static final Pattern ISSUE_KEY_PATTERN = Pattern.compile( "(?:(?<![/A-Z0-9a-z-])([A-Z0-9]+-[1-9][0-9]*)|\\[\\[([A-Z0-9]+-[1-9][0-9]*)\\]\\])"); @Override public void annotate(AbstractBuild<?, ?> build, Entry change, MarkupText text) { BacklogProjectProperty bpp = build.getProject().getProperty(BacklogProjectProperty.class); if (bpp == null || bpp.spaceURL == null) { LOG.debug("BacklogProjectProperty is null or BacklogProjectProperty's spaceURL is null"); return; } annotate(bpp.spaceURL, text); } void annotate(String spaceURL, MarkupText text) { Matcher m = ISSUE_KEY_PATTERN.matcher(text.getText()); List<SubText> r = new ArrayList<SubText>(); while (m.find()) { SubText st = text.new SubText(m, 0); r.add(st); } for (SubText token : r) { LOG.debug("token=" + token.getText()); token.surroundWith("<a href=\"" + spaceURL + "view/$1$2\">", "</a>"); } } }