package hudson.plugins.sctmexecutor; import hudson.Extension; import hudson.model.AbstractProject; import hudson.model.FreeStyleProject; import hudson.model.Hudson; import hudson.plugins.sctmexecutor.validators.EmptySingleFieldValidator; import hudson.plugins.sctmexecutor.validators.NumberCSVSingleFieldValidator; import hudson.plugins.sctmexecutor.validators.TestConnectionValidator; import hudson.tasks.BuildStepDescriptor; import hudson.tasks.Builder; import hudson.util.FormValidation; import java.io.BufferedReader; import java.io.IOException; import java.net.URL; import java.util.Collection; import java.util.Collections; import java.util.logging.Logger; import javax.servlet.ServletException; import net.sf.json.JSONObject; import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; /** * * @author Thomas Fuerer * */ @Extension public final class SCTMExecutorDescriptor extends BuildStepDescriptor<Builder> { private static final Logger LOGGER = Logger.getLogger("hudson.plugins.sctmexecutor"); //$NON-NLS-1$ private String serviceURL; private String user; private String password; // private transients ISCTMService service; public SCTMExecutorDescriptor() { super(SCTMExecutor.class); load(); } @Override public String getDisplayName() { return Messages.getString("SCTMExecutorDescriptor.plugin.title"); //$NON-NLS-1$ } @Override public Builder newInstance(StaplerRequest req, JSONObject formData) throws FormException { String execDefIds = formData.getString("execDefIds"); //$NON-NLS-1$ int projectId = formData.getInt("projectId"); //$NON-NLS-1$ int delay = getOptionalIntValue(formData.getString("delay"), 0); //$NON-NLS-1$ boolean contOnErr = formData.getBoolean("continueOnError"); //$NON-NLS-1$ boolean collectResults = formData.getBoolean("collectResults"); //$NON-NLS-1$ boolean ignoreSetupCleanup = formData.getBoolean("ignoreSetupCleanup"); //$NON-NLS-1$ String jobName = ""; //$NON-NLS-1$ JSONObject buildNumberUsageOption = (JSONObject) formData.get("buildNumberUsageOption"); //$NON-NLS-1$ int optValue; if (buildNumberUsageOption == null) optValue = SCTMExecutor.OPT_NO_BUILD_NUMBER; else optValue = buildNumberUsageOption.getInt("value");//$NON-NLS-1$ String version = null; switch (optValue) { case SCTMExecutor.OPT_USE_SPECIFICJOB_BUILDNUMBER: jobName = buildNumberUsageOption.getString("jobName"); //$NON-NLS-1$ case SCTMExecutor.OPT_USE_LATEST_SCTM_BUILDNUMBER: case SCTMExecutor.OPT_USE_THIS_BUILD_NUMBER: version = buildNumberUsageOption.getString("productVersion"); //$NON-NLS-1$ } return new SCTMExecutor(projectId, execDefIds, delay, optValue, jobName, contOnErr, collectResults, ignoreSetupCleanup, version); } private int getOptionalIntValue(String value, int defaultValue) { try { return Integer.parseInt(value); } catch (NumberFormatException e) { return defaultValue; } } @Override public boolean configure(StaplerRequest req, JSONObject formData) throws hudson.model.Descriptor.FormException { serviceURL = formData.getString("serviceURL"); //$NON-NLS-1$ user = formData.getString("user"); //$NON-NLS-1$ password = PwdCrypt.encode(formData.getString("password"), Hudson.getInstance().getSecretKey()); //$NON-NLS-1$ save(); return super.configure(req, formData); } public void setServiceURL(String serviceURL) { this.serviceURL = serviceURL; } public String getServiceURL() { return serviceURL; } public String getUser() { return user; } public String getPassword() { if (password != null && !password.equals("")) //$NON-NLS-1$ return PwdCrypt.decode(password, Hudson.getInstance().getSecretKey()); else return ""; //$NON-NLS-1$ } public void setUser(String user) { this.user = user; } public void setPassword(String password) { this.password = password; } public FormValidation doCheckServiceURL(StaplerRequest req, StaplerResponse rsp, @QueryParameter("value") final String value) throws IOException, ServletException { return new FormValidation.URLCheck() { @Override protected FormValidation check() throws IOException, ServletException { if (value == null || (value != null && !value .matches("http(s)?://(((\\d{1,3}.){3}\\d{1,3})?|([\\p{Alnum}-_.])*)(:\\d{0,5})?(/([\\p{Alnum}-_.])*)?/services"))) { //$NON-NLS-1$ return FormValidation.error(Messages.getString("SCTMExecutorDescriptor.validate.msg.noValidURL")); //$NON-NLS-1$ } try { URL url = new URL(value); BufferedReader reader = open(url); if (findText(reader, "tmexecution")) //$NON-NLS-1$ return FormValidation.ok(); else return FormValidation.warning(Messages.getString("SCTMExecutorDescriptor.validate.msg.noServiceFound")); //$NON-NLS-1$ } catch (IOException e) { return handleIOException(value, e); } catch (IllegalArgumentException e) { return FormValidation.error(Messages.getString("SCTMExecutorDescriptor.validate.msg.noValidURL")); //$NON-NLS-1$ } } }.check(); } public Collection<String> getAllJobs() { return Hudson.getInstance().getJobNames(); } public Collection<String> getAllVersions(String execdefIds) { // try { // int execDefId = Utils.csvToIntList(execdefIds).get(0); // return this.service.getAllVersions(execDefId); // } catch (SCTMException e) { // LOGGER.warning("No versions available for product."); // } return Collections.emptyList(); } public FormValidation doCheckUser(StaplerRequest req, StaplerResponse rsp, @QueryParameter("value") final String value) { return new EmptySingleFieldValidator().check(value); } public FormValidation doCheckPassword(StaplerRequest req, StaplerResponse rsp, @QueryParameter("value") final String value) { return new EmptySingleFieldValidator().check(value); } public FormValidation doCheckExecDefIds(StaplerRequest req, StaplerResponse rsp, @QueryParameter("value") final String value) { return new NumberCSVSingleFieldValidator().check(value); } public FormValidation doCheckProjectId(StaplerRequest req, StaplerResponse rsp, @QueryParameter("value") final String value) { return FormValidation.validateNonNegativeInteger(value); } public FormValidation doCheckDelay(StaplerRequest rep, StaplerResponse rsp, @QueryParameter("value") final String value) { return FormValidation.validateNonNegativeInteger(value); } public FormValidation doTestConnection(StaplerRequest req, StaplerResponse rsp, @QueryParameter("serviceURL") final String serviceURL, @QueryParameter("user") final String user, @QueryParameter("password") final String password) throws IOException, ServletException { return new TestConnectionValidator().check(serviceURL, user, password); } // public FormValidation doCheckVersion(StaplerRequest req, StaplerResponse rsp, // @QueryParameter("version") final String version, @QueryParameter("execDefIds") final String execDefIds) { // Collection<String> allVersions = getAllVersions(execDefIds); // return allVersions.contains(version) ? FormValidation.ok() : FormValidation.warning(MessageFormat.format( // "The given version ({0}) ist not available on SCTM. Choose one from the following: {1}", version, allVersions)); // } @SuppressWarnings("unchecked") @Override public boolean isApplicable(Class<? extends AbstractProject> jobType) { return (FreeStyleProject.class.equals(jobType)); } }