diff --git a/core/src/main/java/hudson/model/ChoiceParameterDefinition.java b/core/src/main/java/hudson/model/ChoiceParameterDefinition.java index 3b983ed0d931f13aeb45172966e23040159b8108..d18e8168d7ca7d99712415ecca825929e5a2c6de 100755 --- a/core/src/main/java/hudson/model/ChoiceParameterDefinition.java +++ b/core/src/main/java/hudson/model/ChoiceParameterDefinition.java @@ -15,25 +15,26 @@ import java.util.Arrays; * @author huybrechts */ public class ChoiceParameterDefinition extends SimpleParameterDefinition { + public static final String CHOICES_DELIMETER = "\\r?\\n"; + private final List choices; private final String defaultValue; + public static boolean areValidChoices(String choices) { + String strippedChoices = choices.trim(); + return !StringUtils.isEmpty(strippedChoices) && strippedChoices.split(CHOICES_DELIMETER).length > 0; + } + @DataBoundConstructor public ChoiceParameterDefinition(String name, String choices, String description) { super(name, description); - this.choices = Arrays.asList(choices.split("\\r?\\n")); - if (choices.length()==0) { - throw new IllegalArgumentException("No choices found"); - } + this.choices = Arrays.asList(choices.split(CHOICES_DELIMETER)); defaultValue = null; } public ChoiceParameterDefinition(String name, String[] choices, String description) { super(name, description); this.choices = new ArrayList(Arrays.asList(choices)); - if (this.choices.isEmpty()) { - throw new IllegalArgumentException("No choices found"); - } defaultValue = null; } @@ -52,7 +53,7 @@ public class ChoiceParameterDefinition extends SimpleParameterDefinition { return this; } } - + @Exported public List getChoices() { return choices; diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index b20ba525d3753446a6c02d83a0b150a079d3d3f6..b64a2cf733d2264271456d987b3bb64015322947 100755 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -30,6 +30,7 @@ import com.google.common.collect.Lists; import com.google.inject.Injector; import hudson.ExtensionComponent; import hudson.ExtensionFinder; +import hudson.model.ChoiceParameterDefinition; import hudson.model.LoadStatistics; import hudson.model.Messages; import hudson.model.Node; @@ -3559,6 +3560,17 @@ public class Jenkins extends AbstractCIBase implements ModifiableTopLevelItemGro return FormValidation.error(Messages.Hudson_ViewAlreadyExists(view)); } + /** + * 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()); + } + } + /** * Serves static resources placed along with Jelly view files. *

diff --git a/core/src/main/resources/hudson/model/ChoiceParameterDefinition/config.jelly b/core/src/main/resources/hudson/model/ChoiceParameterDefinition/config.jelly index da360341ceb0ca7b9cd5aed3bc72e897b7bc5b12..523c3044e6cbe6e8dff5abbc772e2eb432955d04 100755 --- a/core/src/main/resources/hudson/model/ChoiceParameterDefinition/config.jelly +++ b/core/src/main/resources/hudson/model/ChoiceParameterDefinition/config.jelly @@ -30,7 +30,7 @@ THE SOFTWARE. - + diff --git a/core/src/main/resources/hudson/model/Messages.properties b/core/src/main/resources/hudson/model/Messages.properties index 97b545a6408f87e310b386f406ca906078eeb92a..917e8cb123bdcd136e3935e503218941cc164a68 100644 --- a/core/src/main/resources/hudson/model/Messages.properties +++ b/core/src/main/resources/hudson/model/Messages.properties @@ -308,6 +308,7 @@ TextParameterDefinition.DisplayName=Text Parameter FileParameterDefinition.DisplayName=File Parameter BooleanParameterDefinition.DisplayName=Boolean Value ChoiceParameterDefinition.DisplayName=Choice +ChoiceParameterDefinition.MissingChoices=Requires Choices. RunParameterDefinition.DisplayName=Run Parameter PasswordParameterDefinition.DisplayName=Password Parameter diff --git a/core/src/test/java/hudson/model/ChoiceParameterDefinitionTest.java b/core/src/test/java/hudson/model/ChoiceParameterDefinitionTest.java new file mode 100644 index 0000000000000000000000000000000000000000..95590ce97a14d68b4f0825ed261111818e25fd46 --- /dev/null +++ b/core/src/test/java/hudson/model/ChoiceParameterDefinitionTest.java @@ -0,0 +1,17 @@ +package hudson.model; + +import org.junit.Test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class ChoiceParameterDefinitionTest { + @Test + public void shouldValidateChoices(){ + assertFalse(ChoiceParameterDefinition.areValidChoices("")); + assertFalse(ChoiceParameterDefinition.areValidChoices(" ")); + assertTrue(ChoiceParameterDefinition.areValidChoices("abc")); + assertTrue(ChoiceParameterDefinition.areValidChoices("abc\ndef")); + assertTrue(ChoiceParameterDefinition.areValidChoices("abc\r\ndef")); + } +} diff --git a/test/src/test/java/jenkins/model/JenkinsTest.java b/test/src/test/java/jenkins/model/JenkinsTest.java index ab0e2d87a2a4f17eb9731463d042dde5afe920de..398d889ebe7e2ff5ac968a57ea6f37c81853a565 100644 --- a/test/src/test/java/jenkins/model/JenkinsTest.java +++ b/test/src/test/java/jenkins/model/JenkinsTest.java @@ -46,9 +46,12 @@ import org.jvnet.hudson.test.ExtractResourceSCM; import org.jvnet.hudson.test.HudsonTestCase; import org.jvnet.hudson.test.TestExtension; import org.kohsuke.stapler.HttpResponse; + import java.net.HttpURLConnection; import java.net.URL; +import static org.junit.Assert.assertEquals; + /** * @author kingfai * @@ -307,6 +310,15 @@ public class JenkinsTest extends HudsonTestCase { assertEquals(HttpURLConnection.HTTP_FORBIDDEN, e.getStatusCode()); } } + + @Test + public void testCheckChoices() throws Exception { + Jenkins jenkins = Jenkins.getInstance(); + + assertEquals(FormValidation.Kind.OK, jenkins.doCheckChoices("abc\ndef").kind); + assertEquals(FormValidation.Kind.ERROR, jenkins.doCheckChoices("").kind); + } + private String eval(WebClient wc) throws Exception { WebRequestSettings req = new WebRequestSettings(new URL(wc.getContextPath() + "eval"), HttpMethod.POST); req.setRequestBody("${1+2}");