package se.bjurr.prnfb.service;
import static com.google.common.base.Strings.isNullOrEmpty;
import static se.bjurr.prnfb.service.PrnfbVariable.BUTTON_FORM_DATA;
import static se.bjurr.prnfb.service.PrnfbVariable.BUTTON_TRIGGER_TITLE;
import static se.bjurr.prnfb.service.PrnfbVariable.PULL_REQUEST_COMMENT_ACTION;
import static se.bjurr.prnfb.service.PrnfbVariable.PULL_REQUEST_COMMENT_TEXT;
import static se.bjurr.prnfb.service.PrnfbVariable.PULL_REQUEST_MERGE_COMMIT;
import static se.bjurr.prnfb.service.PrnfbVariable.PULL_REQUEST_USER_GROUPS;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.atlassian.bitbucket.event.pull.PullRequestCommentEvent;
import com.atlassian.bitbucket.event.pull.PullRequestEvent;
import com.atlassian.bitbucket.event.pull.PullRequestMergedEvent;
import com.google.common.base.Joiner;
import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import se.bjurr.prnfb.settings.PrnfbButton;
/**
* {@link PrnfbVariable} is becoming a bit messy with a lot of parameters to resolve different
* variables. This is intended to replace all those parameters.
*/
public class VariablesContext {
public static class VariablesContextBuilder {
public PrnfbButton button;
public PullRequestEvent pullRequestEvent;
public String formData;
public List<String> groups;
public VariablesContextBuilder setButton(PrnfbButton button) {
this.button = button;
return this;
}
public VariablesContextBuilder setFormData(String formData) {
this.formData = formData;
return this;
}
public VariablesContextBuilder setGroups(List<String> groups) {
this.groups = groups;
return this;
}
public VariablesContextBuilder setPullRequestEvent(PullRequestEvent pullRequestEvent) {
this.pullRequestEvent = pullRequestEvent;
return this;
}
public VariablesContextBuilder() {}
public VariablesContext build() {
return new VariablesContext(this);
}
}
private final PrnfbButton button;
private final PullRequestEvent pullRequestEvent;
private final String formData;
private final List<String> groups;
public VariablesContext(VariablesContextBuilder b) {
this.button = b.button;
this.pullRequestEvent = b.pullRequestEvent;
this.formData = b.formData;
this.groups = b.groups;
}
public List<String> getGroups() {
return groups;
}
public Map<PrnfbVariable, Supplier<String>> getVariables() {
Map<PrnfbVariable, Supplier<String>> variables = new HashMap<>();
if (groups != null) {
variables.put(PULL_REQUEST_USER_GROUPS, Suppliers.ofInstance(Joiner.on(',').join(groups)));
}
if (button != null) {
variables.put(BUTTON_TRIGGER_TITLE, Suppliers.ofInstance(button.getName()));
}
if (!isNullOrEmpty(formData)) {
variables.put(BUTTON_FORM_DATA, Suppliers.ofInstance(formData));
}
if (pullRequestEvent != null) {
if (pullRequestEvent instanceof PullRequestCommentEvent) {
PullRequestCommentEvent pullRequestCommentEvent =
(PullRequestCommentEvent) pullRequestEvent;
variables.put(
PULL_REQUEST_COMMENT_TEXT,
() -> {
return pullRequestCommentEvent.getComment().getText();
});
variables.put(
PULL_REQUEST_COMMENT_ACTION,
() -> {
return pullRequestCommentEvent.getCommentAction().name();
});
} else if (pullRequestEvent instanceof PullRequestMergedEvent) {
variables.put(
PULL_REQUEST_MERGE_COMMIT,
new Supplier<String>() {
@Override
public String get() {
return ((PullRequestMergedEvent) pullRequestEvent).getCommit().getId();
}
});
}
}
return variables;
}
}