package hudson.plugins.kagemai; import static org.apache.commons.lang.StringUtils.isEmpty; import hudson.Extension; import hudson.MarkupText; import hudson.MarkupText.SubText; import hudson.model.AbstractBuild; import hudson.plugins.kagemai.model.KagemaiIssue; import hudson.scm.ChangeLogAnnotator; import hudson.scm.ChangeLogSet.Entry; import java.util.HashSet; import java.util.List; import java.util.regex.Pattern; /** * @author yamkazu * */ @Extension public class KagemaiChangelogAnnotator extends ChangeLogAnnotator { @Override public void annotate(AbstractBuild<?, ?> build, Entry change, MarkupText text) { KagemaiProjectProperty kagemaiProjectProperty = build.getParent() .getProperty(KagemaiProjectProperty.class); if (kagemaiProjectProperty == null) { return; } if (kagemaiProjectProperty.getSite() == null) { return; } if (kagemaiProjectProperty.isLinkEnabled() == false) { return; } String regex = kagemaiProjectProperty.getRegex(); Pattern pattern = Pattern.compile(regex); HashSet<Integer> bugIds = new HashSet<Integer>(); for (SubText token : text.findTokens(pattern)) { try { bugIds.add(getId(token)); } catch (NumberFormatException e) { continue; } } if (bugIds.size() == 0) { return; } KagemaiBuildAction action = build.getAction(KagemaiBuildAction.class); if (action == null) { action = new KagemaiBuildAction(build, kagemaiProjectProperty .getKagemaiSession().getIssuesMap(bugIds), kagemaiProjectProperty.getSite().getBaseUrl() .toExternalForm(), kagemaiProjectProperty .getProjectId()); } List<KagemaiIssue> issues = action.getIssues(); for (SubText token : text.findTokens(pattern)) { Integer key = null; try { key = getId(token); } catch (Exception e) { continue; } String summary = null; for (KagemaiIssue issue : issues) { if (key == issue.getId()) { summary = issue.getSummary(); } } if (isEmpty(summary)) { token.surroundWith(String.format(KagemaiSession.LINK_FORMAT, action.getSiteName(), action.getProjectId(), key), "</a>"); } else { token.surroundWith(String.format( KagemaiSession.LINK_FORMAT_WITH_TOOLTIP, action .getSiteName(), action.getProjectId(), key, summary), "</a>"); } } } private static int getId(SubText token) { String id = null; for (int i = 0;; i++) { id = token.group(i); try { return Integer.valueOf(id); } catch (NumberFormatException e) { continue; } } } }