package hudson.plugins.ipmsg; import hudson.Extension; import hudson.Launcher; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.BuildListener; import hudson.model.Result; import hudson.tasks.BuildStepDescriptor; import hudson.tasks.BuildStepMonitor; import hudson.tasks.Notifier; import hudson.tasks.Publisher; import hudson.util.FormValidation; import java.io.IOException; import java.util.List; import net.sf.json.JSONObject; import org.apache.commons.lang.StringUtils; import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.StaplerRequest; /** * Publisher class for IPMessenger. * * @author Toyokazu Ohara */ public class IPMsgPublisher extends Notifier { private static final int DEFAULT_PORT = 2425; private static final int DEFAULT_LOG_LINE_SIZE = 100; private static final int MINMUM_PORT_NUMBER = 0; private static final int MAXMUM_PORT_NUMBER = 65535; @SuppressWarnings("unchecked") @Override public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { if (build.getResult() == Result.FAILURE) { List lines = build.getLog(DESCRIPTOR.getLogLineSize()); StringBuilder sb = new StringBuilder(); sb.append("fail to build.\n"); sb.append("please make sure.\n"); sb.append("\n\n"); for (int i = 0, iMax = lines.size(); i < iMax; i++) { sb.append(lines.get(i).toString()); } MsgClient.sendAll(sb.toString()); } return true; } public BuildStepMonitor getRequiredMonitorService() { return BuildStepMonitor.STEP; } @Extension public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl(); public static final class DescriptorImpl extends BuildStepDescriptor<Publisher> { private int port; private String userName; private String nickName; private String group; private int logLineSize = -1; public int getPort() { if (port > 0) { return port; } else { return DEFAULT_PORT; } } public String getUserName() { if (userName == null) { return "hudson"; } return userName; } public String getNickName() { if (nickName == null) { return "hudson"; } return nickName; } public String getGroup() { if (group == null) { return "hudson"; } return group; } public int getLogLineSize() { if (logLineSize < 0) { return DEFAULT_LOG_LINE_SIZE; } return logLineSize; } DescriptorImpl() { super(IPMsgPublisher.class); load(); } public String getDisplayName() { return "IPMessenger reports"; } @Override public boolean isApplicable(Class<? extends AbstractProject> jobType) { return true; } @Override public IPMsgPublisher newInstance(StaplerRequest req, JSONObject formData) throws FormException { return new IPMsgPublisher(); } @Override public boolean configure( StaplerRequest req, JSONObject json ) throws FormException { MsgClient.logout(); port = nullify(req.getParameter("ipmsg_port"), -1); userName = nullify(req.getParameter("ipmsg_userName")); nickName = nullify(req.getParameter("ipmsg_nickName")); group = nullify(req.getParameter("ipmsg_group")); logLineSize = nullify(req.getParameter("ipmsg_logLineSize"), -1); MsgClient.login(); save(); return true; } /** * Checks the Port in <tt>global.jelly</tt> */ public FormValidation doPortCheck(@QueryParameter final String value) { if (isValidPort(value)) { return FormValidation.ok(); } else { return FormValidation.error("please set valid port number. instead of" + value); } } private String nullify(String v) { if(v!=null && v.length()==0) v=null; return v; } private int nullify(String v, int defaultValue) { String value = nullify(v); if (value == null) { return defaultValue; } else { return Integer.parseInt(value); } } private boolean isValidPort(String value) { if (StringUtils.isNotEmpty(value)) { try { int port = Integer.parseInt(value); if (MINMUM_PORT_NUMBER <= port && port <= MAXMUM_PORT_NUMBER) { return true; } } catch (NumberFormatException ne) { // do nothing } } return false; } } @Override public boolean needsToRunAfterFinalized() { return true; } }