Skip to content
This repository was archived by the owner on Feb 13, 2020. It is now read-only.

Commit

Permalink
Print project build help messages
Browse files Browse the repository at this point in the history
  • Loading branch information
ikikko committed Feb 10, 2015
1 parent 1b37878 commit 4e898c6
Show file tree
Hide file tree
Showing 4 changed files with 146 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ private void outputInternal(Level level, ResponseParameter parameter) {
try {
logger.log(level, parameter.getDescription());

rsp.setContentType("application/json");
rsp.setContentType("application/json; charset=utf-8");
rsp.setStatus(HttpServletResponse.SC_OK);
rsp.getWriter().println(buildResponseMessage(parameter));
} catch (IOException e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ private void parseParameters() {
*/
@Override
public void execute() {
TopLevelItem item = Jenkins.getInstance().getItemMap().get(project);
TopLevelItem item = Jenkins.getInstance().getItem(project);
if (item == null || !(item instanceof AbstractProject)) {
outputError(new ResponseParameter("Project [ " + project + " ] is not found"));
return;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.jenkinsci.plugins.typetalk.webhookaction.executorimpl;

import hudson.model.*;
import jenkins.model.Jenkins;
import org.apache.commons.lang.StringUtils;
import org.jenkinsci.plugins.typetalk.api.TypetalkMessage;
import org.jenkinsci.plugins.typetalk.webhookaction.ResponseParameter;
Expand Down Expand Up @@ -30,30 +32,39 @@ public HelpExecutor(WebhookRequest req, StaplerResponse rsp, String botUser, Lin

@Override
public void execute() {
ResponseParameter responseParameter = new ResponseParameter(ResponseParameter.flatMessages(getMessages()));
ResponseParameter responseParameter = createResponseParameter();
if (responseParameter == null) {
return;
}

responseParameter.setDescription("Command [ help ] is executed");
responseParameter.setEmoji(TypetalkMessage.Emoji.BOOK);

output(responseParameter);
}

private List<String> getMessages() {
private ResponseParameter createResponseParameter() {
String command = parameters.poll();
if (StringUtils.isBlank(command)) {
return getDefaultMessages();
return getDefaultResponseParameter();
}

switch (command) {
case "build":
return getBuildMessages();
String project = parameters.poll();
if (StringUtils.isBlank(project)) {
return getBuildResponseParameter();
} else {
return getProjectBuildResponseParameter(project);
}
case "list":
return getListMessages();
return getListResponseParameter();
default:
return getDefaultMessages();
return getDefaultResponseParameter();
}
}

private List<String> getDefaultMessages() {
private ResponseParameter getDefaultResponseParameter() {
List<String> messages = new ArrayList<>();
messages.add("Usage");
messages.add("```");
Expand All @@ -62,10 +73,10 @@ private List<String> getDefaultMessages() {
messages.add(botUser + " help (<sub command>)");
messages.add("```");

return messages;
return new ResponseParameter(ResponseParameter.flatMessages(messages));
}

private List<String> getBuildMessages() {
private ResponseParameter getBuildResponseParameter() {
List<String> messages = new ArrayList<>();
messages.add("Usage");
messages.add("```");
Expand All @@ -79,10 +90,58 @@ private List<String> getBuildMessages() {
messages.add(botUser + " build helloWorldProject version=1.0.0 env=stage | build with multiple parameters");
messages.add("```");

return messages;
return new ResponseParameter(ResponseParameter.flatMessages(messages));
}

private ResponseParameter getProjectBuildResponseParameter(String p) {
TopLevelItem item = Jenkins.getInstance().getItem(p);
if (item == null || !(item instanceof AbstractProject)) {
outputError(new ResponseParameter("Project [ " + p + " ] is not found"));
return null;
}
AbstractProject project = ((AbstractProject) item);
ParametersDefinitionProperty property = (ParametersDefinitionProperty) project.getProperty(ParametersDefinitionProperty.class);

// usage
List<String> messages = new ArrayList<>();
messages.add("Usage");
messages.add("```");
String option;
if (property == null) {
option = "";
} else if (property.getParameterDefinitions().size() == 1) {
option = " <value>";
} else {
option = " <key=value>";
}
messages.add(botUser + " build " + p + option);
messages.add("```");

// parameter ( if defined )
if (property != null) {
messages.add(TypetalkMessage.Emoji.BOOK.getSymbol() + " Parameters");
messages.add("```");

int maxParameterLength = 0;
for (ParameterDefinition pd : property.getParameterDefinitions()) {
maxParameterLength = Math.max(maxParameterLength, pd.getName().length());
}
String format = "%" + maxParameterLength + "s : %s";
for (ParameterDefinition pd : property.getParameterDefinitions()) {
String description = StringUtils.isNotBlank(pd.getDescription()) ? pd.getDescription() : "(no description)";
messages.add(String.format(format, pd.getName(), description));
}

messages.add("```");
}

ResponseParameter responseParameter = new ResponseParameter(ResponseParameter.flatMessages(messages));
responseParameter.setProject(project);

return responseParameter;
}

private List<String> getListMessages() {
private ResponseParameter getListResponseParameter() {
List<String> messages = new ArrayList<>();
messages.add("Usage");
messages.add("```");
Expand All @@ -95,7 +154,7 @@ private List<String> getListMessages() {
messages.add(botUser + " list hel....rld | list projects with regexp filter");
messages.add("```");

return messages;
return new ResponseParameter(ResponseParameter.flatMessages(messages));
}

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.jenkinsci.plugins.typetalk.webhookaction.executorimpl

import hudson.model.ParametersDefinitionProperty
import hudson.model.StringParameterDefinition
import jenkins.model.JenkinsLocationConfiguration
import org.jenkinsci.plugins.typetalk.webhookaction.WebhookExecutor
import org.jenkinsci.plugins.typetalk.webhookaction.WebhookRequest
Expand Down Expand Up @@ -60,6 +62,72 @@ class HelpExecutorSpec extends Specification {
writer.toString().contains("build helloWorldProject version=1.0.0 env=stage")
}

def "execute : parameters [build project] - no parameter"() {
setup:
setUpRootUrl()
setUpProject([])
executor = new HelpExecutor(req, res, "@jenkins+", ["build", "typetalk-plugin"] as LinkedList)

when:
executor.execute()

then:
1 * res.setStatus(HttpServletResponse.SC_OK)
writer.toString().contains("build typetalk-plugin")
writer.toString().contains("http://localhost:8080/job/typetalk-plugin")
}

def "execute : parameters [build project] - single parameter"() {
setup:
setUpRootUrl()
setUpProject([
new StringParameterDefinition("version", null, "version description"),
])
executor = new HelpExecutor(req, res, "@jenkins+", ["build", "typetalk-plugin"] as LinkedList)

when:
executor.execute()

then:
1 * res.setStatus(HttpServletResponse.SC_OK)
writer.toString().contains("build typetalk-plugin <value>")
writer.toString().contains("version : version description")
writer.toString().contains("http://localhost:8080/job/typetalk-plugin")
}

def "execute : parameters [build project] - multiple parameters"() {
setup:
setUpRootUrl()
setUpProject([
new StringParameterDefinition("version", null, "version description"),
new StringParameterDefinition("env", null, "env description")
])
executor = new HelpExecutor(req, res, "@jenkins+", ["build", "typetalk-plugin"] as LinkedList)

when:
executor.execute()

then:
1 * res.setStatus(HttpServletResponse.SC_OK)
writer.toString().contains("build typetalk-plugin <key=value>")
writer.toString().contains("version : version description")
writer.toString().contains("env : env description")
writer.toString().contains("http://localhost:8080/job/typetalk-plugin")
}

def "execute : parameters [build project] - not found"() {
setup:
setUpRootUrl()
executor = new HelpExecutor(req, res, "@jenkins+", ["build", "typetalk-plugin"] as LinkedList)

when:
executor.execute()

then:
1 * res.setStatus(HttpServletResponse.SC_OK)
writer.toString().contains("not found")
}

def "execute : parameters [list]"() {
setup:
setUpRootUrl()
Expand All @@ -80,4 +148,9 @@ class HelpExecutorSpec extends Specification {
JenkinsLocationConfiguration.get().url = "http://localhost:8080/"
}

def setUpProject(spds) {
def project = j.createFreeStyleProject("typetalk-plugin")
project.addProperty(new ParametersDefinitionProperty(spds))
}

}

0 comments on commit 4e898c6

Please sign in to comment.