Skip to content

Commit 0e27a33

Browse files
committedAug 16, 2015
First alpha for testing.
- Big fixes in javascript for selecting correct template - Style changes for Webhook list page (index.html) - Added Template renderer (still not actually rendering from a build)
1 parent c747867 commit 0e27a33

22 files changed

+485
-88
lines changed
 

‎tcwebhooks-core/src/main/java/webhook/teamcity/BuildState.java

+28
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,34 @@ public boolean enabled(BuildStateEnum currentBuildState, boolean success, boolea
6767
return false;
6868
}
6969

70+
/**
71+
* Determine the WebHook build state from a TeamCity build event state. For anything except finished
72+
* this will simply return the TeamCity state.<br/>
73+
* However, for finished builds, determine if it was success or failure, and then with builds that changed state, if it was a fix or break.
74+
*
75+
* @param currentBuildState
76+
* @param success
77+
* @param changed
78+
* @return The WebHook state for use detemining template etc.
79+
*/
80+
public static BuildStateEnum getEffectiveState(BuildStateEnum currentBuildState, boolean success, boolean changed){
81+
82+
if (currentBuildState.equals(BUILD_FINISHED)){
83+
if (success){
84+
if (changed){
85+
return BUILD_FIXED;
86+
}
87+
return BUILD_SUCCESSFUL;
88+
} else {
89+
if (changed){
90+
return BUILD_BROKEN;
91+
}
92+
return BUILD_FAILED;
93+
}
94+
}
95+
return currentBuildState;
96+
}
97+
7098
public void setEnabled(BuildStateEnum currentBuildState, boolean enabled){
7199
if (enabled)
72100
enable(currentBuildState);

‎tcwebhooks-core/src/main/java/webhook/teamcity/WebHookListener.java

+31-11
Original file line numberDiff line numberDiff line change
@@ -104,37 +104,57 @@ private void processBuildEvent(SRunningBuild sRunningBuild, BuildStateEnum state
104104
for (WebHookConfigWrapper whcw : getListOfEnabledWebHooks(sRunningBuild.getProjectId())){
105105
WebHookPayload payloadFormat = myManager.getFormat(whcw.whc.getPayloadFormat());
106106
WebHookTemplateContent templateForThisBuild;
107-
if (sRunningBuild.getBranch() != null){
108-
// We have a branch aware sBuild. Get the branch template.
109-
templateForThisBuild = webHookTemplateResolver.findWebHookBranchTemplate(state, sRunningBuild.getBuildType(), payloadFormat.getFormatShortName(), whcw.whc.getPayloadTemplate());
110-
} else {
111-
// Branch is null. TeamCity is not aware of branch support for this sBuild, so get the non-branch template.
112-
templateForThisBuild = webHookTemplateResolver.findWebHookTemplate(state, sRunningBuild.getBuildType(), payloadFormat.getFormatShortName(), whcw.whc.getPayloadTemplate());
113-
}
114107
whcw.wh.setContentType(payloadFormat.getContentType());
115108

116109
if (state.equals(BuildStateEnum.BUILD_STARTED)){
117-
whcw.wh.setPayload(payloadFormat.buildStarted(sRunningBuild, getPreviousNonPersonalBuild(sRunningBuild), mergeParameters(whcw.whc.getParams(),sRunningBuild), whcw.whc.getEnabledTemplates(), templateForThisBuild));
118110
whcw.wh.setEnabled(whcw.whc.isEnabledForBuildType(sRunningBuild.getBuildType()) && whcw.wh.getBuildStates().enabled(BuildStateEnum.BUILD_STARTED));
111+
if (whcw.wh.isEnabled()){
112+
templateForThisBuild = findTemplateForState(sRunningBuild, state, whcw.whc.getPayloadTemplate(), payloadFormat);
113+
whcw.wh.setPayload(payloadFormat.buildStarted(sRunningBuild, getPreviousNonPersonalBuild(sRunningBuild), mergeParameters(whcw.whc.getParams(),sRunningBuild), whcw.whc.getEnabledTemplates(), templateForThisBuild));
114+
}
119115
} else if (state.equals(BuildStateEnum.BUILD_INTERRUPTED)){
120-
whcw.wh.setPayload(payloadFormat.buildInterrupted(sRunningBuild, getPreviousNonPersonalBuild(sRunningBuild), mergeParameters(whcw.whc.getParams(),sRunningBuild), whcw.whc.getEnabledTemplates(), templateForThisBuild));
121116
whcw.wh.setEnabled(whcw.whc.isEnabledForBuildType(sRunningBuild.getBuildType()) && whcw.wh.getBuildStates().enabled(BuildStateEnum.BUILD_INTERRUPTED));
117+
if (whcw.wh.isEnabled()){
118+
templateForThisBuild = findTemplateForState(sRunningBuild, state, whcw.whc.getPayloadTemplate(), payloadFormat);
119+
whcw.wh.setPayload(payloadFormat.buildInterrupted(sRunningBuild, getPreviousNonPersonalBuild(sRunningBuild), mergeParameters(whcw.whc.getParams(),sRunningBuild), whcw.whc.getEnabledTemplates(), templateForThisBuild));
120+
}
122121
} else if (state.equals(BuildStateEnum.BEFORE_BUILD_FINISHED)){
123-
whcw.wh.setPayload(payloadFormat.beforeBuildFinish(sRunningBuild, getPreviousNonPersonalBuild(sRunningBuild), mergeParameters(whcw.whc.getParams(),sRunningBuild), whcw.whc.getEnabledTemplates(), templateForThisBuild));
124122
whcw.wh.setEnabled(whcw.whc.isEnabledForBuildType(sRunningBuild.getBuildType()) && whcw.wh.getBuildStates().enabled(BuildStateEnum.BEFORE_BUILD_FINISHED));
123+
if (whcw.wh.isEnabled()){
124+
templateForThisBuild = findTemplateForState(sRunningBuild, state, whcw.whc.getPayloadTemplate(), payloadFormat);
125+
whcw.wh.setPayload(payloadFormat.beforeBuildFinish(sRunningBuild, getPreviousNonPersonalBuild(sRunningBuild), mergeParameters(whcw.whc.getParams(),sRunningBuild), whcw.whc.getEnabledTemplates(), templateForThisBuild));
126+
}
125127
} else if (state.equals(BuildStateEnum.BUILD_FINISHED)){
126128
whcw.wh.setEnabled(whcw.whc.isEnabledForBuildType(sRunningBuild.getBuildType()) && whcw.wh.getBuildStates().enabled(
127129
BuildStateEnum.BUILD_FINISHED,
128130
sRunningBuild.getStatusDescriptor().isSuccessful(),
129131
this.hasBuildChangedHistoricalState(sRunningBuild)));
130-
whcw.wh.setPayload(payloadFormat.buildFinished(sRunningBuild, getPreviousNonPersonalBuild(sRunningBuild), mergeParameters(whcw.whc.getParams(),sRunningBuild), whcw.whc.getEnabledTemplates(), templateForThisBuild));;
132+
133+
if (whcw.wh.isEnabled()){
134+
templateForThisBuild = findTemplateForState(sRunningBuild, BuildState.getEffectiveState(state, sRunningBuild.getStatusDescriptor().isSuccessful(), this.hasBuildChangedHistoricalState(sRunningBuild)), whcw.whc.getPayloadTemplate(), payloadFormat);
135+
whcw.wh.setPayload(payloadFormat.buildFinished(sRunningBuild, getPreviousNonPersonalBuild(sRunningBuild), mergeParameters(whcw.whc.getParams(),sRunningBuild), whcw.whc.getEnabledTemplates(), templateForThisBuild));;
136+
}
131137
}
132138

133139
doPost(whcw.wh, whcw.whc.getPayloadFormat());
134140
Loggers.ACTIVITIES.debug("WebHookListener :: " + myManager.getFormat(whcw.whc.getPayloadFormat()).getFormatDescription());
135141
}
136142
}
137143

144+
private WebHookTemplateContent findTemplateForState(
145+
SRunningBuild sRunningBuild, BuildStateEnum state,
146+
String payloadtemplateName, WebHookPayload payloadFormat) {
147+
WebHookTemplateContent templateForThisBuild;
148+
if (sRunningBuild.getBranch() != null){
149+
// We have a branch aware sBuild. Get the branch template.
150+
templateForThisBuild = webHookTemplateResolver.findWebHookBranchTemplate(state, sRunningBuild.getBuildType(), payloadFormat.getFormatShortName(), payloadtemplateName);
151+
} else {
152+
// Branch is null. TeamCity is not aware of branch support for this sBuild, so get the non-branch template.
153+
templateForThisBuild = webHookTemplateResolver.findWebHookTemplate(state, sRunningBuild.getBuildType(), payloadFormat.getFormatShortName(), payloadtemplateName);
154+
}
155+
return templateForThisBuild;
156+
}
157+
138158
/**
139159
* Build a list of Enabled webhooks to pass to the POSTing logic.
140160
* @param projectId

‎tcwebhooks-core/src/main/java/webhook/teamcity/payload/WebHookTemplateManager.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,13 @@ public void register(){
4646
public void registerTemplateFormatFromSpring(WebHookTemplate payloadTemplate){
4747
synchronized (orderedTemplateCollection) {
4848
Loggers.SERVER.info(this.getClass().getSimpleName() + " :: Registering Spring template "
49-
+ payloadTemplate.getTemplateShortName()
49+
+ payloadTemplate.getTemplateDescription() + " (" + payloadTemplate.getTemplateShortName() + ")"
5050
+ " with rank of " + payloadTemplate.getRank());
5151
springTemplates.put(payloadTemplate.getTemplateShortName(),payloadTemplate);
5252
rebuildOrderedListOfTemplates();
5353
Loggers.SERVER.info(this.getClass().getSimpleName() + " :: Templates list is " + this.orderedTemplateCollection.size() + " items long. Templates are ranked in the following order..");
5454
for (WebHookTemplate pl : this.orderedTemplateCollection){
55-
Loggers.SERVER.info(this.getClass().getSimpleName() + " :: Template Name: " + pl.getTemplateShortName() + " Rank: " + pl.getRank());
55+
Loggers.SERVER.info(this.getClass().getSimpleName() + " :: Template Name: " + pl.getTemplateDescription() + " (" + pl.getTemplateShortName() + ")" + " Rank: " + pl.getRank());
5656
}
5757
}
5858
}

‎tcwebhooks-core/src/main/java/webhook/teamcity/payload/WebHookTemplateResolver.java

+48-2
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,31 @@ public WebHookTemplateContent findWebHookBranchTemplate(BuildStateEnum state, SP
5656
return null;
5757
}
5858

59+
public WebHookTemplateContent findWebHookBranchOrNonBranchTemplate(String stateString, SProject project, String webhookFormat, String templateName){
60+
// TODO: This needs to be more project aware.
61+
if (stateString.endsWith("Branch")) {
62+
String sBuildState = stateString.substring(0,stateString.length() - "Branch".length());
63+
BuildStateEnum state = BuildStateEnum.findBuildState(sBuildState);
64+
if (state != null){
65+
for (WebHookTemplate template : findWebHookTemplatesForProject(project)){
66+
if (template.supportsPayloadFormat(webhookFormat) && template.getTemplateShortName().equals(templateName)){
67+
return template.getBranchTemplateForState(state);
68+
}
69+
}
70+
}
71+
} else {
72+
BuildStateEnum state = BuildStateEnum.findBuildState(stateString);
73+
if (state != null){
74+
for (WebHookTemplate template : findWebHookTemplatesForProject(project)){
75+
if (template.supportsPayloadFormat(webhookFormat) && template.getTemplateShortName().equals(templateName)){
76+
return template.getTemplateForState(state);
77+
}
78+
}
79+
}
80+
}
81+
return null;
82+
}
83+
5984
public List<WebHookTemplate> findWebHookTemplatesForBuild(SBuildType buildTypeId){
6085
// TODO: This needs to be more build aware.
6186
return webHookTemplateManager.getRegisteredTemplates();
@@ -75,12 +100,33 @@ public boolean templateIsValid(SProject project, String webhookFormat, String te
75100
}
76101
return false;
77102
}
103+
104+
public boolean templateNonBranchSupportsFormatAndState(BuildStateEnum myBuildState,
105+
SProject project, String webhookFormat, String templateName){
106+
// TODO: This needs to be more project aware.
107+
for (WebHookTemplate template : findWebHookTemplatesForProject(project)){
108+
if (template.supportsPayloadFormat(webhookFormat) && template.getTemplateShortName().equals(templateName)){
109+
return template.getSupportedBuildStates().contains(myBuildState);
110+
}
111+
}
112+
return false;
113+
}
114+
public boolean templateForBranchSupportsFormatAndState(BuildStateEnum myBuildState,
115+
SProject project, String webhookFormat, String templateName){
116+
// TODO: This needs to be more project aware.
117+
for (WebHookTemplate template : findWebHookTemplatesForProject(project)){
118+
if (template.supportsPayloadFormat(webhookFormat) && template.getTemplateShortName().equals(templateName)){
119+
return template.getSupportedBranchBuildStates().contains(myBuildState);
120+
}
121+
}
122+
return false;
123+
}
78124

79125
public boolean templateSupportsFormatAndState(BuildStateEnum myBuildState,
80126
SProject project, String webhookFormat, String templateName) {
81127
return (
82-
findWebHookTemplate(myBuildState, project, webhookFormat, templateName) != null
83-
&& findWebHookBranchTemplate(myBuildState, project, webhookFormat, templateName) != null);
128+
templateNonBranchSupportsFormatAndState(myBuildState, project, webhookFormat, templateName)
129+
&& templateForBranchSupportsFormatAndState(myBuildState, project, webhookFormat, templateName));
84130
}
85131

86132
}

‎tcwebhooks-core/src/main/java/webhook/teamcity/payload/template/LegacyDeprecatedFormatWebHookTemplate.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
public class LegacyDeprecatedFormatWebHookTemplate extends AbstractWebHookTemplate implements WebHookTemplate {
1212

1313
Set<BuildStateEnum> states = new HashSet<BuildStateEnum>();
14-
Set<BuildStateEnum> branchStates = new HashSet<BuildStateEnum>();
1514

1615
public LegacyDeprecatedFormatWebHookTemplate(WebHookTemplateManager manager) {
1716
super();
@@ -23,7 +22,7 @@ public LegacyDeprecatedFormatWebHookTemplate(WebHookTemplateManager manager) {
2322

2423
@Override
2524
public String getTemplateDescription() {
26-
return "Legacy (deprecated) Webhook";
25+
return "Legacy Webhook";
2726
}
2827

2928
@Override
@@ -41,6 +40,7 @@ public boolean supportsPayloadFormat(String payloadFormat) {
4140
return payloadFormat.equalsIgnoreCase("JSON") ||
4241
payloadFormat.equalsIgnoreCase("nvpairs") ||
4342
payloadFormat.equalsIgnoreCase("xml") ||
43+
payloadFormat.equalsIgnoreCase("tailoredjson") ||
4444
payloadFormat.equalsIgnoreCase("none");
4545
}
4646

@@ -61,7 +61,7 @@ public Set<BuildStateEnum> getSupportedBuildStates() {
6161

6262
@Override
6363
public Set<BuildStateEnum> getSupportedBranchBuildStates() {
64-
return branchStates;
64+
return states;
6565
}
6666

6767
@Override

‎tcwebhooks-core/src/main/java/webhook/teamcity/payload/template/WebHookTemplateFromXml.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ public void setTemplateShortName(String shortName){
9696

9797
@Override
9898
public boolean supportsPayloadFormat(String payloadFormat) {
99-
return supportedFormats.contains(payloadFormat.toLowerCase());
99+
return supportedFormats.contains(payloadFormat);
100100
}
101101

102102
@Override
@@ -203,7 +203,7 @@ public static WebHookTemplate build(
203203

204204
for (webhook.teamcity.settings.entity.WebHookTemplate.WebHookTemplateFormat format : entityTemplate.getFormats()){
205205
if (format.isEnabled() && payloadManager.isRegisteredFormat(format.getName())){
206-
template.supportedFormats.add(format.getName().toLowerCase());
206+
template.supportedFormats.add(format.getName());
207207
}
208208
}
209209
return template;

‎tcwebhooks-core/src/main/java/webhook/teamcity/settings/WebHookConfig.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ public Element getAsElement(){
194194
el.setAttribute("url", this.getUrl());
195195
el.setAttribute("enabled", String.valueOf(this.enabled));
196196
el.setAttribute("format", String.valueOf(this.payloadFormat).toLowerCase());
197-
el.setAttribute("template", String.valueOf(this.payloadTemplate).toLowerCase());
197+
el.setAttribute("template", String.valueOf(this.payloadTemplate));
198198

199199
Element statesEl = new Element("states");
200200
for (BuildStateEnum state : states.getStateSet()){
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1-
template.default={ "text": "All your build failures are belong to us", "attachments": [ { "fallback": "${buildName} <${buildStatusUrl}|build #${buildNumber}> triggered by ${triggeredBy} has a status of ${buildResult}", "text": "${buildName} <${buildStatusUrl}|build #${buildNumber}> triggered by ${triggeredBy} has a status of ${buildResult}", "color": "danger" }]}
1+
template.buildFailed={ "text": "All your build failures are belong to us", "attachments": [ { "fallback": "${buildName} <${buildStatusUrl}|build #${buildNumber}> triggered by ${triggeredBy} has a status of ${buildResult}", "text": "${buildName} <${buildStatusUrl}|build #${buildNumber}> triggered by ${triggeredBy} has a status of ${buildResult}", "color": "danger" }]}
2+
template.buildFailed.branch={ "text": "All your build failures are belong to us", "attachments": [ { "fallback": "${buildName} <${buildStatusUrl}|build #${buildNumber}> branch: ${branchName} triggered by ${triggeredBy} has a status of ${buildResult}", "text": "${buildName} <${buildStatusUrl}|build #${buildNumber}> branch: ${branchName} triggered by ${triggeredBy} has a status of ${buildResult}", "color": "danger" }]}
23
template.buildSuccessful={ "text": "All your build successes should to be celebrated", "attachments": [ { "fallback": "${buildName} <${buildStatusUrl}|build #${buildNumber}> triggered by ${triggeredBy} has a status of ${buildResult}", "text": "${buildName} <${buildStatusUrl}|build #${buildNumber}> triggered by ${triggeredBy} has a status of ${buildResult}", "color": "good" } ] }
3-
template.buildSuccessful.branch={ "text": "All your build successes should to be celebrated", "attachments": [ { "fallback": "${buildName} <${buildStatusUrl}|build #${buildNumber}> triggered by ${triggeredBy} has a status of ${buildResult}", "text": "${buildName} <${buildStatusUrl}|build #${buildNumber}> triggered by ${triggeredBy} has a status of ${buildResult}", "color": "good" } ] }
4+
template.buildSuccessful.branch={ "text": "All your build successes should to be celebrated", "attachments": [ { "fallback": "${buildName} <${buildStatusUrl}|build #${buildNumber}> branch: ${branchName} triggered by ${triggeredBy} has a status of ${buildResult}", "text": "${buildName} <${buildStatusUrl}|build #${buildNumber}> branch: ${branchName} triggered by ${triggeredBy} has a status of ${buildResult}", "color": "good" } ] }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package webhook.teamcity.payload.template;
2+
3+
import static org.junit.Assert.*;
4+
import static org.mockito.Mockito.*;
5+
import jetbrains.buildServer.serverSide.SBuildServer;
6+
import jetbrains.buildServer.serverSide.SBuildType;
7+
import jetbrains.buildServer.serverSide.SProject;
8+
import jetbrains.buildServer.serverSide.ServerPaths;
9+
10+
import org.junit.Before;
11+
import org.junit.Test;
12+
13+
import webhook.teamcity.BuildStateEnum;
14+
import webhook.teamcity.MockSBuildType;
15+
import webhook.teamcity.MockSProject;
16+
import webhook.teamcity.payload.WebHookPayloadManager;
17+
import webhook.teamcity.payload.WebHookTemplateManager;
18+
import webhook.teamcity.payload.WebHookTemplateResolver;
19+
20+
public class WebHookTemplateResolverAndLegacyTemplateTest {
21+
22+
@Before
23+
public void setUp() throws Exception {
24+
}
25+
26+
@Test
27+
public void testTemplateSupportsFormatAndState() {
28+
29+
SBuildServer server = mock(SBuildServer.class);
30+
SBuildType build = new MockSBuildType("test", "something else", "build01");
31+
SProject project = new MockSProject("test", "something", "project01", "MyProject", build);
32+
WebHookPayloadManager payloadManager = new WebHookPayloadManager(server);
33+
ServerPaths serverPaths = mock(ServerPaths.class);
34+
WebHookTemplateManager templateManager = new WebHookTemplateManager(serverPaths , payloadManager);
35+
WebHookTemplateResolver resolver = new WebHookTemplateResolver(server, templateManager);
36+
37+
LegacyDeprecatedFormatWebHookTemplate template = new LegacyDeprecatedFormatWebHookTemplate(templateManager);
38+
template.register();
39+
assertTrue(resolver.templateSupportsFormatAndState(BuildStateEnum.BUILD_STARTED, project, "json", "none"));
40+
assertTrue(resolver.templateSupportsFormatAndState(BuildStateEnum.BUILD_INTERRUPTED, project, "json", "none"));
41+
assertTrue(resolver.templateSupportsFormatAndState(BuildStateEnum.BEFORE_BUILD_FINISHED, project, "json", "none"));
42+
assertTrue(resolver.templateSupportsFormatAndState(BuildStateEnum.BUILD_BROKEN, project, "json", "none"));
43+
assertTrue(resolver.templateSupportsFormatAndState(BuildStateEnum.BUILD_FIXED, project, "json", "none"));
44+
assertTrue(resolver.templateSupportsFormatAndState(BuildStateEnum.BUILD_FAILED, project, "json", "none"));
45+
assertTrue(resolver.templateSupportsFormatAndState(BuildStateEnum.BUILD_SUCCESSFUL, project, "json", "none"));
46+
47+
}
48+
49+
}

‎tcwebhooks-web-ui/src/main/java/webhook/teamcity/extension/WebHookAjaxEditPageController.java

+13-32
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import webhook.teamcity.extension.bean.WebhookBuildTypeEnabledStatusBean;
3333
import webhook.teamcity.extension.bean.WebhookConfigAndBuildTypeListHolder;
3434
import webhook.teamcity.extension.bean.template.RegisteredWebHookTemplateBean;
35+
import webhook.teamcity.extension.util.EnabledBuildStateResolver;
3536
import webhook.teamcity.payload.WebHookPayloadManager;
3637
import webhook.teamcity.payload.WebHookTemplateManager;
3738
import webhook.teamcity.payload.WebHookTemplateResolver;
@@ -72,27 +73,6 @@ public void register(){
7273
myWebManager.registerController("/webhooks/ajaxEdit.html", this);
7374
}
7475

75-
protected static void checkAndAddBuildState(WebHookTemplateResolver templateResolver, SProject project, HttpServletRequest r, BuildState state, BuildStateEnum myBuildState, String varName){
76-
if ((r.getParameter(varName) != null)
77-
&& (r.getParameter(varName).equalsIgnoreCase("on"))
78-
&& (templateResolver.templateSupportsFormatAndState(myBuildState, project, r.getParameter("payloadFormat"), r.getParameter("payloadTemplate")))){
79-
state.enable(myBuildState);
80-
} else {
81-
state.disable(myBuildState);;
82-
}
83-
}
84-
85-
protected static void checkAndAddBuildStateIfEitherSet(HttpServletRequest r, BuildState state, BuildStateEnum myBuildState, String varName, String otherVarName){
86-
if ((r.getParameter(varName) != null)
87-
&& (r.getParameter(varName).equalsIgnoreCase("on"))){
88-
state.enable(myBuildState);
89-
} else if ((r.getParameter(otherVarName) != null)
90-
&& (r.getParameter(otherVarName).equalsIgnoreCase("on"))){
91-
state.enable(myBuildState);
92-
} else {
93-
state.disable(myBuildState);;
94-
}
95-
}
9676

9777
@Nullable
9878
protected ModelAndView doHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {
@@ -146,16 +126,17 @@ protected ModelAndView doHandle(HttpServletRequest request, HttpServletResponse
146126
enabled = true;
147127
}
148128
BuildState states = new BuildState();
129+
EnabledBuildStateResolver buildStateResolver = new EnabledBuildStateResolver(myTemplateResolver, myProject);
149130

150-
checkAndAddBuildState(myTemplateResolver, myProject, request, states, BuildStateEnum.BUILD_SUCCESSFUL, BUILD_SUCCESSFUL);
151-
checkAndAddBuildState(myTemplateResolver, myProject, request, states, BuildStateEnum.BUILD_FAILED, BUILD_FAILED);
152-
checkAndAddBuildState(myTemplateResolver, myProject, request, states, BuildStateEnum.BUILD_FIXED, BUILD_FIXED);
153-
checkAndAddBuildState(myTemplateResolver, myProject, request, states, BuildStateEnum.BUILD_BROKEN, BUILD_BROKEN);
154-
checkAndAddBuildState(myTemplateResolver, myProject, request, states, BuildStateEnum.BUILD_STARTED, BUILD_STARTED);
155-
checkAndAddBuildState(myTemplateResolver, myProject, request, states, BuildStateEnum.BUILD_INTERRUPTED, BUILD_INTERRUPTED);
156-
checkAndAddBuildState(myTemplateResolver, myProject, request, states, BuildStateEnum.BEFORE_BUILD_FINISHED, BEFORE_FINISHED);
157-
checkAndAddBuildStateIfEitherSet(request, states, BuildStateEnum.BUILD_FINISHED, BUILD_SUCCESSFUL,BUILD_FAILED);
158-
checkAndAddBuildState(myTemplateResolver, myProject, request, states, BuildStateEnum.RESPONSIBILITY_CHANGED, "ResponsibilityChanged");
131+
buildStateResolver.checkAndAddBuildState(request, states, BuildStateEnum.BUILD_SUCCESSFUL, BUILD_SUCCESSFUL);
132+
buildStateResolver.checkAndAddBuildState(request, states, BuildStateEnum.BUILD_FAILED, BUILD_FAILED);
133+
buildStateResolver.checkAndAddBuildState(request, states, BuildStateEnum.BUILD_FIXED, BUILD_FIXED);
134+
buildStateResolver.checkAndAddBuildState(request, states, BuildStateEnum.BUILD_BROKEN, BUILD_BROKEN);
135+
buildStateResolver.checkAndAddBuildState(request, states, BuildStateEnum.BUILD_STARTED, BUILD_STARTED);
136+
buildStateResolver.checkAndAddBuildState(request, states, BuildStateEnum.BUILD_INTERRUPTED, BUILD_INTERRUPTED);
137+
buildStateResolver.checkAndAddBuildState(request, states, BuildStateEnum.BEFORE_BUILD_FINISHED, BEFORE_FINISHED);
138+
buildStateResolver.checkAndAddBuildStateIfEitherSet(request, states, BuildStateEnum.BUILD_FINISHED, BUILD_SUCCESSFUL,BUILD_FAILED);
139+
buildStateResolver.checkAndAddBuildState(request, states, BuildStateEnum.RESPONSIBILITY_CHANGED, "ResponsibilityChanged");
159140

160141
if ((request.getParameter("buildTypeSubProjects") != null ) && (request.getParameter("buildTypeSubProjects").equalsIgnoreCase("on"))){
161142
buildTypeSubProjects = true;
@@ -259,8 +240,8 @@ protected ModelAndView doHandle(HttpServletRequest request, HttpServletResponse
259240
} else {
260241
params.put("haveProject", "false");
261242
}
262-
} else {
263-
params.put("haveProject", "false");
243+
// } else {
244+
// params.put("haveProject", "false");
264245
}
265246

266247
return new ModelAndView(myPluginPath + "WebHook/ajaxEdit.jsp", params);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package webhook.teamcity.extension;
2+
3+
import java.util.HashMap;
4+
5+
import javax.servlet.http.HttpServletRequest;
6+
import javax.servlet.http.HttpServletResponse;
7+
8+
import org.springframework.web.servlet.ModelAndView;
9+
10+
import webhook.teamcity.BuildStateEnum;
11+
import webhook.teamcity.extension.bean.template.TemplateRenderingBean;
12+
import webhook.teamcity.extension.bean.template.TemplateRenderingBeanJsonSerialiser;
13+
import webhook.teamcity.payload.WebHookPayloadManager;
14+
import webhook.teamcity.payload.WebHookTemplateContent;
15+
import webhook.teamcity.payload.WebHookTemplateResolver;
16+
import webhook.teamcity.payload.content.WebHookPayloadContent;
17+
import webhook.teamcity.payload.template.render.WebHookStringRenderer;
18+
import webhook.teamcity.settings.WebHookProjectSettings;
19+
import jetbrains.buildServer.controllers.BaseController;
20+
import jetbrains.buildServer.serverSide.SBuild;
21+
import jetbrains.buildServer.serverSide.SBuildServer;
22+
import jetbrains.buildServer.serverSide.SProject;
23+
import jetbrains.buildServer.serverSide.settings.ProjectSettingsManager;
24+
import jetbrains.buildServer.web.openapi.PluginDescriptor;
25+
import jetbrains.buildServer.web.openapi.WebControllerManager;
26+
27+
public class WebHookTemplateRenderingController extends BaseController {
28+
29+
30+
private final WebControllerManager myWebManager;
31+
private SBuildServer myServer;
32+
private ProjectSettingsManager mySettings;
33+
private final String myPluginPath;
34+
private final WebHookPayloadManager myPayloadManager;
35+
private final WebHookTemplateResolver myTemplateResolver;
36+
37+
public WebHookTemplateRenderingController(SBuildServer server, WebControllerManager webManager,
38+
ProjectSettingsManager settings, WebHookProjectSettings whSettings, WebHookPayloadManager payloadManager,
39+
WebHookTemplateResolver templateResolver, PluginDescriptor pluginDescriptor) {
40+
super(server);
41+
myWebManager = webManager;
42+
myServer = server;
43+
mySettings = settings;
44+
myPluginPath = pluginDescriptor.getPluginResourcesPath();
45+
myPayloadManager = payloadManager;
46+
myTemplateResolver = templateResolver;
47+
}
48+
49+
public void register(){
50+
myWebManager.registerController("/webhooks/renderTemplate.html", this);
51+
}
52+
53+
@Override
54+
protected ModelAndView doHandle(HttpServletRequest request,
55+
HttpServletResponse response) throws Exception {
56+
57+
if ( request.getParameter("buildState") != null
58+
&& request.getParameter("payloadTemplate") != null
59+
&& request.getParameter("payloadFormat") != null
60+
&& request.getParameter("projectId") != null){
61+
62+
SProject myproject = this.myServer.getProjectManager().findProjectByExternalId(request.getParameter("projectId"));
63+
String buildState = request.getParameter("buildState");
64+
String payloadFormat = request.getParameter("payloadFormat");
65+
String payloadTemplate = request.getParameter("payloadTemplate");
66+
67+
WebHookTemplateContent content = myTemplateResolver.findWebHookBranchOrNonBranchTemplate(buildState, myproject, payloadFormat, payloadTemplate);
68+
69+
WebHookStringRenderer renderer = myPayloadManager.getFormat(payloadFormat).getWebHookStringRenderer();
70+
HashMap<String,Object> params = new HashMap<String,Object>();
71+
params.put("templateRendering", TemplateRenderingBeanJsonSerialiser.serialise(
72+
TemplateRenderingBean.build(
73+
myproject.getExternalId(),
74+
buildState.replace("Branch", ""),
75+
payloadFormat,
76+
renderer.render(content.getTemplateText()),
77+
renderer.render(content.getTemplateText()) // TODO: need to resolve actual build info here
78+
)
79+
)
80+
);
81+
return new ModelAndView(myPluginPath + "WebHook/templateRendering.jsp", params);
82+
83+
84+
}
85+
return null;
86+
}
87+
88+
}

‎tcwebhooks-web-ui/src/main/java/webhook/teamcity/extension/bean/WebhookConfigAndBuildTypeListHolder.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public WebhookConfigAndBuildTypeListHolder(WebHookConfig config, Collection<WebH
4747
}
4848

4949
for (WebHookPayload payload : registeredPayloads){
50-
if (payload.getFormatShortName().equals(payloadFormat)){
50+
if (payload.getFormatShortName().equalsIgnoreCase(payloadFormat)){
5151
if (t != null){
5252
this.payloadFormatForWeb = t.getTemplateDescription() + " (" + payload.getFormatDescription() + ")";
5353
} else {

‎tcwebhooks-web-ui/src/main/java/webhook/teamcity/extension/bean/template/RegisteredWebHookTemplateBean.java

+9-9
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ public Map<String, SimpleTemplate> getTemplateMap() {
3737

3838
public static class SimpleTemplate{
3939
private String description;
40-
private String shortName;
41-
private String formatName;
40+
private String templateShortName;
41+
private String formatShortName;
4242
private String templateFormatCombinationKey;
4343
private List<String> supportedStates = new ArrayList<String>();
4444
private List<String> supportedBranchStates = new ArrayList<String>();
@@ -47,9 +47,9 @@ public static SimpleTemplate build(WebHookTemplate webHookTemplate, WebHookPaylo
4747
SimpleTemplate temp = new SimpleTemplate();
4848

4949
temp.description = webHookTemplate.getTemplateDescription() + " (" + format.getFormatDescription() + ")";
50-
temp.shortName = webHookTemplate.getTemplateShortName();
51-
temp.formatName = format.getFormatShortName();
52-
temp.templateFormatCombinationKey = webHookTemplate.getTemplateShortName() + "_" + format.getFormatShortName();
50+
temp.templateShortName = webHookTemplate.getTemplateShortName();
51+
temp.formatShortName = format.getFormatShortName().toLowerCase();
52+
temp.templateFormatCombinationKey = webHookTemplate.getTemplateShortName() + "_" + format.getFormatShortName().toLowerCase();
5353
for (BuildStateEnum s : webHookTemplate.getSupportedBuildStates()){
5454
temp.supportedStates.add(s.getShortName());
5555
}
@@ -59,16 +59,16 @@ public static SimpleTemplate build(WebHookTemplate webHookTemplate, WebHookPaylo
5959
return temp;
6060
}
6161

62-
public String getShortName() {
63-
return shortName;
62+
public String getTemplateShortName() {
63+
return templateShortName;
6464
}
6565

6666
public String getDescription() {
6767
return description;
6868
}
6969

70-
public String getFormatName() {
71-
return formatName;
70+
public String getFormatShortName() {
71+
return formatShortName;
7272
}
7373

7474
public List<String> getSupportedStates() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package webhook.teamcity.extension.bean.template;
2+
3+
public class TemplateRenderingBean {
4+
5+
String projectId;
6+
String webhookTemplateName;
7+
String webhookPayloadName;
8+
9+
String webhookTemplate;
10+
String webhookTemplateRendered;
11+
12+
13+
public static TemplateRenderingBean build(String projectId, String template, String payload, String templateSource, String templateRendered){
14+
TemplateRenderingBean t = new TemplateRenderingBean();
15+
t.projectId = projectId;
16+
t.webhookTemplateName = template;
17+
t.webhookPayloadName = payload;
18+
t.webhookTemplate = templateSource;
19+
t.webhookTemplateRendered = templateRendered;
20+
return t;
21+
}
22+
23+
public String getProjectId() {
24+
return projectId;
25+
}
26+
27+
public String getWebhookTemplateName() {
28+
return webhookTemplateName;
29+
}
30+
31+
public String getWebhookPayloadName() {
32+
return webhookPayloadName;
33+
}
34+
35+
public String getWebhookTemplate() {
36+
return webhookTemplate;
37+
}
38+
39+
public String getWebhookTemplateRendered() {
40+
return webhookTemplateRendered;
41+
}
42+
43+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package webhook.teamcity.extension.bean.template;
2+
3+
import webhook.teamcity.payload.convertor.ExtraParametersMapToJsonConvertor;
4+
5+
import com.thoughtworks.xstream.XStream;
6+
import com.thoughtworks.xstream.io.json.JsonHierarchicalStreamDriver;
7+
8+
public class TemplateRenderingBeanJsonSerialiser {
9+
10+
public static String serialise(TemplateRenderingBean templateRendering){
11+
XStream xstream = new XStream(new JsonHierarchicalStreamDriver());
12+
xstream.setMode(XStream.NO_REFERENCES);
13+
xstream.registerConverter(new ExtraParametersMapToJsonConvertor());
14+
xstream.alias("templatesOutput", TemplateRenderingBean.class);
15+
/* For some reason, the items are coming back as "@name" and "@value"
16+
* so strip those out with a regex.
17+
*/
18+
return xstream.toXML(templateRendering);
19+
}
20+
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package webhook.teamcity.extension.util;
2+
3+
import javax.servlet.http.HttpServletRequest;
4+
5+
import jetbrains.buildServer.serverSide.SProject;
6+
import webhook.teamcity.BuildState;
7+
import webhook.teamcity.BuildStateEnum;
8+
import webhook.teamcity.payload.WebHookTemplateResolver;
9+
10+
public class EnabledBuildStateResolver {
11+
12+
private WebHookTemplateResolver templateResolver;
13+
private SProject project;
14+
15+
public EnabledBuildStateResolver(WebHookTemplateResolver templateResolver, SProject project) {
16+
this.templateResolver = templateResolver;
17+
this.project = project;
18+
}
19+
20+
public void checkAndAddBuildState(HttpServletRequest r, BuildState state, BuildStateEnum myBuildState, String varName){
21+
if ((r.getParameter(varName) != null)
22+
&& (r.getParameter(varName).equalsIgnoreCase("on"))
23+
&& (templateResolver.templateSupportsFormatAndState(myBuildState, project, r.getParameter("payloadFormat"), r.getParameter("payloadTemplate")))){
24+
state.enable(myBuildState);
25+
} else {
26+
state.disable(myBuildState);;
27+
}
28+
}
29+
30+
public void checkAndAddBuildStateIfEitherSet(HttpServletRequest r, BuildState state, BuildStateEnum myBuildState, String varName, String otherVarName){
31+
if ((r.getParameter(varName) != null)
32+
&& (r.getParameter(varName).equalsIgnoreCase("on"))){
33+
state.enable(myBuildState);
34+
} else if ((r.getParameter(otherVarName) != null)
35+
&& (r.getParameter(otherVarName).equalsIgnoreCase("on"))){
36+
state.enable(myBuildState);
37+
} else {
38+
state.disable(myBuildState);;
39+
}
40+
}
41+
42+
43+
}

‎tcwebhooks-web-ui/src/main/resources/META-INF/build-server-plugin-WebHookListener.xml

+5
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@
3737
class="webhook.teamcity.extension.WebHookAjaxEditPageController"
3838
init-method="register"
3939
/>
40+
41+
<bean id="webHookTemplateRenderingController"
42+
class="webhook.teamcity.extension.WebHookTemplateRenderingController"
43+
init-method="register"
44+
/>
4045

4146
<bean id="webHookFactory"
4247
class="webhook.teamcity.WebHookFactoryImpl"

‎tcwebhooks-web-ui/src/main/resources/buildServerResources/WebHook/css/styles.css

+12
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,18 @@ label {
2424
display:none;
2525
}
2626

27+
#currentTemplateRaw, #currentTemplateRendered {
28+
margin: 0.5em 0em 0.5em 0em;
29+
width:auto;
30+
height:15em;
31+
border: solid 1px;
32+
border-color: #999;
33+
white-space: pre-wrap;
34+
word-wrap: break-word;
35+
overflow: scroll;
36+
37+
}
38+
2739
.etabs { margin: 0; padding: 0 0 0 1em; }
2840
.tab { display: inline-block; zoom:1; *display:inline; background: #eee; border: solid 1px #999; border-bottom: none; -moz-border-radius: 4px 4px 0 0; -webkit-border-radius: 4px 4px 0 0; }
2941
.tab a { font-size: 14px; line-height: 2em; display: block; padding: 0 10px; outline: none; }

‎tcwebhooks-web-ui/src/main/resources/buildServerResources/WebHook/index.jsp

+25-3
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,13 @@
6969
{
7070
jQueryWebhook("td." + state.id).removeClass('buildStateDisabled');
7171
jQueryWebhook("input#" + state.id).removeAttr('disabled');
72+
jQueryWebhook("#currentTemplateBuildEvent option[value=" + state.id + "]").removeAttr('disabled');
73+
jQueryWebhook("#currentTemplateBuildEvent option[value=" + state.id + "Branch]").removeAttr('disabled');
7274
} else {
7375
jQueryWebhook("td." + state.id).addClass('buildStateDisabled');
7476
jQueryWebhook("input#" + state.id).attr('disabled', 'disabled');
77+
jQueryWebhook("#currentTemplateBuildEvent option[value=" + state.id + "]").attr('disabled', 'disabled');
78+
jQueryWebhook("#currentTemplateBuildEvent option[value=" + state.id + "Branch]").attr('disabled', 'disabled');
7579
}
7680
//console.log(state);
7781
//console.log(state.id);
@@ -87,6 +91,23 @@
8791
}
8892
});
8993
});
94+
95+
96+
jQueryWebhook('#currentTemplateBuildEvent').change(function() {
97+
var selectedBuildState = jQueryWebhook(this).val();
98+
jQueryWebhook.getJSON( "renderTemplate.html", {
99+
projectId: "${projectExternalId}",
100+
buildState: selectedBuildState,
101+
payloadTemplate: lookupTemplate(jQueryWebhook('#payloadFormatHolder').val()),
102+
payloadFormat: lookupFormat(jQueryWebhook('#payloadFormatHolder').val())
103+
})
104+
.done(function(data){
105+
console.log(data);
106+
console.log(data.templatesOutput);
107+
jQueryWebhook('#currentTemplateRaw').html(data.templatesOutput.webhookTemplate);
108+
jQueryWebhook('#currentTemplateRendered').html(data.templatesOutput.webhookTemplateRendered);
109+
});
110+
});
90111
});
91112
92113
function selectBuildState(){
@@ -166,7 +187,7 @@
166187
jQueryWebhook.each(ProjectBuilds.templatesAndWebhooks.registeredTemplates.templateList, function(thing, config){
167188
if (templateFormatCombinationKey === config[0]){
168189
var template = config[1];
169-
name = template.shortName;
190+
name = template.templateShortName;
170191
return false;
171192
}
172193
});
@@ -178,7 +199,7 @@
178199
jQueryWebhook.each(ProjectBuilds.templatesAndWebhooks.registeredTemplates.templateList, function(thing, config){
179200
if (templateFormatCombinationKey === config[0]){
180201
var template = config[1];
181-
name = template.formatName;
202+
name = template.formatShortName;
182203
return false;
183204
}
184205
});
@@ -240,7 +261,8 @@
240261
}
241262
242263
this.showCentered();
243-
jQueryWebhook('#buildPane').innerHeight(jQueryWebhook('#hookPane').innerHeight());
264+
jQueryWebhook('#hookPane').innerHeight(jQueryWebhook('#templatePane').innerHeight());
265+
jQueryWebhook('#buildPane').innerHeight(jQueryWebhook('#templatePane').innerHeight());
244266
jQueryWebhook('#tab-container').easytabs('select', tab);
245267
246268
$('webHookUrl').focus();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<%@ page contentType="application/json;charset=UTF-8" language="java" session="true" errorPage="/runtimeError.jsp"
2+
%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"
3+
%><%@ taglib prefix="bs" tagdir="/WEB-INF/tags" %>
4+
${templateRendering}
5+

‎tcwebhooks-web-ui/src/main/resources/buildServerResources/WebHook/webHookInclude.jsp

+34-1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
<ul class='etabs'>
6868
<li class='tab'><a href="#hookPane" class="active">WebHook Config</a></li>
6969
<li class='tab'><a href="#buildPane">Builds (<span id="selectedBuildCount">all</span>)</a></li>
70+
<li class='tab'><a href="#templatePane">Payload Content</a></li>
7071
</ul>
7172
<div class='panel-container'>
7273
<div id='hookPane'>
@@ -159,7 +160,39 @@
159160
<p style="border-bottom:solid 1px #cccccc; margin:0; padding:0.5em;"><label><input id="buildTypeSubProjects" name="buildTypeSubProjects" onclick="updateSelectedBuildTypes();" type=checkbox style="padding-right: 1em;" class="buildType_subprojects"><strong>All Sub-Project Builds</strong></label></p>
160161
<div id='buildList' style="overflow:auto; padding:0;">
161162
</div>
162-
</div>
163+
</div><!--buildPane -->
164+
<div id='templatePane'>
165+
<div id='templateLeftPanel'>
166+
<div id="currentTemplateName"></div>
167+
<div>
168+
Build Event: <select name="currentTemplateBuildEvent" id="currentTemplateBuildEvent">
169+
<option value="buildStarted">Build Started</option>
170+
<option value="buildStartedBranch">Build Started - Branch</option>
171+
<option value="buildInterrupted">Build Interrupted</option>
172+
<option value="buildInterruptedBranch">Build Interrupted - Branch</option>
173+
<option value="beforeBuildFinish">Build Almost Completed</option>
174+
<option value="beforeBuildFinishBranch">Build Almost Completed - Branch</option>
175+
<option value="responsibilityChanged">Build Responsibility Changed</option>
176+
<option value="responsibilityChangedBranch">Build Responsibility Changed - Branch</option>
177+
<option value="buildSuccessful">Build Successful</option>
178+
<option value="buildSuccessfulBranch">Build Successful - Branch</option>
179+
<option value="buildFixed"> - Build changes from Failure to Success</option>
180+
<option value="buildFixedBranch"> - Build changes from Failure to Success - Branch</option>
181+
<option value="buildFailed">Build Failed</option>
182+
<option value="buildFailedBranch">Build Failed - Branch</option>
183+
<option value="buildBroken"> - Build changes from Success to Failure</option>
184+
<option value="buildBrokenBranch"> - Build changes from Success to Failure - Branch</option>
185+
</select>
186+
<!--label><checkbox id="currentTemplateCustomise" disabled>&nbsp;Customise Template</label-->
187+
</div>
188+
<div id="currentTemplateRaw"></div>
189+
<div id="currentTemplateRendered"></div>
190+
191+
192+
</div>
193+
194+
195+
</div><!--templatePane -->
163196
</div><!-- panel-container -->
164197
</div> <!-- tab-container -->
165198

‎tcwebhooks-web-ui/src/test/java/webhook/teamcity/extension/WebHookAjaxEditPageControllerTest.java

+19-19
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
import static org.mockito.Mockito.when;
77
import static webhook.teamcity.extension.WebHookAjaxEditPageController.BUILD_FAILED;
88
import static webhook.teamcity.extension.WebHookAjaxEditPageController.BUILD_SUCCESSFUL;
9-
import static webhook.teamcity.extension.WebHookAjaxEditPageController.checkAndAddBuildState;
10-
import static webhook.teamcity.extension.WebHookAjaxEditPageController.checkAndAddBuildStateIfEitherSet;
119

1210
import javax.servlet.http.HttpServletRequest;
1311

@@ -18,7 +16,7 @@
1816

1917
import webhook.teamcity.BuildState;
2018
import webhook.teamcity.BuildStateEnum;
21-
import webhook.teamcity.MockSProject;
19+
import webhook.teamcity.extension.util.EnabledBuildStateResolver;
2220
import webhook.teamcity.payload.WebHookTemplateResolver;
2321

2422
public class WebHookAjaxEditPageControllerTest {
@@ -33,6 +31,7 @@ public class WebHookAjaxEditPageControllerTest {
3331
BuildState states;
3432
WebHookTemplateResolver templateResolver;
3533
SProject project;
34+
private EnabledBuildStateResolver resolver;
3635

3736
@Before
3837
public void setup(){
@@ -65,6 +64,7 @@ public void setup(){
6564
when(templateResolver.templateSupportsFormatAndState(state, project, paramFormat, paramTemplate)).thenReturn(true);
6665
}
6766

67+
resolver = new EnabledBuildStateResolver(templateResolver, project);
6868
}
6969

7070
@Test
@@ -77,16 +77,16 @@ public void setup(){
7777
*/
7878
public void testCheckAndAddBuildState() {
7979
assertFalse(states.enabled(BuildStateEnum.BUILD_SUCCESSFUL));
80-
checkAndAddBuildState(templateResolver, project, requestSuccessOnAndFailureOff, states, BuildStateEnum.BUILD_SUCCESSFUL, BUILD_SUCCESSFUL);
80+
resolver.checkAndAddBuildState(requestSuccessOnAndFailureOff, states, BuildStateEnum.BUILD_SUCCESSFUL, BUILD_SUCCESSFUL);
8181
assertTrue(states.enabled(BuildStateEnum.BUILD_SUCCESSFUL));
8282

8383

8484
assertFalse(states.enabled(BuildStateEnum.BUILD_FINISHED));
85-
checkAndAddBuildState(templateResolver, project, requestSuccessOnAndFailureOff, states, BuildStateEnum.BUILD_FINISHED, BUILD_SUCCESSFUL);
85+
resolver.checkAndAddBuildState(requestSuccessOnAndFailureOff, states, BuildStateEnum.BUILD_FINISHED, BUILD_SUCCESSFUL);
8686
assertTrue(states.enabled(BuildStateEnum.BUILD_FINISHED));
8787

8888
assertFalse(states.enabled(BuildStateEnum.BUILD_FAILED));
89-
checkAndAddBuildState(templateResolver, project, requestSuccessOnAndFailureOff, states, BuildStateEnum.BUILD_FINISHED, BUILD_FAILED);
89+
resolver.checkAndAddBuildState(requestSuccessOnAndFailureOff, states, BuildStateEnum.BUILD_FINISHED, BUILD_FAILED);
9090
assertFalse(states.enabled(BuildStateEnum.BUILD_FAILED));
9191

9292
assertFalse(states.enabled(BuildStateEnum.BUILD_FINISHED));
@@ -98,71 +98,71 @@ public void testCheckAndAddBuildState() {
9898
public void testCheckAndAddBuildStateIfEitherSet01() {
9999

100100
assertFalse(states.enabled(BuildStateEnum.BUILD_SUCCESSFUL));
101-
checkAndAddBuildState(templateResolver, project, requestSuccessOnAndFailureOff, states, BuildStateEnum.BUILD_SUCCESSFUL, BUILD_SUCCESSFUL);
101+
resolver.checkAndAddBuildState(requestSuccessOnAndFailureOff, states, BuildStateEnum.BUILD_SUCCESSFUL, BUILD_SUCCESSFUL);
102102
assertTrue(states.enabled(BuildStateEnum.BUILD_SUCCESSFUL));
103103

104104
assertFalse(states.enabled(BuildStateEnum.BUILD_FINISHED));
105-
checkAndAddBuildState(templateResolver, project, requestSuccessOnAndFailureOff, states, BuildStateEnum.BUILD_FINISHED, BUILD_SUCCESSFUL);
105+
resolver.checkAndAddBuildState(requestSuccessOnAndFailureOff, states, BuildStateEnum.BUILD_FINISHED, BUILD_SUCCESSFUL);
106106
assertTrue(states.enabled(BuildStateEnum.BUILD_FINISHED));
107107

108108
assertFalse(states.enabled(BuildStateEnum.BUILD_FAILED));
109-
checkAndAddBuildState(templateResolver, project, requestSuccessOnAndFailureOff, states, BuildStateEnum.BUILD_FINISHED, BUILD_FAILED);
109+
resolver.checkAndAddBuildState(requestSuccessOnAndFailureOff, states, BuildStateEnum.BUILD_FINISHED, BUILD_FAILED);
110110
assertFalse(states.enabled(BuildStateEnum.BUILD_FAILED));
111111

112112
/* Use checkAndAddBuildStateIfEitherSet so that either one or the other need to be set, not the last one */
113113

114-
checkAndAddBuildStateIfEitherSet(requestSuccessOnAndFailureOff, states, BuildStateEnum.BUILD_FINISHED, BUILD_SUCCESSFUL, BUILD_FAILED);
114+
resolver.checkAndAddBuildStateIfEitherSet(requestSuccessOnAndFailureOff, states, BuildStateEnum.BUILD_FINISHED, BUILD_SUCCESSFUL, BUILD_FAILED);
115115
assertTrue(states.enabled(BuildStateEnum.BUILD_FINISHED));
116116
}
117117

118118
@Test
119119
public void testCheckAndAddBuildStateIfEitherSet02() {
120120

121121
assertFalse(states.enabled(BuildStateEnum.BUILD_SUCCESSFUL));
122-
checkAndAddBuildState(templateResolver, project, requestSuccessOffAndFailureOn, states, BuildStateEnum.BUILD_SUCCESSFUL, BUILD_SUCCESSFUL);
122+
resolver.checkAndAddBuildState(requestSuccessOffAndFailureOn, states, BuildStateEnum.BUILD_SUCCESSFUL, BUILD_SUCCESSFUL);
123123
assertFalse(states.enabled(BuildStateEnum.BUILD_SUCCESSFUL));
124124

125125
assertFalse(states.enabled(BuildStateEnum.BUILD_FAILED));
126-
checkAndAddBuildState(templateResolver, project, requestSuccessOffAndFailureOn, states, BuildStateEnum.BUILD_FAILED, BUILD_FAILED);
126+
resolver.checkAndAddBuildState(requestSuccessOffAndFailureOn, states, BuildStateEnum.BUILD_FAILED, BUILD_FAILED);
127127
assertTrue(states.enabled(BuildStateEnum.BUILD_FAILED));
128128

129129
/* Use checkAndAddBuildStateIfEitherSet so that either one or the other need to be set, not the last one */
130130

131-
checkAndAddBuildStateIfEitherSet(requestSuccessOffAndFailureOn, states, BuildStateEnum.BUILD_FINISHED, BUILD_SUCCESSFUL, BUILD_FAILED);
131+
resolver.checkAndAddBuildStateIfEitherSet(requestSuccessOffAndFailureOn, states, BuildStateEnum.BUILD_FINISHED, BUILD_SUCCESSFUL, BUILD_FAILED);
132132
assertTrue(states.enabled(BuildStateEnum.BUILD_FINISHED));
133133
}
134134

135135
@Test
136136
public void testCheckAndAddBuildStateIfEitherSet03() {
137137

138138
assertFalse(states.enabled(BuildStateEnum.BUILD_SUCCESSFUL));
139-
checkAndAddBuildState(templateResolver, project, requestSuccessOffAndFailureOff, states, BuildStateEnum.BUILD_SUCCESSFUL, BUILD_SUCCESSFUL);
139+
resolver.checkAndAddBuildState(requestSuccessOffAndFailureOff, states, BuildStateEnum.BUILD_SUCCESSFUL, BUILD_SUCCESSFUL);
140140
assertFalse(states.enabled(BuildStateEnum.BUILD_SUCCESSFUL));
141141

142142
assertFalse(states.enabled(BuildStateEnum.BUILD_FAILED));
143-
checkAndAddBuildState(templateResolver, project, requestSuccessOffAndFailureOff, states, BuildStateEnum.BUILD_FAILED, BUILD_FAILED);
143+
resolver.checkAndAddBuildState(requestSuccessOffAndFailureOff, states, BuildStateEnum.BUILD_FAILED, BUILD_FAILED);
144144
assertFalse(states.enabled(BuildStateEnum.BUILD_FAILED));
145145

146146
/* Use checkAndAddBuildStateIfEitherSet so that either one or the other need to be set, not the last one */
147147

148-
checkAndAddBuildStateIfEitherSet(requestSuccessOffAndFailureOff, states, BuildStateEnum.BUILD_FINISHED, BUILD_SUCCESSFUL, BUILD_FAILED);
148+
resolver.checkAndAddBuildStateIfEitherSet(requestSuccessOffAndFailureOff, states, BuildStateEnum.BUILD_FINISHED, BUILD_SUCCESSFUL, BUILD_FAILED);
149149
assertFalse(states.enabled(BuildStateEnum.BUILD_FINISHED));
150150
}
151151

152152
@Test
153153
public void testCheckAndAddBuildStateIfEitherSet04() {
154154

155155
assertFalse(states.enabled(BuildStateEnum.BUILD_SUCCESSFUL));
156-
checkAndAddBuildState(templateResolver, project, requestSuccessOnAndFailureOn, states, BuildStateEnum.BUILD_SUCCESSFUL, BUILD_SUCCESSFUL);
156+
resolver.checkAndAddBuildState(requestSuccessOnAndFailureOn, states, BuildStateEnum.BUILD_SUCCESSFUL, BUILD_SUCCESSFUL);
157157
assertTrue(states.enabled(BuildStateEnum.BUILD_SUCCESSFUL));
158158

159159
assertFalse(states.enabled(BuildStateEnum.BUILD_FAILED));
160-
checkAndAddBuildState(templateResolver, project, requestSuccessOnAndFailureOn, states, BuildStateEnum.BUILD_FAILED, BUILD_FAILED);
160+
resolver.checkAndAddBuildState(requestSuccessOnAndFailureOn, states, BuildStateEnum.BUILD_FAILED, BUILD_FAILED);
161161
assertTrue(states.enabled(BuildStateEnum.BUILD_FAILED));
162162

163163
/* Use checkAndAddBuildStateIfEitherSet so that either one or the other need to be set, not the last one */
164164

165-
checkAndAddBuildStateIfEitherSet(requestSuccessOnAndFailureOn, states, BuildStateEnum.BUILD_FINISHED, BUILD_SUCCESSFUL, BUILD_FAILED);
165+
resolver.checkAndAddBuildStateIfEitherSet(requestSuccessOnAndFailureOn, states, BuildStateEnum.BUILD_FINISHED, BUILD_SUCCESSFUL, BUILD_FAILED);
166166
assertTrue(states.enabled(BuildStateEnum.BUILD_FINISHED));
167167
}
168168

0 commit comments

Comments
 (0)
Please sign in to comment.