-
Notifications
You must be signed in to change notification settings - Fork 721
/
JellyScriptContent.java
145 lines (129 loc) · 5.68 KB
/
JellyScriptContent.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package hudson.plugins.emailext.plugins.content;
import hudson.model.AbstractBuild;
import hudson.model.Hudson;
import hudson.model.TaskListener;
import hudson.plugins.emailext.plugins.EmailToken;
import hudson.plugins.emailext.ExtendedEmailPublisher;
import hudson.tasks.Mailer;
import org.apache.commons.io.IOUtils;
import org.apache.commons.jelly.JellyContext;
import org.apache.commons.jelly.JellyException;
import org.apache.commons.jelly.JellyTagException;
import org.apache.commons.jelly.Script;
import org.apache.commons.jelly.XMLOutput;
import org.xml.sax.InputSource;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import org.jenkinsci.plugins.tokenmacro.DataBoundTokenMacro;
import org.jenkinsci.plugins.tokenmacro.MacroEvaluationException;
@EmailToken
public class JellyScriptContent extends DataBoundTokenMacro {
public static final String MACRO_NAME = "JELLY_SCRIPT";
private static final String DEFAULT_HTML_TEMPLATE_NAME = "html";
private static final String DEFAULT_TEXT_TEMPLATE_NAME = "text";
private static final String DEFAULT_TEMPLATE_NAME = DEFAULT_HTML_TEMPLATE_NAME;
private static final String EMAIL_TEMPLATES_DIRECTORY = "email-templates";
@Parameter
public String template = DEFAULT_TEMPLATE_NAME;
@Override
public boolean acceptsMacroName(String macroName) {
return macroName.equals(MACRO_NAME);
}
/*
public String getHelpText() {
return "Custom message content generated from a Jelly script template. "
+ "There are two templates provided: \"" + DEFAULT_HTML_TEMPLATE_NAME + "\" "
+ "and \"" + DEFAULT_TEXT_TEMPLATE_NAME + "\". Custom Jelly templates should be placed in "
+ "$JENKINS_HOME/" + EMAIL_TEMPLATES_DIRECTORY + ". When using custom templates, "
+ "the template filename without \".jelly\" should be used for "
+ "the \"" + TEMPLATE_NAME_ARG + "\" argument.\n"
+ "<ul>\n"
+ "<li><i>" + TEMPLATE_NAME_ARG + "</i> - the template name.<br>\n"
+ "Defaults to \"" + DEFAULT_TEMPLATE_NAME + "\".\n"
+ "</ul>\n";
}
*/
@Override
public String evaluate(AbstractBuild<?, ?> build, TaskListener listener, String macroName)
throws MacroEvaluationException, IOException, InterruptedException {
InputStream inputStream = null;
try {
inputStream = getTemplateInputStream(template);
return renderContent(build, inputStream);
} catch (JellyException e) {
//LOGGER.log(Level.SEVERE, null, e);
return "JellyException: " + e.getMessage();
} catch (FileNotFoundException e) {
String missingTemplateError = generateMissingTemplate(template);
//LOGGER.log(Level.SEVERE, missingTemplateError);
return missingTemplateError;
} finally {
IOUtils.closeQuietly(inputStream);
}
}
private String generateMissingTemplate(String template) {
return "Jelly script [" + template + "] was not found in $JENKINS_HOME/" + EMAIL_TEMPLATES_DIRECTORY + ".";
}
/**
* Try to get the template from the classpath first before trying the file
* system.
*
* @param templateName
* @return
* @throws java.io.FileNotFoundException
*/
private InputStream getTemplateInputStream(String templateName)
throws FileNotFoundException {
// add .jelly if needed
if(!templateName.endsWith(".jelly")) {
templateName += ".jelly";
}
InputStream inputStream = getClass().getClassLoader().getResourceAsStream(
"hudson/plugins/emailext/templates/" + templateName);
if (inputStream == null) {
final File templatesFolder = new File(Hudson.getInstance().getRootDir(), EMAIL_TEMPLATES_DIRECTORY);
final File templateFile = new File(templatesFolder, templateName);
inputStream = new FileInputStream(templateFile);
}
return inputStream;
}
private String renderContent(AbstractBuild<?, ?> build, InputStream inputStream)
throws JellyException, IOException {
JellyContext context = createContext(new ScriptContentBuildWrapper(build), build);
Script script = context.compileScript(new InputSource(inputStream));
if (script != null) {
return convert(context, script);
}
return null;
}
private String convert(JellyContext context, Script script)
throws JellyTagException, IOException {
ByteArrayOutputStream output = new ByteArrayOutputStream(16 * 1024);
XMLOutput xmlOutput = XMLOutput.createXMLOutput(output);
script.run(context, xmlOutput);
xmlOutput.flush();
xmlOutput.close();
output.close();
return output.toString(getCharset());
}
private JellyContext createContext(Object it, AbstractBuild<?, ?> build) {
JellyContext context = new JellyContext();
context.setVariable("it", it);
context.setVariable("build", build);
context.setVariable("project", build.getParent());
context.setVariable("rooturl", ExtendedEmailPublisher.DESCRIPTOR.getHudsonUrl());
return context;
}
private String getCharset() {
String charset = Mailer.descriptor().getCharset();
String overrideCharset = ExtendedEmailPublisher.DESCRIPTOR.getCharset();
if (overrideCharset != null) {
charset = overrideCharset;
}
return charset;
}
}