Skip to content

Commit

Permalink
Merge pull request #8 from mcupak/parameter-display
Browse files Browse the repository at this point in the history
[FIXED JENKINS-19316] improved handling of boolean, choice and text parameters
  • Loading branch information
mcupak committed Jul 14, 2014
2 parents 545936d + 315101e commit 829deea
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 37 deletions.
@@ -1,25 +1,31 @@
package org.jenkinsci.plugins.buildwithparameters;

import hudson.model.ParameterValue;
import hudson.model.BooleanParameterValue;
import hudson.model.ParameterValue;
import hudson.model.PasswordParameterValue;
import hudson.model.StringParameterValue;
import hudson.model.TextParameterValue;
import java.util.List;

public class BuildParameter {

static final String JOB_DEFAULT_PASSWORD_PLACEHOLDER = "job_default_password";
private boolean isPasswordParam;
private String name, description, value;
private BuildParameterType type;
private final String name;
private final String description;
private String value;
private List<String> choices = null;

public BuildParameter(String name, String description) {
this.name = name;
this.description = description;
}

public static boolean isDefaultPasswordPlaceholder(String candidate) {
if(candidate == null) {
return false;
}
return JOB_DEFAULT_PASSWORD_PLACEHOLDER.equals(candidate);
if (candidate == null) {
return false;
}
return JOB_DEFAULT_PASSWORD_PLACEHOLDER.equals(candidate);
}

public String getName() {
Expand All @@ -37,18 +43,29 @@ public String getValue() {
public void setValue(ParameterValue parameterValue) {
if (parameterValue instanceof StringParameterValue) {
this.value = ((StringParameterValue) parameterValue).value;
} else if (parameterValue instanceof TextParameterValue) {
this.value = ((TextParameterValue) parameterValue).value;
} else if (parameterValue instanceof BooleanParameterValue) {
this.value = String.valueOf(((BooleanParameterValue) parameterValue).value);
} else if (parameterValue instanceof PasswordParameterValue) {
this.value = JOB_DEFAULT_PASSWORD_PLACEHOLDER;
}
}

public void setPasswordParam(boolean isPasswordParam) {
this.isPasswordParam = isPasswordParam;
}

public boolean isPasswordParam() {
return isPasswordParam;
}
public BuildParameterType getType() {
return type;
}

public void setType(BuildParameterType type) {
this.type = type;
}

public List<String> getChoices() {
return choices;
}

public void setChoices(List<String> choices) {
this.choices = choices;
}

}
@@ -0,0 +1,12 @@
package org.jenkinsci.plugins.buildwithparameters;

/**
* Type of a build parameter.
*
* @author Miroslav Cupak (mirocupak@gmail.com)
* @version 1.0
*/
public enum BuildParameterType {

STRING, PASSWORD, TEXT, BOOLEAN, CHOICE;
}
@@ -1,42 +1,44 @@
package org.jenkinsci.plugins.buildwithparameters;


import hudson.model.AbstractProject;
import hudson.model.Action;
import hudson.model.BooleanParameterDefinition;
import hudson.model.BooleanParameterValue;
import hudson.model.Cause;
import hudson.model.CauseAction;
import hudson.model.ChoiceParameterDefinition;
import hudson.model.Hudson;
import hudson.model.ParameterDefinition;
import hudson.model.ParameterValue;
import hudson.model.ParametersAction;
import hudson.model.ParametersDefinitionProperty;
import hudson.model.PasswordParameterDefinition;
import hudson.model.PasswordParameterValue;
import hudson.model.StringParameterDefinition;
import hudson.model.TextParameterDefinition;
import hudson.util.Secret;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import net.sf.json.JSONObject;
import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;

import javax.servlet.ServletException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class BuildWithParametersAction implements Action {

private final AbstractProject project;

public BuildWithParametersAction(AbstractProject project) {
this.project = project;
}


//////////////////
// //
// VIEW //
// //
//////////////////

public String getProjectName() {
return project.getName();
}
Expand All @@ -46,7 +48,21 @@ public List<BuildParameter> getAvailableParameters() {

for (ParameterDefinition parameterDefinition : getParameterDefinitions()) {
BuildParameter buildParameter = new BuildParameter(parameterDefinition.getName(), parameterDefinition.getDescription());
buildParameter.setPasswordParam(parameterDefinition.getClass().isAssignableFrom(PasswordParameterDefinition.class));
if (parameterDefinition.getClass().isAssignableFrom(PasswordParameterDefinition.class)) {
buildParameter.setType(BuildParameterType.PASSWORD);
} else if (parameterDefinition.getClass().isAssignableFrom(BooleanParameterDefinition.class)) {
buildParameter.setType(BuildParameterType.BOOLEAN);
} else if (parameterDefinition.getClass().isAssignableFrom(ChoiceParameterDefinition.class)) {
buildParameter.setType(BuildParameterType.CHOICE);
buildParameter.setChoices(((ChoiceParameterDefinition) parameterDefinition).getChoices());
} else if (parameterDefinition.getClass().isAssignableFrom(StringParameterDefinition.class)) {
buildParameter.setType(BuildParameterType.STRING);
} else if (parameterDefinition.getClass().isAssignableFrom(TextParameterDefinition.class)) {
buildParameter.setType(BuildParameterType.TEXT);
} else {
// default to string
buildParameter.setType(BuildParameterType.STRING);
}

try {
buildParameter.setValue(getParameterDefinitionValue(parameterDefinition));
Expand Down Expand Up @@ -76,13 +92,11 @@ public String getUrlName() {
return "parambuild";
}


//////////////////
// //
// SUBMISSION //
// //
//////////////////

public void doConfigSubmit(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
project.checkPermission(AbstractProject.BUILD);

Expand All @@ -92,7 +106,10 @@ public void doConfigSubmit(StaplerRequest req, StaplerResponse rsp) throws IOExc
if (!formData.isEmpty()) {
for (ParameterDefinition parameterDefinition : getParameterDefinitions()) {
ParameterValue parameterValue = parameterDefinition.createValue(req);
if(parameterValue.getClass().isAssignableFrom(PasswordParameterValue.class)) {
if (parameterValue.getClass().isAssignableFrom(BooleanParameterValue.class)) {
boolean value = (req.getParameter(parameterDefinition.getName()) != null);
parameterValue = ((BooleanParameterDefinition) parameterDefinition).createValue(String.valueOf(value));
} else if (parameterValue.getClass().isAssignableFrom(PasswordParameterValue.class)) {
parameterValue = applyDefaultPassword(parameterDefinition, parameterValue);
}
// This will throw an exception if the provided value is not a valid option for the parameter.
Expand All @@ -105,31 +122,27 @@ public void doConfigSubmit(StaplerRequest req, StaplerResponse rsp) throws IOExc
rsp.sendRedirect("../");
}


ParameterValue applyDefaultPassword(ParameterDefinition parameterDefinition,
ParameterValue parameterValue) {
String jobPassword = getPasswordValue((PasswordParameterValue)parameterValue);
if(!BuildParameter.isDefaultPasswordPlaceholder(jobPassword)) {
String jobPassword = getPasswordValue((PasswordParameterValue) parameterValue);
if (!BuildParameter.isDefaultPasswordPlaceholder(jobPassword)) {
return parameterValue;
}
String jobDefaultPassword = getPasswordValue(((PasswordParameterValue) parameterDefinition.getDefaultParameterValue()));
ParameterValue passwordParameterValue = new PasswordParameterValue(parameterValue.getName(), jobDefaultPassword);
return passwordParameterValue;
}


static String getPasswordValue(PasswordParameterValue parameterValue) {
Secret secret = parameterValue.getValue();
return Secret.toString(secret);
}


//////////////////
// //
// HELPERS //
// //
//////////////////

private List<ParameterDefinition> getParameterDefinitions() {
ParametersDefinitionProperty property = (ParametersDefinitionProperty) project.getProperty(ParametersDefinitionProperty.class);
if (property != null && property.getParameterDefinitions() != null) {
Expand Down
Expand Up @@ -11,13 +11,26 @@
<f:form method="post" action="configSubmit" name="config">
<j:forEach var="parameter" items="${it.availableParameters}">
<f:entry title="${parameter.name}" description="${parameter.description}">
<div>
<div name="parameter">
<j:choose>
<j:when test="${!parameter.passwordParam}">
<f:textbox name="${parameter.name}" value="${parameter.value}"/>
<j:when test="${parameter.type == 'PASSWORD'}">
<f:password name="${parameter.name}" value="${parameter.value}"/>
</j:when>
<j:when test="${parameter.type == 'BOOLEAN'}">
<f:checkbox name="${parameter.name}" checked="${parameter.value}"/>
</j:when>
<j:when test="${parameter.type == 'CHOICE'}">
<select name="${parameter.name}">
<j:forEach var="value" items="${parameter.choices}">
<f:option selected="${parameter.value == value}">${value}</f:option>
</j:forEach>
</select>
</j:when>
<j:when test="${parameter.type == 'TEXT'}">
<f:textarea name="${parameter.name}" value="${parameter.value}"/>
</j:when>
<j:otherwise>
<f:password name="${parameter.name}" value="${parameter.value}"/>
<f:textbox name="${parameter.name}" value="${parameter.value}"/>
</j:otherwise>
</j:choose>
</div>
Expand Down
Expand Up @@ -24,7 +24,7 @@ public void getAvailableParameters_passwordParam() throws IOException {
BuildWithParametersAction bwpa = testableProject(pwParamDef);

BuildParameter pwParameter = bwpa.getAvailableParameters().get(0);
assertTrue(pwParameter.isPasswordParam());
assertTrue(pwParameter.getType()==BuildParameterType.PASSWORD);
}

private BuildWithParametersAction testableProject(
Expand Down

0 comments on commit 829deea

Please sign in to comment.