package org.jenkinsci.plugins.github.common;
import hudson.Extension;
import hudson.model.AbstractBuild;
import hudson.model.AbstractDescribableImpl;
import hudson.model.Descriptor;
import hudson.model.Run;
import hudson.model.TaskListener;
import org.jenkinsci.plugins.github.Messages;
import org.jenkinsci.plugins.tokenmacro.MacroEvaluationException;
import org.jenkinsci.plugins.tokenmacro.TokenMacro;
import org.kohsuke.stapler.DataBoundConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.Collections;
import static org.apache.commons.lang3.StringUtils.trimToEmpty;
/**
* Represents a message that can contain token macros.
*
* uses https://wiki.jenkins-ci.org/display/JENKINS/Token+Macro+Plugin to expand vars
*
* @author Kanstantsin Shautsou
* @author Alina Karpovich
* @since 1.14.1
*/
public class ExpandableMessage extends AbstractDescribableImpl<ExpandableMessage> {
private static final Logger LOGGER = LoggerFactory.getLogger(ExpandableMessage.class);
private final String content;
@DataBoundConstructor
public ExpandableMessage(String content) {
this.content = content;
}
/**
* Expands all env vars. In case of AbstractBuild also expands token macro and build vars
*
* @param run build context
* @param listener usually used to log something to console while building env vars
*
* @return string with expanded vars and tokens
*/
public String expandAll(Run<?, ?> run, TaskListener listener) throws IOException, InterruptedException {
if (run instanceof AbstractBuild) {
try {
return TokenMacro.expandAll(
(AbstractBuild) run,
listener,
content,
false,
Collections.<TokenMacro>emptyList()
);
} catch (MacroEvaluationException e) {
LOGGER.error("Can't process token content {} in {} ({})",
content, run.getParent().getFullName(), e.getMessage());
LOGGER.trace(e.getMessage(), e);
return content;
}
} else {
// fallback to env vars only because of token-macro allow only AbstractBuild in 1.11
return run.getEnvironment(listener).expand(trimToEmpty(content));
}
}
public String getContent() {
return content;
}
@Override
public DescriptorImpl getDescriptor() {
return (DescriptorImpl) super.getDescriptor();
}
@Extension
public static class DescriptorImpl extends Descriptor<ExpandableMessage> {
@Override
public String getDisplayName() {
return Messages.common_expandable_message_title();
}
}
}