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

Commit

Permalink
Create parameter object
Browse files Browse the repository at this point in the history
  • Loading branch information
ikikko committed Feb 3, 2015
1 parent b9e8a2d commit 0d13024
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 43 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package org.jenkinsci.plugins.typetalk.webhookaction;

import hudson.model.AbstractProject;
import org.jenkinsci.plugins.typetalk.api.TypetalkMessage;

import java.util.List;

public class ResponseParameter {

private String description;

public String getDescription() {
return description != null ? description : message;
}

public void setDescription(String description) {
this.description = description;
}

private final String message;

public String getMessage() {
return message;
}

private TypetalkMessage.Emoji emoji = TypetalkMessage.Emoji.SMILEY;

public TypetalkMessage.Emoji getEmoji() {
return emoji;
}

public void setEmoji(TypetalkMessage.Emoji emoji) {
this.emoji = emoji;
}

private AbstractProject project;

public AbstractProject getProject() {
return project;
}

public void setProject(AbstractProject project) {
this.project = project;
}

public ResponseParameter(String message) {
this.message = message;
}

public static String flatMessages(List<String> messages) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < messages.size() - 1; i++) {
builder.append(messages.get(i) + "\n");
}
builder.append(messages.get(messages.size() - 1));

return builder.toString();
}

}
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
package org.jenkinsci.plugins.typetalk.webhookaction;

import hudson.model.AbstractProject;
import net.sf.json.JSONObject;
import org.jenkinsci.plugins.typetalk.api.TypetalkMessage;
import org.kohsuke.stapler.StaplerResponse;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

Expand All @@ -27,58 +25,35 @@ protected WebhookExecutor(WebhookRequest req, StaplerResponse rsp, String comman

public abstract void execute();

protected void output(String message) {
output(message, (AbstractProject) null);
protected void output(ResponseParameter parameter) {
outputInternal(Level.INFO, HttpServletResponse.SC_OK, parameter);
}

protected void output(String message, AbstractProject project) {
output(message, message, project);
protected void outputError(ResponseParameter parameter) {
outputError(parameter, HttpServletResponse.SC_BAD_REQUEST);
}

protected void output(String description, List<String> messages) {
output(description, messages, TypetalkMessage.Emoji.SMILEY);
protected void outputError(ResponseParameter parameter, int status) {
outputInternal(Level.WARNING, status, parameter);
}

protected void output(String description, List<String> messages, TypetalkMessage.Emoji emoji) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < messages.size() - 1; i++) {
builder.append(messages.get(i) + "\n");
}
builder.append(messages.get(messages.size() - 1));

// FIXME 本当なら直接 internal は呼ばないほうがいい。けど、parameterObjects を導入したら解決するので、それで
outputInternal(Level.INFO, HttpServletResponse.SC_OK, emoji, description, builder.toString(), null);
}

protected void output(String description, String message, AbstractProject project) {
outputInternal(Level.INFO, HttpServletResponse.SC_OK, TypetalkMessage.Emoji.SMILEY, description, message, project);
}

protected void outputError(String message) {
outputError(message, HttpServletResponse.SC_BAD_REQUEST);
}

protected void outputError(String message, int status) {
outputInternal(Level.WARNING, status, TypetalkMessage.Emoji.CRY, message, message, null);
}

private void outputInternal(Level level, int status, TypetalkMessage.Emoji emoji, String description, String message, AbstractProject project) {
private void outputInternal(Level level, int status, ResponseParameter parameter) {
try {
logger.log(level, description);
logger.log(level, parameter.getDescription());

rsp.setContentType("application/json");
rsp.setStatus(status);
rsp.getWriter().println(buildResponseMessage(emoji, message, project));
rsp.getWriter().println(buildResponseMessage(parameter));
} catch (IOException e) {
throw new IllegalStateException(e);
}
}

private String buildResponseMessage(TypetalkMessage.Emoji emoji, String message, AbstractProject project) {
private String buildResponseMessage(ResponseParameter parameter) {
JSONObject jsonObject = new JSONObject();

TypetalkMessage typetalkMessage = new TypetalkMessage(emoji, message);
jsonObject.element("message", typetalkMessage.messageWithProjectInfo(project));
TypetalkMessage typetalkMessage = new TypetalkMessage(parameter.getEmoji(), parameter.getMessage());
jsonObject.element("message", typetalkMessage.messageWithProjectInfo(parameter.getProject()));
jsonObject.element("replyTo", req.getPostId());

return jsonObject.toString();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

import hudson.model.*;
import jenkins.model.Jenkins;
import org.jenkinsci.plugins.typetalk.webhookaction.ResponseParameter;
import org.jenkinsci.plugins.typetalk.webhookaction.WebhookExecutor;
import org.jenkinsci.plugins.typetalk.webhookaction.WebhookRequest;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;

import javax.servlet.http.HttpServletResponse;
Expand Down Expand Up @@ -47,19 +47,22 @@ private void parseParameters() {
public void execute() {
TopLevelItem item = Jenkins.getInstance().getItemMap().get(job);
if (item == null || !(item instanceof AbstractProject)) {
outputError("Project [ " + job + " ] is not found");
outputError(new ResponseParameter("Project [ " + job + " ] is not found"));
return;
}
AbstractProject project = ((AbstractProject) item);

if (!project.hasPermission(Item.BUILD)) {
String name = Jenkins.getAuthentication().getName();
outputError(String.format("Project [ %s ] cannot be built by '%s'", job, name), HttpServletResponse.SC_FORBIDDEN);
outputError(new ResponseParameter(String.format("Project [ %s ] cannot be built by '%s'", job, name)), HttpServletResponse.SC_FORBIDDEN);
return;
}

Jenkins.getInstance().getQueue().schedule(project, project.getQuietPeriod(), getParametersAction(project), getCauseAction());
output("Project [ " + job + " ] has been scheduled", project);

ResponseParameter responseParameter = new ResponseParameter("Project [ " + job + " ] has been scheduled");
responseParameter.setProject(project);
output(responseParameter);
}

private Action getParametersAction(AbstractProject project) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import org.apache.commons.lang.StringUtils;
import org.jenkinsci.plugins.typetalk.api.TypetalkMessage;
import org.jenkinsci.plugins.typetalk.webhookaction.ResponseParameter;
import org.jenkinsci.plugins.typetalk.webhookaction.WebhookExecutor;
import org.jenkinsci.plugins.typetalk.webhookaction.WebhookRequest;
import org.kohsuke.stapler.StaplerResponse;
Expand Down Expand Up @@ -29,7 +30,11 @@ public HelpExecutor(WebhookRequest req, StaplerResponse rsp, String botUser, Lin

@Override
public void execute() {
output("Command [ help ] is executed", getMessages(), TypetalkMessage.Emoji.BOOK);
ResponseParameter responseParameter = new ResponseParameter(ResponseParameter.flatMessages(getMessages()));
responseParameter.setDescription("Command [ help ] is executed");
responseParameter.setEmoji(TypetalkMessage.Emoji.BOOK);

output(responseParameter);
}

private List<String> getMessages() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.jenkinsci.plugins.typetalk.webhookaction.executorimpl;

import org.jenkinsci.plugins.typetalk.webhookaction.ResponseParameter;
import org.jenkinsci.plugins.typetalk.webhookaction.WebhookExecutor;
import org.jenkinsci.plugins.typetalk.webhookaction.WebhookRequest;
import org.kohsuke.stapler.StaplerResponse;
Expand All @@ -12,6 +13,6 @@ public UndefinedExecutor(WebhookRequest req, StaplerResponse rsp, String command

@Override
public void execute() {
outputError("Command [ " + command + " ] is not defined");
outputError(new ResponseParameter("Command [ " + command + " ] is not defined"));
}
}

0 comments on commit 0d13024

Please sign in to comment.