package hudson.model; import hudson.util.FormValidation; import org.jenkinsci.Symbol; import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.export.Exported; import org.apache.commons.lang.StringUtils; import net.sf.json.JSONObject; import hudson.Extension; import java.util.ArrayList; import java.util.List; import java.util.Arrays; /** * @author huybrechts */ public class ChoiceParameterDefinition extends SimpleParameterDefinition { public static final String CHOICES_DELIMITER = "\\r?\\n"; @Deprecated public static final String CHOICES_DELIMETER = CHOICES_DELIMITER; private final List<String> choices; private final String defaultValue; public static boolean areValidChoices(String choices) { String strippedChoices = choices.trim(); return !StringUtils.isEmpty(strippedChoices) && strippedChoices.split(CHOICES_DELIMITER).length > 0; } @DataBoundConstructor public ChoiceParameterDefinition(String name, String choices, String description) { super(name, description); this.choices = Arrays.asList(choices.split(CHOICES_DELIMITER)); defaultValue = null; } public ChoiceParameterDefinition(String name, String[] choices, String description) { super(name, description); this.choices = new ArrayList<String>(Arrays.asList(choices)); defaultValue = null; } private ChoiceParameterDefinition(String name, List<String> choices, String defaultValue, String description) { super(name, description); this.choices = choices; this.defaultValue = defaultValue; } @Override public ParameterDefinition copyWithDefaultValue(ParameterValue defaultValue) { if (defaultValue instanceof StringParameterValue) { StringParameterValue value = (StringParameterValue) defaultValue; return new ChoiceParameterDefinition(getName(), choices, value.value, getDescription()); } else { return this; } } @Exported public List<String> getChoices() { return choices; } public String getChoicesText() { return StringUtils.join(choices, "\n"); } @Override public StringParameterValue getDefaultParameterValue() { return new StringParameterValue(getName(), defaultValue == null ? choices.get(0) : defaultValue, getDescription()); } private StringParameterValue checkValue(StringParameterValue value) { if (!choices.contains(value.value)) throw new IllegalArgumentException("Illegal choice for parameter " + getName() + ": " + value.value); return value; } @Override public ParameterValue createValue(StaplerRequest req, JSONObject jo) { StringParameterValue value = req.bindJSON(StringParameterValue.class, jo); value.setDescription(getDescription()); return checkValue(value); } public StringParameterValue createValue(String value) { return checkValue(new StringParameterValue(getName(), value, getDescription())); } @Extension @Symbol({"choice","choiceParam"}) public static class DescriptorImpl extends ParameterDescriptor { @Override public String getDisplayName() { return Messages.ChoiceParameterDefinition_DisplayName(); } @Override public String getHelpFile() { return "/help/parameter/choice.html"; } /** * Checks if parameterised build choices are valid. */ public FormValidation doCheckChoices(@QueryParameter String value) { if (ChoiceParameterDefinition.areValidChoices(value)) { return FormValidation.ok(); } else { return FormValidation.error(Messages.ChoiceParameterDefinition_MissingChoices()); } } } }