package hudson.plugins.kagemai;
import hudson.Extension;
import hudson.Launcher;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.BuildListener;
import hudson.model.Result;
import hudson.plugins.kagemai.model.KagemaiIssue;
import hudson.scm.ChangeLogSet.Entry;
import hudson.tasks.BuildStepDescriptor;
import hudson.tasks.BuildStepMonitor;
import hudson.tasks.Publisher;
import hudson.tasks.Recorder;
import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.sf.json.JSONObject;
import org.kohsuke.stapler.StaplerRequest;
/**
* @author yamkazu
*
*/
public class KagemaiPublisher extends Recorder {
KagemaiPublisher() {
}
@Override
public boolean perform(AbstractBuild<?, ?> build, Launcher launcher,
BuildListener listener) throws InterruptedException, IOException {
KagemaiSite site = KagemaiSite.get(build.getProject());
if (site == null) {
build.setResult(Result.FAILURE);
return true;
}
HashSet<Integer> bugIds = new HashSet<Integer>();
KagemaiProjectProperty mpp = build.getParent().getProperty(
KagemaiProjectProperty.class);
if (mpp != null && mpp.getSite() != null) {
String regex = mpp.getRegex();
Pattern pattern = Pattern.compile(regex);
for (Entry entry : build.getChangeSet()) {
Matcher matcher = pattern.matcher(entry.getMsg());
while (matcher.find()) {
try {
bugIds.add(Integer.valueOf(matcher.group(matcher
.groupCount())));
} catch (NumberFormatException e) {
continue;
}
}
}
} else {
build.setResult(Result.FAILURE);
return true;
}
KagemaiSession kagemaiSession = mpp.getKagemaiSession();
List<KagemaiIssue> issues = null;
if ((!bugIds.isEmpty()) && kagemaiSession != null) {
issues = kagemaiSession.getIssuesMap(bugIds);
}
if (issues != null && issues.size() > 0) {
Collections.sort(issues);
}
KagemaiBuildAction action = new KagemaiBuildAction(build, issues, mpp
.getSiteName(), mpp.getProjectId());
build.addAction(action);
return true;
}
public BuildStepMonitor getRequiredMonitorService() {
return BuildStepMonitor.STEP;
}
@Override
public DescriptorImpl getDescriptor() {
return (DescriptorImpl)super.getDescriptor();
}
@Extension
public static final class DescriptorImpl extends BuildStepDescriptor<Publisher> {
public DescriptorImpl() {
super(KagemaiPublisher.class);
}
@Override
public String getDisplayName() {
return Messages.publisher_dispname();
}
@Override
public boolean isApplicable(Class<? extends AbstractProject> jobType) {
return true;
}
@Override
public KagemaiPublisher newInstance(StaplerRequest req, JSONObject formData)
throws FormException {
return new KagemaiPublisher();
}
}
}