package hudson.plugins.mantis;
import hudson.Extension;
import hudson.MarkupText;
import hudson.Util;
import hudson.MarkupText.SubText;
import hudson.model.AbstractBuild;
import hudson.plugins.mantis.model.MantisIssue;
import hudson.scm.ChangeLogAnnotator;
import hudson.scm.ChangeLogSet.Entry;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
/**
* Creates HTML link for Mantis issues.
*
* @author Seiji Sogabe
*/
@Extension
public final class MantisLinkAnnotator extends ChangeLogAnnotator {
@Override
public void annotate(final AbstractBuild<?, ?> build, final Entry change, final MarkupText text) {
final MantisProjectProperty mpp = build.getParent().getProperty(MantisProjectProperty.class);
if (mpp == null || mpp.getSite() == null) {
return;
}
if (!mpp.isLinkEnabled()) {
return;
}
final MantisBuildAction action = build.getAction(MantisBuildAction.class);
final String url = mpp.getSite().getUrl().toExternalForm();
final List<MantisIssue> notSavedIssues = new ArrayList<MantisIssue>();
final Pattern pattern = findRegexPattern(action, mpp);
for (final SubText st : text.findTokens(pattern)) {
// retrieve id from changelog
int id;
try {
id = Integer.valueOf(st.group(1));
} catch (final NumberFormatException e) {
LOGGER.log(Level.WARNING, Messages.MantisLinkAnnotator_IllegalMantisId(st.group(1)));
continue;
}
// get the issue from saved one or Mantis
MantisIssue issue;
if (action != null) {
issue = action.getIssue(id);
} else {
issue = getIssue(build, id);
if (issue != null) {
notSavedIssues.add(issue);
}
}
// add hyperlink to Mantis
final String newUrl = Util.encode(url + "view.php?id=$1");
if (issue == null) {
LOGGER.log(Level.WARNING, Messages.MantisLinkAnnotator_FailedToGetMantisIssue(id));
st.surroundWith(String.format("<a href='%s'>", newUrl), "</a>");
} else {
final String summary = Utility.escape(issue.getSummary());
st.surroundWith(String.format("<a href='%s' tooltip='%s'>", newUrl, summary), "</a>");
}
}
if (!notSavedIssues.isEmpty()) {
saveIssues(build, pattern, notSavedIssues);
}
}
private Pattern findRegexPattern(final MantisBuildAction action, final MantisProjectProperty mpp) {
Pattern pattern = null;
if (action != null) {
pattern = action.getPattern();
}
if (pattern == null) {
pattern = mpp.getRegexpPattern();
}
return pattern;
}
private void saveIssues(final AbstractBuild<?, ?> build, final Pattern pattern, final List<MantisIssue> issues) {
final MantisBuildAction action = new MantisBuildAction(pattern, issues.toArray(new MantisIssue[0]));
build.getActions().add(action);
try {
build.save();
} catch (final IOException e) {
LOGGER.log(Level.WARNING, Messages.MantisLinkAnnotator_FailedToSave(), e);
}
}
private MantisIssue getIssue(final AbstractBuild<?, ?> build, final int id) {
final MantisSite site = MantisSite.get(build.getProject());
MantisIssue issue = null;
try {
issue = site.getIssue(id);
} catch (final MantisHandlingException e) {
//
}
return issue;
}
private static final Logger LOGGER = Logger.getLogger(MantisLinkAnnotator.class.getName());
}